From b95c1570a9fd976d67a11dc6148bebd4e3769032 Mon Sep 17 00:00:00 2001 From: Bram Matthys Date: Sat, 22 Mar 2025 06:39:44 +0100 Subject: [PATCH] Add CONFIG_ALLOW_BLOCK & CONFIG_CLASS in HOOKTYPE_CONFIGTEST and HOOKTYPE_CONFIGRUN_EX. Allowing to modularize things (for us and third party modules) --- include/modules.h | 2 ++ src/conf.c | 86 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/include/modules.h b/include/modules.h index 92a26afff..4c8d07bfc 100644 --- a/include/modules.h +++ b/include/modules.h @@ -2745,6 +2745,8 @@ enum EfunctionType { #define CONFIG_LISTEN 10 #define CONFIG_LISTEN_OPTIONS 11 #define CONFIG_SET_HISTORY_CHANNEL 12 +#define CONFIG_ALLOW_BLOCK 13 +#define CONFIG_CLASS 14 #define MOD_HEADER Mod_Header #define MOD_TEST() DLLFUNC int Mod_Test(ModuleInfo *modinfo) diff --git a/src/conf.c b/src/conf.c index 900a3b829..b234f1c26 100644 --- a/src/conf.c +++ b/src/conf.c @@ -4754,6 +4754,7 @@ int _conf_class(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *cep, *cep2; ConfigItem_class *class; unsigned char isnew = 0; + Hook *h; if (!(class = find_class(ce->value))) { @@ -4789,6 +4790,12 @@ int _conf_class(ConfigFile *conf, ConfigEntry *ce) if (!strcmp(cep2->name, "nofakelag")) class->options |= CLASS_OPT_NOFAKELAG; } + for (h = Hooks[HOOKTYPE_CONFIGRUN_EX]; h; h = h->next) + { + int value = (*(h->func.intfunc))(conf, cep, CONFIG_CLASS, class); + if (value == 1) + break; + } } if (isnew) AddListItem(class, conf_class); @@ -4801,6 +4808,7 @@ int _test_class(ConfigFile *conf, ConfigEntry *ce) int errors = 0; char has_pingfreq = 0, has_connfreq = 0, has_maxclients = 0, has_sendq = 0; char has_recvq = 0; + Hook *h; if (!ce->value) { @@ -4816,6 +4824,40 @@ int _test_class(ConfigFile *conf, ConfigEntry *ce) for (cep = ce->items; cep; cep = cep->next) { + int used_by_module = 0; + + /* First, check if a module knows about this class::something */ + for (h = Hooks[HOOKTYPE_CONFIGTEST]; h; h = h->next) + { + int value, errs = 0; + if (h->owner && !(h->owner->flags & MODFLAG_TESTING) + && !(h->owner->options & MOD_OPT_PERM)) + { + continue; + } + value = (*(h->func.intfunc))(conf, cep, CONFIG_ALLOW_BLOCK, &errs); + if (value == 2) + used_by_module = 1; + if (value == 1) + { + used_by_module = 1; + break; + } + if (value == -1) + { + used_by_module = 1; + errors += errs; + break; + } + if (value == -2) + { + used_by_module = 1; + errors += errs; + } + } + if (used_by_module) + continue; + if (!strcmp(cep->name, "options")) { for (cep2 = cep->items; cep2; cep2 = cep2->next) @@ -5804,7 +5846,7 @@ int _conf_allow(ConfigFile *conf, ConfigEntry *ce) int value; for (h = Hooks[HOOKTYPE_CONFIGRUN]; h; h = h->next) { - value = (*(h->func.intfunc))(conf,ce,CONFIG_ALLOW); + value = (*(h->func.intfunc))(conf, ce, CONFIG_ALLOW); if (value == 1) break; } @@ -5866,6 +5908,12 @@ int _conf_allow(ConfigFile *conf, ConfigEntry *ce) allow->flags.reject_on_auth_failure = 1; } } + for (h = Hooks[HOOKTYPE_CONFIGRUN_EX]; h; h = h->next) + { + int value = (*(h->func.intfunc))(conf, cep, CONFIG_ALLOW_BLOCK, allow); + if (value == 1) + break; + } } /* Default: global-maxperip = maxperip+1 */ @@ -5903,7 +5951,7 @@ int _test_allow(ConfigFile *conf, ConfigEntry *ce) if (h->owner && !(h->owner->flags & MODFLAG_TESTING) && !(h->owner->options & MOD_OPT_PERM)) continue; - value = (*(h->func.intfunc))(conf,ce,CONFIG_ALLOW,&errs); + value = (*(h->func.intfunc))(conf, ce, CONFIG_ALLOW, &errs); if (value == 2) used = 1; if (value == 1) @@ -5934,6 +5982,40 @@ int _test_allow(ConfigFile *conf, ConfigEntry *ce) for (cep = ce->items; cep; cep = cep->next) { + int used_by_module = 0; + + /* First, check if a module knows about this allow::something */ + for (h = Hooks[HOOKTYPE_CONFIGTEST]; h; h = h->next) + { + int value, errs = 0; + if (h->owner && !(h->owner->flags & MODFLAG_TESTING) + && !(h->owner->options & MOD_OPT_PERM)) + { + continue; + } + value = (*(h->func.intfunc))(conf, cep, CONFIG_ALLOW_BLOCK, &errs); + if (value == 2) + used_by_module = 1; + if (value == 1) + { + used_by_module = 1; + break; + } + if (value == -1) + { + used_by_module = 1; + errors += errs; + break; + } + if (value == -2) + { + used_by_module = 1; + errors += errs; + } + } + if (used_by_module) + continue; + if (strcmp(cep->name, "options") && strcmp(cep->name, "match") && strcmp(cep->name, "mask") &&