irc: save CLIENTTAGDENY from message 005 in server, do not send typing messages if "typing" client tag is denied

This commit is contained in:
Sébastien Helleu 2021-08-08 18:37:15 +02:00
parent 415ea95eb4
commit 8e676edd1a
6 changed files with 198 additions and 1 deletions

View File

@ -3567,6 +3567,19 @@ IRC_PROTOCOL_CALLBACK(005)
pos2[0] = ' ';
}
/* save client tag deny */
pos = strstr (argv_eol[3], "CLIENTTAGDENY=");
if (pos)
{
pos += 14;
pos2 = strchr (pos, ' ');
if (pos2)
pos2[0] = '\0';
irc_server_set_clienttagdeny (server, pos);
if (pos2)
pos2[0] = ' ';
}
/* save whole message (concatenate to existing isupport, if any) */
pos_start = NULL;
pos = strstr (argv_eol[3], " :");

View File

@ -1115,6 +1115,72 @@ irc_server_set_prefix_modes_chars (struct t_irc_server *server,
irc_nick_realloc_prefixes (server, old_length_chars, length_chars);
}
/*
* Sets "clienttagdeny", "clienttagdeny_count", "clienttagdeny_array" and
* "typing_allowed" in server using value of CLIENTTAGDENY in IRC message 005.
* The masks in array start with "!" for a tag that is allowed (not denied).
*
* For example, if clienttagdeny is "*,-foo,-example/bar":
* clienttagdeny is set to "*,-foo,-example/bar"
* clienttagdeny_count is set to 3
* clienttagdeny_array is set to ["*", "!foo", "!example/bar"]
* typing_allowed is set to 0
*
* For example, if clienttagdeny is "*,-typing":
* clienttagdeny is set to "*,-typing"
* clienttagdeny_count is set to 2
* clienttagdeny_array is set to ["*", "!typing"]
* typing_allowed is set to 1
*/
void
irc_server_set_clienttagdeny (struct t_irc_server *server,
const char *clienttagdeny)
{
int i, typing_denied;
if (!server)
return;
/* free previous values */
if (server->clienttagdeny)
{
free (server->clienttagdeny);
server->clienttagdeny = NULL;
}
if (server->clienttagdeny_array)
{
weechat_string_free_split (server->clienttagdeny_array);
server->clienttagdeny_array = NULL;
}
server->clienttagdeny_count = 0;
server->typing_allowed = 1;
/* assign new values */
if (!clienttagdeny || !clienttagdeny[0])
return;
server->clienttagdeny = strdup (clienttagdeny);
server->clienttagdeny_array = weechat_string_split (
clienttagdeny, ",", NULL,
WEECHAT_STRING_SPLIT_STRIP_LEFT
| WEECHAT_STRING_SPLIT_STRIP_RIGHT
| WEECHAT_STRING_SPLIT_COLLAPSE_SEPS,
0, &server->clienttagdeny_count);
if (server->clienttagdeny_array)
{
for (i = 0; i < server->clienttagdeny_count; i++)
{
if (server->clienttagdeny_array[i][0] == '-')
server->clienttagdeny_array[i][0] = '!';
}
}
typing_denied = weechat_string_match_list (
"typing",
(const char **)server->clienttagdeny_array,
1);
server->typing_allowed = (typing_denied) ? 0 : 1;
}
/*
* Sets lag in server buffer (local variable), update bar item "lag"
* and send signal "irc_server_lag_changed" for the server.
@ -1530,6 +1596,10 @@ irc_server_alloc (const char *name)
new_server->chanmodes = NULL;
new_server->monitor = 0;
new_server->monitor_time = 0;
new_server->clienttagdeny = NULL;
new_server->clienttagdeny_count = 0;
new_server->clienttagdeny_array = NULL;
new_server->typing_allowed = 1;
new_server->reconnect_delay = 0;
new_server->reconnect_start = 0;
new_server->command_time = 0;
@ -2088,6 +2158,10 @@ irc_server_free_data (struct t_irc_server *server)
free (server->chantypes);
if (server->chanmodes)
free (server->chanmodes);
if (server->clienttagdeny)
free (server->clienttagdeny);
if (server->clienttagdeny_array)
weechat_string_free_split (server->clienttagdeny_array);
if (server->away_message)
free (server->away_message);
if (server->cmd_list_regexp)
@ -5985,6 +6059,10 @@ irc_server_hdata_server_cb (const void *pointer, void *data,
WEECHAT_HDATA_VAR(struct t_irc_server, chanmodes, STRING, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, monitor, INTEGER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, monitor_time, TIME, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, clienttagdeny, STRING, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, clienttagdeny_count, INTEGER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, clienttagdeny_array, STRING, 0, "clienttagdeny_count", NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, typing_allowed, INTEGER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, reconnect_delay, INTEGER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, reconnect_start, TIME, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, command_time, TIME, 0, NULL, NULL);
@ -6240,6 +6318,10 @@ irc_server_add_to_infolist (struct t_infolist *infolist,
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "monitor_time", server->monitor_time))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "clienttagdeny", server->clienttagdeny))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "typing_allowed", server->typing_allowed))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "reconnect_delay", server->reconnect_delay))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "reconnect_start", server->reconnect_start))
@ -6633,6 +6715,10 @@ irc_server_print_log ()
weechat_log_printf (" chanmodes . . . . . . . . : '%s'", ptr_server->chanmodes);
weechat_log_printf (" monitor . . . . . . . . . : %d", ptr_server->monitor);
weechat_log_printf (" monitor_time. . . . . . . : %lld", (long long)ptr_server->monitor_time);
weechat_log_printf (" clienttagdeny . . . . . . : '%s'", ptr_server->clienttagdeny);
weechat_log_printf (" clienttagdeny_count . . . : %d", ptr_server->clienttagdeny_count);
weechat_log_printf (" clienttagdeny_array . . . : 0x%lx", ptr_server->clienttagdeny_array);
weechat_log_printf (" typing_allowed . . . . . : %d", ptr_server->typing_allowed);
weechat_log_printf (" reconnect_delay . . . . . : %d", ptr_server->reconnect_delay);
weechat_log_printf (" reconnect_start . . . . . : %lld", (long long)ptr_server->reconnect_start);
weechat_log_printf (" command_time. . . . . . . : %lld", (long long)ptr_server->command_time);

View File

@ -232,6 +232,10 @@ struct t_irc_server
/* (eg "beI,k,l,imnpstaqr") */
int monitor; /* monitor limit from msg 005 (eg 100) */
time_t monitor_time; /* time for monitoring nicks (on connect)*/
char *clienttagdeny; /* list of blocked client-only tags */
int clienttagdeny_count; /* number of masks in clienttagdeny */
char **clienttagdeny_array; /* masks expanded from clienttagdeny */
int typing_allowed; /* typing not excluded by clienttagdeny? */
int reconnect_delay; /* current reconnect delay (growing) */
time_t reconnect_start; /* this time + delay = reconnect time */
time_t command_time; /* this time + command_delay = time to */
@ -332,6 +336,8 @@ extern const char *irc_server_get_isupport_value (struct t_irc_server *server,
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_clienttagdeny (struct t_irc_server *server,
const char *clienttagdeny);
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);

