static void cmd_unignore(const char *data) { IGNORE_REC *rec; GSList *tmp; char *key; if (is_numeric(data, ' ')) { /* with index number */ tmp = g_slist_nth(ignores, atoi(data)-1); rec = tmp == NULL ? NULL : tmp->data; } else { /* with mask */ char *chans[2] = { "*", NULL }; if (ischannel(*data)) chans[0] = (char *) data; rec = ignore_find("*", ischannel(*data) ? NULL : data, chans); } if (rec == NULL) printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_IGNORE_NOT_FOUND, data); else { key = ignore_get_key(rec); printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_UNIGNORED, key); g_free(key); rec->level = 0; rec->except_level = 0; ignore_update_rec(rec); } }
void DH1080_received(SERVER_REC * server, char *msg, char *nick, char *address, char *target) { int i; char hisPubKey[300], contactName[CONTACT_SIZE] = "", encryptedKey[KEYBUF_SIZE] = ""; if (ischannel(*target) || ischannel(*nick)) return; // no KeyXchange for channels... i = strlen(msg); if (i < 191 || i > 195) return; if (strncmp(msg, "DH1080_INIT ", 12) == 0) { strcpy(hisPubKey, msg + 12); if (strspn(hisPubKey, B64ABC) != strlen(hisPubKey)) return; if (query_find(server, nick) == NULL) { // query window not found, lets create one keyx_query_created = 1; irc_query_create(server->tag, nick, TRUE); keyx_query_created = 0; } printtext(server, nick, MSGLEVEL_CRAP, "\002FiSH:\002 Received DH1080 public key from %s, sending mine...", nick); DH1080_gen(g_myPrivKey, g_myPubKey); irc_send_cmdv((IRC_SERVER_REC *) server, "NOTICE %s :%s %s", nick, "DH1080_FINISH", g_myPubKey); } else if (strncmp(msg, "DH1080_FINISH ", 14) == 0) strcpy(hisPubKey, msg + 14); else return; if (DH1080_comp(g_myPrivKey, hisPubKey) == 0) return; signal_stop(); encrypt_key(hisPubKey, encryptedKey); ZeroMemory(hisPubKey, sizeof(hisPubKey)); if (getIniSectionForContact(server, nick, contactName) == FALSE) return; if (setIniValue(contactName, "key", encryptedKey, iniPath) == -1) { ZeroMemory(encryptedKey, KEYBUF_SIZE); printtext(server, nick, MSGLEVEL_CRAP, "\002FiSH ERROR:\002 Unable to write to blow.ini, probably out of space or permission denied."); return; } ZeroMemory(encryptedKey, KEYBUF_SIZE); printtext(server, nick, MSGLEVEL_CRAP, "\002FiSH:\002 Key for %s successfully set!", nick); }
static int ischannel_func(SERVER_REC *server, const char *data) { if (*data == '@') { /* @#channel, @+#channel */ data++; if (*data == '+' && ischannel(data[1])) return 1; } return ischannel(*data); }
static const char *skip_target(const char *target) { if (target != NULL && *target == '@') { /* @#channel, @+#channel - Hybrid6 / Bahamut features */ if (target[1] == '+' && ischannel(target[2])) target += 2; else if (ischannel(target[1])) target++; } return target; }
static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg, const char *nick, const char *address, const char *target) { void *item; const char *oldtarget; char *freemsg = NULL; int level; oldtarget = target; target = skip_target(IRC_SERVER(server), target); level = MSGLEVEL_ACTIONS | (ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); if (ignore_check(SERVER(server), nick, address, target, msg, level)) return; if (ignore_check(SERVER(server), nick, address, target, msg, level | MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; if (ischannel(*target)) item = irc_channel_find(server, target); else item = privmsg_get_query(SERVER(server), nick, FALSE, level); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); if (ischannel(*target)) { /* channel action */ if (window_item_is_active(item) && target == oldtarget) { /* message to active channel in window */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC, nick, msg); } else { /* message to not existing/active channel, or to @/+ */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC_CHANNEL, nick, oldtarget, msg); } } else { /* private action */ printformat(server, nick, MSGLEVEL_ACTIONS | MSGLEVEL_MSGS, item == NULL ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, address == NULL ? "" : address, msg); } g_free_not_null(freemsg); }
static void ctcp_default_reply(const char *data, IRC_SERVER_REC *server, const char *nick, const char *addr, const char *target) { char *ptr, *str; g_return_if_fail(data != NULL); str = g_strdup(data); ptr = strchr(str, ' '); if (ptr != NULL) *ptr++ = '\0'; else ptr = ""; printformat(server, ischannel(*target) ? target : nick, MSGLEVEL_CTCPS, ischannel(*target) ? IRCTXT_CTCP_REPLY_CHANNEL : IRCTXT_CTCP_REPLY, str, nick, ptr, target); g_free(str); }
static void event_mode(const char *data, IRC_SERVER_REC *server, const char *nick, const char *addr) { char *params, *channel, *mode; g_return_if_fail(data != NULL); if (nick == NULL) nick = server->real_address; params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &channel, &mode); if (ignore_check(SERVER(server), nick, addr, channel, mode, MSGLEVEL_MODES)) { g_free(params); return; } if (!ischannel(*channel)) { /* user mode change */ printformat(server, NULL, MSGLEVEL_MODES, IRCTXT_USERMODE_CHANGE, mode, channel); } else if (addr == NULL) { /* channel mode changed by server */ printformat(server, channel, MSGLEVEL_MODES, IRCTXT_SERVER_CHANMODE_CHANGE, channel, mode, nick); } else { /* channel mode changed by normal user */ printformat(server, channel, MSGLEVEL_MODES, IRCTXT_CHANMODE_CHANGE, channel, mode, nick); } g_free(params); }
static void cmd_channel(const char *data, SERVER_REC *server) { if (ischannel(*data)) { signal_emit("command join", 2, data, server); signal_stop(); } }
static void sig_message_own_action(IRC_SERVER_REC *server, const char *msg, const char *target) { void *item; if (ischannel(*target)) item = irc_channel_find(server, target); else item = irc_query_find(server, target); printformat(server, target, MSGLEVEL_ACTIONS | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT | (ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS), item != NULL ? IRCTXT_OWN_ACTION : IRCTXT_OWN_ACTION_TARGET, server->nick, msg, target); }
static const char *skip_target(IRC_SERVER_REC *server, const char *target) { int i = 0; const char *val, *chars; /* Quick check */ if (server == NULL || server->prefix[(int)(unsigned char)*target] == 0) return target; /* Hack: for bahamut 1.4 which sends neither STATUSMSG nor * WALLCHOPS in 005, accept @#chan and @+#chan (but not +#chan) */ val = g_hash_table_lookup(server->isupport, "STATUSMSG"); if (val == NULL && *target != '@') return target; chars = val ? val : "@+"; for(i = 0; target[i] != '\0'; i++) { if (strchr(chars, target[i]) == NULL) break; }; if(ischannel(target[i])) target += i; return target; }
static void command_set_ban(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item, int set, int ban_type) { IRC_CHANNEL_REC *chanrec; char *channel, *nicks; void *free_arg; g_return_if_fail(data != NULL); if (server == NULL || !server->connected || !IS_IRC_SERVER(server)) cmd_return_error(CMDERR_NOT_CONNECTED); if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTCHAN | PARAM_FLAG_GETREST, item, &channel, &nicks)) return; if (!ischannel(*channel)) cmd_param_error(CMDERR_NOT_JOINED); if (*nicks == '\0') { if (strcmp(data, "*") != 0) cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); /* /BAN * or /UNBAN * - ban/unban everyone */ nicks = (char *) data; } chanrec = irc_channel_find(server, channel); if (chanrec == NULL) cmd_param_error(CMDERR_CHAN_NOT_FOUND); if (set) ban_set(chanrec, nicks, ban_type); else ban_remove(chanrec, nicks); cmd_params_free(free_arg); }
static void sig_message_irc_ctcp(IRC_SERVER_REC *server, const char *cmd, const char *data, const char *nick, const char *addr, const char *target) { printformat(server, ischannel(*target) ? target : nick, MSGLEVEL_CTCPS, IRCTXT_CTCP_REQUESTED, nick, addr, cmd, data, target); }
/* * Decrypt NOTICE messages (and forward DH1080 key-exchange) */ void decrypt_notice(SERVER_REC * server, char *msg, char *nick, char *address, char *target) { GString *decrypted; char *DH1024warn; if (strncmp(msg, "DH1024_", 7) == 0) { DH1024warn = "\002FiSH:\002 Received \002old DH1024\002 public key from you! Please update to latest version: https://github.com/falsovsky/FiSH-irssi"; signal_stop(); irc_send_cmdv((IRC_SERVER_REC *) server, "NOTICE %s :%s\n", nick, DH1024warn); signal_emit("message irc own_notice", 3, server, DH1024warn, nick); return; } if (strncmp(msg, "DH1080_", 7) == 0) { DH1080_received(server, msg, nick, address, target); return; } #ifdef FiSH_DECRYPT_ZNC_LOGS if (IsZNCtimestamp(msg)) msg += 11; #endif decrypted = g_string_new(""); if (FiSH_decrypt(server, msg, ischannel(*target) ? target : nick, decrypted)) { signal_continue(5, server, decrypted->str, nick, address, target); ZeroMemory(decrypted->str, decrypted->len); } g_string_free(decrypted, TRUE); }
static void event_target_unavailable(IRC_SERVER_REC *server, const char *data, const char *nick, const char *addr) { IRC_CHANNEL_REC *chanrec; char *params, *target; g_return_if_fail(data != NULL); params = event_get_params(data, 2, NULL, &target); if (!ischannel(*target)) { /* nick unavailable */ printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_NICK_UNAVAILABLE, target); } else { chanrec = irc_channel_find(server, target); if (chanrec != NULL && chanrec->joined) { /* dalnet - can't change nick while being banned */ print_event_received(server, data, nick, FALSE); } else { /* channel is unavailable. */ printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_JOINERROR_UNAVAIL, target); } } g_free(params); }
void do_rkicksay(COMMAND_ARGS) { /* * on_msg checks: CARGS */ KickSay *kick; char *channel; channel = chop(&rest); /* cant be NULL (CARGS) */ if (!ischannel(channel) && *channel != '*') goto usage; if (!*rest) goto usage; if (!(kick = find_kicksay(rest,channel))) { to_user(from,"I'm not kicking on that"); return; } to_user(from,"No longer kicking on %s",kick->mask); remove_kicksay(kick); current->ul_save++; return; usage: usage(from); /* usage for CurrentCmd->name */ }
/* FIXME: should be moved to fe-common/core/fe-messages.c.. */ static void sig_message_mode(IRC_SERVER_REC *server, const char *channel, const char *nick, const char *addr, const char *mode) { if (nick == NULL) nick = server->real_address; if (ignore_check(SERVER(server), nick, addr, channel, mode, MSGLEVEL_MODES)) return; if (!ischannel(*channel)) { /* user mode change */ printformat(server, NULL, MSGLEVEL_MODES, IRCTXT_USERMODE_CHANGE, mode, channel); } else if (addr == NULL) { /* channel mode changed by server */ printformat(server, channel, MSGLEVEL_MODES, IRCTXT_SERVER_CHANMODE_CHANGE, channel, mode, nick); } else { /* channel mode changed by normal user */ IRC_CHANNEL_REC *chanrec; chanrec = !group_multi_mode ? NULL : irc_channel_find(server, channel); if (chanrec != NULL) msg_multi_mode(chanrec, nick, addr, mode); else { printformat(server, channel, MSGLEVEL_MODES, IRCTXT_CHANMODE_CHANGE, channel, mode, nick); } } }
static void event_privmsg(const char *data, IRC_SERVER_REC *server, const char *nick) { char *params, *target, *msg; GSList **list; g_return_if_fail(server != NULL); if (nick == NULL) return; /* from server */ params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg); if (ischannel(*target)) { /* channel message */ CHANNEL_REC *channel; channel = channel_find(server, target); if (channel == NULL) { g_free(params); return; } list = irc_nick_match(server->nick, msg) ? &channel->lastownmsgs : &channel->lastmsgs; nick_completion_create(list, time(NULL), nick); } else { /* private message */ add_private_msg(server, nick); } g_free(params); }
void cmd_keyx(const char *target, SERVER_REC * server, WI_ITEM_REC * item) { if (IsNULLorEmpty(target)) { if (item != NULL) target = window_item_get_target(item); else { printtext(NULL, NULL, MSGLEVEL_CRAP, "\002FiSH:\002 Please define nick/#channel. Usage: /keyx <nick/#channel>"); return; } } if (ischannel(*target)) { printtext(server, target, MSGLEVEL_CRAP, "\002FiSH:\002 KeyXchange does not work for channels!"); return; } DH1080_gen(g_myPrivKey, g_myPubKey); irc_send_cmdv((IRC_SERVER_REC *) server, "NOTICE %s :%s %s", target, "DH1080_INIT", g_myPubKey); printtext(server, item != NULL ? window_item_get_target(item) : NULL, MSGLEVEL_CRAP, "\002FiSH:\002 Sent my DH1080 public key to %s, waiting for reply ...", target); }
static void event_privmsg(const char *data, IRC_SERVER_REC *server, const char *nick, const char *address) { char *params, *target, *msg, *args, *str; g_return_if_fail(data != NULL); params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg); if (ischannel(*target)) { g_free(params); return; } /* private message for us */ str = g_strconcat("bot command ", msg, NULL); args = strchr(str+12, ' '); if (args != NULL) *args++ = '\0'; else args = ""; g_strdown(str); if (signal_emit(str, 4, args, server, nick, address)) { /* msg was a command - the msg event. */ signal_stop(); } g_free(str); g_free(params); }
void decrypt_action(SERVER_REC * server, char *msg, char *nick, char *address, char *target) { if (target == NULL) return; FiSH_decrypt(server, msg, msg, ischannel(*target) ? target : nick); }
static void dcc_request(CHAT_DCC_REC *dcc) { if (!IS_DCC_CHAT(dcc)) return; printformat(dcc->server, NULL, MSGLEVEL_DCC, ischannel(*dcc->target) ? IRCTXT_DCC_CHAT_CHANNEL : IRCTXT_DCC_CHAT, dcc->id, dcc->addrstr, dcc->port, dcc->target); }
static void dcc_request(GET_DCC_REC *dcc) { if (!IS_DCC_GET(dcc)) return; printformat(dcc->server, NULL, MSGLEVEL_DCC, ischannel(*dcc->target) ? IRCTXT_DCC_SEND_CHANNEL : IRCTXT_DCC_SEND, dcc->nick, dcc->addrstr, dcc->port, dcc->arg, dcc->size, dcc->target); }
static void event_privmsg(const char *data, IRC_SERVER_REC *server, const char *nick, const char *addr) { WINDOW_REC *window; WI_ITEM_REC *item; char *params, *target, *msg; int level; g_return_if_fail(data != NULL); params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg); /* get window and window item */ level = ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS; item = window_item_find(server, ischannel(*target) ? target : nick); window = item == NULL ? window_find_closest(server, target, GPOINTER_TO_INT(level)) : window_item_window(item); /* check that msg wasn't send to current window and that it didn't get ignored */ if (window != active_win && !ignore_check(server, nick, addr, target, msg, level)) { /* hilight */ if (item != NULL) item->last_color = irc_hilight_last_color(); level = (item != NULL && item->last_color > 0) || !ischannel(*target) || irc_nick_match(server->nick, msg) ? NEWDATA_HILIGHT : NEWDATA_MSG; if (item != NULL && item->new_data < level) { item->new_data = level; signal_emit("window item hilight", 1, item); } else { int oldlevel = window->new_data; if (window->new_data < level) { window->new_data = level; window->last_color = irc_hilight_last_color(); signal_emit("window hilight", 2, window, GINT_TO_POINTER(oldlevel)); } signal_emit("window activity", 2, window, GINT_TO_POINTER(oldlevel)); } } g_free(params); }
static void sig_message_irc_notice(SERVER_REC *server, const char *msg, const char *nick, const char *address, const char *target) { const char *oldtarget; int level = MSGLEVEL_NOTICES; oldtarget = target; target = skip_target(IRC_SERVER(server), target); if (address == NULL || *address == '\0') { /* notice from server */ if (!ignore_check(server, nick, "", target, msg, MSGLEVEL_SNOTES)) { printformat(server, target, MSGLEVEL_SNOTES, IRCTXT_NOTICE_SERVER, nick, msg); } return; } if (ignore_check(server, nick, address, ischannel(*target) ? target : NULL, msg, level)) return; if (ignore_check(server, nick, address, ischannel(*target) ? target : NULL, msg, level | MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; if (ischannel(*target)) { /* notice in some channel */ printformat(server, target, level, IRCTXT_NOTICE_PUBLIC, nick, oldtarget, msg); } else { /* private notice */ privmsg_get_query(SERVER(server), nick, FALSE, MSGLEVEL_NOTICES); printformat(server, nick, level, IRCTXT_NOTICE_PRIVATE, nick, address, msg); } }
static void ctcp_print(const char *pre, const char *data, IRC_SERVER_REC *server, const char *nick, const char *addr, const char *target) { char *str; g_return_if_fail(data != NULL); str = g_strconcat(pre, " ", data, NULL); printformat(server, ischannel(*target) ? target : nick, MSGLEVEL_CTCPS, IRCTXT_CTCP_REQUESTED, nick, addr, str, target); g_free(str); }
static void event_notice(const char *data, IRC_SERVER_REC *server, const char *nick, const char *addr) { char *params, *target, *msg; int op_notice; g_return_if_fail(data != NULL); params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg); if (nick == NULL) { nick = server->real_address == NULL ? server->connrec->address : server->real_address; } if (addr == NULL) { /* notice from server */ if (*msg != 1 && !ignore_check(SERVER(server), nick, "", target, msg, MSGLEVEL_SNOTES)) printformat(server, target, MSGLEVEL_SNOTES, IRCTXT_NOTICE_SERVER, nick, msg); } else { op_notice = *target == '@' && ischannel(target[1]); if (op_notice) target++; if (ignore_check(SERVER(server), nick, addr, ischannel(*target) ? target : NULL, msg, MSGLEVEL_NOTICES)) return; if (ischannel(*target)) { /* notice in some channel */ printformat(server, target, MSGLEVEL_NOTICES, op_notice ? IRCTXT_NOTICE_PUBLIC_OPS : IRCTXT_NOTICE_PUBLIC, nick, target, msg); } else { /* private notice */ privmsg_get_query(SERVER(server), nick, FALSE, MSGLEVEL_NOTICES); printformat(server, nick, MSGLEVEL_NOTICES, IRCTXT_NOTICE_PRIVATE, nick, addr, msg); } } g_free(params); }
static void event_privmsg(IRC_SERVER_REC *server, const char *data, const char *nick, const char *addr) { char *params, *target, *msg, *recoded; char *chantypes; g_return_if_fail(data != NULL); params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg); if (nick == NULL) nick = server->real_address; if (addr == NULL) addr = ""; if ( (*target == '@' || *target == '+' || *target == '%') && ischannel(target[1]) && server && server->prefix[(unsigned char)*target] && ( (chantypes = g_hash_table_lookup(server->isupport, "CHANTYPES")) || (chantypes = "#&"), !strchr(chantypes, *target) ) ) { /* Hybrid 6 feature, send msg to all ops/voiced in channel */ recoded = recode_in(SERVER(server), msg, target+1); signal_emit(*target == '%' ? "message irc halfop_public" : *target == '+' ? "message irc voice_public" : "message irc op_public", 5, server, recoded, nick, addr, get_visible_target(server, target+1)); } else { recoded = recode_in(SERVER(server), msg, ischannel(*target) ? target : nick); signal_emit(ischannel(*target) ? "message public" : "message private", 5, server, recoded, nick, addr, get_visible_target(server, target)); } g_free(params); g_free(recoded); }
static void sig_message_own_action(IRC_SERVER_REC *server, const char *msg, const char *target) { void *item; char *freemsg = NULL; if (ischannel(*target)) item = irc_channel_find(server, target); else item = irc_query_find(server, target); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); printformat(server, target, MSGLEVEL_ACTIONS | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT | (ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS), item != NULL ? IRCTXT_OWN_ACTION : IRCTXT_OWN_ACTION_TARGET, server->nick, msg, target); g_free_not_null(freemsg); }
/* we use "ctcp msg" here because "ctcp msg action" can be ignored with /IGNORE * CTCPS, and we don't want that.. */ static void ctcp_msg_check_action(const char *data, IRC_SERVER_REC *server, const char *nick, const char *addr, const char *target) { void *item; int level; g_return_if_fail(data != NULL); if (g_strncasecmp(data, "ACTION ", 7) != 0) return; data += 7; level = MSGLEVEL_ACTIONS | (ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); if (ignore_check(SERVER(server), nick, addr, target, data, level)) return; if (ischannel(*target)) { /* channel action */ item = irc_channel_find(server, target); if (window_item_is_active(item)) { /* message to active channel in window */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC, nick, data); } else { /* message to not existing/active channel */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC_CHANNEL, nick, target, data); } } else { /* private action */ item = privmsg_get_query(SERVER(server), nick, FALSE, MSGLEVEL_MSGS); printformat(server, nick, level, item == NULL ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, addr == NULL ? "" : addr, data); } }
void decrypt_action(SERVER_REC * server, char *msg, char *nick, char *address, char *target) { GString *decrypted; if (target == NULL) return; decrypted = g_string_new(""); if (FiSH_decrypt(server, msg, ischannel(*target) ? target : nick, decrypted)) { signal_continue(5, server, decrypted->str, nick, address, target); ZeroMemory(decrypted->str, decrypted->len); } g_string_free(decrypted, TRUE); }