summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSébastien Helleu <flashcode@flashtux.org>2023-05-16 21:03:22 +0200
committerSébastien Helleu <flashcode@flashtux.org>2023-05-16 21:03:22 +0200
commit1f21cdc0bd89a326fc7e682c5de0b433846a48de (patch)
treea4b8cca2728a5604fc9bd4968698e6b8acee389b
parente11ce668a231f6e5cb63960fe965e3c7b84c5895 (diff)
downloadweechat-1f21cdc0bd89a326fc7e682c5de0b433846a48de.zip
irc: update secure data when server autojoin option contains `${sec.data.xxx}` and option autojoin_dynamic is enabled (closes #1934)
-rw-r--r--ChangeLog.adoc1
-rw-r--r--src/plugins/irc/irc-join.c135
-rw-r--r--tests/unit/plugins/irc/test-irc-join.cpp57
3 files changed, 158 insertions, 35 deletions
diff --git a/ChangeLog.adoc b/ChangeLog.adoc
index 2bd995307..afe741976 100644
--- a/ChangeLog.adoc
+++ b/ChangeLog.adoc
@@ -74,6 +74,7 @@ Bug fixes::
* irc: reset all internal servers variables when disconnecting
* irc: fix join of channels in "autojoin" server option on first connection to server if auto reconnection is performed (issue #1873)
* irc: update autojoin option with redirected channels when autojoin_dynamic is enabled (issue #1898)
+ * irc: update secure data when server autojoin option contains `${sec.data.xxx}` and option autojoin_dynamic is enabled (issue #1934)
* irc: don't switch to buffer of joined channel if it was not manually joined nor present in server autojoin option
* irc: fix target buffer for commands 432/433 (erroneous nickname/nickname already in use) when the nickname looks like a channel
* irc: display command 437 on server buffer when nickname cannot change while banned on channel (issue #88)
diff --git a/src/plugins/irc/irc-join.c b/src/plugins/irc/irc-join.c
index 0707cb725..7f794701f 100644
--- a/src/plugins/irc/irc-join.c
+++ b/src/plugins/irc/irc-join.c
@@ -584,6 +584,54 @@ irc_join_add_channels (struct t_irc_server *server,
}
/*
+ * Sets the server autojoin option to a new value.
+ *
+ * If the autojoin contains a link to secure data (eg: "${sec.data.xxx}" with
+ * nothing before "${" and nothing after "}"), then the content of secure data
+ * is updated and the server autojoin option is kept as-is.
+ */
+
+void
+irc_join_set_autojoin_option (struct t_irc_server *server,
+ const char *join)
+{
+ const char *ptr_autojoin, *pos_option, *pos_closing_brace;
+ char *sec_data_name, **command;
+
+ sec_data_name = NULL;
+ ptr_autojoin = IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN);
+
+ if (ptr_autojoin && ptr_autojoin[0]
+ && (strncmp (ptr_autojoin, "${sec.data.", 11) == 0))
+ {
+ pos_option = ptr_autojoin + 11;
+ pos_closing_brace = strchr (pos_option, '}');
+ if (pos_closing_brace && !pos_closing_brace[1])
+ {
+ sec_data_name = weechat_strndup (pos_option,
+ pos_closing_brace - pos_option);
+ }
+ }
+
+ if (sec_data_name)
+ {
+ command = weechat_string_dyn_alloc (128);
+ weechat_string_dyn_concat (command, "/mute /secure set ", -1);
+ weechat_string_dyn_concat (command, sec_data_name, -1);
+ weechat_string_dyn_concat (command, " ", -1);
+ weechat_string_dyn_concat (command, join, -1);
+ weechat_command (weechat_buffer_search_main (), *command);
+ weechat_string_dyn_free (command, 1);
+ free (sec_data_name);
+ }
+ else
+ {
+ weechat_config_option_set (server->options[IRC_SERVER_OPTION_AUTOJOIN],
+ join, 1);
+ }
+}
+
+/*
* Adds a channel with optional key to the autojoin option of a server.
*/
@@ -591,22 +639,24 @@ void
irc_join_add_channel_to_autojoin (struct t_irc_server *server,
const char *channel_name, const char *key)
{
- char *new_autojoin;
+ char *old_autojoin, *new_autojoin;
if (!channel_name)
return;
- new_autojoin = irc_join_add_channel (
+ old_autojoin = irc_server_eval_expression (
server,
- IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN),
- channel_name,
- key);
+ IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN));
+
+ new_autojoin = irc_join_add_channel (server, old_autojoin, channel_name, key);
if (new_autojoin)
{
- weechat_config_option_set (server->options[IRC_SERVER_OPTION_AUTOJOIN],
- new_autojoin, 1);
+ irc_join_set_autojoin_option (server, new_autojoin);
free (new_autojoin);
}
+
+ if (old_autojoin)
+ free (old_autojoin);
}
/*
@@ -617,18 +667,21 @@ void
irc_join_add_channels_to_autojoin (struct t_irc_server *server,
const char *join)
{
- char *new_autojoin;
+ char *old_autojoin, *new_autojoin;
- new_autojoin = irc_join_add_channels (
+ old_autojoin = irc_server_eval_expression (
server,
- IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN),
- join);
+ IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN));
+
+ new_autojoin = irc_join_add_channels (server, old_autojoin, join);
if (new_autojoin)
{
- weechat_config_option_set (server->options[IRC_SERVER_OPTION_AUTOJOIN],
- new_autojoin, 1);
+ irc_join_set_autojoin_option (server, new_autojoin);
free (new_autojoin);
}
+
+ if (old_autojoin)
+ free (old_autojoin);
}
/*
@@ -686,21 +739,24 @@ void
irc_join_remove_channel_from_autojoin (struct t_irc_server *server,
const char *channel_name)
{
- char *new_autojoin;
+ char *old_autojoin, *new_autojoin;
if (!channel_name)
return;
- new_autojoin = irc_join_remove_channel (
+ old_autojoin = irc_server_eval_expression (
server,
- IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN),
- channel_name);
+ IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN));
+
+ new_autojoin = irc_join_remove_channel (server, old_autojoin, channel_name);
if (new_autojoin)
{
- weechat_config_option_set (server->options[IRC_SERVER_OPTION_AUTOJOIN],
- new_autojoin, 1);
+ irc_join_set_autojoin_option (server, new_autojoin);
free (new_autojoin);
}
+
+ if (old_autojoin)
+ free (old_autojoin);
}
/*
@@ -802,22 +858,25 @@ irc_join_rename_channel_in_autojoin (struct t_irc_server *server,
const char *channel_name,
const char *new_channel_name)
{
- char *new_autojoin;
+ char *old_autojoin, *new_autojoin;
if (!channel_name || !new_channel_name)
return;
- new_autojoin = irc_join_rename_channel (
+ old_autojoin = irc_server_eval_expression (
server,
- IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN),
- channel_name,
- new_channel_name);
+ IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN));
+
+ new_autojoin = irc_join_rename_channel (server, old_autojoin,
+ channel_name, new_channel_name);
if (new_autojoin)
{
- weechat_config_option_set (server->options[IRC_SERVER_OPTION_AUTOJOIN],
- new_autojoin, 1);
+ irc_join_set_autojoin_option (server, new_autojoin);
free (new_autojoin);
}
+
+ if (old_autojoin)
+ free (old_autojoin);
}
/*
@@ -860,8 +919,7 @@ irc_join_save_channels_to_autojoin (struct t_irc_server *server)
new_autojoin = irc_join_build_string (arraylist);
if (new_autojoin)
{
- weechat_config_option_set (server->options[IRC_SERVER_OPTION_AUTOJOIN],
- new_autojoin, 1);
+ irc_join_set_autojoin_option (server, new_autojoin);
free (new_autojoin);
}
@@ -897,22 +955,29 @@ irc_join_sort_channels (struct t_irc_server *server, const char *join,
void
irc_join_sort_autojoin (struct t_irc_server *server, enum t_irc_join_sort sort)
{
- const char *ptr_autojoin;
- char *new_autojoin;
+ char *old_autojoin, *new_autojoin;
if (!server)
return;
- ptr_autojoin = IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN);
+ old_autojoin = irc_server_eval_expression (
+ server,
+ IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_AUTOJOIN));
- if (!ptr_autojoin || !ptr_autojoin[0])
+ if (!old_autojoin || !old_autojoin[0])
+ {
+ if (old_autojoin)
+ free (old_autojoin);
return;
+ }
- new_autojoin = irc_join_sort_channels (server, ptr_autojoin, sort);
+ new_autojoin = irc_join_sort_channels (server, old_autojoin, sort);
if (new_autojoin)
{
- weechat_config_option_set (server->options[IRC_SERVER_OPTION_AUTOJOIN],
- new_autojoin, 1);
+ irc_join_set_autojoin_option (server, new_autojoin);
free (new_autojoin);
}
+
+ if (old_autojoin)
+ free (old_autojoin);
}
diff --git a/tests/unit/plugins/irc/test-irc-join.cpp b/tests/unit/plugins/irc/test-irc-join.cpp
index 59c21c0f4..ed8aa4087 100644
--- a/tests/unit/plugins/irc/test-irc-join.cpp
+++ b/tests/unit/plugins/irc/test-irc-join.cpp
@@ -28,6 +28,8 @@ extern "C"
#include <string.h>
#include "src/core/wee-arraylist.h"
#include "src/core/wee-config-file.h"
+#include "src/core/wee-hashtable.h"
+#include "src/core/wee-secure.h"
#include "src/gui/gui-buffer.h"
#include "src/plugins/irc/irc-channel.h"
#include "src/plugins/irc/irc-join.h"
@@ -596,6 +598,7 @@ TEST(IrcJoin, SortChannels)
/*
* Tests functions:
+ * irc_join_set_autojoin_option
* irc_join_add_channel_to_autojoin
* irc_join_add_channels_to_autojoin
* irc_join_remove_channel_from_autojoin
@@ -756,6 +759,33 @@ TEST(IrcJoin, AddRemoveChannelsAutojoin)
"#xyz,#DEF,#jkl key_xyz",
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
+ /* use of secure data in autojoin option */
+ hashtable_set (secure_hashtable_data, "autojoin", "#abc");
+ config_file_option_set (server->options[IRC_SERVER_OPTION_AUTOJOIN],
+ "${sec.data.autojoin}", 1);
+ irc_join_add_channels_to_autojoin (server, "#def key_def");
+ STRCMP_EQUAL(
+ "${sec.data.autojoin}",
+ CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
+ STRCMP_EQUAL(
+ "#def,#abc key_def",
+ (const char *)hashtable_get (secure_hashtable_data, "autojoin"));
+ irc_join_rename_channel_in_autojoin (server, "#abc", "#zzz");
+ STRCMP_EQUAL(
+ "${sec.data.autojoin}",
+ CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
+ STRCMP_EQUAL(
+ "#def,#zzz key_def",
+ (const char *)hashtable_get (secure_hashtable_data, "autojoin"));
+ irc_join_remove_channel_from_autojoin (server, "#def");
+ STRCMP_EQUAL(
+ "${sec.data.autojoin}",
+ CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
+ STRCMP_EQUAL(
+ "#zzz",
+ (const char *)hashtable_get (secure_hashtable_data, "autojoin"));
+ hashtable_remove (secure_hashtable_data, "autojoin");
+
irc_server_free (server);
}
@@ -783,6 +813,19 @@ TEST(IrcJoin, SaveChannelsToAutojoin)
"#test2,#test1 key2",
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
+ /* use of secure data in autojoin option */
+ hashtable_set (secure_hashtable_data, "autojoin", "#abc");
+ config_file_option_set (server->options[IRC_SERVER_OPTION_AUTOJOIN],
+ "${sec.data.autojoin}", 1);
+ irc_join_save_channels_to_autojoin (server);
+ STRCMP_EQUAL(
+ "${sec.data.autojoin}",
+ CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
+ STRCMP_EQUAL(
+ "#test2,#test1 key2",
+ (const char *)hashtable_get (secure_hashtable_data, "autojoin"));
+ hashtable_remove (secure_hashtable_data, "autojoin");
+
gui_buffer_close (channel1->buffer);
gui_buffer_close (channel2->buffer);
@@ -813,5 +856,19 @@ TEST(IrcJoin, SortAutojoinChannels)
STRCMP_EQUAL("#xyz,#zzz,#ABC,#def,#ghi key_xyz,key_zzz",
CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
+ /* use of secure data in autojoin option */
+ hashtable_set (secure_hashtable_data,
+ "autojoin", "#zzz,#xyz,#ghi,#def,#ABC key_zzz,key_xyz");
+ config_file_option_set (server->options[IRC_SERVER_OPTION_AUTOJOIN],
+ "${sec.data.autojoin}", 1);
+ irc_join_sort_autojoin (server, IRC_JOIN_SORT_ALPHA);
+ STRCMP_EQUAL(
+ "${sec.data.autojoin}",
+ CONFIG_STRING(server->options[IRC_SERVER_OPTION_AUTOJOIN]));
+ STRCMP_EQUAL(
+ "#xyz,#zzz,#ABC,#def,#ghi key_xyz,key_zzz",
+ (const char *)hashtable_get (secure_hashtable_data, "autojoin"));
+ hashtable_remove (secure_hashtable_data, "autojoin");
+
irc_server_free (server);
}