mirror of
https://github.com/weechat/weechat.git
synced 2026-06-25 12:26:40 +02:00
irc: do not allow send of empty messages (single line or multiline)
This commit is contained in:
@@ -637,6 +637,34 @@ irc_message_parse_cap_multiline_value (struct t_irc_server *server,
|
||||
weechat_hashtable_free (values);
|
||||
}
|
||||
|
||||
/*
|
||||
* Checks if a message is empty: either empty string or contains only newlines.
|
||||
*
|
||||
* Returns:
|
||||
* 1: message is empty
|
||||
* 0: message is NOT empty
|
||||
*/
|
||||
|
||||
int
|
||||
irc_message_is_empty (const char *message)
|
||||
{
|
||||
const char *ptr_msg;
|
||||
|
||||
if (!message || !message[0])
|
||||
return 1;
|
||||
|
||||
ptr_msg = message;
|
||||
while (ptr_msg && ptr_msg[0])
|
||||
{
|
||||
if (ptr_msg[0] != '\n')
|
||||
return 0;
|
||||
ptr_msg = weechat_utf8_next_char (ptr_msg);
|
||||
}
|
||||
|
||||
/* only newlines => consider message is empty */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Encodes/decodes an IRC message using a charset.
|
||||
*
|
||||
@@ -1309,6 +1337,10 @@ irc_message_split_privmsg_notice (struct t_irc_message_split_context *context,
|
||||
|
||||
rc = 1;
|
||||
|
||||
/* privmsg/notice with empty message: not allowed */
|
||||
if (irc_message_is_empty (arguments))
|
||||
return 1;
|
||||
|
||||
if (multiline)
|
||||
{
|
||||
index_multiline_args = 1;
|
||||
@@ -1499,15 +1531,17 @@ irc_message_split (struct t_irc_server *server, const char *message)
|
||||
struct t_irc_message_split_context split_context;
|
||||
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_user;
|
||||
int max_length_host, max_length_nick_user_host, split_msg_max_length;
|
||||
int multiline, multiline_max_bytes, multiline_max_lines;
|
||||
int split_ok, split_privmsg, argc, index_args, max_length_nick;
|
||||
int max_length_user, max_length_host, max_length_nick_user_host;
|
||||
int split_msg_max_length, multiline, multiline_max_bytes;
|
||||
int multiline_max_lines;
|
||||
|
||||
split_context.hashtable = NULL;
|
||||
split_context.number = 1;
|
||||
split_context.total_bytes = 0;
|
||||
|
||||
split_ok = 0;
|
||||
split_privmsg = 0;
|
||||
tags = NULL;
|
||||
host = NULL;
|
||||
command = NULL;
|
||||
@@ -1679,6 +1713,7 @@ irc_message_split (struct t_irc_server *server, const char *message)
|
||||
* PRIVMSG target :some text here
|
||||
* NOTICE target :some text here
|
||||
*/
|
||||
split_privmsg = 1;
|
||||
if (index_args + 1 <= argc - 1)
|
||||
{
|
||||
split_ok = irc_message_split_privmsg_notice (
|
||||
@@ -1738,8 +1773,9 @@ irc_message_split (struct t_irc_server *server, const char *message)
|
||||
|
||||
end:
|
||||
if (!split_ok
|
||||
|| (weechat_hashtable_get_integer (split_context.hashtable,
|
||||
"items_count") == 0))
|
||||
|| (!split_privmsg
|
||||
&& (weechat_hashtable_get_integer (split_context.hashtable,
|
||||
"items_count") == 0)))
|
||||
{
|
||||
split_context.number = (message) ? 1 : 0;
|
||||
irc_message_split_add (&split_context,
|
||||
|
||||
@@ -46,6 +46,7 @@ extern struct t_hashtable *irc_message_parse_to_hashtable (struct t_irc_server *
|
||||
extern struct t_hashtable *irc_message_parse_cap_value (const char *value);
|
||||
extern void irc_message_parse_cap_multiline_value (struct t_irc_server *server,
|
||||
const char *value);
|
||||
extern int irc_message_is_empty (const char *message);
|
||||
extern char *irc_message_convert_charset (const char *message,
|
||||
int pos_start,
|
||||
const char *modifier,
|
||||
|
||||
@@ -946,6 +946,24 @@ convert_irc_charset_cb (const void *pointer, void *data,
|
||||
return new_string;
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests functions:
|
||||
* irc_message_is_empty
|
||||
*/
|
||||
|
||||
TEST(IrcMessage, IsEmpty)
|
||||
{
|
||||
LONGS_EQUAL(1, irc_message_is_empty (NULL));
|
||||
LONGS_EQUAL(1, irc_message_is_empty (""));
|
||||
LONGS_EQUAL(1, irc_message_is_empty ("\n"));
|
||||
LONGS_EQUAL(1, irc_message_is_empty ("\n\n\n\n\n\n\n\n"));
|
||||
|
||||
LONGS_EQUAL(0, irc_message_is_empty (" "));
|
||||
LONGS_EQUAL(0, irc_message_is_empty ("\n "));
|
||||
LONGS_EQUAL(0, irc_message_is_empty ("\n \n"));
|
||||
LONGS_EQUAL(0, irc_message_is_empty ("test"));
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests functions:
|
||||
* irc_message_convert_charset
|
||||
@@ -1516,6 +1534,12 @@ TEST(IrcMessage, Split)
|
||||
(const char *)hashtable_get (hashtable, "msg1"));
|
||||
hashtable_free (hashtable);
|
||||
|
||||
/* PRIVMSG with no content: no split (not allowed) */
|
||||
hashtable = irc_message_split (server, "PRIVMSG #channel :");
|
||||
CHECK(hashtable);
|
||||
LONGS_EQUAL(0, hashtable->items_count);
|
||||
hashtable_free (hashtable);
|
||||
|
||||
/* PRIVMSG with small content: no split */
|
||||
hashtable = irc_message_split (server, "PRIVMSG #channel :test");
|
||||
CHECK(hashtable);
|
||||
|
||||
Reference in New Issue
Block a user