extern int inchannel_compareflags(char symbol, const char *member_modes);
extern int highest_channel_member_count(Client *client);
extern MODVAR long long central_spamfilter_last_download;
+extern int valid_operclass_character(char c);
+extern int valid_operclass_name(const char *str);
#define IDLEN 12
#define SIDLEN 3
#define SWHOISLEN 256
+#define OPERCLASSLEN 64
#define UMODETABLESZ (sizeof(long) * 8)
#define MAXCCUSERS 20 /* Maximum for set::anti-flood::max-concurrent-conversations */
#define BATCHLEN 22
{
config_error_noname(ce->file->filename, ce->line_number, "operclass");
errors++;
+ } else
+ if (!valid_operclass_name(ce->value))
+ {
+ config_error("%s:%d: operclass name may only contain alphanumerical characters and "
+ "characters _-",
+ ce->file->filename, ce->line_number);
+ errors++;
}
+
for (cep = ce->items; cep; cep = cep->next)
{
if (!strcmp(cep->name, "parent"))
}
#endif
}
+
+int valid_operclass_character(char c)
+{
+ /* allow alpha, numeric, -, _ */
+ if (!strchr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_", c))
+ return 0;
+ return 1;
+}
+
+int valid_operclass_name(const char *str)
+{
+ const char *p;
+
+ if (strlen(str) > OPERCLASSLEN)
+ return 0;
+
+ for (p = str; *p; p++)
+ if (!valid_operclass_character(*p))
+ return 0;
+
+ return 1;
+}
}
-#define OPERCLASSLEN 64
-
const char *extban_operclass_conv_param(BanContext *b, Extban *extban)
{
static char retbuf[OPERCLASSLEN + 4];
strlcpy(retbuf, b->banstr, sizeof(retbuf));
- /* allow alpha, numeric, -, _, * and ? wildcards */
+ /* cut off at first invalid character (.. but allow wildcards) */
for (p = retbuf; *p; p++)
- if (!strchr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_?*", *p))
+ {
+ if (!valid_operclass_character(*p) && !strchr("*?", *p))
+ {
*p = '\0';
+ break;
+ }
+ }
if (retbuf[3] == '\0')
return NULL; /* just "~O:" is invalid */