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)
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;
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) {
}
-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;
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);
}
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 */
};
/**
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
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");