Clean up handling CAP LS

This commit is contained in:
Patrick Griffis 2016-01-28 15:18:15 -05:00
parent 5c534ac344
commit 4e061a43b3
1 changed files with 39 additions and 61 deletions

View File

@ -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 void
inbound_cap_ls (server *serv, char *nick, char *extensions_str, inbound_cap_ls (server *serv, char *nick, char *extensions_str,
const message_tags_data *tags_data) const message_tags_data *tags_data)
{ {
char buffer[256]; /* buffer for requesting capabilities and emitting the signal */ 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 */ gboolean want_cap = FALSE; /* 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_sasl = FALSE; /* CAP END shouldn't be sent when SASL is requested, it needs further responses */
char **extensions; char **extensions;
int i; int i;
EMIT_SIGNAL_TIMESTAMP (XP_TE_CAPLIST, serv->server_session, nick, EMIT_SIGNAL_TIMESTAMP (XP_TE_CAPLIST, serv->server_session, nick,
extensions_str, NULL, NULL, 0, tags_data->timestamp); extensions_str, NULL, NULL, 0, tags_data->timestamp);
want_cap = 0;
want_sasl = 0;
extensions = g_strsplit (extensions_str, " ", 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++) for (i=0; extensions[i]; i++)
{ {
const char *extension = extensions[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 the SASL password is set AND auth mode is set to SASL, request SASL auth */
if (!strcmp (extension, "sasl") if (!g_strcmp0 (extension, "sasl") &&
&& ((serv->loginmethod == LOGIN_SASL && strlen (serv->password) != 0) ((serv->loginmethod == LOGIN_SASL && strlen (serv->password) != 0)
|| (serv->loginmethod == LOGIN_SASLEXTERNAL && serv->have_cert))) || (serv->loginmethod == LOGIN_SASLEXTERNAL && serv->have_cert)))
{ {
strcat (buffer, "sasl "); want_cap = TRUE;
want_cap = 1; want_sasl = TRUE;
want_sasl = 1; 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;
}
} }
} }