diff --git a/src/common/proto-irc.c b/src/common/proto-irc.c index 1b20d17c..b8899855 100644 --- a/src/common/proto-irc.c +++ b/src/common/proto-irc.c @@ -28,8 +28,6 @@ #include #endif -#include - #include "hexchat.h" #include "ctcp.h" #include "fe.h" @@ -1132,9 +1130,7 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[]) else if (len == 3) { guint32 t; - int passlen; - char *encoded; - char *buffer; + char *pass; t = WORDL((guint8)type[0], (guint8)type[1], (guint8)type[2], (guint8)type[3]); switch (t) @@ -1152,18 +1148,9 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[]) PrintTextf (sess, "Authenticating via SASL as %s\n", sess->server->sasluser); tcp_send_len (serv, "AUTHENTICATE PLAIN\r\n", 20); - /* passphrase generation, nicely copy-pasted from the SASL plugin */ - passlen = strlen (sess->server->sasluser) * 2 + 2 + strlen (sess->server->saslpassword); - buffer = (char*) malloc (passlen + 1); - strcpy (buffer, sess->server->sasluser); - strcpy (buffer + strlen (sess->server->sasluser) + 1, sess->server->sasluser); - strcpy (buffer + strlen (sess->server->sasluser) * 2 + 2, sess->server->saslpassword); - encoded = g_base64_encode ((unsigned char*) buffer, passlen); - - tcp_sendf (sess->server, "AUTHENTICATE %s\r\n", encoded); - - free (encoded); - free (buffer); + pass = encode_sasl_pass (sess->server->sasluser, sess->server->saslpassword); + tcp_sendf (sess->server, "AUTHENTICATE %s\r\n", pass); + free (pass); } } else if (strncasecmp (word[4], "LS", 2) == 0) diff --git a/src/common/util.c b/src/common/util.c index 5120c25a..f05a2c9e 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -1966,3 +1966,23 @@ get_subdirs (const char *path) return dirlist; } + +char * +encode_sasl_pass (char *user, char *pass) +{ + int passlen; + char *buffer; + char *encoded; + + /* passphrase generation, nicely copy-pasted from the CAP-SASL plugin */ + passlen = strlen (user) * 2 + 2 + strlen (pass); + buffer = (char*) malloc (passlen + 1); + strcpy (buffer, user); + strcpy (buffer + strlen (user) + 1, user); + strcpy (buffer + strlen (user) * 2 + 2, pass); + encoded = g_base64_encode ((unsigned char*) buffer, passlen); + + free (buffer); + + return encoded; +} diff --git a/src/common/util.h b/src/common/util.h index 484cd617..d2e8e84e 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -61,5 +61,6 @@ void canonalize_key (char *key); int portable_mode (); int hextray_mode (); GSList *get_subdirs (const char *path); +char *encode_sasl_pass (char *user, char *pass); #endif