diff --git a/src/common/inbound.c b/src/common/inbound.c index ef26890b..645cc824 100644 --- a/src/common/inbound.c +++ b/src/common/inbound.c @@ -1699,20 +1699,37 @@ inbound_cap_ack (server *serv, char *nick, char *extensions, } } +static const char * const supported_caps[] = { + "identify-msg", + + /* IRCv3.1 */ + "multi-prefix", + "away-notify", + "account-notify", + "extended-join", + /* "sasl", Handled manually */ + + /* IRCv3.2 */ + "server-time" + "userhost-in-names", + + /* ZNC */ + "znc.in/server-time-iso", + "znc.in/server-time", +}; + void inbound_cap_ls (server *serv, char *nick, char *extensions_str, 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 */ + gboolean want_cap = FALSE; /* format the CAP REQ string based on previous capabilities being requested or not */ + gboolean want_sasl = FALSE; /* CAP END shouldn't be sent when SASL is requested, it needs further responses */ char **extensions; int i; EMIT_SIGNAL_TIMESTAMP (XP_TE_CAPLIST, serv->server_session, nick, extensions_str, NULL, NULL, 0, tags_data->timestamp); - want_cap = 0; - want_sasl = 0; extensions = g_strsplit (extensions_str, " ", 0); @@ -1721,66 +1738,27 @@ inbound_cap_ls (server *serv, char *nick, char *extensions_str, for (i=0; extensions[i]; i++) { const char *extension = extensions[i]; + gsize x; - if (!strcmp (extension, "identify-msg")) - { - strcat (buffer, "identify-msg "); - want_cap = 1; - } - if (!strcmp (extension, "multi-prefix")) - { - strcat (buffer, "multi-prefix "); - want_cap = 1; - } - if (!strcmp (extension, "away-notify")) - { - strcat (buffer, "away-notify "); - want_cap = 1; - } - if (!strcmp (extension, "account-notify")) - { - strcat (buffer, "account-notify "); - want_cap = 1; - } - if (!strcmp (extension, "extended-join")) - { - strcat (buffer, "extended-join "); - want_cap = 1; - } - if (!strcmp (extension, "userhost-in-names")) - { - strcat (buffer, "userhost-in-names "); - want_cap = 1; - } - - /* bouncers can prefix a name space to the extension so we should use. - * znc <= 1.0 uses "znc.in/server-time" and newer use "znc.in/server-time-iso". - */ - if (!strcmp (extension, "znc.in/server-time-iso")) - { - strcat (buffer, "znc.in/server-time-iso "); - want_cap = 1; - } - if (!strcmp (extension, "znc.in/server-time")) - { - strcat (buffer, "znc.in/server-time "); - want_cap = 1; - } - if (prefs.hex_irc_cap_server_time - && !strcmp (extension, "server-time")) - { - strcat (buffer, "server-time "); - want_cap = 1; - } - /* if the SASL password is set AND auth mode is set to SASL, request SASL auth */ - if (!strcmp (extension, "sasl") - && ((serv->loginmethod == LOGIN_SASL && strlen (serv->password) != 0) - || (serv->loginmethod == LOGIN_SASLEXTERNAL && serv->have_cert))) + if (!g_strcmp0 (extension, "sasl") && + ((serv->loginmethod == LOGIN_SASL && strlen (serv->password) != 0) + || (serv->loginmethod == LOGIN_SASLEXTERNAL && serv->have_cert))) { - strcat (buffer, "sasl "); - want_cap = 1; - want_sasl = 1; + want_cap = TRUE; + want_sasl = TRUE; + g_strlcat (buffer, "sasl ", sizeof(buffer)); + continue; + } + + for (x = 0; x < G_N_ELEMENTS(supported_caps); ++x) + { + if (!g_strcmp0 (extension, supported_caps[x])) + { + g_strlcat (buffer, extension, sizeof(buffer)); + g_strlcat (buffer, " ", sizeof(buffer)); + want_cap = TRUE; + } } }