View File

@ -60,6 +60,10 @@ irc_typing_signal_typing_self_cb (const void *pointer, void *data,
if (!ptr_server || !ptr_channel)
return WEECHAT_RC_OK;
/* typing not allowed on server? */
if (!ptr_server->typing_allowed)
return WEECHAT_RC_OK;
/* typing works only if capability "message-tags" is enabled */
if (!weechat_hashtable_has_key (ptr_server->cap_list, "message-tags"))
return WEECHAT_RC_OK;
@ -94,8 +98,11 @@ irc_typing_send_to_targets (struct t_irc_server *server)
struct t_irc_channel *ptr_channel;
time_t current_time;
if (!weechat_config_boolean (irc_config_look_typing_status_self))
if (!weechat_config_boolean (irc_config_look_typing_status_self)
|| !server->typing_allowed)
{
return;
}
current_time = time (NULL);

View File

@ -564,6 +564,23 @@ irc_upgrade_read_cb (const void *pointer, void *data,
irc_upgrade_current_server->monitor = (int)number;
}
}
/* "clienttagdeny" is new in WeeChat 3.3 */
if (weechat_infolist_search_var (infolist, "clienttagdeny"))
{
irc_server_set_clienttagdeny (irc_upgrade_current_server,
weechat_infolist_string (infolist, "clienttagdeny"));
}
else
{
/* WeeChat <= 3.2 */
str = irc_server_get_isupport_value (irc_upgrade_current_server,
"CLIENTTAGDENY");
if (str)
{
irc_server_set_clienttagdeny (irc_upgrade_current_server,
str);
}
}
irc_upgrade_current_server->reconnect_delay = weechat_infolist_integer (infolist, "reconnect_delay");
irc_upgrade_current_server->reconnect_start = weechat_infolist_time (infolist, "reconnect_start");
irc_upgrade_current_server->command_time = weechat_infolist_time (infolist, "command_time");

