diff -r a7dab773e3f6 -r bbd52f93184e libpurple/protocols/irc/irc.c --- a/libpurple/protocols/irc/irc.c Wed Sep 19 22:57:46 2012 -0400 +++ b/libpurple/protocols/irc/irc.c Tue Sep 25 22:58:51 2012 +0200 @@ -155,6 +155,7 @@ char *tosend= g_strdup(buf); purple_signal_emit(_irc_plugin, "irc-sending-text", purple_account_get_connection(irc->account), &tosend); + if (tosend == NULL) return 0; @@ -392,9 +393,17 @@ const char *username, *realname; struct irc_conn *irc = gc->proto_data; const char *pass = purple_connection_get_password(gc); +#ifdef HAVE_CYRUS_SASL + const gboolean use_sasl = purple_account_get_bool(irc->account, "sasl", FALSE); +#endif if (pass && *pass) { - buf = irc_format(irc, "v:", "PASS", pass); +#ifdef HAVE_CYRUS_SASL + if (use_sasl) + buf = irc_format(irc, "vv:", "CAP", "REQ", "sasl"); + else /* intended to fall through */ +#endif + buf = irc_format(irc, "v:", "PASS", pass); if (irc_send(irc, buf) < 0) { g_free(buf); return FALSE; @@ -526,6 +535,17 @@ g_free(irc->mode_chars); g_free(irc->reqnick); +#ifdef HAVE_CYRUS_SASL + if (irc->sasl_conn) { + sasl_dispose(&irc->sasl_conn); + irc->sasl_conn = NULL; + } + g_free(irc->sasl_cb); + if(irc->sasl_mechs) + g_string_free(irc->sasl_mechs, TRUE); +#endif + + g_free(irc); } @@ -1045,6 +1065,16 @@ option = purple_account_option_bool_new(_("Use SSL"), "ssl", FALSE); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); +#ifdef HAVE_CYRUS_SASL + option = purple_account_option_bool_new(_("Authenticate with SASL"), "sasl", FALSE); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); + + option = purple_account_option_bool_new( + _("Allow plaintext SASL auth over unencrypted connection"), + "auth_plain_in_clear", FALSE); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); +#endif + _irc_plugin = plugin; purple_prefs_remove("/plugins/prpl/irc/quitmsg");