]> jfr.im git - irc/weechat/weechat.git/commitdiff
irc, buflist: add bar item "tls_version" with options for colors, add buflist format...
authorAndrew Potter <redacted>
Sat, 27 Mar 2021 00:27:37 +0000 (17:27 -0700)
committerSébastien Helleu <redacted>
Sun, 16 May 2021 08:00:30 +0000 (10:00 +0200)
18 files changed:
doc/de/weechat_user.de.adoc
doc/en/weechat_user.en.adoc
doc/fr/weechat_user.fr.adoc
doc/it/weechat_user.it.adoc
doc/ja/weechat_user.ja.adoc
doc/pl/weechat_user.pl.adoc
src/plugins/buflist/buflist-bar-item.c
src/plugins/buflist/buflist-command.c
src/plugins/buflist/buflist-config.c
src/plugins/buflist/buflist-config.h
src/plugins/irc/irc-bar-item.c
src/plugins/irc/irc-color.h
src/plugins/irc/irc-config.c
src/plugins/irc/irc-config.h
src/plugins/irc/irc-protocol.c
src/plugins/irc/irc-server.c
src/plugins/irc/irc-server.h
src/plugins/xfer/xfer-chat.c

index 74783dc4ec9dd1799801852ee551eada60646172..8d10ff6f4948edff682f59ffdaf8f9419d48eafa 100644 (file)
@@ -868,6 +868,8 @@ andere Items die zur Verfügung stehen (die aber nicht standardmäßig in einer
 | mouse_status                 | `M`                      | Status der Maus (keine Anzeige, falls Maus deaktiviert).
 | spell_dict                   | `de,en`                  | zeigt an welche Wörterbücher für die Rechtschreibung im aktuellen Buffer genutzt werden.
 | spell_suggest                | `Glück,Glocke,Block`     | Vorschläge für ein falsch geschriebenes Wort.
+// TRANSLATION MISSING
+| tls_version                  | `TLS1.3`                 | TLS version in use for current IRC server.
 | window_number                | `2`                      | Nummer des aktuellen Fensters.
 |===
 
index 98fb837364ed596370b7a798fad45a5f863d6031..dcd7f03639a9d4f1b6e970360981fbcf5e7f897a 100644 (file)
@@ -862,6 +862,7 @@ Other items available (not used in bars by default):
 | mouse_status                 | `M`                      | Mouse status (empty if mouse is disabled).
 | spell_dict                   | `fr,en`                  | Spelling dictionaries used on current buffer.
 | spell_suggest                | `print,prone,prune`      | Spelling suggestions for word under cursor (if misspelled).
+| tls_version                  | `TLS1.3`                 | TLS version in use for current IRC server.
 | window_number                | `2`                      | Current window number.
 |===
 
index 1d5c31d8e88fd1b4f87262853af3668e3e92c5c2..d730adda36ed49f5ba29f21927dd0a75f60eb085 100644 (file)
@@ -882,6 +882,7 @@ Autres objets (non utilisés dans des barres par défaut) :
 | mouse_status                 | `M`                      | Statut de la souris (vide si la souris est désactivée).
 | spell_dict                   | `fr,en`                  | Dictionnaires utilisés pour la vérification de l'orthographe sur le tampon courant.
 | spell_suggest                | `print,prone,prune`      | Suggestions pour le mot sous le curseur (si mal orthographié).
+| tls_version                  | `TLS1.3`                 | Version de TLS utilisée sur le serveur IRC courant.
 | window_number                | `2`                      | Numéro de la fenêtre courante.
 |===
 
index abd836628437c5cd57c07f5fd8fe7d37a4017a94..293f2c94e5b65f07b14ef891d0d6ffd67d062029 100644 (file)
@@ -940,6 +940,7 @@ Other items available (not used in bars by default):
 | mouse_status                 | `M`                      | Mouse status (empty if mouse is disabled).
 | spell_dict                   | `fr,en`                  | Spelling dictionaries used on current buffer.
 | spell_suggest                | `print,prone,prune`      | Spelling suggestions for word under cursor (if misspelled).
+| tls_version                  | `TLS1.3`                 | TLS version in use for current IRC server.
 | window_number                | `2`                      | Current window number.
 |===
 
index b3a5912e06d48c8f762999b37eaadf7d19a3b75c..f0e740fef557b59644723c67917dd758c7898386 100644 (file)
@@ -905,6 +905,8 @@ WeeChat を起動した端末の例:
 | mouse_status                 | `M`                      | マウスの状態 (マウスが無効化されている場合は空文字列)
 | spell_dict                   | `fr,en`                  | 現在のバッファにおけるスペリング辞書
 | spell_suggest                | `print,prone,prune`      | カーソル下の単語に対するスペリング候補 (スペルが間違っている場合)
+// TRANSLATION MISSING
+| tls_version                  | `TLS1.3`                 | TLS version in use for current IRC server.
 | window_number                | `2`                      | 現在のウィンドウ番号
 |===
 
index 1a1394287e182956aca15421eb3f656b202f3317..b89e5a7fd242460677a069151619fdd8bddc1637 100644 (file)
@@ -880,6 +880,8 @@ Inne dostępne elementy (nie używane domyślnie w paskach):
 | mouse_status                 | `M`                      | Status obsługi myszy (pusty jeśli obsługa myszy jest wyłączona).
 | spell_dict                   | `fr,en`                  | Słowniki używane w obecnym buforze.
 | spell_suggest                | `print,prone,prune`      | Sugestie dla słowa pod kursorem (jeśli zawiera błąd).
+// TRANSLATION MISSING
+| tls_version                  | `TLS1.3`                 | TLS version in use for current IRC server.
 | window_number                | `2`                      | Numer obecnego okna.
 |===
 
index 88972cf8cf4f8415690a5bfb376e08d2253ed49a..90cb7234d7a0868c2a5ac24832801ab5668260e2 100644 (file)
@@ -312,7 +312,7 @@ buflist_bar_item_buflist_cb (const void *pointer, void *data,
     const char *hotlist_priority[4] = { "low", "message", "private",
                                         "highlight" };
     const char indent_empty[1] = { '\0' };
-    const char *ptr_lag, *ptr_item_name;
+    const char *ptr_lag, *ptr_item_name, *ptr_tls_version;
     int item_index, num_buffers, is_channel, is_private;
     int i, j, length_max_number, current_buffer, number, prev_number, priority;
     int rc, count, line_number, line_number_current_buffer;
@@ -596,6 +596,14 @@ buflist_bar_item_buflist_cb (const void *pointer, void *data,
                                    "format_lag", "");
         }
 
+        /* tls version */
+        ptr_tls_version = weechat_buffer_get_string (ptr_buffer, "localvar_tls_version");
+        weechat_hashtable_set (
+            buflist_hashtable_extra_vars,
+            "format_tls_version",
+            (ptr_tls_version && ptr_tls_version[0]) ?
+            weechat_config_string (buflist_config_format_tls_version) : "");
+
         /* check condition: if false, the buffer is not displayed */
         condition = weechat_string_eval_expression (
             weechat_config_string (buflist_config_look_display_conditions),
index 51ed01d3780b9646a04016e36ad5d7d5e4ebba54..7a8dfc7da1612853c50f953d5efd6b94f54a75d7 100644 (file)
@@ -168,7 +168,10 @@ buflist_command_init ()
            "    - ${hotlist_priority}: \"none\", \"low\", \"message\", "
            "\"private\" or \"highlight\"\n"
            "    - ${format_lag}: the lag for an IRC server buffer, empty if "
-           "there's no lag (evaluation of option buflist.format.lag)"),
+           "there's no lag (evaluation of option buflist.format.lag)\n"
+           "    - ${format_tls_version}: indicator of TLS version for a server "
+           "buffer, empty for channels. (evaluation of option "
+           "buflist.format.tls_version)"),
         "enable|disable|toggle || bar || refresh",
         &buflist_command_buflist, NULL, NULL);
 }
