aboutsummaryrefslogtreecommitdiffstats
path: root/src/libserver
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2019-02-12 11:59:25 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2019-02-12 11:59:25 +0000
commit3d2cadb16676133ac3007da65630996168be3c91 (patch)
treee53f75a454b6743718f4ad820797a425f7489fc8 /src/libserver
parent2b1a95aedcf68effe867940478ca4430b2d13dc1 (diff)
downloadrspamd-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.c15
-rw-r--r--src/libserver/rspamd_symcache.h12
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