diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-06-24 12:27:58 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-06-24 12:27:58 +0100 |
commit | 3d5281ec7b5f97763ec92555492a322127dc4bb4 (patch) | |
tree | a8840f51a24c36a53ead52214ff39519ad61367f | |
parent | 014c2a2585f1c3aef3f5e6aefeaa5fe0d4310f3e (diff) | |
download | rspamd-3d5281ec7b5f97763ec92555492a322127dc4bb4.tar.gz rspamd-3d5281ec7b5f97763ec92555492a322127dc4bb4.zip |
[Minor] Settings: Add preliminary policies support
-rw-r--r-- | src/libserver/cfg_file.h | 10 | ||||
-rw-r--r-- | src/libserver/cfg_utils.c | 11 | ||||
-rw-r--r-- | src/lua/lua_config.c | 35 |
3 files changed, 51 insertions, 5 deletions
diff --git a/src/libserver/cfg_file.h b/src/libserver/cfg_file.h index 07e66b826..f6b1adad6 100644 --- a/src/libserver/cfg_file.h +++ b/src/libserver/cfg_file.h @@ -308,8 +308,15 @@ struct rspamd_config_post_init_script { struct rspamd_lang_detector; +enum rspamd_config_settings_policy { + RSPAMD_SETTINGS_POLICY_DEFAULT = 0, + RSPAMD_SETTINGS_POLICY_IMPLICIT_ALLOW = 1, + RSPAMD_SETTINGS_POLICY_IMPLICIT_DENY = 2, +}; + struct rspamd_config_settings_elt { guint32 id; + enum rspamd_config_settings_policy policy; const gchar *name; ucl_object_t *symbols_enabled; ucl_object_t *symbols_disabled; @@ -744,7 +751,8 @@ gboolean rspamd_config_radix_from_ucl (struct rspamd_config *cfg, void rspamd_config_register_settings_id (struct rspamd_config *cfg, const gchar *name, ucl_object_t *symbols_enabled, - ucl_object_t *symbols_disabled); + ucl_object_t *symbols_disabled, + enum rspamd_config_settings_policy policy); /** * Convert settings name to settings id diff --git a/src/libserver/cfg_utils.c b/src/libserver/cfg_utils.c index ad61f5777..6e244902a 100644 --- a/src/libserver/cfg_utils.c +++ b/src/libserver/cfg_utils.c @@ -2404,9 +2404,10 @@ struct rspamd_config_settings_elt *rspamd_config_find_settings_name_ref ( void rspamd_config_register_settings_id (struct rspamd_config *cfg, - const gchar *name, - ucl_object_t *symbols_enabled, - ucl_object_t *symbols_disabled) + const gchar *name, + ucl_object_t *symbols_enabled, + ucl_object_t *symbols_disabled, + enum rspamd_config_settings_policy policy) { struct rspamd_config_settings_elt *elt; guint32 id; @@ -2433,6 +2434,8 @@ rspamd_config_register_settings_id (struct rspamd_config *cfg, nelt->symbols_disabled = ucl_object_ref (symbols_disabled); } + nelt->policy = policy; + REF_INIT_RETAIN (nelt, rspamd_config_settings_elt_dtor); msg_warn_config ("replace settings id %ud (%s)", id, name); rspamd_symcache_process_settings_elt (cfg->cache, elt); @@ -2460,6 +2463,8 @@ rspamd_config_register_settings_id (struct rspamd_config *cfg, elt->symbols_disabled = ucl_object_ref (symbols_disabled); } + elt->policy = policy; + msg_info_config ("register new settings id %ud (%s)", id, name); REF_INIT_RETAIN (elt, rspamd_config_settings_elt_dtor); rspamd_symcache_process_settings_elt (cfg->cache, elt); diff --git a/src/lua/lua_config.c b/src/lua/lua_config.c index 9f7952cc3..8948dd3ae 100644 --- a/src/lua/lua_config.c +++ b/src/lua/lua_config.c @@ -3475,6 +3475,7 @@ lua_config_register_settings_id (lua_State *L) if (cfg != NULL && settings_name) { ucl_object_t *sym_enabled, *sym_disabled; + enum rspamd_config_settings_policy policy = RSPAMD_SETTINGS_POLICY_DEFAULT; sym_enabled = ucl_object_lua_import (L, 3); @@ -3493,8 +3494,40 @@ lua_config_register_settings_id (lua_State *L) return luaL_error (L, "invalid symbols enabled"); } + /* Check policy */ + if (lua_isstring (L, 5)) { + const gchar *policy_str = lua_tostring (L, 5); + + if (strcmp (policy_str, "default") == 0) { + policy = RSPAMD_SETTINGS_POLICY_DEFAULT; + } + else if (strcmp (policy_str, "implicit_allow") == 0) { + policy = RSPAMD_SETTINGS_POLICY_IMPLICIT_ALLOW; + } + else if (strcmp (policy_str, "implicit_deny") == 0) { + policy = RSPAMD_SETTINGS_POLICY_IMPLICIT_DENY; + } + else { + return luaL_error (L, "invalid settings policy: %s", policy_str); + } + } + else { + /* Apply heuristic */ + if (!sym_enabled) { + policy = RSPAMD_SETTINGS_POLICY_IMPLICIT_ALLOW; + } + } + rspamd_config_register_settings_id (cfg, settings_name, sym_enabled, - sym_disabled); + sym_disabled, policy); + + if (sym_enabled) { + ucl_object_unref (sym_enabled); + } + + if (sym_disabled) { + ucl_object_unref (sym_disabled); + } } else { return luaL_error (L, "invalid arguments"); |