From a01bd83c64b76da028d3c23b743a61bbbc62a2d2 Mon Sep 17 00:00:00 2001 From: Diogo Sousa Date: Sat, 22 Jun 2013 16:48:05 +0100 Subject: [PATCH] Organized cap inbound code in inbound.c instead of proto-irc.c. --- src/common/inbound.c | 130 +++++++++++++++++++++++++++++++++++++++++ src/common/inbound.h | 9 ++- src/common/proto-irc.c | 127 ++++------------------------------------ 3 files changed, 148 insertions(+), 118 deletions(-) diff --git a/src/common/inbound.c b/src/common/inbound.c index 54c59ae4..070eb585 100644 --- a/src/common/inbound.c +++ b/src/common/inbound.c @@ -1522,3 +1522,133 @@ inbound_identified (server *serv) /* 'MODE +e MYSELF' on freenode */ check_autojoin_channels (serv); } } + +void +inbound_cap_ack (server *serv, char *nick, char *extensions, + const message_tags_data *tags_data) +{ + char *pass; /* buffer for SASL password */ + + EMIT_SIGNAL_TIMESTAMP (XP_TE_CAPACK, serv->server_session, nick, extensions, + NULL, NULL, 0, tags_data->timestamp); + + if (strstr (extensions, "identify-msg") != 0) + { + serv->have_idmsg = TRUE; + } + + if (strstr (extensions, "multi-prefix") != 0) + { + serv->have_namesx = TRUE; + } + + if (strstr (extensions, "away-notify") != 0) + { + serv->have_awaynotify = TRUE; + } + + if (strstr (extensions, "account-notify") != 0) + { + serv->have_accnotify = TRUE; + } + + if (strstr (extensions, "extended-join") != 0) + { + serv->have_extjoin = TRUE; + } + + if (strstr (extensions, "sasl") != 0) + { + char *user; + + serv->have_sasl = TRUE; + + user = (((ircnet *)serv->network)->user) + ? (((ircnet *)serv->network)->user) : prefs.hex_irc_user_name; + + EMIT_SIGNAL_TIMESTAMP (XP_TE_SASLAUTH, serv->server_session, user, NULL, + NULL, NULL, 0, tags_data->timestamp); + tcp_send_len (serv, "AUTHENTICATE PLAIN\r\n", 20); + + pass = encode_sasl_pass (user, serv->password); + tcp_sendf (serv, "AUTHENTICATE %s\r\n", pass); + free (pass); + } +} + +void +inbound_cap_ls (server *serv, char *nick, char *extensions, + const message_tags_data *tags_data) +{ + char buffer[256]; /* buffer for requesting capabilities and emitting the signal */ + guint32 want_cap; /* format the CAP REQ string based on previous capabilities being requested or not */ + guint32 want_sasl; /* CAP END shouldn't be sent when SASL is requested, it needs further responses */ + + EMIT_SIGNAL_TIMESTAMP (XP_TE_CAPLIST, serv->server_session, nick, extensions, + NULL, NULL, 0, tags_data->timestamp); + want_cap = 0; + want_sasl = 0; + + strcpy (buffer, "CAP REQ :"); + + if (strstr (extensions, "identify-msg") != 0) + { + strcat (buffer, "identify-msg "); + want_cap = 1; + } + if (strstr (extensions, "multi-prefix") != 0) + { + strcat (buffer, "multi-prefix "); + want_cap = 1; + } + if (strstr (extensions, "away-notify") != 0) + { + strcat (buffer, "away-notify "); + want_cap = 1; + } + if (strstr (extensions, "account-notify") != 0) + { + strcat (buffer, "account-notify "); + want_cap = 1; + } + if (strstr (extensions, "extended-join") != 0) + { + strcat (buffer, "extended-join "); + want_cap = 1; + } + /* if the SASL password is set AND auth mode is set to SASL, request SASL auth */ + if (strstr (extensions, "sasl") != 0 && strlen (serv->password) != 0 && serv->loginmethod == LOGIN_SASL) + { + strcat (buffer, "sasl "); + want_cap = 1; + want_sasl = 1; + } + + if (want_cap) + { + /* buffer + 9 = emit buffer without "CAP REQ :" */ + EMIT_SIGNAL_TIMESTAMP (XP_TE_CAPREQ, serv->server_session, + buffer + 9, NULL, NULL, NULL, 0, + tags_data->timestamp); + tcp_sendf (serv, "%s\r\n", buffer); + } + if (!want_sasl) + { + /* if we use SASL, CAP END is dealt via raw numerics */ + tcp_send_len (serv, "CAP END\r\n", 9); + } +} + +void +inbound_cap_nak (server *serv, const message_tags_data *tags_data) +{ + tcp_send_len (serv, "CAP END\r\n", 9); +} + +void +inbound_cap_list (server *serv, char *nick, char *extensions, + const message_tags_data *tags_data) +{ + EMIT_SIGNAL_TIMESTAMP (XP_TE_CAPACK, serv->server_session, nick, extensions, + NULL, NULL, 0, tags_data->timestamp); +} diff --git a/src/common/inbound.h b/src/common/inbound.h index 19820e78..5525f3ff 100644 --- a/src/common/inbound.h +++ b/src/common/inbound.h @@ -73,8 +73,15 @@ void inbound_privmsg (server *serv, char *from, char *ip, char *text, int id, void inbound_action (session *sess, char *chan, char *from, char *ip, char *text, int fromme, int id); void inbound_newnick (server *serv, char *nick, char *newnick, int quiet, const message_tags_data *tags_data); -void do_dns (session *sess, char *nick, char *host); void inbound_identified (server *serv); +void inbound_cap_ack (server *serv, char *nick, char *extensions, + const message_tags_data *tags_data); +void inbound_cap_ls (server *serv, char *nick, char *extensions, + const message_tags_data *tags_data); +void inbound_cap_nak (server *serv, const message_tags_data *tags_data); +void inbound_cap_list (server *serv, char *nick, char *extensions, + const message_tags_data *tags_data); +void do_dns (session *sess, char *nick, char *host); gboolean alert_match_word (char *word, char *masks); gboolean alert_match_text (char *text, char *masks); diff --git a/src/common/proto-irc.c b/src/common/proto-irc.c index 4b8c755c..72c73417 100644 --- a/src/common/proto-irc.c +++ b/src/common/proto-irc.c @@ -1216,10 +1216,6 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[], else if (len == 3) { guint32 t; - guint32 want_cap; /* format the CAP REQ string based on previous capabilities being requested or not */ - guint32 want_sasl; /* CAP END shouldn't be sent when SASL is requested, it needs further responses */ - char *pass; /* buffer for SASL password */ - char buffer[256]; /* buffer for requesting capabilities and emitting the signal */ t = WORDL((guint8)type[0], (guint8)type[1], (guint8)type[2], (guint8)type[3]); switch (t) @@ -1227,128 +1223,25 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[], case WORDL('C','A','P','\0'): if (strncasecmp (word[4], "ACK", 3) == 0) { - EMIT_SIGNAL_TIMESTAMP (XP_TE_CAPACK, sess->server->server_session, - word[1], word[5][0]==':' ? ++word_eol[5] : word_eol[5], - NULL, NULL, 0, - tags_data->timestamp); - - if (strstr (word_eol[5], "identify-msg") != 0) - { - serv->have_idmsg = TRUE; - } - - if (strstr (word_eol[5], "multi-prefix") != 0) - { - serv->have_namesx = TRUE; - } - - if (strstr (word_eol[5], "away-notify") != 0) - { - serv->have_awaynotify = TRUE; - } - - if (strstr (word_eol[5], "account-notify") != 0) - { - serv->have_accnotify = TRUE; - } - - if (strstr (word_eol[5], "extended-join") != 0) - { - serv->have_extjoin = TRUE; - } - - if (strstr (word_eol[5], "sasl") != 0) - { - serv->have_sasl = TRUE; - EMIT_SIGNAL_TIMESTAMP - ( - XP_TE_SASLAUTH, - serv->server_session, - (((ircnet *)sess->server->network)->user) ? (((ircnet *)sess->server->network)->user) : prefs.hex_irc_user_name, - NULL, - NULL, - NULL, - 0, - tags_data->timestamp - ); - tcp_send_len (serv, "AUTHENTICATE PLAIN\r\n", 20); - - pass = encode_sasl_pass - ( - (((ircnet *)sess->server->network)->user) ? (((ircnet *)sess->server->network)->user) : prefs.hex_irc_user_name, - sess->server->password - ); - tcp_sendf (sess->server, "AUTHENTICATE %s\r\n", pass); - free (pass); - } + inbound_cap_ack (serv, word[1], + word[5][0] == ':' ? word_eol[5] + 1 : word_eol[5], + tags_data); } else if (strncasecmp (word[4], "LS", 2) == 0) { - EMIT_SIGNAL_TIMESTAMP (XP_TE_CAPLIST, serv->server_session, word[1], - word[5][0]==':' ? ++word_eol[5] : word_eol[5], - NULL, NULL, 0, - tags_data->timestamp); - want_cap = 0; - want_sasl = 0; - - strcpy (buffer, "CAP REQ :"); - - if (strstr (word_eol[5], "identify-msg") != 0) - { - strcat (buffer, "identify-msg "); - want_cap = 1; - } - if (strstr (word_eol[5], "multi-prefix") != 0) - { - strcat (buffer, "multi-prefix "); - want_cap = 1; - } - if (strstr (word_eol[5], "away-notify") != 0) - { - strcat (buffer, "away-notify "); - want_cap = 1; - } - if (strstr (word_eol[5], "account-notify") != 0) - { - strcat (buffer, "account-notify "); - want_cap = 1; - } - if (strstr (word_eol[5], "extended-join") != 0) - { - strcat (buffer, "extended-join "); - want_cap = 1; - } - /* if the SASL password is set AND auth mode is set to SASL, request SASL auth */ - if (strstr (word_eol[5], "sasl") != 0 && strlen (sess->server->password) != 0 && serv->loginmethod == LOGIN_SASL) - { - strcat (buffer, "sasl "); - want_cap = 1; - want_sasl = 1; - } - - if (want_cap) - { - /* buffer + 9 = emit buffer without "CAP REQ :" */ - EMIT_SIGNAL_TIMESTAMP (XP_TE_CAPREQ, sess->server->server_session, - buffer + 9, NULL, NULL, NULL, 0, - tags_data->timestamp); - tcp_sendf (serv, "%s\r\n", buffer); - } - if (!want_sasl) - { - /* if we use SASL, CAP END is dealt via raw numerics */ - tcp_send_len (serv, "CAP END\r\n", 9); - } + inbound_cap_ls (serv, word[1], + word[5][0] == ':' ? word_eol[5] + 1 : word_eol[5], + tags_data); } else if (strncasecmp (word[4], "NAK", 3) == 0) { - tcp_send_len (serv, "CAP END\r\n", 9); + inbound_cap_nak (serv, tags_data); } else if (strncasecmp (word[4], "LIST", 4) == 0) { - EMIT_SIGNAL_TIMESTAMP (XP_TE_CAPACK, sess->server->server_session, - word[1], word[5][0]==':' ? ++word_eol[5] : word_eol[5], - NULL, NULL, 0, tags_data->timestamp); + inbound_cap_list (serv, word[1], + word[5][0] == ':' ? word_eol[5] + 1 : word_eol[5], + tags_data); } return;