index ffd9a18777fe2d837e28a53aa8532db2ad22f32f..9acac0036cc819609706e1ba264519059f5307d5 100644 (file)
@@ -59,6 +59,7 @@ struct t_config_option *buflist_config_format_lag;
 struct t_config_option *buflist_config_format_name;
 struct t_config_option *buflist_config_format_nick_prefix;
 struct t_config_option *buflist_config_format_number;
+struct t_config_option *buflist_config_format_tls_version;
 
 struct t_hook **buflist_config_signals_refresh = NULL;
 int buflist_config_num_signals_refresh = 0;
@@ -403,7 +404,7 @@ buflist_config_add_eval_for_formats (const char *string)
     char *formats[] = { "format_buffer", "format_number", "indent",
                         "format_nick_prefix", "format_name",
                         "format_hotlist", "hotlist", "format_lag",
-                        "color_hotlist", NULL };
+                        "color_hotlist", "format_tls_version", NULL };
     char *result, *tmp, format[512], format_eval[512];
     int i;
 
@@ -773,6 +774,19 @@ buflist_config_init ()
         NULL, NULL, NULL,
         &buflist_config_change_buflist, NULL, NULL,
         NULL, NULL, NULL);
+    buflist_config_format_tls_version = weechat_config_new_option (
+        buflist_config_file, ptr_section,
+        "tls_version", "string",
+        N_("format for tls_version on an IRC server buffer "
+           "(note: content is evaluated, see /help buflist)"),
+        NULL, 0, 0,
+        " ${color:default}(${if:${tls_version}==TLS1.3?${color:green}:"
+        "${if:${tls_version}==TLS1.2?${color:yellow}:${color:red}}}"
+        "${tls_version}${color:default})",
+        NULL, 0,
+        NULL, NULL, NULL,
+        &buflist_config_change_buflist, NULL, NULL,
+        NULL, NULL, NULL);
 
     return 1;
 }
