@@ -49,13 +49,19 @@ module
49
49
#define STR_FAIL_LIMIT_REACHED ":%s FAIL METADATA LIMIT_REACHED %s :metadata limit reached"
50
50
#define STR_FAIL_RATE_LIMITED ":%s FAIL METADATA RATE_LIMITED %s :rate limited"
51
51
#define STR_FAIL_TOO_MANY_SUBS ":%s FAIL METADATA TOO_MANY_SUBS %s :too many subscriptions"
52
+ #define STR_FAIL_INVALID_VALUE_UTF8 ":%s FAIL METADATA INVALID_VALUE :value contains invalid UTF8"
53
+ #define STR_FAIL_INVALID_VALUE_SIZE ":%s FAIL METADATA INVALID_VALUE :value is too long"
52
54
53
55
/* actual METADATA code */
54
56
55
57
/* get or set for perms */
56
58
#define MODE_SET 0
57
59
#define MODE_GET 1
58
60
61
+ /* TODO: pick a less arbitrary value; to allow it to be as large as possible without
62
+ * overflowing IRC line length */
63
+ #define MAX_VALUE_BYTES 300
64
+
59
65
#define MYCONF "metadata2"
60
66
61
67
#define CHECKPARAMSCNT_OR_DIE (count , return ) \
@@ -449,7 +455,7 @@ MOD_UNLOAD() {
449
455
const char * metadata_cap_param (Client * client )
450
456
{
451
457
static char buf [20 ];
452
- ircsnprintf (buf , sizeof (buf ), "maxsub =%d" , metadata_settings .max_subscriptions );
458
+ ircsnprintf (buf , sizeof (buf ), "max-sub =%d,max-value-bytes=%d " , metadata_settings .max_subscriptions , MAX_VALUE_BYTES );
453
459
return buf ;
454
460
}
455
461
@@ -1163,6 +1169,15 @@ CMD_FUNC(cmd_metadata_local)
1163
1169
return ;
1164
1170
}
1165
1171
1172
+ if (!unrl_utf8_validate (value , NULL )) {
1173
+ sendto_one (client , NULL , STR_FAIL_INVALID_VALUE_UTF8 , me .name );
1174
+ return ;
1175
+ }
1176
+ if (strlen (value ) > MAX_VALUE_BYTES ) {
1177
+ sendto_one (client , NULL , STR_FAIL_INVALID_VALUE_SIZE , me .name );
1178
+ return ;
1179
+ }
1180
+
1166
1181
if (channel )
1167
1182
metadata_set_channel (channel , key , value , client );
1168
1183
else
0 commit comments