From b6cc5ef70f942aaa28b62ae4dd4556c08e30123d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Sun, 4 Aug 2019 14:47:29 +0200 Subject: [PATCH] irc: fix length of user/nick/host in split of messages (closes #1387) --- ChangeLog.adoc | 1 + src/plugins/irc/irc-message.c | 39 +++--- tests/unit/plugins/irc/test-irc-message.cpp | 128 ++++++++++---------- 3 files changed, 87 insertions(+), 81 deletions(-) diff --git a/ChangeLog.adoc b/ChangeLog.adoc index ca7443af2..825de79a7 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -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) diff --git a/src/plugins/irc/irc-message.c b/src/plugins/irc/irc-message.c index b9fe30bb9..4350128e2 100644 --- a/src/plugins/irc/irc-message.c +++ b/src/plugins/irc/irc-message.c @@ -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) diff --git a/tests/unit/plugins/irc/test-irc-message.cpp b/tests/unit/plugins/irc/test-irc-message.cpp index e0557c88b..662a53157 100644 --- a/tests/unit/plugins/irc/test-irc-message.cpp +++ b/tests/unit/plugins/irc/test-irc-message.cpp @@ -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);