From 611eae1b23025f80bf5ad36ab62254348feee972 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 26 Dec 2020 23:27:49 +0000 Subject: [PATCH] [Rework] Distinguish between strict config test mode --- src/libserver/cfg_utils.c | 2 +- src/plugins/chartable.c | 6 ++--- src/plugins/dkim_check.c | 16 ++++++++---- src/plugins/fuzzy_check.c | 9 ++++--- src/plugins/regexp.c | 51 ++++++++++++++++++++++++++++----------- src/rspamd.c | 8 ++++-- src/rspamd.h | 2 +- 7 files changed, 64 insertions(+), 30 deletions(-) diff --git a/src/libserver/cfg_utils.c b/src/libserver/cfg_utils.c index e2f886aa6..439a61793 100644 --- a/src/libserver/cfg_utils.c +++ b/src/libserver/cfg_utils.c @@ -1589,7 +1589,7 @@ rspamd_init_filters (struct rspamd_config *cfg, bool reconfig, bool strict) } else { - if (!mod->module_config_func (cfg)) { + if (!mod->module_config_func (cfg, strict)) { msg_err_config ("config of %s failed", mod->name); ret = FALSE; diff --git a/src/plugins/chartable.c b/src/plugins/chartable.c index ce37ebd58..c997862a1 100644 --- a/src/plugins/chartable.c +++ b/src/plugins/chartable.c @@ -58,7 +58,7 @@ INIT_LOG_MODULE(chartable) /* Initialization */ gint chartable_module_init (struct rspamd_config *cfg, struct module_ctx **ctx); -gint chartable_module_config (struct rspamd_config *cfg); +gint chartable_module_config (struct rspamd_config *cfg, bool validate); gint chartable_module_reconfig (struct rspamd_config *cfg); module_t chartable_module = { @@ -109,7 +109,7 @@ chartable_module_init (struct rspamd_config *cfg, struct module_ctx **ctx) gint -chartable_module_config (struct rspamd_config *cfg) +chartable_module_config (struct rspamd_config *cfg, bool validate) { const ucl_object_t *value; gint res = TRUE; @@ -174,7 +174,7 @@ chartable_module_config (struct rspamd_config *cfg) gint chartable_module_reconfig (struct rspamd_config *cfg) { - return chartable_module_config (cfg); + return chartable_module_config (cfg, false); } static gint latin_confusable[] = { diff --git a/src/plugins/dkim_check.c b/src/plugins/dkim_check.c index fae0acf0b..c00b87b11 100644 --- a/src/plugins/dkim_check.c +++ b/src/plugins/dkim_check.c @@ -113,7 +113,7 @@ static gint lua_dkim_canonicalize_handler (lua_State *L); /* Initialization */ gint dkim_module_init (struct rspamd_config *cfg, struct module_ctx **ctx); -gint dkim_module_config (struct rspamd_config *cfg); +gint dkim_module_config (struct rspamd_config *cfg, bool validate); gint dkim_module_reconfig (struct rspamd_config *cfg); module_t dkim_module = { @@ -309,7 +309,7 @@ dkim_module_init (struct rspamd_config *cfg, struct module_ctx **ctx) } gint -dkim_module_config (struct rspamd_config *cfg) +dkim_module_config (struct rspamd_config *cfg, bool validate) { const ucl_object_t *value; gint res = TRUE, cb_id = -1; @@ -469,6 +469,10 @@ dkim_module_config (struct rspamd_config *cfg) NULL, RSPAMD_MAP_DEFAULT)) { msg_warn_config ("cannot load dkim domains list from %s", ucl_object_tostring (value)); + + if (validate) { + return FALSE; + } } else { got_trusted = TRUE; @@ -523,8 +527,10 @@ dkim_module_config (struct rspamd_config *cfg) } if (dkim_module_ctx->trusted_only && !got_trusted) { - msg_err_config ( - "trusted_only option is set and no trusted domains are defined; disabling dkim module completely as it is useless in this case"); + msg_err_config ("trusted_only option is set and no trusted domains are defined"); + if (validate) { + return FALSE; + } } else { if (!rspamd_config_is_module_enabled (cfg, "dkim")) { @@ -896,7 +902,7 @@ lua_dkim_sign_handler (lua_State *L) gint dkim_module_reconfig (struct rspamd_config *cfg) { - return dkim_module_config (cfg); + return dkim_module_config (cfg, false); } /* diff --git a/src/plugins/fuzzy_check.c b/src/plugins/fuzzy_check.c index 633ce50ae..9d0aa35e1 100644 --- a/src/plugins/fuzzy_check.c +++ b/src/plugins/fuzzy_check.c @@ -181,7 +181,7 @@ static void fuzzy_symbol_callback (struct rspamd_task *task, /* Initialization */ gint fuzzy_check_module_init (struct rspamd_config *cfg, struct module_ctx **ctx); -gint fuzzy_check_module_config (struct rspamd_config *cfg); +gint fuzzy_check_module_config (struct rspamd_config *cfg, bool valdate); gint fuzzy_check_module_reconfig (struct rspamd_config *cfg); static gint fuzzy_attach_controller (struct module_ctx *ctx, GHashTable *commands); @@ -940,7 +940,7 @@ fuzzy_check_module_init (struct rspamd_config *cfg, struct module_ctx **ctx) } gint -fuzzy_check_module_config (struct rspamd_config *cfg) +fuzzy_check_module_config (struct rspamd_config *cfg, bool validate) { const ucl_object_t *value, *cur, *elt; ucl_object_iter_t it; @@ -969,7 +969,8 @@ fuzzy_check_module_config (struct rspamd_config *cfg) "table and not %s", lua_typename (L, lua_type (L, -1))); fuzzy_module_ctx->enabled = FALSE; - } else { + } + else { lua_pushstring (L, "process_rule"); lua_gettable (L, -2); @@ -1205,7 +1206,7 @@ fuzzy_check_module_reconfig (struct rspamd_config *cfg) fuzzy_module_ctx->process_rule_ref); } - return fuzzy_check_module_config (cfg); + return fuzzy_check_module_config (cfg, false); } /* Finalize IO */ diff --git a/src/plugins/regexp.c b/src/plugins/regexp.c index a967c46aa..9dde6cddb 100644 --- a/src/plugins/regexp.c +++ b/src/plugins/regexp.c @@ -46,7 +46,7 @@ static void process_regexp_item (struct rspamd_task *task, /* Initialization */ gint regexp_module_init (struct rspamd_config *cfg, struct module_ctx **ctx); -gint regexp_module_config (struct rspamd_config *cfg); +gint regexp_module_config (struct rspamd_config *cfg, bool validate); gint regexp_module_reconfig (struct rspamd_config *cfg); module_t regexp_module = { @@ -130,7 +130,7 @@ regexp_module_init (struct rspamd_config *cfg, struct module_ctx **ctx) } gint -regexp_module_config (struct rspamd_config *cfg) +regexp_module_config (struct rspamd_config *cfg, bool validate) { struct regexp_ctx *regexp_module_ctx = regexp_get_context (cfg); struct regexp_module_item *cur_item = NULL; @@ -174,7 +174,9 @@ regexp_module_config (struct rspamd_config *cfg) if (!read_regexp_expression (cfg->cfg_pool, cur_item, ucl_object_key (value), ucl_obj_tostring (value), &ud)) { - res = FALSE; + if (validate) { + return FALSE; + } } else { rspamd_symcache_add_symbol (cfg->cache, @@ -228,7 +230,9 @@ regexp_module_config (struct rspamd_config *cfg) if (!read_regexp_expression (cfg->cfg_pool, cur_item, ucl_object_key (value), ucl_obj_tostring (elt), &ud)) { - res = FALSE; + if (validate) { + return FALSE; + } } else { valid_expression = TRUE; @@ -263,7 +267,9 @@ regexp_module_config (struct rspamd_config *cfg) "mime_only attribute is not boolean for symbol: '%s'", cur_item->symbol); - res = FALSE; + if (validate) { + return FALSE; + } } else { if (ucl_object_toboolean (elt)) { @@ -314,7 +320,9 @@ regexp_module_config (struct rspamd_config *cfg) "score attribute is not numeric for symbol: '%s'", cur_item->symbol); - res = FALSE; + if (validate) { + return FALSE; + } } else { score = ucl_object_todouble (elt); @@ -329,7 +337,9 @@ regexp_module_config (struct rspamd_config *cfg) "one_shot attribute is not boolean for symbol: '%s'", cur_item->symbol); - res = FALSE; + if (validate) { + return FALSE; + } } else { if (ucl_object_toboolean (elt)) { @@ -344,7 +354,9 @@ regexp_module_config (struct rspamd_config *cfg) "any_shot attribute is not boolean for symbol: '%s'", cur_item->symbol); - res = FALSE; + if (validate) { + return FALSE; + } } else { if (ucl_object_toboolean (elt)) { @@ -359,7 +371,9 @@ regexp_module_config (struct rspamd_config *cfg) "nshots attribute is not numeric for symbol: '%s'", cur_item->symbol); - res = FALSE; + if (validate) { + return FALSE; + } } else { nshots = ucl_object_toint (elt); @@ -374,7 +388,9 @@ regexp_module_config (struct rspamd_config *cfg) "one_param attribute is not boolean for symbol: '%s'", cur_item->symbol); - res = FALSE; + if (validate) { + return FALSE; + } } else { if (ucl_object_toboolean (elt)) { @@ -391,7 +407,9 @@ regexp_module_config (struct rspamd_config *cfg) "priority attribute is not numeric for symbol: '%s'", cur_item->symbol); - res = FALSE; + if (validate) { + return FALSE; + } } else { priority = ucl_object_toint (elt); @@ -427,8 +445,13 @@ regexp_module_config (struct rspamd_config *cfg) } } - msg_info_config ("init internal regexp module, %d regexp rules and %d " - "lua rules are loaded", nre, nlua); + if (res) { + msg_info_config ("init internal regexp module, %d regexp rules and %d " + "lua rules are loaded", nre, nlua); + } + else { + msg_err_config ("fatal regexp module error"); + } return res; } @@ -436,7 +459,7 @@ regexp_module_config (struct rspamd_config *cfg) gint regexp_module_reconfig (struct rspamd_config *cfg) { - return regexp_module_config (cfg); + return regexp_module_config (cfg, false); } static gboolean diff --git a/src/rspamd.c b/src/rspamd.c index 5a1898c29..17b2956ab 100644 --- a/src/rspamd.c +++ b/src/rspamd.c @@ -968,11 +968,15 @@ load_rspamd_config (struct rspamd_main *rspamd_main, rspamd_lua_post_load_config (cfg); if (init_modules) { - rspamd_init_filters (cfg, reload, false); + if (!rspamd_init_filters (cfg, reload, false)) { + return FALSE; + } } /* Do post-load actions */ - rspamd_config_post_load (cfg, opts); + if (!rspamd_config_post_load (cfg, opts)) { + return FALSE; + } } return TRUE; diff --git a/src/rspamd.h b/src/rspamd.h index 2dfb512bc..bc1ed8a86 100644 --- a/src/rspamd.h +++ b/src/rspamd.h @@ -212,7 +212,7 @@ typedef struct module_s { int (*module_init_func) (struct rspamd_config *cfg, struct module_ctx **ctx); - int (*module_config_func) (struct rspamd_config *cfg); + int (*module_config_func) (struct rspamd_config *cfg, bool validate); int (*module_reconfig_func) (struct rspamd_config *cfg); -- 2.39.5