Moved SASL PLAIN authentication to own function

This commit is contained in:
Patrick Okraku 2023-11-01 17:15:23 +01:00 committed by Patrick Griffis
parent 44d14a436b
commit 50ca0d5b09

View File

@ -1901,6 +1901,38 @@ inbound_cap_list (server *serv, char *nick, char *extensions,
NULL, NULL, 0, tags_data->timestamp); NULL, NULL, 0, tags_data->timestamp);
} }
static void
plain_authenticate(server *serv, char *user, char *password)
{
char *pass = encode_sasl_pass_plain (user, password);
if (pass == NULL)
{
/* something went wrong abort */
tcp_sendf (serv, "AUTHENTICATE *\r\n");
return;
}
/* long SASL passwords must be split into 400-byte chunks
https://ircv3.net/specs/extensions/sasl-3.1#the-authenticate-command */
size_t pass_len = strlen (pass);
if (pass_len <= 400)
tcp_sendf (serv, "AUTHENTICATE %s\r\n", pass);
else
{
size_t sent = 0;
while (sent < pass_len)
{
char *pass_chunk = g_strndup (pass + sent, 400);
tcp_sendf (serv, "AUTHENTICATE %s\r\n", pass_chunk);
sent += 400;
g_free (pass_chunk);
}
}
if (pass_len % 400 == 0)
tcp_sendf (serv, "AUTHENTICATE +\r\n");
}
void void
inbound_sasl_authenticate (server *serv, char *data) inbound_sasl_authenticate (server *serv, char *data)
{ {
@ -1921,43 +1953,15 @@ inbound_sasl_authenticate (server *serv, char *data)
switch (serv->sasl_mech) switch (serv->sasl_mech)
{ {
case MECH_PLAIN: case MECH_PLAIN:
pass = encode_sasl_pass_plain (user, serv->password); plain_authenticate(serv, user, serv->password);
break; break;
#ifdef USE_OPENSSL #ifdef USE_OPENSSL
case MECH_EXTERNAL: case MECH_EXTERNAL:
pass = g_strdup ("+"); tcp_sendf (serv, "AUTHENTICATE +\r\n");
break; break;
#endif #endif
} }
if (pass == NULL)
{
/* something went wrong abort */
tcp_sendf (serv, "AUTHENTICATE *\r\n");
return;
}
/* long SASL passwords must be split into 400-byte chunks
https://ircv3.net/specs/extensions/sasl-3.1#the-authenticate-command */
size_t pass_len = strlen (pass);
if (pass_len <= 400)
tcp_sendf (serv, "AUTHENTICATE %s\r\n", pass);
else
{
size_t sent = 0;
while (sent < pass_len)
{
char *pass_chunk = g_strndup (pass + sent, 400);
tcp_sendf (serv, "AUTHENTICATE %s\r\n", pass_chunk);
sent += 400;
g_free (pass_chunk);
}
}
if (pass_len % 400 == 0)
tcp_sendf (serv, "AUTHENTICATE +\r\n");
g_free (pass);
EMIT_SIGNAL_TIMESTAMP (XP_TE_SASLAUTH, serv->server_session, user, (char*)mech, EMIT_SIGNAL_TIMESTAMP (XP_TE_SASLAUTH, serv->server_session, user, (char*)mech,
NULL, NULL, 0, 0); NULL, NULL, 0, 0);
} }