View File

@ -249,6 +249,74 @@ TEST(IrcServer, SetPrefixModesChars)
/* TODO: write tests */
}
/*
* Tests functions:
* irc_server_set_clienttagdeny
*/
TEST(IrcServer, SetClienttagdeny)
{
struct t_irc_server *server;
server = irc_server_alloc ("test_clienttagdeny");
CHECK(server);
POINTERS_EQUAL(NULL, server->clienttagdeny);
LONGS_EQUAL(0, server->clienttagdeny_count);
POINTERS_EQUAL(NULL, server->clienttagdeny_array);
LONGS_EQUAL(1, server->typing_allowed);
irc_server_set_clienttagdeny (server, "*");
irc_server_set_clienttagdeny (server, NULL);
POINTERS_EQUAL(NULL, server->clienttagdeny);
LONGS_EQUAL(0, server->clienttagdeny_count);
POINTERS_EQUAL(NULL, server->clienttagdeny_array);
LONGS_EQUAL(1, server->typing_allowed);
irc_server_set_clienttagdeny (server, "*");
irc_server_set_clienttagdeny (server, "");
POINTERS_EQUAL(NULL, server->clienttagdeny);
LONGS_EQUAL(0, server->clienttagdeny_count);
POINTERS_EQUAL(NULL, server->clienttagdeny_array);
LONGS_EQUAL(1, server->typing_allowed);
irc_server_set_clienttagdeny (server, "*");
STRCMP_EQUAL("*", server->clienttagdeny);
LONGS_EQUAL(1, server->clienttagdeny_count);
STRCMP_EQUAL("*", server->clienttagdeny_array[0]);
POINTERS_EQUAL(NULL, server->clienttagdeny_array[1]);
LONGS_EQUAL(0, server->typing_allowed);
irc_server_set_clienttagdeny (server, "*,-foo");
STRCMP_EQUAL("*,-foo", server->clienttagdeny);
LONGS_EQUAL(2, server->clienttagdeny_count);
STRCMP_EQUAL("*", server->clienttagdeny_array[0]);
STRCMP_EQUAL("!foo", server->clienttagdeny_array[1]);
POINTERS_EQUAL(NULL, server->clienttagdeny_array[2]);
LONGS_EQUAL(0, server->typing_allowed);
irc_server_set_clienttagdeny (server, "*,-foo,-example/bar");
STRCMP_EQUAL("*,-foo,-example/bar", server->clienttagdeny);
LONGS_EQUAL(3, server->clienttagdeny_count);
STRCMP_EQUAL("*", server->clienttagdeny_array[0]);
STRCMP_EQUAL("!foo", server->clienttagdeny_array[1]);
STRCMP_EQUAL("!example/bar", server->clienttagdeny_array[2]);
POINTERS_EQUAL(NULL, server->clienttagdeny_array[3]);
LONGS_EQUAL(0, server->typing_allowed);
irc_server_set_clienttagdeny (server, "*,-foo,-example/bar,-typing");
STRCMP_EQUAL("*,-foo,-example/bar,-typing", server->clienttagdeny);
LONGS_EQUAL(4, server->clienttagdeny_count);
STRCMP_EQUAL("*", server->clienttagdeny_array[0]);
STRCMP_EQUAL("!foo", server->clienttagdeny_array[1]);
STRCMP_EQUAL("!example/bar", server->clienttagdeny_array[2]);
STRCMP_EQUAL("!typing", server->clienttagdeny_array[3]);
POINTERS_EQUAL(NULL, server->clienttagdeny_array[4]);
LONGS_EQUAL(1, server->typing_allowed);
irc_server_free (server);
}
/*
* Tests functions:
* irc_server_set_lag