X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=apps%2Firssi%2Fsrc%2Fsilc%2Fcore%2Fsilc-channels.c;h=2ebdcc7ab42de108834ae6b9405a080ad8b704ba;hp=6235e6f012912f0cd12f669eb195342a758305ba;hb=413da0f8686910f5e627393157566ae729ca99c4;hpb=8763262ca87be2c00479b25c27dfa505fc4f349c diff --git a/apps/irssi/src/silc/core/silc-channels.c b/apps/irssi/src/silc/core/silc-channels.c index 6235e6f0..2ebdcc7a 100644 --- a/apps/irssi/src/silc/core/silc-channels.c +++ b/apps/irssi/src/silc/core/silc-channels.c @@ -45,8 +45,25 @@ #include "silc-commands.h" +void sig_mime(SILC_SERVER_REC *server, SILC_CHANNEL_REC *channel, + const char *blob, const char *enc, const char *type, + const char *nick) +{ + + if (!(IS_SILC_SERVER(server))) + return; + + printformat_module("fe-common/silc", server, + channel == NULL ? NULL : channel->name, + MSGLEVEL_CRAP, SILCTXT_MESSAGE_DATA, + nick == NULL ? "[]" : nick, type); + +} + SILC_CHANNEL_REC *silc_channel_create(SILC_SERVER_REC *server, - const char *name, int automatic) + const char *name, + const char *visible_name, + int automatic) { SILC_CHANNEL_REC *rec; @@ -55,10 +72,8 @@ SILC_CHANNEL_REC *silc_channel_create(SILC_SERVER_REC *server, rec = g_new0(SILC_CHANNEL_REC, 1); rec->chat_type = SILC_PROTOCOL; - rec->name = g_strdup(name); - rec->server = server; - - channel_init((CHANNEL_REC *) rec, automatic); + channel_init((CHANNEL_REC *)rec, (SERVER_REC *)server, name, name, + automatic); return rec; } @@ -66,6 +81,8 @@ static void sig_channel_destroyed(SILC_CHANNEL_REC *channel) { if (!IS_SILC_CHANNEL(channel)) return; + if (channel->server && channel->server->disconnected) + return; if (channel->server != NULL && !channel->left && !channel->kicked) { /* destroying channel record without actually @@ -107,6 +124,11 @@ static void sig_server_quit(SILC_SERVER_REC *server, const char *msg) silc_command_exec(server, "QUIT", msg); } +static void sig_gui_quit(SILC_SERVER_REC *server, const char *msg) +{ + silc_client_stop(silc_client); +} + /* Find Irssi channel entry by SILC channel entry */ SILC_CHANNEL_REC *silc_channel_find_entry(SILC_SERVER_REC *server, @@ -142,7 +164,7 @@ static void command_part(const char *data, SILC_SERVER_REC *server, if (!strcmp(data, "*") || *data == '\0') { if (!IS_SILC_CHANNEL(item)) cmd_return_error(CMDERR_NOT_JOINED); - data = item->name; + data = item->visible_name; } chanrec = silc_channel_find(server, data); @@ -159,7 +181,7 @@ static void command_part(const char *data, SILC_SERVER_REC *server, chanrec->left = TRUE; silc_command_exec(server, "LEAVE", chanrec->name); signal_stop(); - + channel_destroy(CHANNEL(chanrec)); } @@ -171,6 +193,7 @@ static void command_me(const char *data, SILC_SERVER_REC *server, SILC_CHANNEL_REC *chanrec; char *tmpcmd = "ME", *tmp; SilcUInt32 argc = 0; + unsigned char *message = NULL; unsigned char **argv; SilcUInt32 *argv_lens, *argv_types; int i; @@ -192,15 +215,27 @@ static void command_me(const char *data, SILC_SERVER_REC *server, if (argc < 2) cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); - chanrec = silc_channel_find(server, item->name); + chanrec = silc_channel_find(server, item->visible_name); if (chanrec == NULL) cmd_return_error(CMDERR_CHAN_NOT_FOUND); + if (!silc_term_utf8()) { + int len = silc_utf8_encoded_len(argv[1], argv_lens[1], + SILC_STRING_LANGUAGE); + message = silc_calloc(len + 1, sizeof(*message)); + g_return_if_fail(message != NULL); + silc_utf8_encode(argv[1], argv_lens[1], SILC_STRING_LANGUAGE, + message, len); + } + /* Send the action message */ silc_client_send_channel_message(silc_client, server->conn, chanrec->entry, NULL, - SILC_MESSAGE_FLAG_ACTION, - argv[1], argv_lens[1], TRUE); + SILC_MESSAGE_FLAG_ACTION | + SILC_MESSAGE_FLAG_UTF8, + message ? message : argv[1], + message ? strlen(message) : argv_lens[1], + TRUE); printformat_module("fe-common/silc", server, chanrec->entry->channel_name, MSGLEVEL_ACTIONS, SILCTXT_CHANNEL_OWNACTION, @@ -210,6 +245,7 @@ static void command_me(const char *data, SILC_SERVER_REC *server, silc_free(argv[i]); silc_free(argv_lens); silc_free(argv_types); + silc_free(message); } /* ACTION local command. Same as ME but takes the channel as mandatory @@ -221,6 +257,7 @@ static void command_action(const char *data, SILC_SERVER_REC *server, SILC_CHANNEL_REC *chanrec; char *tmpcmd = "ME", *tmp; SilcUInt32 argc = 0; + unsigned char *message = NULL; unsigned char **argv; SilcUInt32 *argv_lens, *argv_types; int i; @@ -245,11 +282,23 @@ static void command_action(const char *data, SILC_SERVER_REC *server, if (chanrec == NULL) cmd_return_error(CMDERR_CHAN_NOT_FOUND); + if (!silc_term_utf8()) { + int len = silc_utf8_encoded_len(argv[2], argv_lens[2], + SILC_STRING_LANGUAGE); + message = silc_calloc(len + 1, sizeof(*message)); + g_return_if_fail(message != NULL); + silc_utf8_encode(argv[2], argv_lens[2], SILC_STRING_LANGUAGE, + message, len); + } + /* Send the action message */ silc_client_send_channel_message(silc_client, server->conn, chanrec->entry, NULL, - SILC_MESSAGE_FLAG_ACTION, - argv[2], argv_lens[2], TRUE); + SILC_MESSAGE_FLAG_ACTION | + SILC_MESSAGE_FLAG_UTF8, + message ? message : argv[2], + message ? strlen(message) : argv_lens[2], + TRUE); printformat_module("fe-common/silc", server, chanrec->entry->channel_name, MSGLEVEL_ACTIONS, SILCTXT_CHANNEL_OWNACTION, @@ -259,6 +308,7 @@ static void command_action(const char *data, SILC_SERVER_REC *server, silc_free(argv[i]); silc_free(argv_lens); silc_free(argv_types); + silc_free(message); } /* NOTICE local command. */ @@ -269,6 +319,7 @@ static void command_notice(const char *data, SILC_SERVER_REC *server, SILC_CHANNEL_REC *chanrec; char *tmpcmd = "ME", *tmp; SilcUInt32 argc = 0; + unsigned char *message = NULL; unsigned char **argv; SilcUInt32 *argv_lens, *argv_types; int i; @@ -289,15 +340,27 @@ static void command_notice(const char *data, SILC_SERVER_REC *server, if (argc < 2) cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); - chanrec = silc_channel_find(server, item->name); + chanrec = silc_channel_find(server, item->visible_name); if (chanrec == NULL) cmd_return_error(CMDERR_CHAN_NOT_FOUND); + if (!silc_term_utf8()) { + int len = silc_utf8_encoded_len(argv[1], argv_lens[1], + SILC_STRING_LANGUAGE); + message = silc_calloc(len + 1, sizeof(*message)); + g_return_if_fail(message != NULL); + silc_utf8_encode(argv[1], argv_lens[1], SILC_STRING_LANGUAGE, + message, len); + } + /* Send the action message */ silc_client_send_channel_message(silc_client, server->conn, chanrec->entry, NULL, - SILC_MESSAGE_FLAG_NOTICE, - argv[1], argv_lens[1], TRUE); + SILC_MESSAGE_FLAG_NOTICE | + SILC_MESSAGE_FLAG_UTF8, + message ? message : argv[1], + message ? strlen(message) : argv_lens[1], + TRUE); printformat_module("fe-common/silc", server, chanrec->entry->channel_name, MSGLEVEL_NOTICES, SILCTXT_CHANNEL_OWNNOTICE, @@ -307,22 +370,20 @@ static void command_notice(const char *data, SILC_SERVER_REC *server, silc_free(argv[i]); silc_free(argv_lens); silc_free(argv_types); + silc_free(message); } /* AWAY local command. Sends UMODE command that sets the SILC_UMODE_GONE flag. */ -static void command_away(const char *data, SILC_SERVER_REC *server, - WI_ITEM_REC *item) +bool silc_set_away(const char *reason, SILC_SERVER_REC *server) { bool set; - - CMD_SILC_SERVER(server); - + if (!IS_SILC_SERVER(server) || !server->connected) - cmd_return_error(CMDERR_NOT_CONNECTED); - - if (*data == '\0') { + return FALSE; + + if (*reason == '\0') { /* Remove any possible away message */ silc_client_set_away_message(silc_client, server->conn, NULL); set = FALSE; @@ -331,16 +392,37 @@ static void command_away(const char *data, SILC_SERVER_REC *server, SILCTXT_UNSET_AWAY); } else { /* Set the away message */ - silc_client_set_away_message(silc_client, server->conn, (char *)data); + silc_client_set_away_message(silc_client, server->conn, (char *)reason); set = TRUE; printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP, - SILCTXT_SET_AWAY, data); + SILCTXT_SET_AWAY, reason); } + server->usermode_away = set; + g_free_and_null(server->away_reason); + if (set) + server->away_reason = g_strdup((char *)reason); + signal_emit("away mode changed", 1, server); - silc_command_exec(server, "UMODE", set ? "+g" : "-g"); + return set; +} + +static void command_away(const char *data, SILC_SERVER_REC *server, + WI_ITEM_REC *item) +{ + CMD_SILC_SERVER(server); + + if (!IS_SILC_SERVER(server) || !server->connected) + cmd_return_error(CMDERR_NOT_CONNECTED); + + g_free_and_null(server->away_reason); + if ((data) && (*data != '\0')) + server->away_reason = g_strdup(data); + + silc_command_exec(server, "UMODE", + (server->away_reason != NULL) ? "+g" : "-g"); } typedef struct { @@ -375,7 +457,7 @@ static void keyagr_completion(SilcClient client, /* Set the private key for this client */ silc_client_del_private_message_key(client, conn, client_entry); silc_client_add_private_message_key_ske(client, conn, client_entry, - NULL, key, i->responder); + NULL, NULL, key, i->responder); printformat_module("fe-common/silc", i->server, NULL, MSGLEVEL_CRAP, SILCTXT_KEY_AGREEMENT_PRIVMSG, client_entry->nickname); @@ -403,6 +485,17 @@ static void keyagr_completion(SilcClient client, printformat_module("fe-common/silc", i->server, NULL, MSGLEVEL_CRAP, SILCTXT_KEY_AGREEMENT_ABORTED, client_entry->nickname); break; + + case SILC_KEY_AGREEMENT_ALREADY_STARTED: + printformat_module("fe-common/silc", i->server, NULL, MSGLEVEL_CRAP, + SILCTXT_KEY_AGREEMENT_ALREADY_STARTED, + client_entry->nickname); + break; + + case SILC_KEY_AGREEMENT_SELF_DENIED: + printformat_module("fe-common/silc", i->server, NULL, MSGLEVEL_CRAP, + SILCTXT_KEY_AGREEMENT_SELF_DENIED); + break; default: break; @@ -552,32 +645,46 @@ static void command_key(const char *data, SILC_SERVER_REC *server, command = 1; if (argc >= 5) { + char *cipher = NULL, *hmac = NULL; + if (type == 1 && client_entry) { /* Set private message key */ + bool responder = FALSE; silc_client_del_private_message_key(silc_client, conn, client_entry); - if (argc >= 6) - silc_client_add_private_message_key(silc_client, conn, client_entry, - argv[5], argv[4], - argv_lens[4], - (argv[4][0] == '*' ? - TRUE : FALSE), FALSE); - else - silc_client_add_private_message_key(silc_client, conn, client_entry, - NULL, argv[4], - argv_lens[4], - (argv[4][0] == '*' ? - TRUE : FALSE), FALSE); + if (argc >= 6) { + if (!strcasecmp(argv[5], "-responder")) + responder = TRUE; + else + cipher = argv[5]; + } + if (argc >= 7) { + if (!strcasecmp(argv[6], "-responder")) + responder = TRUE; + else + hmac = argv[6]; + } + if (argc >= 8) { + if (!strcasecmp(argv[7], "-responder")) + responder = TRUE; + } + + silc_client_add_private_message_key(silc_client, conn, client_entry, + cipher, hmac, + argv[4], argv_lens[4], + (argv[4][0] == '*' ? + TRUE : FALSE), responder); /* Send the key to the remote client so that it starts using it too. */ + /* XXX for now we don't do this. This feature is pretty stupid + and should perhaps be removed altogether from SILC. silc_client_send_private_message_key(silc_client, conn, client_entry, TRUE); + */ } else if (type == 2) { /* Set private channel key */ - char *cipher = NULL, *hmac = NULL; - if (!(channel_entry->mode & SILC_CHANNEL_MODE_PRIVKEY)) { printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP, SILCTXT_CH_PRIVATE_KEY_NOMODE, @@ -748,8 +855,9 @@ static void command_key(const char *data, SILC_SERVER_REC *server, memset(buf, 0, sizeof(buf)); strncat(buf, " ", 2); - len = strlen(keys[k]->cipher->cipher->name); - strncat(buf, keys[k]->cipher->cipher->name, len > 16 ? 16 : len); + len = strlen(silc_cipher_get_name(keys[k]->cipher)); + strncat(buf, silc_cipher_get_name(keys[k]->cipher), + len > 16 ? 16 : len); if (len < 16) for (i = 0; i < 16 - len; i++) strcat(buf, " "); @@ -913,6 +1021,8 @@ void silc_channels_init(void) signal_add("channel destroyed", (SIGNAL_FUNC) sig_channel_destroyed); signal_add("server connected", (SIGNAL_FUNC) sig_connected); signal_add("server quit", (SIGNAL_FUNC) sig_server_quit); + signal_add("gui exit", (SIGNAL_FUNC) sig_gui_quit); + signal_add("mime", (SIGNAL_FUNC) sig_mime); command_bind_silc("part", MODULE_NAME, (SIGNAL_FUNC) command_part); command_bind_silc("me", MODULE_NAME, (SIGNAL_FUNC) command_me); @@ -920,7 +1030,7 @@ void silc_channels_init(void) command_bind_silc("notice", MODULE_NAME, (SIGNAL_FUNC) command_notice); command_bind_silc("away", MODULE_NAME, (SIGNAL_FUNC) command_away); command_bind_silc("key", MODULE_NAME, (SIGNAL_FUNC) command_key); - command_bind_silc("listkeys", MODULE_NAME, (SIGNAL_FUNC) command_listkeys); +/* command_bind_silc("listkeys", MODULE_NAME, (SIGNAL_FUNC) command_listkeys); */ silc_nicklist_init(); } @@ -930,6 +1040,8 @@ void silc_channels_deinit(void) signal_remove("channel destroyed", (SIGNAL_FUNC) sig_channel_destroyed); signal_remove("server connected", (SIGNAL_FUNC) sig_connected); signal_remove("server quit", (SIGNAL_FUNC) sig_server_quit); + signal_remove("gui exit", (SIGNAL_FUNC) sig_gui_quit); + signal_remove("mime", (SIGNAL_FUNC) sig_mime); command_unbind("part", (SIGNAL_FUNC) command_part); command_unbind("me", (SIGNAL_FUNC) command_me); @@ -937,7 +1049,7 @@ void silc_channels_deinit(void) command_unbind("notice", (SIGNAL_FUNC) command_notice); command_unbind("away", (SIGNAL_FUNC) command_away); command_unbind("key", (SIGNAL_FUNC) command_key); - command_unbind("listkeys", (SIGNAL_FUNC) command_listkeys); +/* command_unbind("listkeys", (SIGNAL_FUNC) command_listkeys); */ silc_nicklist_deinit(); }