1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-06-29 23:36:38 +02:00

Error when an invalid (unknown) snomask is encountered in the config file.

This should help users who are upgrading to UnrealIRCd 6 spot silly mistakes
which would cause them to miss server notices.

It now errors and refers to
https://www.unrealircd.org/docs/Upgrading_from_5.x#Update_your_snomasks
This commit is contained in:
Bram Matthys
2021-12-28 18:04:23 +01:00
parent f7719d2de2
commit 3859c2f477
3 changed files with 84 additions and 8 deletions
+2
View File
@@ -1158,6 +1158,7 @@ extern LogData *log_data_socket_error(int fd);
extern LogData *log_data_link_block(ConfigItem_link *link);
extern LogData *log_data_tkl(const char *key, TKL *tkl);
extern LogData *log_data_tls_error(void);
extern void log_pre_rehash(void);
extern int log_tests(void);
extern void config_pre_run_log(void);
extern void log_blocks_switchover(void);
@@ -1170,6 +1171,7 @@ extern int valid_subsystem(const char *s);
extern const char *timestamp_iso8601_now(void);
extern const char *timestamp_iso8601(time_t v);
extern int is_valid_snomask(char c);
extern int is_valid_snomask_string_testing(const char *str, char **wrong);
/* end of logging */
extern void add_fake_lag(Client *client, long msec);
extern char *prefix_with_extban(const char *remainder, BanContext *b, Extban *extban, char *buf, size_t buflen);
+41 -8
View File
@@ -246,6 +246,7 @@ MODVAR int config_error_flag = 0;
int config_verbose = 0;
int need_operclass_permissions_upgrade = 0;
int invalid_snomasks_encountered = 0;
int have_tls_listeners = 0;
char *port_6667_ip = NULL;
@@ -1893,11 +1894,6 @@ void applymeblock(void)
strlcpy(me.id, conf_me->sid, sizeof(me.id));
}
/** Reset config tests (before running the config test) */
void config_test_reset(void)
{
}
/** Run config test and all post config tests. */
int config_test_all(void)
{
@@ -2049,6 +2045,7 @@ int config_test(void)
memset(&nicklengths, 0, sizeof(nicklengths));
config_setdefaultsettings(&tempiConf);
clicap_pre_rehash();
log_pre_rehash();
free_config_defines();
if (!config_loadmodules())
@@ -2059,8 +2056,6 @@ int config_test(void)
preprocessor_resolve_conditionals_all(PREPROCESSOR_PHASE_MODULE);
config_test_reset();
if (!config_test_all())
{
config_error("IRCd configuration failed to pass testing");
@@ -2747,6 +2742,21 @@ int config_test_blocks()
int errors = 0;
Hook *h;
invalid_snomasks_encountered = 0;
/* First, all the log { } blocks everywhere */
for (cfptr = conf; cfptr; cfptr = cfptr->next)
{
if (config_verbose > 1)
config_status("Testing %s", cfptr->filename);
/* First test and run the log { } blocks */
for (ce = cfptr->items; ce; ce = ce->next)
{
if (!strcmp(ce->name, "log"))
errors += config_test_log(cfptr, ce);
}
}
for (cfptr = conf; cfptr; cfptr = cfptr->next)
{
if (config_verbose > 1)
@@ -2773,7 +2783,8 @@ int config_test_blocks()
{
/* These are already processed, so skip them here.. */
if (!strcmp(ce->name, "secret") ||
!strcmp(ce->name, "set"))
!strcmp(ce->name, "set") ||
!strcmp(ce->name, "log"))
{
continue;
}
@@ -2836,6 +2847,12 @@ int config_test_blocks()
config_error("%i errors encountered", errors);
}
if (invalid_snomasks_encountered)
{
config_error("It seems your set::snomask-on-oper and/or oper::snomask needs to be updated. Are you perhaps upgrading from an older version to UnrealIRCd 6?");
config_error("See https://www.unrealircd.org/docs/Upgrading_from_5.x#Update_your_snomasks");
}
return (errors > 0 ? -1 : 1);
}
@@ -4033,12 +4050,20 @@ int _test_oper(ConfigFile *conf, ConfigEntry *ce)
/* oper::snomask */
else if (!strcmp(cep->name, "snomask"))
{
char *wrong_snomask;
if (has_snomask)
{
config_warn_duplicate(cep->file->filename,
cep->line_number, "oper::snomask");
continue;
}
if (!is_valid_snomask_string_testing(cep->value, &wrong_snomask))
{
config_error("%s:%i: oper::snomask contains unknown snomask letter(s) '%s'",
cep->file->filename, cep->line_number, wrong_snomask);
errors++;
invalid_snomasks_encountered++;
}
has_snomask = 1;
}
else if (!strcmp(cep->name, "server-notice-colors"))
@@ -7808,8 +7833,16 @@ int _test_set(ConfigFile *conf, ConfigEntry *ce)
set_usermode(cep->value);
}
else if (!strcmp(cep->name, "snomask-on-oper")) {
char *wrong_snomask;
CheckNull(cep);
CheckDuplicate(cep, snomask_on_oper, "snomask-on-oper");
if (!is_valid_snomask_string_testing(cep->value, &wrong_snomask))
{
config_error("%s:%i: set::snomask-on-oper contains unknown snomask letter(s) '%s'",
cep->file->filename, cep->line_number, wrong_snomask);
errors++;
invalid_snomasks_encountered++;
}
}
else if (!strcmp(cep->name, "server-notice-colors")) {
CheckNull(cep);
+41
View File
@@ -36,6 +36,7 @@ Log *temp_logs[NUM_LOG_DESTINATIONS] = { NULL, NULL, NULL, NULL, NULL };
static int snomask_num_destinations = 0;
static char snomasks_in_use[257] = { '\0' };
static char snomasks_in_use_testing[257] = { '\0' };
/* Forward declarations */
int log_sources_match(LogSource *logsource, LogLevel loglevel, const char *subsystem, const char *event_id, int matched_already);
@@ -205,6 +206,8 @@ int config_test_log(ConfigFile *conf, ConfigEntry *block)
config_error("%s:%d: snomask must be a single letter",
cep->file->filename, cep->line_number);
errors++;
} else {
strlcat(snomasks_in_use_testing, cep->value, sizeof(snomasks_in_use_testing));
}
} else
if (!strcmp(cep->name, "channel"))
@@ -1803,6 +1806,12 @@ void postconf_defaults_log_block(void)
AppendListItem(ls, l->sources);
}
/* Called before CONFIG_TEST */
void log_pre_rehash(void)
{
*snomasks_in_use_testing = '\0';
}
/* Called after CONFIG_TEST right before CONFIG_RUN */
void config_pre_run_log(void)
{
@@ -1828,3 +1837,35 @@ int is_valid_snomask(char c)
{
return strchr(snomasks_in_use, c) ? 1 : 0;
}
/** Check if a letter is a valid snomask during or after CONFIG_TEST
* (the snomasks exist in the log block configuration read during config_test).
* @param c the snomask letter to check
* @returns 1 if exists, 0 if not.
*/
int is_valid_snomask_testing(char c)
{
return strchr(snomasks_in_use_testing, c) ? 1 : 0;
}
/** Check if a string all consists of valid snomasks during or after CONFIG_TEST
* (the snomasks exist in the log block configuration read during config_test).
* @param str the snomask string to check
* @param invalid_snomasks list of unknown snomask letters
* @returns 1 if exists, 0 if not.
*/
int is_valid_snomask_string_testing(const char *str, char **invalid_snomasks)
{
static char invalid_snomasks_buf[256];
*invalid_snomasks_buf = '\0';
for (; *str; str++)
{
if ((*str == '+') || (*str == '-'))
continue;
if (!strchr(snomasks_in_use_testing, *str))
strlcat_letter(invalid_snomasks_buf, *str, sizeof(invalid_snomasks_buf));
}
*invalid_snomasks = invalid_snomasks_buf;
return *invalid_snomasks_buf ? 0 : 1;
}