]> source.dussan.org Git - rspamd.git/commitdiff
[Project] Implement concept of adaptive disabling of the rules
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 12 Feb 2019 11:59:25 +0000 (11:59 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 12 Feb 2019 11:59:25 +0000 (11:59 +0000)
src/libserver/rspamd_symcache.c
src/libserver/rspamd_symcache.h
src/lua/lua_task.c

index f6487f4d8e523c8357e6854281c04d4f5bccef51..92f75ecbbbdad6d0cc4c075cde6560ac4c749519 100644 (file)
@@ -235,8 +235,6 @@ static void rspamd_symcache_disable_symbol_checkpoint (struct rspamd_task *task,
                struct rspamd_symcache *cache, const gchar *symbol);
 static void rspamd_symcache_enable_symbol_checkpoint (struct rspamd_task *task,
                struct rspamd_symcache *cache, const gchar *symbol);
-static void rspamd_symcache_disable_all_symbols (struct rspamd_task *task,
-               struct rspamd_symcache *cache);
 
 static void
 rspamd_symcache_order_dtor (gpointer p)
@@ -1598,7 +1596,8 @@ rspamd_symcache_process_settings (struct rspamd_task *task,
 
        if (enabled) {
                /* Disable all symbols but selected */
-               rspamd_symcache_disable_all_symbols (task, cache);
+               rspamd_symcache_disable_all_symbols (task, cache,
+                               SYMBOL_TYPE_EXPLICIT_DISABLE);
                already_disabled = TRUE;
                it = NULL;
 
@@ -1615,7 +1614,8 @@ rspamd_symcache_process_settings (struct rspamd_task *task,
                it = NULL;
 
                if (!already_disabled) {
-                       rspamd_symcache_disable_all_symbols (task, cache);
+                       rspamd_symcache_disable_all_symbols (task, cache,
+                                       SYMBOL_TYPE_EXPLICIT_DISABLE);
                }
 
                while ((cur = ucl_iterate_object (enabled, &it, true)) != NULL) {
@@ -2274,9 +2274,10 @@ rspamd_symcache_stats_symbols_count (struct rspamd_symcache *cache)
 }
 
 
-static void
+void
 rspamd_symcache_disable_all_symbols (struct rspamd_task *task,
-               struct rspamd_symcache *cache)
+                                                                        struct rspamd_symcache *cache,
+                                                                        guint skip_mask)
 {
        struct cache_savepoint *checkpoint;
        guint i;
@@ -2295,7 +2296,7 @@ rspamd_symcache_disable_all_symbols (struct rspamd_task *task,
        PTR_ARRAY_FOREACH (cache->items_by_id, i, item) {
                dyn_item = rspamd_symcache_get_dynamic (checkpoint, item);
 
-               if (!(item->type & SYMBOL_TYPE_SQUEEZED)) {
+               if (!(item->type & (SYMBOL_TYPE_SQUEEZED|skip_mask))) {
                        SET_FINISH_BIT (checkpoint, dyn_item);
                        SET_START_BIT (checkpoint, dyn_item);
                }
index ab9c568e1dc196f110f94bf2ff48d76aa5a3adfb..b5e029a6bdfa74fbeae0bb08171de8e9c10eeb25 100644 (file)
@@ -48,6 +48,8 @@ enum rspamd_symbol_type {
        SYMBOL_TYPE_SQUEEZED = (1 << 13), /* Symbol is squeezed inside Lua */
        SYMBOL_TYPE_TRIVIAL = (1 << 14), /* Symbol is trivial */
        SYMBOL_TYPE_MIME_ONLY = (1 << 15), /* Symbol is mime only */
+       SYMBOL_TYPE_EXPLICIT_DISABLE = (1 << 16), /* Symbol should be disabled explicitly only */
+       SYMBOL_TYPE_IGNORE_PASSTHROUGH = (1 << 17), /* Symbol ignores passthrough result */
 };
 
 /**
@@ -374,4 +376,14 @@ gboolean rspamd_symcache_item_async_dec_check_full (struct rspamd_task *task,
                                                                                           const gchar *loc);
 #define rspamd_symcache_item_async_dec_check(task, item, subsystem) \
        rspamd_symcache_item_async_dec_check_full(task, item, subsystem, G_STRLOC)
+
+/**
+ * Disables execution of all symbols, excluding those specified in `skip_mask`
+ * @param task
+ * @param cache
+ * @param skip_mask
+ */
+void rspamd_symcache_disable_all_symbols (struct rspamd_task *task,
+                                                                                 struct rspamd_symcache *cache,
+                                                                                 guint skip_mask);
 #endif
index 90cb1f6898f34da60284d02180492e2792d028d4..b6c5c1fb7bee3648acd3804b467274d95b97c71a 100644 (file)
@@ -1771,10 +1771,12 @@ lua_task_set_pre_result (lua_State * L)
                                rspamd_mempool_strdup (task->task_pool, module));
 
                /* Don't classify or filter message if pre-filter sets results */
-               task->processed_stages |= (RSPAMD_TASK_STAGE_FILTERS |
-                                                                  RSPAMD_TASK_STAGE_CLASSIFIERS |
+               task->processed_stages |= (RSPAMD_TASK_STAGE_CLASSIFIERS |
                                                                   RSPAMD_TASK_STAGE_CLASSIFIERS_PRE |
                                                                   RSPAMD_TASK_STAGE_CLASSIFIERS_POST);
+               rspamd_symcache_disable_all_symbols (task, task->cfg->cache,
+                               SYMBOL_TYPE_IDEMPOTENT|SYMBOL_TYPE_IGNORE_PASSTHROUGH|
+                               SYMBOL_TYPE_POSTFILTER);
        }
        else {
                return luaL_error (L, "invalid arguments");