index 1a368fcde4211f859478729509c6b54d94772f06..2a655da0666785eeba420c529cee4711745289a4 100644 (file)
@@ -58,6 +58,7 @@ extern struct t_config_option *buflist_config_format_lag;
 extern struct t_config_option *buflist_config_format_name;
 extern struct t_config_option *buflist_config_format_nick_prefix;
 extern struct t_config_option *buflist_config_format_number;
+extern struct t_config_option *buflist_config_format_tls_version;
 
 extern char **buflist_config_sort_fields[BUFLIST_BAR_NUM_ITEMS];
 extern int buflist_config_sort_fields_count[BUFLIST_BAR_NUM_ITEMS];
index 2a39596ea257e681fb43e7d3748cd5a85a018b34..0990d02d1cd16d26d582a62fe31638b1e6b0e761 100644 (file)
@@ -23,6 +23,8 @@
 #include <stdio.h>
 #include <string.h>
 
+#include <gnutls/gnutls.h>
+
 #include "../weechat-plugin.h"
 #include "irc.h"
 #include "irc-buffer.h"
@@ -519,6 +521,65 @@ irc_bar_item_lag (const void *pointer, void *data,
     return NULL;
 }
 
+/*
+ * Returns content of bar item "tls_version": bar item with TLS version value.
+ */
+
+char *
+irc_bar_item_tls_version (const void *pointer, void *data,
+                          struct t_gui_bar_item *item,
+                          struct t_gui_window *window, struct t_gui_buffer *buffer,
+                          struct t_hashtable *extra_info)
+{
+    char buf[128];
+    struct t_irc_server *server;
+    gnutls_protocol_t version;
+    const char *color;
+
+    /* make C compiler happy */
+    (void) pointer;
+    (void) data;
+    (void) item;
+    (void) window;
+    (void) extra_info;
+
+    if (!buffer)
+        return NULL;
+
+    irc_buffer_get_server_and_channel (buffer, &server, NULL);
+    if (server && server->is_connected)
+    {
+        if (server->ssl_connected)
+        {
+            version = gnutls_protocol_get_version (server->gnutls_sess);
+            switch (version)
+            {
+                case GNUTLS_TLS1_3:
+                    color = IRC_COLOR_ITEM_TLS_VERSION_OK;
+                    break;
+                case GNUTLS_TLS1_2:
+                    color = IRC_COLOR_ITEM_TLS_VERSION_DEPRECATED;
+                    break;
+                default:
+                    color = IRC_COLOR_ITEM_TLS_VERSION_INSECURE;
+            }
+            snprintf (buf, sizeof (buf), "%s%s", color,
+                      gnutls_protocol_get_name (version));
+            return strdup (buf);
+        }
+        else
+        {
+            snprintf (buf, sizeof (buf), "%s%s",
+                      IRC_COLOR_ITEM_TLS_VERSION_INSECURE,
+                      _("cleartext"));
+            return strdup (buf);
+        }
+    }
+
+    return NULL;
+}
+
+
 /*
  * Returns content of bar item "input_prompt": bar item with input prompt.
  */
@@ -775,6 +836,7 @@ irc_bar_item_buffer_switch (const void *pointer, void *data,
     weechat_bar_item_update ("irc_nick");
     weechat_bar_item_update ("irc_host");
     weechat_bar_item_update ("irc_nick_host");
+    weechat_bar_item_update ("tls_version");
 
     return WEECHAT_RC_OK;
 }
@@ -822,6 +884,8 @@ irc_bar_item_init ()
                           &irc_bar_item_nick_modes, NULL, NULL);
     weechat_bar_item_new ("irc_nick_prefix",
                           &irc_bar_item_nick_prefix, NULL, NULL);
