]> jfr.im git - irc/irssi/irssi.git/commitdiff
Add an option to stop the connection when SASL fails.
authorLemonBoy <redacted>
Tue, 12 Jul 2016 11:59:46 +0000 (13:59 +0200)
committerLemonBoy <redacted>
Mon, 12 Dec 2016 20:41:06 +0000 (21:41 +0100)
src/fe-common/irc/fe-sasl.c
src/irc/core/irc-servers.h
src/irc/core/sasl.c

index 331b38b0dd799525c92bc809a350dd7531f9b6d0..dfbfc84ac401e2cf855ec68a1661861225c4bbd2 100644 (file)
@@ -23,6 +23,9 @@
 #include "signals.h"
 #include "levels.h"
 
+#include "irc-servers.h"
+#include "settings.h"
+
 #include "printtext.h"
 
 static void sig_sasl_success(IRC_SERVER_REC *server)
@@ -35,14 +38,28 @@ static void sig_sasl_failure(IRC_SERVER_REC *server, const char *reason)
        printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_SASL_ERROR, reason);
 }
 
+static void sig_cap_end(IRC_SERVER_REC *server)
+{
+       /* The negotiation has now been terminated, if we didn't manage to
+        * authenticate successfully with the server just disconnect. */
+       if (server->sasl_success == FALSE &&
+           settings_get_bool("sasl_disconnect_on_failure"))
+               server_disconnect(SERVER(server));
+
+}
+
 void fe_sasl_init(void)
 {
+       settings_add_bool("server", "sasl_disconnect_on_failure", TRUE);
+
        signal_add("server sasl success", (SIGNAL_FUNC) sig_sasl_success);
        signal_add("server sasl failure", (SIGNAL_FUNC) sig_sasl_failure);
+       signal_add_first("server cap end", (SIGNAL_FUNC) sig_cap_end);
 }
 
 void fe_sasl_deinit(void)
 {
        signal_remove("server sasl success", (SIGNAL_FUNC) sig_sasl_success);
        signal_remove("server sasl failure", (SIGNAL_FUNC) sig_sasl_failure);
+       signal_remove("server cap end", (SIGNAL_FUNC) sig_cap_end);
 }
index bb100f86645f279ecbf799a42dd8428a785cda42..09f3f81dbfc4f6ada1797a68aeb8e07425ae5811 100644 (file)
@@ -68,6 +68,7 @@ struct _IRC_SERVER_REC {
        unsigned int motd_got:1; /* We've received MOTD */
        unsigned int isupport_sent:1; /* Server has sent us an isupport reply */
        unsigned int cap_complete:1; /* We've done the initial CAP negotiation */
+       unsigned int sasl_success:1; /* Did we authenticate successfully ? */
 
        int max_kicks_in_cmd; /* max. number of people to kick with one /KICK command */
        int max_modes_in_cmd; /* max. number of mode changes in one /MODE command */
index a1c16cdd70853cac7ce48a8b7583733eeddfac48..1021bea4a12d293adbd85a5967e7de1bbfb37e6f 100644 (file)
@@ -48,6 +48,7 @@ static gboolean sasl_timeout(IRC_SERVER_REC *server)
        cap_finish_negotiation(server);
 
        server->sasl_timeout = 0;
+       server->sasl_success = FALSE;
 
        signal_emit("server sasl failure", 2, server, "The authentication timed out");
 
@@ -84,6 +85,8 @@ static void sasl_fail(IRC_SERVER_REC *server, const char *data, const char *from
 
        params = event_get_params(data, 2, NULL, &error);
 
+       server->sasl_success = FALSE;
+
        signal_emit("server sasl failure", 2, server, error);
 
        /* Terminate the negotiation */
@@ -99,6 +102,8 @@ static void sasl_already(IRC_SERVER_REC *server, const char *data, const char *f
                server->sasl_timeout = 0;
        }
 
+       server->sasl_success = TRUE;
+
        signal_emit("server sasl success", 1, server);
 
        /* We're already authenticated, do nothing */
@@ -112,6 +117,8 @@ static void sasl_success(IRC_SERVER_REC *server, const char *data, const char *f
                server->sasl_timeout = 0;
        }
 
+       server->sasl_success = TRUE;
+
        signal_emit("server sasl success", 1, server);
 
        /* The authentication succeeded, time to finish the CAP negotiation */