From 22c4c13c64814e20bb06ea893d9b258df85c0e39 Mon Sep 17 00:00:00 2001 From: Jochen Eisinger Date: Wed, 4 Dec 2002 20:18:42 +0000 Subject: [PATCH] Wed Dec 4 21:08:52 CET 2002 Jochen Eisinger * Display signature verification result in public and private messages using theme abstracts. See irssi/default.theme for examples on their usage. Affected files irssi/default.theme, irssi/src/fe-common/silc/fe-messages.h, irssi/src/fe-common/silc/module-formats.[ch], irssi/src/fe-common/silc/fe-common-silc.c, irssi/src/fe-common/silc/Makefile.am irssi/src/fe-common/core/fe-messages.[ch] --- apps/irssi/default.theme | 57 ++++ apps/irssi/src/fe-common/core/fe-messages.c | 2 +- apps/irssi/src/fe-common/core/fe-messages.h | 2 + apps/irssi/src/fe-common/silc/Makefile.am | 3 +- .../irssi/src/fe-common/silc/fe-common-silc.c | 5 + apps/irssi/src/fe-common/silc/fe-messages.c | 248 ++++++++++++++++++ .../irssi/src/fe-common/silc/module-formats.c | 30 +++ .../irssi/src/fe-common/silc/module-formats.h | 30 +++ 8 files changed, 375 insertions(+), 2 deletions(-) create mode 100644 apps/irssi/src/fe-common/silc/fe-messages.c diff --git a/apps/irssi/default.theme b/apps/irssi/default.theme index 121ca945..4c97c6d9 100644 --- a/apps/irssi/default.theme +++ b/apps/irssi/default.theme @@ -273,6 +273,63 @@ abstracts = { sb_act_hilight = "%M$*"; # hilight with specified color, $0 = color, $1 = text sb_act_hilight_color = "$0$1-%n"; + + # signed messages + # the following formats fit the Irssi default theme: + # + # flag_signed = "%GS%n"; + # flag_unknown = "%Y?%n"; + # flag_failed = "%RF%n"; + # + # pubmsghinick_signed = "{msgnick {flag_signed} $0$2-%n}"; + # pubmsghinick_unknown = "{msgnick {flag_unknown} $0$2-%n}"; + # pubmsghinick_failed = "{msgnick {flag_failed} $0$2-%n}"; + # + # pubmsgmenick_signed = "{msgnick {flag_signed} $1-}"; + # pubmsgmenick_unknown = "{msgnick {flag_unknown} $1-}"; + # pubmsgmenick_failed = "{msgnick {flag_failed} $1-}"; + # + # pubmsgnick_signed = "{msgnick {flag_signed} $1-}"; + # pubmsgnick_unknown = "{msgnick {flag_unknown} $1-}"; + # pubmsgnick_failed = "{msgnick {flag_failed} $1-}"; + # + # privmsg_signed = "{privmsg {flag_signed}$0 $1}"; + # privmsg_unknown = "{privmsg {flag_unknown}$0 $1}"; + # privmsg_failed = "{privmsg {flag_failed}$0 $1}"; + # + # privmsgnick_signed = "{msgnick {flag_signed} %R$*%n}"; + # privmsgnick_unknown = "{msgnick {flag_unknown} %R$*%n}"; + # privmsgnick_failed = "{msgnick {flag_failed} %R$*%n}"; + # + # ownmsgnick_signed = "{msgnick {flag_signed} $1-}"; + # ownprivmsgnick_signed = "{msgnick {flag_signed} $*}"; + # + flag_signed = "%GS%n"; + flag_unknown = "%Y?%n"; + flag_failed = "%RF%n"; + + pubmsghinick_signed = "{msgnick {flag_signed} $0$2-%n}"; + pubmsghinick_unknown = "{msgnick {flag_unknown} $0$2-%n}"; + pubmsghinick_failed = "{msgnick {flag_failed} $0$2-%n}"; + + pubmsgmenick_signed = "%g<{flag_signed}$1->%n %|"; + pubmsgmenick_unknown = "%g<{flag_unknown}$1->%n %|"; + pubmsgmenick_failed = "%g<{flag_failed}$1->%n %|"; + + pubmsgnick_signed = "{msgnick {flag_signed} $1-}"; + pubmsgnick_unknown = "{msgnick {flag_unknown} $1-}"; + pubmsgnick_failed = "{msgnick {flag_failed} $1-}"; + + privmsg_signed = "{privmsg {flag_signed}$0 $1}"; + privmsg_unknown = "{privmsg {flag_unknown}$0 $1}"; + privmsg_failed = "{privmsg {flag_failed}$0 $1}"; + + privmsgnick_signed = "{privmsgnick {flag_signed}$0}"; + privmsgnick_unknown = "{privmsgnick {flag_unknown}$0}"; + privmsgnick_failed = "{privmsgnick {flag_failed}$0}"; + + ownmsgnick_signed = "{msgnick {flag_signed} $1-}%g"; + ownprivmsgnick_signed = "->*%c{flag_signed}%n* %g$1-"; }; # diff --git a/apps/irssi/src/fe-common/core/fe-messages.c b/apps/irssi/src/fe-common/core/fe-messages.c index e210c2a2..31bbbfad 100644 --- a/apps/irssi/src/fe-common/core/fe-messages.c +++ b/apps/irssi/src/fe-common/core/fe-messages.c @@ -39,7 +39,7 @@ #define ishighalnum(c) ((unsigned char) (c) >= 128 || i_isalnum(c)) -static GHashTable *printnicks; +GHashTable *printnicks; /* convert _underlined_ and *bold* words (and phrases) to use real underlining or bolding */ diff --git a/apps/irssi/src/fe-common/core/fe-messages.h b/apps/irssi/src/fe-common/core/fe-messages.h index afe7644d..07ecef80 100644 --- a/apps/irssi/src/fe-common/core/fe-messages.h +++ b/apps/irssi/src/fe-common/core/fe-messages.h @@ -7,4 +7,6 @@ char *expand_emphasis(WI_ITEM_REC *item, const char *text); char *channel_get_nickmode(CHANNEL_REC *channel, const char *nick); +extern GHashTable *printnicks; + #endif diff --git a/apps/irssi/src/fe-common/silc/Makefile.am b/apps/irssi/src/fe-common/silc/Makefile.am index 72abc05e..1a89f348 100644 --- a/apps/irssi/src/fe-common/silc/Makefile.am +++ b/apps/irssi/src/fe-common/silc/Makefile.am @@ -27,7 +27,8 @@ libfe_common_silc_a_SOURCES = \ fe-channels.c \ fe-common-silc.c \ module-formats.c \ - silc-modules.c + silc-modules.c \ + fe-messages.c noinst_HEADERS = \ module-formats.h \ diff --git a/apps/irssi/src/fe-common/silc/fe-common-silc.c b/apps/irssi/src/fe-common/silc/fe-common-silc.c index e1912d5c..51047a00 100644 --- a/apps/irssi/src/fe-common/silc/fe-common-silc.c +++ b/apps/irssi/src/fe-common/silc/fe-common-silc.c @@ -30,18 +30,23 @@ void fe_silc_channels_deinit(void); void fe_silc_modules_init(void); void fe_silc_modules_deinit(void); +void fe_silc_messages_init(void); +void fe_silc_messages_deinit(void); + void fe_silc_init(void) { theme_register(fecommon_silc_formats); fe_silc_channels_init(); fe_silc_modules_init(); + fe_silc_messages_init(); module_register("silc", "fe"); } void fe_silc_deinit(void) { + fe_silc_messages_deinit(); fe_silc_modules_deinit(); fe_silc_channels_deinit(); diff --git a/apps/irssi/src/fe-common/silc/fe-messages.c b/apps/irssi/src/fe-common/silc/fe-messages.c new file mode 100644 index 00000000..41e05144 --- /dev/null +++ b/apps/irssi/src/fe-common/silc/fe-messages.c @@ -0,0 +1,248 @@ +/* + + fe-messages.c + + Author: Jochen Eisinger + + Copyright (C) 2002 Jochen Eisinger + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +*/ + +#include "module.h" +#include "modules.h" +#include "signals.h" +#include "themes.h" +#include "levels.h" +#include "misc.h" +#include "special-vars.h" +#include "settings.h" + +#include "servers.h" +#include "channels.h" +#include "nicklist.h" +#include "ignore.h" + +#include "window-items.h" +#include "fe-queries.h" +#include "fe-messages.h" +#include "hilight-text.h" +#include "printtext.h" +#include "module-formats.h" + +#define VERIFIED_MSG(v,msg) (v == SILC_MSG_SIGNED_VERIFIED ? \ + msg##_SIGNED : (v == SILC_MSG_SIGNED_UNKNOWN ? \ + msg##_UNKNOWN : msg##_FAILED)) + +static void sig_signed_message_public(SERVER_REC * server, const char *msg, + const char *nick, + const char *address, + const char *target, + int verified) +{ + CHANNEL_REC *chanrec; + NICK_REC *nickrec = NULL; /* we cheat here a little to keep the limit of + 6 parameters to a signal handler ... */ + const char *nickmode, *printnick; + int for_me, print_channel, level; + char *color, *freemsg = NULL; + + /* NOTE: this may return NULL if some channel is just closed with + /WINDOW CLOSE and server still sends the few last messages */ + chanrec = channel_find(server, target); + if (nickrec == NULL && chanrec != NULL) + nickrec = nicklist_find(chanrec, nick); + + for_me = !settings_get_bool("hilight_nick_matches") ? FALSE : + nick_match_msg(chanrec, msg, server->nick); + color = for_me ? NULL : + hilight_match_nick(server, target, nick, address, MSGLEVEL_PUBLIC, + msg); + + print_channel = chanrec == NULL || + !window_item_is_active((WI_ITEM_REC *) chanrec); + if (!print_channel && settings_get_bool("print_active_channel") && + window_item_window((WI_ITEM_REC *) chanrec)->items->next != NULL) + print_channel = TRUE; + + level = MSGLEVEL_PUBLIC; + if (for_me || color != NULL) + level |= MSGLEVEL_HILIGHT; + + if (settings_get_bool("emphasis")) + msg = freemsg = expand_emphasis((WI_ITEM_REC *) chanrec, msg); + + /* get nick mode & nick what to print the msg with + (in case there's multiple identical nicks) */ + nickmode = channel_get_nickmode(chanrec, nick); + printnick = nickrec == NULL ? nick : + g_hash_table_lookup(printnicks, nickrec); + if (printnick == NULL) + printnick = nick; + + if (!print_channel) { + /* message to active channel in window */ + if (color != NULL) { + /* highlighted nick */ + printformat_module("fe-common/silc", server, target, + level, VERIFIED_MSG(verified, SILCTXT_PUBMSG_HILIGHT), + color, printnick, msg, nickmode); + } else { + printformat_module("fe-common/silc", server, target, level, + for_me ? VERIFIED_MSG(verified, SILCTXT_PUBMSG_ME) : + VERIFIED_MSG(verified,SILCTXT_PUBMSG), + printnick, msg, nickmode); + } + } else { + /* message to not existing/active channel */ + if (color != NULL) { + /* highlighted nick */ + printformat_module("fe-common/silc", server, target, level, + VERIFIED_MSG(verified, SILCTXT_PUBMSG_HILIGHT_CHANNEL), + color, printnick, target, msg, nickmode); + } else { + printformat_module("fe-common/silc", server, target, level, + for_me ? VERIFIED_MSG(verified, SILCTXT_PUBMSG_ME_CHANNEL) : + VERIFIED_MSG(verified, SILCTXT_PUBMSG_CHANNEL), + printnick, target, msg, nickmode); + } + } + + g_free_not_null(freemsg); + g_free_not_null(color); +} + +static void sig_signed_message_private(SERVER_REC * server, + const char *msg, const char *nick, + const char *address, int verified) +{ + QUERY_REC *query; + char *freemsg = NULL; + + query = query_find(server, nick); + + if (settings_get_bool("emphasis")) + msg = freemsg = expand_emphasis((WI_ITEM_REC *) query, msg); + + printformat_module("fe-common/silc", server, nick, MSGLEVEL_MSGS, + query == NULL ? VERIFIED_MSG(verified, SILCTXT_MSG_PRIVATE) : + VERIFIED_MSG(verified, SILCTXT_MSG_PRIVATE_QUERY), nick, address, msg); + + g_free_not_null(freemsg); +} + +static void sig_signed_message_own_public(SERVER_REC * server, + const char *msg, + const char *target) +{ + WINDOW_REC *window; + CHANNEL_REC *channel; + const char *nickmode; + char *freemsg = NULL; + int print_channel; + + channel = channel_find(server, target); + if (channel != NULL) + target = channel->visible_name; + + nickmode = channel_get_nickmode(channel, server->nick); + + window = channel == NULL ? NULL : + window_item_window((WI_ITEM_REC *) channel); + + print_channel = window == NULL || + window->active != (WI_ITEM_REC *) channel; + + if (!print_channel && settings_get_bool("print_active_channel") && + window != NULL && g_slist_length(window->items) > 1) + print_channel = TRUE; + + if (settings_get_bool("emphasis")) + msg = freemsg = expand_emphasis((WI_ITEM_REC *) channel, msg); + + if (!print_channel) { + printformat_module("fe-common/silc", server, target, + MSGLEVEL_PUBLIC | MSGLEVEL_NOHILIGHT | + MSGLEVEL_NO_ACT, SILCTXT_OWN_MSG_SIGNED, server->nick, msg, + nickmode); + } else { + printformat_module("fe-common/silc", server, target, + MSGLEVEL_PUBLIC | MSGLEVEL_NOHILIGHT | + MSGLEVEL_NO_ACT, SILCTXT_OWN_MSG_CHANNEL_SIGNED, + server->nick, target, msg, nickmode); + } + + g_free_not_null(freemsg); +} + +static void sig_signed_message_own_private(SERVER_REC * server, + const char *msg, + const char *target, + const char *origtarget) +{ + QUERY_REC *query; + char *freemsg = NULL; + + g_return_if_fail(server != NULL); + g_return_if_fail(msg != NULL); + + if (target == NULL) { + /* this should only happen if some special target failed and + we should display some error message. currently the special + targets are only ',' and '.'. */ + g_return_if_fail(strcmp(origtarget, ",") == 0 || + strcmp(origtarget, ".") == 0); + + printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CLIENTNOTICE, + *origtarget == ',' ? SILCTXT_NO_MSGS_GOT : + SILCTXT_NO_MSGS_SENT); + signal_stop(); + return; + } + + query = privmsg_get_query(server, target, TRUE, MSGLEVEL_MSGS); + + if (settings_get_bool("emphasis")) + msg = freemsg = expand_emphasis((WI_ITEM_REC *) query, msg); + + printformat_module("fe-common/silc", server, target, + MSGLEVEL_MSGS | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT, + query == NULL ? SILCTXT_OWN_MSG_PRIVATE_SIGNED : + SILCTXT_OWN_MSG_PRIVATE_QUERY_SIGNED, target, msg, + server->nick); + + g_free_not_null(freemsg); +} + +void fe_silc_messages_init(void) +{ + signal_add_last("message signed_public", + (SIGNAL_FUNC) sig_signed_message_public); + signal_add_last("message signed_private", + (SIGNAL_FUNC) sig_signed_message_private); + signal_add_last("message signed_own_public", + (SIGNAL_FUNC) sig_signed_message_own_public); + signal_add_last("message signed_own_private", + (SIGNAL_FUNC) sig_signed_message_own_private); +} + +void fe_silc_messages_deinit(void) +{ + signal_remove("message signed_public", + (SIGNAL_FUNC) sig_signed_message_public); + signal_remove("message signed_private", + (SIGNAL_FUNC) sig_signed_message_private); + signal_remove("message signed_own_public", + (SIGNAL_FUNC) sig_signed_message_own_public); + signal_remove("message signed_own_private", + (SIGNAL_FUNC) sig_signed_message_own_private); +} diff --git a/apps/irssi/src/fe-common/silc/module-formats.c b/apps/irssi/src/fe-common/silc/module-formats.c index 050f4e6c..09440ca5 100644 --- a/apps/irssi/src/fe-common/silc/module-formats.c +++ b/apps/irssi/src/fe-common/silc/module-formats.c @@ -50,6 +50,36 @@ FORMAT_REC fecommon_silc_formats[] = { { "killed", "{nick $0} has been killed from the SILC Network by {nick $1} ($2)", 3, { 0, 0, 0 } }, { "quieted", "You have been queited and cannot talk on {channel $0}", 1, { 0 } }, { "appears", "{channick $0} now appears as {channick_hilight $1}", 4, { 0, 0, 0, 0 } }, + { "pubmsg_hilight_signed", "{pubmsghinick_signed $0 $3 $1}$2", 4, { 0, 0, 0, 0 } }, + { "pubmsg_hilight_unknown", "{pubmsghinick_unknown $0 $3 $1}$2", 4, { 0, 0, 0, 0 } }, + { "pubmsg_hilight_failed", "{pubmsghinick_failed $0 $3 $1}$2", 4, { 0, 0, 0, 0 } }, + { "pubmsg_me_signed", "{pubmsgmenick_signed $2 {menick $0}}$1", 3, { 0, 0, 0 } }, + { "pubmsg_me_unknown", "{pubmsgmenick_unknown $2 {menick $0}}$1", 3, { 0, 0, 0 } }, + { "pubmsg_me_failed", "{pubmsgmenick_failed $2 {menick $0}}$1", 3, { 0, 0, 0 } }, + { "pubmsg_signed", "{pubmsgnick_signed $2 {pubnick $0}}$1", 3, { 0, 0, 0 } }, + { "pubmsg_unknown", "{pubmsgnick_unknown $2 {pubnick $0}}$1", 3, { 0, 0, 0 } }, + { "pubmsg_failed", "{pubmsgnick_failed $2 {pubnick $0}}$1", 3, { 0, 0, 0 } }, + { "pubmsg_hilight_channel_signed", "{pubmsghinick_signed $0 $4 $1{msgchannel $2}}$3", 5, { 0, 0, 0, 0, 0 } }, + { "pubmsg_hilight_channel_unknown", "{pubmsghinick_unknown $0 $4 $1{msgchannel $2}}$3", 5, { 0, 0, 0, 0, 0 } }, + { "pubmsg_hilight_channel_failed", "{pubmsghinick_failed $0 $4 $1{msgchannel $2}}$3", 5, { 0, 0, 0, 0, 0 } }, + { "pubmsg_me_channel_signed", "{pubmsgmenick_signed $3 {menick $0}{msgchannel $1}}$2", 4, { 0, 0, 0, 0 } }, + { "pubmsg_me_channel_unknown", "{pubmsgmenick_unknown $3 {menick $0}{msgchannel $1}}$2", 4, { 0, 0, 0, 0 } }, + { "pubmsg_me_channel_failed", "{pubmsgmenick_failed $3 {menick $0}{msgchannel $1}}$2", 4, { 0, 0, 0, 0 } }, + { "pubmsg_channel_signed", "{pubmsgnick_signed $3 {pubnick $0}{msgchannel $1}}$2", 4, { 0, 0, 0, 0 } }, + { "pubmsg_channel_unknown", "{pubmsgnick_unknown $3 {pubnick $0}{msgchannel $1}}$2", 4, { 0, 0, 0, 0 } }, + { "pubmsg_channel_failed", "{pubmsgnick_failed $3 {pubnick $0}{msgchannel $1}}$2", 4, { 0, 0, 0, 0 } }, + { "msg_private_signed", "{privmsg_signed $0 $1}$2", 3, { 0, 0, 0 } }, + { "msg_private_unknown", "{privmsg_unknown $0 $1}$2", 3, { 0, 0, 0 } }, + { "msg_private_failed", "{privmsg_failed $0 $1}$2", 3, { 0, 0, 0 } }, + { "msg_private_query_signed", "{privmsgnick_signed $0}$2", 3, { 0, 0, 0 } }, + { "msg_private_query_unknown", "{privmsgnick_unknown $0}$2", 3, { 0, 0, 0 } }, + { "msg_private_query_failed", "{privmsgnick_failed $0}$2", 3, { 0, 0, 0 } }, + { "own_msg_signed", "{ownmsgnick_signed $2 {ownnick $0}}$1", 3, { 0, 0, 0 } }, + { "own_msg_channel_signed", "{ownmsgnick_signed $3 {ownnick $0}{msgchannel $1}}$2", 4, { 0, 0, 0, 0 } }, + { "no_msgs_got", "You have not received a message from anyone yet", 0 }, + { "no_msgs_sent", "You have not sent a message to anyone yet", 0 }, + { "own_msg_private_signed", "{ownprivmsg_signed msg $0}$1", 2, { 0, 0 } }, + { "own_msg_private_query_signed", "{ownprivmsgnick_signed {ownprivnick $2}}$1", 3, { 0, 0, 0 } }, /* WHOIS, WHOWAS and USERS (alias WHO) messages */ { NULL, "Who Queries", 0 }, diff --git a/apps/irssi/src/fe-common/silc/module-formats.h b/apps/irssi/src/fe-common/silc/module-formats.h index 27c92de0..7df09206 100644 --- a/apps/irssi/src/fe-common/silc/module-formats.h +++ b/apps/irssi/src/fe-common/silc/module-formats.h @@ -47,6 +47,36 @@ enum { SILCTXT_CHANNEL_KILLED, SILCTXT_CHANNEL_QUIETED, SILCTXT_CHANNEL_APPEARS, + SILCTXT_PUBMSG_HILIGHT_SIGNED, + SILCTXT_PUBMSG_HILIGHT_UNKNOWN, + SILCTXT_PUBMSG_HILIGHT_FAILED, + SILCTXT_PUBMSG_ME_SIGNED, + SILCTXT_PUBMSG_ME_UNKNOWN, + SILCTXT_PUBMSG_ME_FAILED, + SILCTXT_PUBMSG_SIGNED, + SILCTXT_PUBMSG_UNKNOWN, + SILCTXT_PUBMSG_FAILED, + SILCTXT_PUBMSG_HILIGHT_CHANNEL_SIGNED, + SILCTXT_PUBMSG_HILIGHT_CHANNEL_UNKNOWN, + SILCTXT_PUBMSG_HILIGHT_CHANNEL_FAILED, + SILCTXT_PUBMSG_ME_CHANNEL_SIGNED, + SILCTXT_PUBMSG_ME_CHANNEL_UNKNOWN, + SILCTXT_PUBMSG_ME_CHANNEL_FAILED, + SILCTXT_PUBMSG_CHANNEL_SIGNED, + SILCTXT_PUBMSG_CHANNEL_UNKNOWN, + SILCTXT_PUBMSG_CHANNEL_FAILED, + SILCTXT_MSG_PRIVATE_SIGNED, + SILCTXT_MSG_PRIVATE_UNKNOWN, + SILCTXT_MSG_PRIVATE_FAILED, + SILCTXT_MSG_PRIVATE_QUERY_SIGNED, + SILCTXT_MSG_PRIVATE_QUERY_UNKNOWN, + SILCTXT_MSG_PRIVATE_QUERY_FAILED, + SILCTXT_OWN_MSG_SIGNED, + SILCTXT_OWN_MSG_CHANNEL_SIGNED, + SILCTXT_NO_MSGS_GOT, + SILCTXT_NO_MSGS_SENT, + SILCTXT_OWN_MSG_PRIVATE_SIGNED, + SILCTXT_OWN_MSG_PRIVATE_QUERY_SIGNED, SILCTXT_FILL_2, -- 2.24.0