From 95b30f8da5be6065f1d83be0de6bb2dadbd226eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Thu, 6 Apr 2023 20:22:34 +0200 Subject: irc: connect with TLS and port 6697 by default (issue #1903) --- src/plugins/irc/irc-command.c | 30 ++++++++++------ src/plugins/irc/irc-config.c | 33 ++++++++++++++--- src/plugins/irc/irc-server.c | 84 ++++++++++++++++++++++++++++++++++++------- src/plugins/irc/irc-server.h | 10 +++--- 4 files changed, 126 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/plugins/irc/irc-command.c b/src/plugins/irc/irc-command.c index 04bfba877..1f2827ca5 100644 --- a/src/plugins/irc/irc-command.c +++ b/src/plugins/irc/irc-command.c @@ -5549,7 +5549,7 @@ IRC_COMMAND_CALLBACK(server) { int i, detailed_list, one_server_found, length, count, refresh; struct t_irc_server *ptr_server2, *server_found, *new_server; - char *server_name, *msg_no_quotes, *message; + char *server_name, *msg_no_quotes, *message, *description; IRC_BUFFER_GET_SERVER_CHANNEL(buffer); @@ -5647,9 +5647,11 @@ IRC_COMMAND_CALLBACK(server) new_server->options[IRC_SERVER_OPTION_ADDRESSES], argv[3], 1); irc_server_apply_command_line_options (new_server, argc, argv); + description = irc_server_get_addresses_ports_tls (new_server); + weechat_printf ( NULL, - _("%s: server added: %s%s%s%s%s"), + _("%s: server added: %s%s%s%s%s -> %s"), IRC_PLUGIN_NAME, IRC_COLOR_CHAT_SERVER, new_server->name, @@ -5657,7 +5659,11 @@ IRC_COMMAND_CALLBACK(server) /* TRANSLATORS: "temporary IRC server" */ (new_server->temp_server) ? _(" (temporary)") : "", /* TRANSLATORS: "fake IRC server" */ - (new_server->fake_server) ? _(" (fake)") : ""); + (new_server->fake_server) ? _(" (fake)") : "", + description); + + if (description) + free (description); /* do not connect to server after adding it */ /* @@ -6978,7 +6984,8 @@ irc_command_init () N_(" server: server name, which can be:\n" " - internal server name (added by /server add, " "recommended usage)\n" - " - hostname/port or IP/port, port is 6667 by default\n" + " - hostname/port or IP/port, port is 6697 by default " + "for TLS, 6667 otherwise\n" " - URL with format: irc[6][s]://[nickname[:password]@]" "irc.example.org[:port][/#channel1][,#channel2[...]]\n" " Note: for an address/IP/URL, a temporary server is " @@ -6999,10 +7006,10 @@ irc_command_init () "\n" "Examples:\n" " /connect libera\n" - " /connect irc.oftc.net/6667\n" - " /connect irc6.oftc.net/6667 -ipv6\n" - " /connect irc6.oftc.net/6697 -ipv6 -tls\n" - " /connect my.server.org/6697 -tls -password=test\n" + " /connect irc.oftc.net\n" + " /connect irc.oftc.net/6667 -notls\n" + " /connect irc6.oftc.net/9999 -ipv6\n" + " /connect my.server.org -password=test\n" " /connect irc://nick@irc.oftc.net/#channel\n" " /connect -switch"), "%(irc_servers)|-all|-auto|-open|-nojoin|-switch|%*", @@ -7522,7 +7529,8 @@ irc_command_init () "is used to connect to the server (/connect name) and to set server " "options: irc.server.name.xxx\n" "hostname: name or IP address of server, with optional port " - "(default: 6667), many addresses can be separated by a comma\n" + "(default: 6697 for TLS, 6667 otherwise), many addresses can be " + "separated by a comma\n" " -temp: add a temporary server (not saved)\n" " option: set option for server (for boolean option, value can be " "omitted)\n" @@ -7557,9 +7565,9 @@ irc_command_init () "Examples:\n" " /server listfull\n" " /server add libera irc.libera.chat\n" - " /server add libera irc.libera.chat/6697 -tls -autoconnect\n" + " /server add libera irc.libera.chat/6667 -notls -autoconnect\n" " /server add chatspike irc.chatspike.net/6667," - "irc.duckspike.net/6667\n" + "irc.duckspike.net/6667 -notls\n" " /server copy libera libera-test\n" " /server rename libera-test libera2\n" " /server reorder libera2 libera\n" diff --git a/src/plugins/irc/irc-config.c b/src/plugins/irc/irc-config.c index da52dfe04..458833ceb 100644 --- a/src/plugins/irc/irc-config.c +++ b/src/plugins/irc/irc-config.c @@ -997,8 +997,18 @@ irc_config_server_default_change_cb (const void *pointer, void *data, switch (index_option) { case IRC_SERVER_OPTION_ADDRESSES: - irc_server_set_addresses (ptr_server, - weechat_config_string (option)); + irc_server_set_addresses ( + ptr_server, + weechat_config_string (option), + IRC_SERVER_OPTION_BOOLEAN( + ptr_server, IRC_SERVER_OPTION_TLS)); + break; + case IRC_SERVER_OPTION_TLS: + irc_server_set_addresses ( + ptr_server, + IRC_SERVER_OPTION_STRING( + ptr_server, IRC_SERVER_OPTION_ADDRESSES), + weechat_config_boolean (option)); break; case IRC_SERVER_OPTION_NICKS: irc_server_set_nicks (ptr_server, @@ -1006,10 +1016,15 @@ irc_config_server_default_change_cb (const void *pointer, void *data, break; case IRC_SERVER_OPTION_AWAY_CHECK: case IRC_SERVER_OPTION_AWAY_CHECK_MAX_NICKS: - if (IRC_SERVER_OPTION_INTEGER(ptr_server, IRC_SERVER_OPTION_AWAY_CHECK) > 0) + if (IRC_SERVER_OPTION_INTEGER( + ptr_server, IRC_SERVER_OPTION_AWAY_CHECK) > 0) + { irc_server_check_away (ptr_server); + } else + { irc_server_remove_away (ptr_server); + } break; case IRC_SERVER_OPTION_REGISTERED_MODE: irc_mode_registered_mode_change (ptr_server); @@ -1280,7 +1295,17 @@ irc_config_server_change_cb (const void *pointer, void *data, irc_server_set_addresses ( ptr_server, IRC_SERVER_OPTION_STRING(ptr_server, - IRC_SERVER_OPTION_ADDRESSES)); + IRC_SERVER_OPTION_ADDRESSES), + IRC_SERVER_OPTION_BOOLEAN(ptr_server, + IRC_SERVER_OPTION_TLS)); + break; + case IRC_SERVER_OPTION_TLS: + irc_server_set_addresses ( + ptr_server, + IRC_SERVER_OPTION_STRING(ptr_server, + IRC_SERVER_OPTION_ADDRESSES), + IRC_SERVER_OPTION_BOOLEAN(ptr_server, + IRC_SERVER_OPTION_TLS)); break; case IRC_SERVER_OPTION_NICKS: irc_server_set_nicks ( diff --git a/src/plugins/irc/irc-server.c b/src/plugins/irc/irc-server.c index 7ed88ba48..66c927887 100644 --- a/src/plugins/irc/irc-server.c +++ b/src/plugins/irc/irc-server.c @@ -80,7 +80,7 @@ char *irc_server_options[IRC_SERVER_NUM_OPTIONS][2] = { { "addresses", "" }, { "proxy", "" }, { "ipv6", "on" }, - { "tls", "off" }, + { "tls", "on" }, { "tls_cert", "" }, { "tls_password", "" }, { "tls_priorities", "NORMAL:-VERS-SSL3.0" }, @@ -583,24 +583,80 @@ irc_server_get_name_without_port (const char *name) return strdup (name); } +/* + * Gets a string with addresses and ports and TLS option for the server. + * + * For example if addresses = "irc.example.org,irc2.example.org/7000" and + * "tls" option if on, the result is: + * + * "irc.example.org/6697,irc2.example.org/7000 (TLS: enabled)" + * + * Note: result must be freed after use. + */ + +char * +irc_server_get_addresses_ports_tls (struct t_irc_server *server) +{ + char **result, str_port[32], str_tls[256]; + int i; + + if (!server) + return NULL; + + result = weechat_string_dyn_alloc (64); + if (!result) + return NULL; + + for (i = 0; i < server->addresses_count; i++) + { + if (i > 0) + weechat_string_dyn_concat (result, ", ", -1); + weechat_string_dyn_concat (result, server->addresses_array[i], -1); + weechat_string_dyn_concat (result, "/", -1); + snprintf (str_port, sizeof (str_port), "%d", server->ports_array[i]); + weechat_string_dyn_concat (result, str_port, -1); + } + + snprintf (str_tls, sizeof (str_tls), + " (TLS: %s)", + IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_TLS) ? + _("enabled") : _("disabled")); + weechat_string_dyn_concat (result, str_tls, -1); + + return weechat_string_dyn_free (result, 0); +} + /* * Sets addresses for server. * + * The "tls" is the boolean value of option ".tls" in server, used to find the + * default port if not specified in the address: + * - 6697 if tls is 1 + * - 6667 if tls is 0 + * * Returns: * 1: addresses have been set (changed) * 0: nothing set (addresses unchanged) */ int -irc_server_set_addresses (struct t_irc_server *server, const char *addresses) +irc_server_set_addresses (struct t_irc_server *server, const char *addresses, + int tls) { - int i; + int rc, i, default_port; char *pos, *error, *addresses_eval; const char *ptr_addresses; long number; + if (!server) + return 0; + + rc = 1; addresses_eval = NULL; + default_port = (tls) ? + IRC_SERVER_DEFAULT_PORT_TLS : IRC_SERVER_DEFAULT_PORT_CLEARTEXT; + ptr_addresses = addresses; if (ptr_addresses && (strncmp (ptr_addresses, "fake:", 5) == 0)) { @@ -618,8 +674,7 @@ irc_server_set_addresses (struct t_irc_server *server, const char *addresses) if (server->addresses_eval && (strcmp (server->addresses_eval, addresses_eval) == 0)) { - free (addresses_eval); - return 0; + rc = 0; } } @@ -649,7 +704,7 @@ irc_server_set_addresses (struct t_irc_server *server, const char *addresses) /* set new addresses/ports */ server->addresses_eval = addresses_eval; if (!addresses_eval) - return 1; + return rc; server->addresses_array = weechat_string_split ( addresses_eval, ",", @@ -673,16 +728,16 @@ irc_server_set_addresses (struct t_irc_server *server, const char *addresses) error = NULL; number = strtol (pos, &error, 10); server->ports_array[i] = (error && !error[0]) ? - number : IRC_SERVER_DEFAULT_PORT; + number : default_port; } else { - server->ports_array[i] = IRC_SERVER_DEFAULT_PORT; + server->ports_array[i] = default_port; } server->retry_array[i] = 0; } - return 1; + return rc; } /* @@ -696,7 +751,8 @@ irc_server_set_index_current_address (struct t_irc_server *server, int index) addresses_changed = irc_server_set_addresses ( server, - IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_ADDRESSES)); + IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_ADDRESSES), + IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_TLS)); if (addresses_changed) { @@ -1659,6 +1715,10 @@ irc_server_alloc (const char *name) /* create options with null value */ for (i = 0; i < IRC_SERVER_NUM_OPTIONS; i++) + { + new_server->options[i] = NULL; + } + for (i = 0; i < IRC_SERVER_NUM_OPTIONS; i++) { length = strlen (new_server->name) + 1 + strlen (irc_server_options[i][0]) + @@ -1707,7 +1767,7 @@ irc_server_alloc (const char *name) * - "pass": password for the server (can be used as nick password on most * servers) * - "server": server address - * - "port": port (default is 6667 without TLS and 6697 with TLS) + * - "port": port (default is 6697 with TLS, 6667 otherwise) * - "#chan1": channel to auto-join * * Returns pointer to new server, NULL if error. @@ -1743,7 +1803,7 @@ irc_server_alloc_with_url (const char *irc_url) ipv6 = 0; tls = 0; snprintf (default_port, sizeof (default_port), - "%d", IRC_SERVER_DEFAULT_PORT); + "%d", IRC_SERVER_DEFAULT_PORT_CLEARTEXT); pos_server = strstr (irc_url2, "://"); if (!pos_server || !pos_server[3]) diff --git a/src/plugins/irc/irc-server.h b/src/plugins/irc/irc-server.h index e40f8b62e..33cbfe3a2 100644 --- a/src/plugins/irc/irc-server.h +++ b/src/plugins/irc/irc-server.h @@ -120,9 +120,10 @@ enum t_irc_server_option weechat_config_string(irc_config_server_default[__index]) \ : weechat_config_string_default(irc_config_server_default[__index]))) -#define IRC_SERVER_DEFAULT_PORT 6667 -#define IRC_SERVER_DEFAULT_PORT_TLS 6697 -#define IRC_SERVER_DEFAULT_NICKS "weechat1,weechat2,weechat3,weechat4,weechat5" +#define IRC_SERVER_DEFAULT_PORT_CLEARTEXT 6667 +#define IRC_SERVER_DEFAULT_PORT_TLS 6697 + +#define IRC_SERVER_DEFAULT_NICKS "weechat1,weechat2,weechat3,weechat4,weechat5" /* number of queues for sending messages */ #define IRC_SERVER_NUM_OUTQUEUES_PRIO 2 @@ -333,8 +334,9 @@ extern void irc_server_sasl_get_creds (struct t_irc_server *server, char **key); extern int irc_server_sasl_enabled (struct t_irc_server *server); extern char *irc_server_get_name_without_port (const char *name); +extern char *irc_server_get_addresses_ports_tls (struct t_irc_server *server); extern int irc_server_set_addresses (struct t_irc_server *server, - const char *addresses); + const char *addresses, int tls); extern void irc_server_set_nicks (struct t_irc_server *server, const char *nicks); extern void irc_server_set_nick (struct t_irc_server *server, -- cgit v1.2.3