diff -r 97dc0963df2d -r 7f43656ee445 libpurple/protocols/irc/irc.c --- a/libpurple/protocols/irc/irc.c Sun Jan 13 14:51:04 2013 -0600 +++ b/libpurple/protocols/irc/irc.c Sun Jan 13 14:53:18 2013 -0600 @@ -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; @@ -393,9 +394,17 @@ const char *username, *realname; struct irc_conn *irc = purple_connection_get_protocol_data(gc); 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; @@ -529,6 +538,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); } @@ -1047,6 +1067,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");