From b2ba70cf7a187b429c613eee54251983516d9051 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 5 Apr 2024 17:56:15 +0100 Subject: [PATCH] [Fix] Honor dynamic thresholds for greylisting module --- src/lua/lua_task.c | 41 ++++++++++++++++++++++++++++++++++++ src/plugins/lua/greylist.lua | 2 +- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c index e37c6838d..edbe5b89a 100644 --- a/src/lua/lua_task.c +++ b/src/lua/lua_task.c @@ -872,6 +872,14 @@ LUA_FUNCTION_DEF(task, get_metric_result); * @return {number,number} 2 numbers containing the current score and required score of the metric */ LUA_FUNCTION_DEF(task, get_metric_score); + +/*** + * @method task:get_metric_threshold(action) + * Get the current threshold of the action `action` for the default metric. Should be used after settings have been applied. + * @param {string} action name of a action + * @return {number} the current threshold of the action + */ +LUA_FUNCTION_DEF(task, get_metric_threshold); /*** * @method task:get_metric_action(name) * Get the current action of metric `name` (must be nil or 'default'). Should be used in idempotent filters only. @@ -1307,6 +1315,7 @@ static const struct luaL_reg tasklib_m[] = { LUA_INTERFACE_DEF(task, get_metric_result), LUA_INTERFACE_DEF(task, get_metric_score), LUA_INTERFACE_DEF(task, get_metric_action), + LUA_INTERFACE_DEF(task, get_metric_threshold), LUA_INTERFACE_DEF(task, set_metric_score), LUA_INTERFACE_DEF(task, set_metric_subject), LUA_INTERFACE_DEF(task, learn), @@ -6351,6 +6360,38 @@ lua_task_get_metric_action(lua_State *L) return 1; } +static int +lua_task_get_metric_threshold(lua_State *L) +{ + LUA_TRACE_POINT; + struct rspamd_task *task = lua_check_task(L, 1); + const char *act_name = luaL_checkstring(L, 2); + + if (task && act_name && task->result) { + struct rspamd_action *action = rspamd_config_get_action(task->cfg, act_name); + + if (action == NULL) { + lua_pushnil(L); + } + else { + struct rspamd_action_config *act_config = + rspamd_find_action_config_for_action(task->result, action); + + if (act_config) { + lua_pushnumber(L, act_config->cur_limit); + } + else { + lua_pushnil(L); + } + } + } + else { + return luaL_error(L, "invalid arguments"); + } + + return 1; +} + static int lua_task_set_metric_score(lua_State *L) { diff --git a/src/plugins/lua/greylist.lua b/src/plugins/lua/greylist.lua index 540b92fe6..e4a633233 100644 --- a/src/plugins/lua/greylist.lua +++ b/src/plugins/lua/greylist.lua @@ -330,7 +330,7 @@ local function greylist_set(task) end -- We need to update this on each scan, as it can vary per settings or be redefined dynamically - local greylist_min_score = settings.greylist_min_score or rspamd_config:get_metric_action('greylist') + local greylist_min_score = settings.greylist_min_score or task:get_metric_threshold('greylist') if greylist_min_score then local score = task:get_metric_score()[1] if score < greylist_min_score then -- 2.39.5