irc: fix length of user/nick/host in split of messages (closes #1387)

v2.8-utf8proc
Sébastien Helleu 2019-08-04 14:47:29 +02:00
parent 59ba378eec
commit b6cc5ef70f
3 changed files with 87 additions and 81 deletions

View File

@ -35,6 +35,7 @@ Bug fixes::
* core: replace newlines by spaces in argument "completion" of function hook_command (issue #538)
* core: replace char "," by "~" in color codes to separate foreground from background (issue #1264)
* alias: remove default aliases /AME and /AMSG (issue #1355)
* irc: fix length of user/nick/host in split of messages (issue #1387)
* irc: quote NICK command argument sent to the server only if there's a ":" in the nick (issue #1376, issue #1319)
* irc: return all arguments in the PONG response to a PING (issue #1369)
* irc: disable server reconnection when the server buffer is closed (issue #236)

View File

@ -658,7 +658,7 @@ irc_message_split_string (struct t_hashtable *hashtable,
const char *arguments,
const char *suffix,
const char delimiter,
int max_length_host,
int max_length_nick_user_host,
int max_length)
{
const char *pos, *pos_max, *pos_next, *pos_last_delim;
@ -666,8 +666,8 @@ irc_message_split_string (struct t_hashtable *hashtable,
int number;
max_length -= 2; /* by default: 512 - 2 = 510 bytes */
if (max_length_host >= 0)
max_length -= max_length_host;
if (max_length_nick_user_host >= 0)
max_length -= max_length_nick_user_host;
else
max_length -= (host) ? strlen (host) + 1 : 0;
max_length -= strlen (command) + 1;
@ -886,7 +886,7 @@ int
irc_message_split_privmsg_notice (struct t_hashtable *hashtable,
char *tags, char *host, char *command,
char *target, char *arguments,
int max_length_host,
int max_length_nick_user_host,
int max_length)
{
char prefix[4096], suffix[2], *pos, saved_char;
@ -926,7 +926,7 @@ irc_message_split_privmsg_notice (struct t_hashtable *hashtable,
rc = irc_message_split_string (hashtable, tags, host, command, target,
prefix, arguments, suffix,
' ', max_length_host, max_length);
' ', max_length_nick_user_host, max_length);
return rc;
}
@ -1002,8 +1002,8 @@ irc_message_split (struct t_irc_server *server, const char *message)
struct t_hashtable *hashtable;
char **argv, **argv_eol, *tags, *host, *command, *arguments, target[4096];
char *pos, monitor_action[3];
int split_ok, argc, index_args, max_length_nick, max_length_host;
int split_msg_max_length;
int split_ok, argc, index_args, max_length_nick, max_length_user;
int max_length_host, max_length_nick_user_host, split_msg_max_length;
split_ok = 0;
tags = NULL;
@ -1089,11 +1089,18 @@ irc_message_split (struct t_irc_server *server, const char *message)
max_length_nick = (server && (server->nick_max_length > 0)) ?
server->nick_max_length : 16;
max_length_host = 1 + /* ":" */
max_length_nick + /* nick */
1 + /* "!" */
63 + /* host */
1; /* " " */
max_length_user = (server && (server->user_max_length > 0)) ?
server->user_max_length : 10;
max_length_host = (server && (server->host_max_length > 0)) ?
server->host_max_length : 63;
max_length_nick_user_host = 1 + /* ":" */
max_length_nick + /* nick */
1 + /* "!" */
max_length_user + /* user */
1 + /* @ */
max_length_host + /* host */
1; /* " " */
if ((weechat_strcasecmp (command, "ison") == 0)
|| (weechat_strcasecmp (command, "wallops") == 0))
@ -1106,7 +1113,7 @@ irc_message_split (struct t_irc_server *server, const char *message)
hashtable, tags, host, command, NULL, ":",
(argv_eol[index_args][0] == ':') ?
argv_eol[index_args] + 1 : argv_eol[index_args],
NULL, ' ', max_length_host, split_msg_max_length);
NULL, ' ', max_length_nick_user_host, split_msg_max_length);
}
else if (weechat_strcasecmp (command, "monitor") == 0)
{
@ -1121,7 +1128,7 @@ irc_message_split (struct t_irc_server *server, const char *message)
"%c ", argv_eol[index_args][0]);
split_ok = irc_message_split_string (
hashtable, tags, host, command, NULL, monitor_action,
argv_eol[index_args] + 2, NULL, ',', max_length_host,
argv_eol[index_args] + 2, NULL, ',', max_length_nick_user_host,
split_msg_max_length);
}
else
@ -1130,7 +1137,7 @@ irc_message_split (struct t_irc_server *server, const char *message)
hashtable, tags, host, command, NULL, ":",
(argv_eol[index_args][0] == ':') ?
argv_eol[index_args] + 1 : argv_eol[index_args],
NULL, ',', max_length_host, split_msg_max_length);
NULL, ',', max_length_nick_user_host, split_msg_max_length);
}
}
else if (weechat_strcasecmp (command, "join") == 0)
@ -1156,7 +1163,7 @@ irc_message_split (struct t_irc_server *server, const char *message)
hashtable, tags, host, command, argv[index_args],
(argv_eol[index_args + 1][0] == ':') ?
argv_eol[index_args + 1] + 1 : argv_eol[index_args + 1],
max_length_host, split_msg_max_length);
max_length_nick_user_host, split_msg_max_length);
}
}
else if (weechat_strcasecmp (command, "005") == 0)

