]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Settings: Add preliminary policies support
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 24 Jun 2019 11:27:58 +0000 (12:27 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 24 Jun 2019 11:27:58 +0000 (12:27 +0100)
src/libserver/cfg_file.h
src/libserver/cfg_utils.c
src/lua/lua_config.c

index 07e66b8267d68de5725b25bff7bd21e290569546..f6b1adad6d1990b388b8709d5f64e5c0eddbf754 100644 (file)
@@ -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
index ad61f5777dd79841ccb61e96fb9ea82a35a470bb..6e244902a6a8a9b68dbb38672f1b274ab64ad14e 100644 (file)
@@ -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);
index 9f7952cc3ad522dbbddd3ef1de68f498edcbc31d..8948dd3aeea47a853c45830e29db8b8b63fe1fbf 100644 (file)
@@ -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");