+    weechat_bar_item_new ("tls_version",
+                          &irc_bar_item_tls_version, NULL, NULL);
 
     weechat_hook_focus ("buffer_nicklist",
                         &irc_bar_item_focus_buffer_nicklist, NULL, NULL);
index 0b4f6259789e35ad47a8fc0f63a2f46d01ba6f56..20383f65c8eace8c1ae783fc91060fdc0da235f6 100644 (file)
@@ -99,6 +99,9 @@
 #define IRC_COLOR_ITEM_LAG_COUNTING weechat_color(weechat_config_string(irc_config_color_item_lag_counting))
 #define IRC_COLOR_ITEM_LAG_FINISHED weechat_color(weechat_config_string(irc_config_color_item_lag_finished))
 #define IRC_COLOR_ITEM_NICK_MODES weechat_color(weechat_config_string(irc_config_color_item_nick_modes))
+#define IRC_COLOR_ITEM_TLS_VERSION_OK weechat_color(weechat_config_string(irc_config_color_item_tls_version_ok))
+#define IRC_COLOR_ITEM_TLS_VERSION_DEPRECATED weechat_color(weechat_config_string(irc_config_color_item_tls_version_deprecated))
+#define IRC_COLOR_ITEM_TLS_VERSION_INSECURE weechat_color(weechat_config_string(irc_config_color_item_tls_version_insecure))
 
 struct t_irc_color_ansi_state
 {
index c6ad6b52d6636870d0a42a59df5a77aea7762917..e64d171f72386a00e1cacc62117606b5a4b7e8ee 100644 (file)
@@ -116,6 +116,9 @@ struct t_config_option *irc_config_color_item_channel_modes;
 struct t_config_option *irc_config_color_item_lag_counting;
 struct t_config_option *irc_config_color_item_lag_finished;
 struct t_config_option *irc_config_color_item_nick_modes;
+struct t_config_option *irc_config_color_item_tls_version_ok;
+struct t_config_option *irc_config_color_item_tls_version_deprecated;
+struct t_config_option *irc_config_color_item_tls_version_insecure;
 struct t_config_option *irc_config_color_message_account;
 struct t_config_option *irc_config_color_message_join;
 struct t_config_option *irc_config_color_message_chghost;
@@ -698,6 +701,22 @@ irc_config_change_color_item_nick_modes (const void *pointer, void *data,
     weechat_bar_item_update ("irc_nick_modes");
 }
 
+/*
+ * Callback for changes on options "irc.color.item_tls_version_*".
+ */
+
+void
+irc_config_change_color_item_tls_version (const void *pointer, void *data,
+                                          struct t_config_option *option)
+{
+    /* make C compiler happy */
+    (void) pointer;
+    (void) data;
+    (void) option;
+
+    weechat_bar_item_update ("tls_version");
+}
+
 /*
  * Callback for changes on option "irc.color.mirc_remap".
  */
@@ -3228,6 +3247,30 @@ irc_config_init ()
         NULL, NULL, NULL,
         &irc_config_change_color_item_nick_modes, NULL, NULL,
         NULL, NULL, NULL);