View File

@ -707,8 +707,7 @@ TEST(IrcMessage, Split)
"k25 nick26 nick27 nick28 nick29 nick30 nick31 nick32 nick33"
" nick34 nick35 nick36 nick37 nick38 nick39 nick40 nick41 ni"
"ck42 nick43 nick44 nick45 nick46 nick47 nick48 nick49 nick5"
"0 nick51 nick52 nick53 nick54 nick55 nick56 nick57 nick58 n"
"ick59 nick60",
"0 nick51 nick52 nick53 nick54 nick55 nick56 nick57 nick58",
(const char *)hashtable_get (hashtable, "msg1"));
STRCMP_EQUAL("nick01 nick02 nick03 nick04 nick05 nick06 nick07 nick08 nic"
"k09 nick10 nick11 nick12 nick13 nick14 nick15 nick16 nick17"
@ -716,14 +715,13 @@ TEST(IrcMessage, Split)
"ck26 nick27 nick28 nick29 nick30 nick31 nick32 nick33 nick3"
"4 nick35 nick36 nick37 nick38 nick39 nick40 nick41 nick42 n"
"ick43 nick44 nick45 nick46 nick47 nick48 nick49 nick50 nick"
"51 nick52 nick53 nick54 nick55 nick56 nick57 nick58 nick59 "
"nick60",
"51 nick52 nick53 nick54 nick55 nick56 nick57 nick58",
(const char *)hashtable_get (hashtable, "args1"));
STRCMP_EQUAL("ISON :nick61 nick62 nick63 nick64 nick65 nick66 nick67 nick"
"68 nick69 nick70 nick71 nick72 nick__73",
STRCMP_EQUAL("ISON :nick59 nick60 nick61 nick62 nick63 nick64 nick65 nick"
"66 nick67 nick68 nick69 nick70 nick71 nick72 nick__73",
(const char *)hashtable_get (hashtable, "msg2"));
STRCMP_EQUAL("nick61 nick62 nick63 nick64 nick65 nick66 nick67 nick68 nic"
"k69 nick70 nick71 nick72 nick__73",
STRCMP_EQUAL("nick59 nick60 nick61 nick62 nick63 nick64 nick65 nick66 nic"
"k67 nick68 nick69 nick70 nick71 nick72 nick__73",
(const char *)hashtable_get (hashtable, "args2"));
hashtable_free (hashtable);
@ -831,7 +829,7 @@ TEST(IrcMessage, Split)
"ck33,nick34,nick35,nick36,nick37,nick38,nick39,nick40,nick4"
"1,nick42,nick43,nick44,nick45,nick46,nick47,nick48,nick49,n"
"ick50,nick51,nick52,nick53,nick54,nick55,nick56,nick57,nick"
"58,nick59",
"58",
(const char *)hashtable_get (hashtable, "msg1"));
STRCMP_EQUAL("nick01,nick02,nick03,nick04,nick05,nick06,nick07,nick08,nic"
"k09,nick10,nick11,nick12,nick13,nick14,nick15,nick16,nick17"
@ -839,13 +837,13 @@ TEST(IrcMessage, Split)
"ck26,nick27,nick28,nick29,nick30,nick31,nick32,nick33,nick3"
"4,nick35,nick36,nick37,nick38,nick39,nick40,nick41,nick42,n"
"ick43,nick44,nick45,nick46,nick47,nick48,nick49,nick50,nick"
"51,nick52,nick53,nick54,nick55,nick56,nick57,nick58,nick59",
"51,nick52,nick53,nick54,nick55,nick56,nick57,nick58",
(const char *)hashtable_get (hashtable, "args1"));
STRCMP_EQUAL("MONITOR + nick60,nick61,nick62,nick63,nick64,nick65,nick66,"
"nick67,nick68,nick69,nick70,nick71,nick72,nick__73",
STRCMP_EQUAL("MONITOR + nick59,nick60,nick61,nick62,nick63,nick64,nick65,"
"nick66,nick67,nick68,nick69,nick70,nick71,nick72,nick__73",
(const char *)hashtable_get (hashtable, "msg2"));
STRCMP_EQUAL("nick60,nick61,nick62,nick63,nick64,nick65,nick66,nick67,nic"
"k68,nick69,nick70,nick71,nick72,nick__73",
STRCMP_EQUAL("nick59,nick60,nick61,nick62,nick63,nick64,nick65,nick66,nic"
"k67,nick68,nick69,nick70,nick71,nick72,nick__73",
(const char *)hashtable_get (hashtable, "args2"));
hashtable_free (hashtable);
@ -862,7 +860,7 @@ TEST(IrcMessage, Split)
"k33,nick34,nick35,nick36,nick37,nick38,nick39,nick40,nick41"
",nick42,nick43,nick44,nick45,nick46,nick47,nick48,nick49,ni"
"ck50,nick51,nick52,nick53,nick54,nick55,nick56,nick57,nick5"
"8,nick59,nick60",
"8",
(const char *)hashtable_get (hashtable, "msg1"));
STRCMP_EQUAL("nick01,nick02,nick03,nick04,nick05,nick06,nick07,nick08,nic"
"k09,nick10,nick11,nick12,nick13,nick14,nick15,nick16,nick17"
@ -870,14 +868,13 @@ TEST(IrcMessage, Split)
"ck26,nick27,nick28,nick29,nick30,nick31,nick32,nick33,nick3"
"4,nick35,nick36,nick37,nick38,nick39,nick40,nick41,nick42,n"
"ick43,nick44,nick45,nick46,nick47,nick48,nick49,nick50,nick"
"51,nick52,nick53,nick54,nick55,nick56,nick57,nick58,nick59,"
"nick60",
"51,nick52,nick53,nick54,nick55,nick56,nick57,nick58",
(const char *)hashtable_get (hashtable, "args1"));
STRCMP_EQUAL("MONITOR :nick61,nick62,nick63,nick64,nick65,nick66,nick67,n"
"ick68,nick69,nick70,nick71,nick72,nick__73",
STRCMP_EQUAL("MONITOR :nick59,nick60,nick61,nick62,nick63,nick64,nick65,n"
"ick66,nick67,nick68,nick69,nick70,nick71,nick72,nick__73",
(const char *)hashtable_get (hashtable, "msg2"));
STRCMP_EQUAL("nick61,nick62,nick63,nick64,nick65,nick66,nick67,nick68,nic"
"k69,nick70,nick71,nick72,nick__73",
STRCMP_EQUAL("nick59,nick60,nick61,nick62,nick63,nick64,nick65,nick66,nic"
"k67,nick68,nick69,nick70,nick71,nick72,nick__73",
(const char *)hashtable_get (hashtable, "args2"));
hashtable_free (hashtable);
@ -917,7 +914,7 @@ TEST(IrcMessage, Split)
"ligula ut nibh malesuada, vel vehicula leo pulvinar. Nullam"
" tellus dolor, posuere sed orci in, pretium fermentum ante."
" Donec a quam vulputate, fermentum nisi nec, convallis sapi"
"en. Vestibulum",
"en.",
(const char *)hashtable_get (hashtable, "msg1"));
STRCMP_EQUAL("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fu"
"sce auctor ac leo ut maximus. Curabitur vestibulum facilisi"
@ -925,14 +922,14 @@ TEST(IrcMessage, Split)
"aretra metus eu hendrerit. Proin viverra ligula ut nibh mal"
"esuada, vel vehicula leo pulvinar. Nullam tellus dolor, pos"
"uere sed orci in, pretium fermentum ante. Donec a quam vulp"
"utate, fermentum nisi nec, convallis sapien. Vestibulum",
"utate, fermentum nisi nec, convallis sapien.",
(const char *)hashtable_get (hashtable, "args1"));
STRCMP_EQUAL("PRIVMSG #channel :malesuada dui eget iaculis sagittis. Prae"
"sent egestas non ex quis blandit. Maecenas quis leo nunc. I"
"n.",
STRCMP_EQUAL("PRIVMSG #channel :Vestibulum malesuada dui eget iaculis sag"
"ittis. Praesent egestas non ex quis blandit. Maecenas quis "
"leo nunc. In.",
(const char *)hashtable_get (hashtable, "msg2"));
STRCMP_EQUAL("malesuada dui eget iaculis sagittis. Praesent egestas non e"
"x quis blandit. Maecenas quis leo nunc. In.",
STRCMP_EQUAL("Vestibulum malesuada dui eget iaculis sagittis. Praesent eg"
"estas non ex quis blandit. Maecenas quis leo nunc. In.",
(const char *)hashtable_get (hashtable, "args2"));
hashtable_free (hashtable);
@ -952,8 +949,7 @@ TEST(IrcMessage, Split)
" suscipit pharetra metus eu hendrerit. Proin viverra ligula"
" ut nibh malesuada, vel vehicula leo pulvinar. Nullam tellu"
"s dolor, posuere sed orci in, pretium fermentum ante. Donec"
" a quam vulputate, fermentum nisi nec, convallis sapien. Ve"
"stibulum",
" a quam vulputate, fermentum nisi nec, convallis sapien.",
(const char *)hashtable_get (hashtable, "msg1"));
STRCMP_EQUAL("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fu"
"sce auctor ac leo ut maximus. Curabitur vestibulum facilisi"
@ -961,14 +957,15 @@ TEST(IrcMessage, Split)
"aretra metus eu hendrerit. Proin viverra ligula ut nibh mal"
"esuada, vel vehicula leo pulvinar. Nullam tellus dolor, pos"
"uere sed orci in, pretium fermentum ante. Donec a quam vulp"
"utate, fermentum nisi nec, convallis sapien. Vestibulum",
"utate, fermentum nisi nec, convallis sapien.",
(const char *)hashtable_get (hashtable, "args1"));
STRCMP_EQUAL("@tag1=value1;tag2=value2;tag3=value3 :nick!user@host PRIVMS"
"G #channel :malesuada dui eget iaculis sagittis. Praesent e"
"gestas non ex quis blandit. Maecenas quis leo nunc. In.",
"G #channel :Vestibulum malesuada dui eget iaculis sagittis."
" Praesent egestas non ex quis blandit. Maecenas quis leo nu"
"nc. In.",
(const char *)hashtable_get (hashtable, "msg2"));
STRCMP_EQUAL("malesuada dui eget iaculis sagittis. Praesent egestas non e"
"x quis blandit. Maecenas quis leo nunc. In.",
STRCMP_EQUAL("Vestibulum malesuada dui eget iaculis sagittis. Praesent eg"
"estas non ex quis blandit. Maecenas quis leo nunc. In.",
(const char *)hashtable_get (hashtable, "args2"));
hashtable_free (hashtable);
@ -989,7 +986,7 @@ TEST(IrcMessage, Split)
"erit. Proin viverra ligula ut nibh malesuada, vel vehicula "
"leo pulvinar. Nullam tellus dolor, posuere sed orci in, pre"
"tium fermentum ante. Donec a quam vulputate, fermentum nisi"
" nec, convallis sapien." "\x01",
" nec, convallis" "\x01",
(const char *)hashtable_get (hashtable, "msg1"));
STRCMP_EQUAL("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fu"
"sce auctor ac leo ut maximus. Curabitur vestibulum facilisi"
@ -997,14 +994,15 @@ TEST(IrcMessage, Split)
"aretra metus eu hendrerit. Proin viverra ligula ut nibh mal"
"esuada, vel vehicula leo pulvinar. Nullam tellus dolor, pos"
"uere sed orci in, pretium fermentum ante. Donec a quam vulp"
"utate, fermentum nisi nec, convallis sapien.",
"utate, fermentum nisi nec, convallis",
(const char *)hashtable_get (hashtable, "args1"));
STRCMP_EQUAL("PRIVMSG #channel :" "\x01" "ACTION " "Vestibulum malesuada "
"dui eget iaculis sagittis. Praesent egestas non ex quis bla"
"ndit. Maecenas quis leo nunc. In." "\x01",
STRCMP_EQUAL("PRIVMSG #channel :" "\x01" "ACTION " "sapien. Vestibulum ma"
"lesuada dui eget iaculis sagittis. Praesent egestas non ex "
"quis blandit. Maecenas quis leo nunc. In." "\x01",
(const char *)hashtable_get (hashtable, "msg2"));
STRCMP_EQUAL("Vestibulum malesuada dui eget iaculis sagittis. Praesent eg"
"estas non ex quis blandit. Maecenas quis leo nunc. In.",
STRCMP_EQUAL("sapien. Vestibulum malesuada dui eget iaculis sagittis. Pra"
"esent egestas non ex quis blandit. Maecenas quis leo nunc. "
"In.",
(const char *)hashtable_get (hashtable, "args2"));
hashtable_free (hashtable);
@ -1022,7 +1020,7 @@ TEST(IrcMessage, Split)
"ligula ut nibh malesuada, vel vehicula leo pulvinar. Nullam"
" tellus dolor, posuere sed orci in, pretium fermentum ante."
" Donec a quam vulputate, fermentum nisi nec, convallis sapi"
"en. Vestibulum",
"en.",
(const char *)hashtable_get (hashtable, "msg1"));
STRCMP_EQUAL("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fu"
"sce auctor ac leo ut maximus. Curabitur vestibulum facilisi"
@ -1030,34 +1028,34 @@ TEST(IrcMessage, Split)
"aretra metus eu hendrerit. Proin viverra ligula ut nibh mal"
"esuada, vel vehicula leo pulvinar. Nullam tellus dolor, pos"
"uere sed orci in, pretium fermentum ante. Donec a quam vulp"
"utate, fermentum nisi nec, convallis sapien. Vestibulum",
"utate, fermentum nisi nec, convallis sapien.",
(const char *)hashtable_get (hashtable, "args1"));
STRCMP_EQUAL("PRIVMSG #channel :malesuada dui eget iaculis sagittis. Prae"
"sent egestas non ex quis blandit. Maecenas quis leo nunc. I"
"nteger eget tincidunt sapien, id lobortis libero. Aliquam p"
"osuere turpis in libero luctus pharetra. Vestibulum dui aug"
"ue, volutpat ultricies laoreet in, varius sodales ante. Ut "
"nec urna non lacus bibendum scelerisque. Nullam convallis a"
"liquet lectus interdum volutpat. Phasellus lacus tortor, el"
"ementum",
STRCMP_EQUAL("PRIVMSG #channel :Vestibulum malesuada dui eget iaculis sag"
"ittis. Praesent egestas non ex quis blandit. Maecenas quis "
"leo nunc. Integer eget tincidunt sapien, id lobortis libero"
". Aliquam posuere turpis in libero luctus pharetra. Vestibu"
"lum dui augue, volutpat ultricies laoreet in, varius sodale"
"s ante. Ut nec urna non lacus bibendum scelerisque. Nullam "
"convallis aliquet lectus interdum volutpat. Phasellus lacus",
(const char *)hashtable_get (hashtable, "msg2"));
STRCMP_EQUAL("malesuada dui eget iaculis sagittis. Praesent egestas non e"
"x quis blandit. Maecenas quis leo nunc. Integer eget tincid"
"unt sapien, id lobortis libero. Aliquam posuere turpis in l"
"ibero luctus pharetra. Vestibulum dui augue, volutpat ultri"
"cies laoreet in, varius sodales ante. Ut nec urna non lacus"
" bibendum scelerisque. Nullam convallis aliquet lectus inte"
"rdum volutpat. Phasellus lacus tortor, elementum",
STRCMP_EQUAL("Vestibulum malesuada dui eget iaculis sagittis. Praesent eg"
"estas non ex quis blandit. Maecenas quis leo nunc. Integer "
"eget tincidunt sapien, id lobortis libero. Aliquam posuere "
"turpis in libero luctus pharetra. Vestibulum dui augue, vol"
"utpat ultricies laoreet in, varius sodales ante. Ut nec urn"
"a non lacus bibendum scelerisque. Nullam convallis aliquet "
"lectus interdum volutpat. Phasellus lacus",
(const char *)hashtable_get (hashtable, "args2"));
STRCMP_EQUAL("PRIVMSG #channel :hendrerit lobortis ac, commodo id augue. "
STRCMP_EQUAL("PRIVMSG #channel :tortor, elementum hendrerit lobortis ac, "
"commodo id augue. Morbi imperdiet interdum consequat. Mauri"
"s purus lectus, ultrices sed velit et, pretium rhoncus erat"
". Pellentesque pellentesque efficitur nisl quis sodales. Na"
"m hendreri.",
(const char *)hashtable_get (hashtable, "msg3"));
STRCMP_EQUAL("tortor, elementum hendrerit lobortis ac, commodo id augue. "
"Morbi imperdiet interdum consequat. Mauris purus lectus, ul"
"trices sed velit et, pretium rhoncus erat. Pellentesque pel"
"lentesque efficitur nisl quis sodales. Nam hendreri.",
(const char *)hashtable_get (hashtable, "msg3"));
STRCMP_EQUAL("hendrerit lobortis ac, commodo id augue. Morbi imperdiet in"
"terdum consequat. Mauris purus lectus, ultrices sed velit e"
"t, pretium rhoncus erat. Pellentesque pellentesque efficitu"
"r nisl quis sodales. Nam hendreri.",
(const char *)hashtable_get (hashtable, "args3"));
hashtable_free (hashtable);