summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/irc/irc-config.c37
-rw-r--r--src/plugins/irc/irc-mode.c44
-rw-r--r--src/plugins/irc/irc-mode.h1
-rw-r--r--src/plugins/irc/irc-protocol.c9
-rw-r--r--src/plugins/irc/irc-server.c13
-rw-r--r--src/plugins/irc/irc-server.h11
-rw-r--r--src/plugins/irc/irc-upgrade.c14
7 files changed, 129 insertions, 0 deletions
diff --git a/src/plugins/irc/irc-config.c b/src/plugins/irc/irc-config.c
index 5362ca468..57304bf38 100644
--- a/src/plugins/irc/irc-config.c
+++ b/src/plugins/irc/irc-config.c
@@ -34,6 +34,7 @@
#include "irc-channel.h"
#include "irc-ctcp.h"
#include "irc-ignore.h"
+#include "irc-mode.h"
#include "irc-msgbuffer.h"
#include "irc-nick.h"
#include "irc-notify.h"
@@ -1000,6 +1001,9 @@ irc_config_server_default_change_cb (const void *pointer, void *data,
else
irc_server_remove_away (ptr_server);
break;
+ case IRC_SERVER_OPTION_REGISTERED_MODE:
+ irc_mode_registered_mode_change (ptr_server);
+ break;
}
}
}
@@ -1218,6 +1222,20 @@ irc_config_server_check_value_cb (const void *pointer, void *data,
return 0;
}
break;
+ case IRC_SERVER_OPTION_REGISTERED_MODE:
+ if (!value || !value[0])
+ break;
+ /* Only one character should be accepted */
+ if (value[1])
+ {
+ weechat_printf (
+ NULL,
+ _("%s%s: invalid registered mode, must be a single "
+ "character"),
+ weechat_prefix ("error"), IRC_PLUGIN_NAME);
+ return 0;
+ }
+ break;
}
}
@@ -1270,6 +1288,9 @@ irc_config_server_change_cb (const void *pointer, void *data,
case IRC_SERVER_OPTION_NOTIFY:
irc_notify_new_for_server (ptr_server);
break;
+ case IRC_SERVER_OPTION_REGISTERED_MODE:
+ irc_mode_registered_mode_change (ptr_server);
+ break;
}
}
}
@@ -2502,6 +2523,22 @@ irc_config_server_new_option (struct t_config_file *config_file,
callback_change_data,
NULL, NULL, NULL);
break;
+ case IRC_SERVER_OPTION_REGISTERED_MODE:
+ new_option = weechat_config_new_option (
+ config_file, section,
+ option_name, "string",
+ N_("mode that is set on registered users (default is \"r\")"),
+ NULL, 0, 0,
+ default_value, value,
+ null_value_allowed,
+ callback_check_value,
+ callback_check_value_pointer,
+ callback_check_value_data,
+ callback_change,
+ callback_change_pointer,
+ callback_change_data,
+ NULL, NULL, NULL);
+ break;
case IRC_SERVER_NUM_OPTIONS:
break;
}
diff --git a/src/plugins/irc/irc-mode.c b/src/plugins/irc/irc-mode.c
index de85dfe55..4fc8cde9b 100644
--- a/src/plugins/irc/irc-mode.c
+++ b/src/plugins/irc/irc-mode.c
@@ -585,6 +585,7 @@ void
irc_mode_user_add (struct t_irc_server *server, char mode)
{
char str_mode[2], *nick_modes2;
+ const char *registered_mode;
str_mode[0] = mode;
str_mode[1] = '\0';
@@ -617,6 +618,15 @@ irc_mode_user_add (struct t_irc_server *server, char mode)
weechat_bar_item_update ("input_prompt");
weechat_bar_item_update ("irc_nick_modes");
}
+
+ registered_mode = IRC_SERVER_OPTION_STRING(
+ server, IRC_SERVER_OPTION_REGISTERED_MODE);
+ if (registered_mode
+ && (registered_mode[0] == mode)
+ && (server->authentication_method == IRC_SERVER_AUTH_METHOD_NONE))
+ {
+ server->authentication_method = IRC_SERVER_AUTH_METHOD_OTHER;
+ }
}
/*
@@ -627,6 +637,7 @@ void
irc_mode_user_remove (struct t_irc_server *server, char mode)
{
char *pos, *nick_modes2;
+ const char *registered_mode;
int new_size;
if (server->nick_modes)
@@ -643,6 +654,11 @@ irc_mode_user_remove (struct t_irc_server *server, char mode)
weechat_bar_item_update ("irc_nick_modes");
}
}
+
+ registered_mode = IRC_SERVER_OPTION_STRING(
+ server, IRC_SERVER_OPTION_REGISTERED_MODE);
+ if (registered_mode && (registered_mode[0] == mode))
+ server->authentication_method = IRC_SERVER_AUTH_METHOD_NONE;
}
/*
@@ -695,3 +711,31 @@ irc_mode_user_set (struct t_irc_server *server, const char *modes,
weechat_bar_item_update ("input_prompt");
weechat_bar_item_update ("irc_nick_modes");
}
+
+/*
+ * Updates authentication_method when IRC_SERVER_OPTION_REGISTERED_MODE
+ * changes.
+ */
+
+void
+irc_mode_registered_mode_change (struct t_irc_server *server)
+{
+ const char *ptr_mode, *registered_mode;
+
+ registered_mode = IRC_SERVER_OPTION_STRING(
+ server, IRC_SERVER_OPTION_REGISTERED_MODE);
+
+ ptr_mode = (server->nick_modes && registered_mode[0]) ?
+ strchr (server->nick_modes, registered_mode[0]) : NULL;
+
+ if (ptr_mode)
+ {
+ if (server->authentication_method == IRC_SERVER_AUTH_METHOD_NONE)
+ server->authentication_method = IRC_SERVER_AUTH_METHOD_OTHER;
+ }
+ else
+ {
+ if (server->authentication_method == IRC_SERVER_AUTH_METHOD_OTHER)
+ server->authentication_method = IRC_SERVER_AUTH_METHOD_NONE;
+ }
+}
diff --git a/src/plugins/irc/irc-mode.h b/src/plugins/irc/irc-mode.h
index 76b21cee4..6682602e7 100644
--- a/src/plugins/irc/irc-mode.h
+++ b/src/plugins/irc/irc-mode.h
@@ -33,5 +33,6 @@ extern int irc_mode_channel_set (struct t_irc_server *server,
const char *modes_arguments);
extern void irc_mode_user_set (struct t_irc_server *server, const char *modes,
int reset_modes);
+extern void irc_mode_registered_mode_change (struct t_irc_server *server);
#endif /* WEECHAT_PLUGIN_IRC_MODE_H */
diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c
index 54b1ac7b3..a4eba464d 100644
--- a/src/plugins/irc/irc-protocol.c
+++ b/src/plugins/irc/irc-protocol.c
@@ -571,6 +571,10 @@ IRC_PROTOCOL_CALLBACK(authenticate)
IRC_PLUGIN_NAME,
sasl_error);
}
+ else
+ {
+ server->sasl_mechanism_used = sasl_mechanism;
+ }
irc_server_sendf (server, 0, NULL, "AUTHENTICATE %s", answer);
free (answer);
}
@@ -7281,6 +7285,8 @@ IRC_PROTOCOL_CALLBACK(sasl_end_ok)
IRC_PROTOCOL_RUN_CALLBACK(numeric);
+ server->authentication_method = IRC_SERVER_AUTH_METHOD_SASL;
+
if (!server->is_connected)
irc_server_sendf (server, 0, NULL, "CAP END");
@@ -7306,6 +7312,9 @@ IRC_PROTOCOL_CALLBACK(sasl_end_fail)
server->hook_timer_sasl = NULL;
}
+ server->authentication_method = IRC_SERVER_AUTH_METHOD_NONE;
+ server->sasl_mechanism_used = -1;
+
IRC_PROTOCOL_RUN_CALLBACK(numeric);
sasl_fail = IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_SASL_FAIL);
diff --git a/src/plugins/irc/irc-server.c b/src/plugins/irc/irc-server.c
index 1c5726bc6..7392e1298 100644
--- a/src/plugins/irc/irc-server.c
+++ b/src/plugins/irc/irc-server.c
@@ -122,6 +122,7 @@ char *irc_server_options[IRC_SERVER_NUM_OPTIONS][2] =
{ "split_msg_max_length", "512" },
{ "charset_message", "message" },
{ "default_chantypes", "#&" },
+ { "registered_mode", "r" },
};
char *irc_server_casemapping_string[IRC_SERVER_NUM_CASEMAPPING] =
@@ -1555,6 +1556,8 @@ irc_server_alloc (const char *name)
new_server->sasl_scram_auth_message = NULL;
new_server->sasl_temp_username = NULL;
new_server->sasl_temp_password = NULL;
+ new_server->authentication_method = IRC_SERVER_AUTH_METHOD_NONE;
+ new_server->sasl_mechanism_used = -1;
new_server->is_connected = 0;
new_server->ssl_connected = 0;
new_server->disconnected = 0;
@@ -3975,6 +3978,8 @@ irc_server_close_connection (struct t_irc_server *server)
weechat_hashtable_remove_all (server->join_noswitch);
/* server is now disconnected */
+ server->authentication_method = IRC_SERVER_AUTH_METHOD_NONE;
+ server->sasl_mechanism_used = -1;
server->is_connected = 0;
server->ssl_connected = 0;
@@ -6113,6 +6118,8 @@ irc_server_hdata_server_cb (const void *pointer, void *data,
WEECHAT_HDATA_VAR(struct t_irc_server, sasl_scram_auth_message, STRING, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, sasl_temp_username, STRING, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, sasl_temp_password, STRING, 0, NULL, NULL);
+ WEECHAT_HDATA_VAR(struct t_irc_server, authentication_method, INTEGER, 0, NULL, NULL);
+ WEECHAT_HDATA_VAR(struct t_irc_server, sasl_mechanism_used, INTEGER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, is_connected, INTEGER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, ssl_connected, INTEGER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, disconnected, INTEGER, 0, NULL, NULL);
@@ -6483,6 +6490,10 @@ irc_server_add_to_infolist (struct t_infolist *infolist,
if (!weechat_infolist_new_var_time (ptr_item, "lag_last_refresh", server->lag_last_refresh))
return 0;
}
+ if (!weechat_infolist_new_var_integer (ptr_item, "authentication_method", server->authentication_method))
+ return 0;
+ if (!weechat_infolist_new_var_integer (ptr_item, "sasl_mechanism_used", server->sasl_mechanism_used))
+ return 0;
if (!weechat_infolist_new_var_string (ptr_item, "isupport", server->isupport))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "prefix_modes", server->prefix_modes))
@@ -6857,6 +6868,8 @@ irc_server_print_log ()
weechat_log_printf (" sasl_scram_auth_message . : (hidden)");
weechat_log_printf (" sasl_temp_username. . . . : '%s'", ptr_server->sasl_temp_username);
weechat_log_printf (" sasl_temp_password. . . . : (hidden)");
+ weechat_log_printf (" authentication_method . . : %d", ptr_server->authentication_method);
+ weechat_log_printf (" sasl_mechanism_used . . . : %d", ptr_server->sasl_mechanism_used);
weechat_log_printf (" is_connected. . . . . . . : %d", ptr_server->is_connected);
weechat_log_printf (" ssl_connected . . . . . . : %d", ptr_server->ssl_connected);
weechat_log_printf (" disconnected. . . . . . . : %d", ptr_server->disconnected);
diff --git a/src/plugins/irc/irc-server.h b/src/plugins/irc/irc-server.h
index 0a9fa25a3..7ac282a8f 100644
--- a/src/plugins/irc/irc-server.h
+++ b/src/plugins/irc/irc-server.h
@@ -94,6 +94,7 @@ enum t_irc_server_option
IRC_SERVER_OPTION_SPLIT_MSG_MAX_LENGTH, /* max length of messages */
IRC_SERVER_OPTION_CHARSET_MESSAGE, /* what to decode/encode in msg */
IRC_SERVER_OPTION_DEFAULT_CHANTYPES, /* chantypes if not received */
+ IRC_SERVER_OPTION_REGISTERED_MODE, /* mode set on registered user */
/* number of server options */
IRC_SERVER_NUM_OPTIONS,
};
@@ -153,6 +154,14 @@ enum t_irc_server_utf8mapping
IRC_SERVER_NUM_UTF8MAPPING,
};
+/* authentication method */
+enum t_irc_server_auth_method
+{
+ IRC_SERVER_AUTH_METHOD_NONE = 0,
+ IRC_SERVER_AUTH_METHOD_SASL,
+ IRC_SERVER_AUTH_METHOD_OTHER,
+};
+
/* output queue of messages to server (for sending slowly to server) */
struct t_irc_outqueue
@@ -200,6 +209,8 @@ struct t_irc_server
char *sasl_scram_auth_message; /* auth message for SASL SCRAM */
char *sasl_temp_username; /* temp SASL username (set by /auth cmd) */
char *sasl_temp_password; /* temp SASL password (set by /auth cmd) */
+ int authentication_method; /* authentication method used to login */
+ int sasl_mechanism_used; /* SASL method used at login time */
int is_connected; /* 1 if WeeChat is connected to server */
int ssl_connected; /* = 1 if connected with SSL */
int disconnected; /* 1 if server has been disconnected */
diff --git a/src/plugins/irc/irc-upgrade.c b/src/plugins/irc/irc-upgrade.c
index 374fbf195..851f93482 100644
--- a/src/plugins/irc/irc-upgrade.c
+++ b/src/plugins/irc/irc-upgrade.c
@@ -416,6 +416,20 @@ irc_upgrade_read_cb (const void *pointer, void *data,
irc_upgrade_current_server,
NULL);
}
+ /*
+ * "authentication_method" and "sasl_mechanism_used" are
+ * new in WeeChat 3.9
+ */
+ if (weechat_infolist_search_var (infolist, "authentication_method"))
+ {
+ irc_upgrade_current_server->authentication_method = weechat_infolist_integer (infolist, "authentication_method");
+ irc_upgrade_current_server->sasl_mechanism_used = weechat_infolist_integer (infolist, "sasl_mechanism_used");
+ }
+ else
+ {
+ irc_upgrade_current_server->authentication_method = IRC_SERVER_AUTH_METHOD_NONE;
+ irc_upgrade_current_server->sasl_mechanism_used = -1;
+ }
irc_upgrade_current_server->is_connected = weechat_infolist_integer (infolist, "is_connected");
irc_upgrade_current_server->ssl_connected = weechat_infolist_integer (infolist, "ssl_connected");
irc_upgrade_current_server->disconnected = weechat_infolist_integer (infolist, "disconnected");