From 72b224213537d3a42fe15d4fecd3241d2c97f617 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Sun, 12 Oct 2025 16:11:33 +0200 Subject: [PATCH] irc: send SASL username with mechanism EXTERNAL (closes #2270) The SASL username is sent if set, otherwise "+" is still sent. --- CHANGELOG.md | 1 + src/plugins/irc/irc-protocol.c | 2 +- src/plugins/irc/irc-sasl.c | 29 ++++++++++++++++++++++++ src/plugins/irc/irc-sasl.h | 1 + tests/unit/plugins/irc/test-irc-sasl.cpp | 15 ++++++++++++ 5 files changed, 47 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61e3d7eec..33cff60a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ SPDX-License-Identifier: GPL-3.0-or-later - api: add support of date like ISO 8601 but with spaces and lower `t` and `z` in function util_parse_time ([#886](https://github.com/weechat/weechat/issues/886)) - irc: request and perform SASL authentication when the server advertises SASL support with message "CAP NEW" ([#2277](https://github.com/weechat/weechat/issues/2277)) +- irc: send SASL username with mechanism EXTERNAL ([#2270](https://github.com/weechat/weechat/issues/2270)) - logger: change default time format to `%@%F %T.%fZ` (UTC) ([#886](https://github.com/weechat/weechat/issues/886)) - logger: use function util_parse_time to parse date/time in log files ([#886](https://github.com/weechat/weechat/issues/886)) - xfer: add buffer local variable "server" in DCC CHAT buffers diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c index 99d466ec2..fd9c10acc 100644 --- a/src/plugins/irc/irc-protocol.c +++ b/src/plugins/irc/irc-protocol.c @@ -591,7 +591,7 @@ IRC_PROTOCOL_CALLBACK(authenticate) sasl_username, sasl_key, &sasl_error); break; case IRC_SASL_MECHANISM_EXTERNAL: - answer = strdup ("+"); + answer = irc_sasl_mechanism_external (sasl_username); break; } if (answer) diff --git a/src/plugins/irc/irc-sasl.c b/src/plugins/irc/irc-sasl.c index f402f4884..1852c2506 100644 --- a/src/plugins/irc/irc-sasl.c +++ b/src/plugins/irc/irc-sasl.c @@ -684,3 +684,32 @@ irc_sasl_mechanism_ecdsa_nist256p_challenge (struct t_irc_server *server, return answer_base64; } + +/* + * Builds answer for SASL authentication, using mechanism "EXTERNAL". + * + * Note: result must be freed after use. + */ + +char * +irc_sasl_mechanism_external (const char *sasl_username) +{ + char *answer_base64; + int length; + + if (!sasl_username || !sasl_username[0]) + return strdup ("+"); + + length = strlen (sasl_username); + answer_base64 = malloc ((length * 4) + 1); + if (answer_base64) + { + if (weechat_string_base_encode ("64", sasl_username, length, answer_base64) < 0) + { + free (answer_base64); + answer_base64 = NULL; + } + } + + return answer_base64; +} diff --git a/src/plugins/irc/irc-sasl.h b/src/plugins/irc/irc-sasl.h index 3f65dd401..d8d40e3b1 100644 --- a/src/plugins/irc/irc-sasl.h +++ b/src/plugins/irc/irc-sasl.h @@ -56,5 +56,6 @@ extern char *irc_sasl_mechanism_ecdsa_nist256p_challenge (struct t_irc_server *s const char *sasl_username, const char *sasl_key, char **sasl_error); +extern char *irc_sasl_mechanism_external (const char *sasl_username); #endif /* WEECHAT_PLUGIN_IRC_SASL_H */ diff --git a/tests/unit/plugins/irc/test-irc-sasl.cpp b/tests/unit/plugins/irc/test-irc-sasl.cpp index b87c7cbb4..ca082a9f2 100644 --- a/tests/unit/plugins/irc/test-irc-sasl.cpp +++ b/tests/unit/plugins/irc/test-irc-sasl.cpp @@ -114,3 +114,18 @@ TEST(IrcSasl, MechanismEcdsaNist256pChallenge) { /* TODO: write tests */ } + +/* + * Tests functions: + * irc_sasl_mechanism_external + */ + +TEST(IrcSasl, MechanismExternal) +{ + char *str; + + WEE_TEST_STR("+", irc_sasl_mechanism_external (NULL)); + WEE_TEST_STR("+", irc_sasl_mechanism_external ("")); + + WEE_TEST_STR("YWxpY2U=", irc_sasl_mechanism_external ("alice")); +}