diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-02-12 11:59:25 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-02-12 11:59:25 +0000 |
commit | 3d2cadb16676133ac3007da65630996168be3c91 (patch) | |
tree | e53f75a454b6743718f4ad820797a425f7489fc8 /src/libserver | |
parent | 2b1a95aedcf68effe867940478ca4430b2d13dc1 (diff) | |
download | rspamd-3d2cadb16676133ac3007da65630996168be3c91.tar.gz rspamd-3d2cadb16676133ac3007da65630996168be3c91.zip |
[Project] Implement concept of adaptive disabling of the rules
Diffstat (limited to 'src/libserver')
-rw-r--r-- | src/libserver/rspamd_symcache.c | 15 | ||||
-rw-r--r-- | src/libserver/rspamd_symcache.h | 12 |
2 files changed, 20 insertions, 7 deletions
diff --git a/src/libserver/rspamd_symcache.c b/src/libserver/rspamd_symcache.c index f6487f4d8..92f75ecbb 100644 --- a/src/libserver/rspamd_symcache.c +++ b/src/libserver/rspamd_symcache.c @@ -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); } diff --git a/src/libserver/rspamd_symcache.h b/src/libserver/rspamd_symcache.h index ab9c568e1..b5e029a6b 100644 --- a/src/libserver/rspamd_symcache.h +++ b/src/libserver/rspamd_symcache.h @@ -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 |