1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-12 14:14:48 +02:00

relay: add handshake option "escape_commands" in weechat protocol

This commit is contained in:
Sébastien Helleu
2023-06-03 17:32:44 +02:00
parent 2660164118
commit 482fe6604c
8 changed files with 118 additions and 27 deletions
+1
View File
@@ -67,6 +67,7 @@ New features::
* relay: make TLS certificate/key loading error handling more verbose (issue #1558)
* relay: add modifiers "relay_client_irc_in", "relay_client_irc_out1" and "relay_client_irc_out" in irc protocol
* relay: add support of capability "echo-message" in irc protocol (issue #1949)
* relay: add handshake option "escape_commands" in weechat protocol
Bug fixes::
+16 -3
View File
@@ -98,7 +98,7 @@ List of available commands (detail in next chapters):
[[command_handshake]]
=== handshake
_WeeChat ≥ 2.9, updated in version 3.5._
_WeeChat ≥ 2.9, updated in versions 3.5, 4.0.0._
Perform an handshake between the client and WeeChat: this is required in most
cases to know the session settings and prepare the authentication with the
@@ -131,6 +131,11 @@ Arguments:
*** _zstd_: compress with https://facebook.github.io/zstd/[Zstandard ^↗^^]:
better compression and much faster than _zlib_ for both compression and decompression
_(WeeChat ≥ 3.5)_
** _escape_commands_: commands sent by the client to relay must be escaped:
all backslashes are interpreted and a single backslash must be escaped (`\\`);
this allows for example the client to send multiline messages (chars `\n` are
converted to newlines, see <<command_input,input command>>)
_(WeeChat ≥ 4.0.0)_
Notes about option _password_hash_algo_:
@@ -602,7 +607,7 @@ Request an _infolist_.
[IMPORTANT]
Content of infolist is a duplication of actual data. Wherever possible, use
command <<command_hdata,hdata>>, which is direct access to data (it is
<<command_hdata,hdata command>>, which is direct access to data (it is
faster, uses less memory and returns smaller objects in message).
Syntax:
@@ -964,6 +969,14 @@ input core.weechat /help filter
input irc.libera.#weechat hello!
----
* Send multiline message to #test channel (option _escape_commands_ must have
been enabled in <<command_handshake,handshake command>> and requires
WeeChat ≥ 4.0.0):
----
input irc.ergo.#test this message has\n2 lines
----
[[command_completion]]
=== completion
@@ -1211,7 +1224,7 @@ Arguments:
specify all buffers
* _options_: one of following keywords, separated by commas (default is
_buffers,upgrade,buffer,nicklist_ for "*" and _buffer,nicklist_ for a buffer);
see <<command_sync,command sync>> for values
see <<command_sync,sync command>> for values
[NOTE]
When using buffer "*", the other buffers synchronized (using a name) are kept. +
+17 -3
View File
@@ -102,7 +102,7 @@ Liste des commandes disponibles (détail dans les chapitres suivants) :
[[command_handshake]]
=== handshake
_WeeChat ≥ 2.9, mis à jour dans la version 3.5._
_WeeChat ≥ 2.9, mis à jour dans les versions 3.5, 4.0.0._
Effectuer une poignée de main entre le client et WeeChat : cela est obligatoire
dans la plupart des cas pour connaître les paramètres de la session et préparer
@@ -138,6 +138,12 @@ Paramètres :
*** _zstd_ : compresser avec https://facebook.github.io/zstd/[Zstandard ^↗^^] :
meilleure compression et bien plus rapide que _zlib_ pour la compression et
la décompression _(WeeChat ≥ 3.5)_
** _escape_commands_ : les commandes envoyées par le client vers _relay_ doivent
être échappées : toutes les barres obliques inverses sont interprétées et une
barre oblique inverse simple doit être échappée (`\\`) ; cela autorise
par exemple un client à envoyer des messages multi-lignes (les caractères
`\n` sont remplacés par des nouvelles lignes, voir la <<command_input,commande input>>)
_(WeeChat ≥ 4.0.0)_
Notes à propos de l'option _password_hash_algo_ :
@@ -614,7 +620,7 @@ Demander une _infolist_.
[IMPORTANT]
Le contenu de l'infolist est une duplication des données. Dans la mesure du
possible, utilisez plutôt la commande <<command_hdata,hdata>>, qui est un accès
possible, utilisez plutôt la <<command_hdata,commande hdata>>, qui est un accès
direct aux données (cela est plus rapide, utilise moins de mémoire et retourne
des objets plus petits dans le message).
@@ -978,6 +984,14 @@ input core.weechat /help filter
input irc.libera.#weechat bonjour !
----
* Envoyer un message multi-lignes au canal #test (l'option _escape_commands_
doit avoir été activée dans la <<command_handshake,commande handshake>> et
requiert WeeChat ≥ 4.0.0) :
----
input irc.ergo.#test ce message a\n2 lignes
----
[[command_completion]]
=== completion
@@ -1228,7 +1242,7 @@ Paramètres :
spécifier tous les tampons
* _options_ : un ou plusieurs mots-clés, séparés par des virgules (le défaut est
_buffers,upgrade,buffer,nicklist_ pour "*" et _buffer,nicklist_ pour un
tampon) ; voir <<command_sync,la commande sync>> pour les valeurs
tampon) ; voir la <<command_sync,commande sync>> pour les valeurs
[NOTE]
En utilisant le tampon "*", les autres tampons synchronisés (en utilisant un
+17 -1
View File
@@ -106,7 +106,8 @@ _リレー_ プラグインは _IRC プロキシ_ のように振舞います (
[[command_handshake]]
=== handshake
_WeeChat ≥ 2.9, updated in version 3.5._
// TRANSLATION MISSING
_WeeChat ≥ 2.9, updated in versions 3.5, 4.0.0._
Perform an handshake between the client and WeeChat: this is required in most
cases to know the session settings and prepare the authentication with the
@@ -140,6 +141,12 @@ Arguments:
*** _zstd_: compress with https://facebook.github.io/zstd/[Zstandard ^↗^^]: better
compression and much faster than _zlib_ for both compression and decompression
_(WeeChat ≥ 3.5)_
// TRANSLATION MISSING
** _escape_commands_: commands sent by the client to relay must be escaped:
all backslashes are interpreted and a single backslash must be escaped (`\\`);
this allows for example the client to send multiline messages (chars `\n` are
converted to newlines, see <<command_input,input command>>)
_(WeeChat ≥ 4.0.0)_
Notes about option _password_hash_algo_:
@@ -985,6 +992,15 @@ input core.weechat /help filter
input irc.libera.#weechat hello!
----
// TRANSLATION MISSING
* Send multiline message to #test channel (option _escape_commands_ must have
been enabled in <<command_handshake,handshake command>> and requires
WeeChat ≥ 4.0.0):
----
input irc.ergo.#test this message has\n2 lines
----
// TRANSLATION MISSING
[[command_completion]]
=== completion
+17 -1
View File
@@ -92,7 +92,8 @@ _клијенти_ су повезани са _релејем_ као што ј
[[command_handshake]]
=== handshake
_WeeChat ≥ 2.9, ажурирано у верзији 3.5._
// TRANSLATION MISSING
_WeeChat ≥ 2.9, updated in versions 3.5, 4.0.0._
Извршава руковање између клијента и програма WeeChat: ово је у већини случајева неопходно како би се сазнале поставке сесије и припремила аутентификација командом _init_.
@@ -122,6 +123,12 @@ _WeeChat ≥ 2.9, ажурирано у верзији 3.5._
*** _zstd_: компресија са https://facebook.github.io/zstd/[Zstandard ^↗^^]: боља
компресија, као и много бржа компресија и декомпресија у односу на _zlib_
_(WeeChat ≥ 3.5)_
// TRANSLATION MISSING
** _escape_commands_: commands sent by the client to relay must be escaped:
all backslashes are interpreted and a single backslash must be escaped (`\\`);
this allows for example the client to send multiline messages (chars `\n` are
converted to newlines, see <<command_input,input command>>)
_(WeeChat ≥ 4.0.0)_
Напомене у вези опције _password_hash_algo_:
@@ -911,6 +918,15 @@ input core.weechat /help filter
input irc.libera.#weechat здраво!
----
// TRANSLATION MISSING
* Send multiline message to #test channel (option _escape_commands_ must have
been enabled in <<command_handshake,handshake command>> and requires
WeeChat ≥ 4.0.0):
----
input irc.ergo.#test this message has\n2 lines
----
[[command_completion]]
=== completion
@@ -203,6 +203,10 @@ relay_weechat_protocol_handshake_reply (struct t_relay_client *client,
hashtable,
"compression",
relay_weechat_compression_string[RELAY_WEECHAT_DATA(client, compression)]);
weechat_hashtable_set (
hashtable,
"escape_commands",
RELAY_WEECHAT_DATA(client, escape_commands) ? "on" : "off");
msg = relay_weechat_msg_new (id);
if (msg)
@@ -315,6 +319,12 @@ RELAY_WEECHAT_PROTOCOL_CALLBACK(handshake)
weechat_string_free_split (compressions);
}
}
else if (strcmp (options[i], "escape_commands") == 0)
{
RELAY_WEECHAT_DATA(client, escape_commands) =
(weechat_strcmp (pos, "on") == 0) ?
1 : 0;
}
}
}
weechat_string_free_split_command (options);
@@ -1742,7 +1752,8 @@ RELAY_WEECHAT_PROTOCOL_CALLBACK(quit)
void
relay_weechat_protocol_recv (struct t_relay_client *client, const char *data)
{
char *pos, *id, *command, **argv, **argv_eol;
const char *ptr_data;
char *data_unescaped, *pos, *id, *command, **argv, **argv_eol;
int i, argc, return_code;
struct t_relay_weechat_protocol_cb protocol_cb[] =
{ { "handshake", &relay_weechat_protocol_cb_handshake },
@@ -1775,35 +1786,44 @@ relay_weechat_protocol_recv (struct t_relay_client *client, const char *data)
data);
}
/* extract id */
data_unescaped = NULL;
ptr_data = data;
id = NULL;
if (data[0] == '(')
command = NULL;
argv = NULL;
argv_eol = NULL;
if (RELAY_WEECHAT_DATA(client, escape_commands))
{
pos = strchr (data, ')');
data_unescaped = weechat_string_convert_escaped_chars (data);
if (data_unescaped)
ptr_data = data_unescaped;
}
/* extract id */
if (ptr_data[0] == '(')
{
pos = strchr (ptr_data, ')');
if (pos)
{
id = weechat_strndup (data + 1, pos - data - 1);
data = pos + 1;
while (data[0] == ' ')
id = weechat_strndup (ptr_data + 1, pos - ptr_data - 1);
ptr_data = pos + 1;
while (ptr_data[0] == ' ')
{
data++;
ptr_data++;
}
}
}
/* search end of data */
pos = strchr (data, ' ');
pos = strchr (ptr_data, ' ');
if (pos)
command = weechat_strndup (data, pos - data);
command = weechat_strndup (ptr_data, pos - ptr_data);
else
command = strdup (data);
command = strdup (ptr_data);
if (!command)
{
if (id)
free (id);
return;
}
goto end;
argc = 0;
argv = NULL;
@@ -1868,6 +1888,9 @@ relay_weechat_protocol_recv (struct t_relay_client *client, const char *data)
}
}
end:
if (data_unescaped)
free (data_unescaped);
if (id)
free (id);
free (command);
@@ -184,6 +184,7 @@ relay_weechat_alloc (struct t_relay_client *client)
RELAY_WEECHAT_DATA(client, password_ok) = 0;
RELAY_WEECHAT_DATA(client, totp_ok) = 0;
RELAY_WEECHAT_DATA(client, compression) = RELAY_WEECHAT_COMPRESSION_OFF;
RELAY_WEECHAT_DATA(client, escape_commands) = 0;
RELAY_WEECHAT_DATA(client, buffers_sync) =
weechat_hashtable_new (32,
WEECHAT_HASHTABLE_STRING,
@@ -237,6 +238,8 @@ relay_weechat_alloc_with_infolist (struct t_relay_client *client,
RELAY_WEECHAT_DATA(client, totp_ok) = 1;
RELAY_WEECHAT_DATA(client, compression) = weechat_infolist_integer (
infolist, "compression");
RELAY_WEECHAT_DATA(client, escape_commands) = weechat_infolist_integer (
infolist, "escape_commands");
/* sync of buffers */
RELAY_WEECHAT_DATA(client, buffers_sync) = weechat_hashtable_new (
@@ -357,6 +360,8 @@ relay_weechat_add_to_infolist (struct t_infolist_item *item,
return 0;
if (!weechat_infolist_new_var_integer (item, "compression", RELAY_WEECHAT_DATA(client, compression)))
return 0;
if (!weechat_infolist_new_var_integer (item, "escape_commands", RELAY_WEECHAT_DATA(client, escape_commands)))
return 0;
if (!weechat_hashtable_add_to_infolist (RELAY_WEECHAT_DATA(client, buffers_sync), item, "buffers_sync"))
return 0;
@@ -376,6 +381,7 @@ relay_weechat_print_log (struct t_relay_client *client)
weechat_log_printf (" password_ok . . . . . . : %d", RELAY_WEECHAT_DATA(client, password_ok));
weechat_log_printf (" totp_ok . . . . . . . . : %d", RELAY_WEECHAT_DATA(client, totp_ok));
weechat_log_printf (" compression . . . . . . : %d", RELAY_WEECHAT_DATA(client, compression));
weechat_log_printf (" escape_commands . . . . : %d", RELAY_WEECHAT_DATA(client, escape_commands));
weechat_log_printf (" buffers_sync. . . . . . : 0x%lx (hashtable: '%s')",
RELAY_WEECHAT_DATA(client, buffers_sync),
weechat_hashtable_get_string (RELAY_WEECHAT_DATA(client, buffers_sync),
+5 -3
View File
@@ -44,13 +44,15 @@ struct t_relay_weechat_data
/* handshake status */
int handshake_done; /* 1 if handshake has been done */
/* handshake options */
enum t_relay_weechat_compression compression; /* compression type */
int escape_commands; /* 1 if backslashes are interpreted */
/* in commands sent by client */
/* authentication status (init command) */
int password_ok; /* password received and OK? */
int totp_ok; /* TOTP received and OK? */
/* options set by client (init command) */
enum t_relay_weechat_compression compression; /* compression type */
/* sync of buffers */
struct t_hashtable *buffers_sync; /* buffers synchronized (events */
/* received for these buffers) */