+    irc_config_color_item_tls_version_ok = weechat_config_new_option (
+        irc_config_file, ptr_section,
+        "item_tls_version_ok", "color",
+        N_("color for max supported TLS version in bar item \"tls_version\""),
+        NULL, -1, 0, "green", NULL, 0,
+        NULL, NULL, NULL,
+        &irc_config_change_color_item_tls_version, NULL, NULL,
+        NULL, NULL, NULL);
+    irc_config_color_item_tls_version_deprecated = weechat_config_new_option (
+        irc_config_file, ptr_section,
+        "item_tls_version_deprecated", "color",
+        N_("color for deprecated TLS versions in bar item \"tls_version\""),
+        NULL, -1, 0, "yellow", NULL, 0,
+        NULL, NULL, NULL,
+        &irc_config_change_color_item_tls_version, NULL, NULL,
+        NULL, NULL, NULL);
+    irc_config_color_item_tls_version_insecure = weechat_config_new_option (
+        irc_config_file, ptr_section,
+        "item_tls_version_insecure", "color",
+        N_("color for insecure TLS versions in bar item \"tls_version\""),
+        NULL, -1, 0, "red", NULL, 0,
+        NULL, NULL, NULL,
+        &irc_config_change_color_item_tls_version, NULL, NULL,
+        NULL, NULL, NULL);
     irc_config_color_message_account = weechat_config_new_option (
         irc_config_file, ptr_section,
         "message_account", "color",
index b0d6a849f4e7e2792186d3adf03a340f66944a85..cbd7f45f17f1b8a036ec961961b45d02241012e5 100644 (file)
@@ -154,6 +154,9 @@ extern struct t_config_option *irc_config_color_item_channel_modes;
 extern struct t_config_option *irc_config_color_item_lag_counting;
 extern struct t_config_option *irc_config_color_item_lag_finished;
 extern struct t_config_option *irc_config_color_item_nick_modes;
+extern struct t_config_option *irc_config_color_item_tls_version_ok;
+extern struct t_config_option *irc_config_color_item_tls_version_deprecated;
+extern struct t_config_option *irc_config_color_item_tls_version_insecure;
 extern struct t_config_option *irc_config_color_message_account;
 extern struct t_config_option *irc_config_color_message_chghost;
 extern struct t_config_option *irc_config_color_message_join;
index 5be5796f4f8cdf767c6b3c86b5b8928af67ae295..f5f91b9e04ee0d5d85aa9982151885b92417be5b 100644 (file)
@@ -2994,6 +2994,7 @@ IRC_PROTOCOL_CALLBACK(001)
     server->is_connected = 1;
     server->reconnect_delay = 0;
     server->monitor_time = time (NULL) + 5;
+    irc_server_set_tls_version (server);
 
     if (server->hook_timer_connection)
     {
index a8fc93ea4dc0e5b0e2c71d76bd443604fa14a2c9..abe307d70d0edbe61087ecbee5a271a5c1141f7c 100644 (file)
@@ -1118,6 +1118,37 @@ irc_server_set_lag (struct t_irc_server *server)
     weechat_bar_item_update ("lag");
 }
 
+/*
+ * Sets tls_version in server buffer (local variable), update bar item
+ * "tls_version".
+ */
+
+void
+irc_server_set_tls_version (struct t_irc_server *server)
+{
+    gnutls_protocol_t version;
+
+    if (server->is_connected)
+    {
+        if (server->ssl_connected)
+        {
+            version = gnutls_protocol_get_version (server->gnutls_sess);
+            weechat_buffer_set (server->buffer, "localvar_set_tls_version",
+                                gnutls_protocol_get_name (version));
+        }
+        else
+        {
+            weechat_buffer_set (server->buffer, "localvar_set_tls_version",
+                                _("cleartext"));
+        }
+    }
+    else
+    {
+        weechat_buffer_set (server->buffer, "localvar_del_tls_version", "");
+    }
+    weechat_bar_item_update ("tls_version");
+}
+
 /*
  * Gets prefix_modes for server (for example: "ohv").
  *
@@ -3732,6 +3763,8 @@ irc_server_close_connection (struct t_irc_server *server)
     /* server is now disconnected */
     server->is_connected = 0;
     server->ssl_connected = 0;
+
+    irc_server_set_tls_version (server);
 }
 
 /*
index 11d8bf281ef079f89970c2f9be84d06239ad578c..535b61c903bd11d7bfd55c7aa6650619edeac60c 100644 (file)
@@ -323,6 +323,7 @@ extern const char *irc_server_get_chantypes (struct t_irc_server *server);
 extern void irc_server_set_prefix_modes_chars (struct t_irc_server *server,
                                                const char *prefix);
 extern void irc_server_set_lag (struct t_irc_server *server);
+extern void irc_server_set_tls_version (struct t_irc_server *server);
 extern const char *irc_server_get_prefix_modes (struct t_irc_server *server);
 extern const char *irc_server_get_prefix_chars (struct t_irc_server *server);
 extern int irc_server_get_prefix_mode_index (struct t_irc_server *server,
index bb60a8b20c994622868da234f79a5b8bcfd28d1c..070ee0712b9feeeaf0e32a554f87f6badaa5bf9b 100644 (file)
@@ -391,6 +391,7 @@ xfer_chat_open_buffer (struct t_xfer *xfer)
         weechat_buffer_set (xfer->buffer, "localvar_set_type", "private");
         weechat_buffer_set (xfer->buffer, "localvar_set_nick", xfer->local_nick);
         weechat_buffer_set (xfer->buffer, "localvar_set_channel", xfer->remote_nick);
+        weechat_buffer_set (xfer->buffer, "localvar_set_tls_version", _("cleartext"));
         weechat_buffer_set (xfer->buffer, "highlight_words_add", "$nick");
     }