소스 검색

[Fix] Process high priority settings even if settings/id has been specified

tags/2.3
Vsevolod Stakhov 4 년 전
부모
커밋
5c31b20668
2개의 변경된 파일48개의 추가작업 그리고 15개의 파일을 삭제
  1. 1
    0
      lualib/lua_settings.lua
  2. 47
    15
      src/plugins/lua/settings.lua

+ 1
- 0
lualib/lua_settings.lua 파일 보기

@@ -240,6 +240,7 @@ local function register_settings_id(str, settings)
else
known_ids[numeric_id] = {
name = str,
id = numeric_id,
settings = transform_settings_maybe(settings, str),
symbols = {}
}

+ 47
- 15
src/plugins/lua/settings.lua 파일 보기

@@ -95,8 +95,12 @@ local function apply_settings(task, to_apply, id)
end
end

-- Checks for overridden settings within query params and returns 3 values:
-- * Apply element
-- * Settings ID element if found
-- * Priority of the settings according to the place where it is found
--
-- If no override has been found, it returns `false`
local function check_query_settings(task)
-- Try 'settings' attribute
local settings_id = task:get_settings_id()
@@ -111,9 +115,9 @@ local function check_query_settings(task)
tostring(settings_id))
end
local settings_obj = parser:get_object()
apply_settings(task, settings_obj, nil)

return true
-- Treat as low priority
return settings_obj,nil,1
else
rspamd_logger.errx(task, 'Parse error: %s', err)
end
@@ -145,8 +149,8 @@ local function check_query_settings(task)

if not settings_id then
rspamd_logger.infox(task, 'apply maxscore = %s', nset.actions)
apply_settings(task, nset, nil)
return true
-- Maxscore is low priority
return nset, nil, 1
end
end
end
@@ -164,24 +168,19 @@ local function check_query_settings(task)
if nset then
elt.apply = lua_util.override_defaults(nset, elt.apply)
end
apply_settings(task, elt['apply'], settings_id)
rspamd_logger.infox(task, "applied settings id %s(%s)",
cached.name, settings_id)
return true
return elt.apply, cached, cached.priority or 1
end
else
rspamd_logger.warnx(task, 'no settings id "%s" has been found', settings_id)
if nset then
rspamd_logger.infox(task, 'apply maxscore = %s', nset.actions)
apply_settings(task, nset, nil)
return true
return nset, nil, 1
end
end
else
if nset then
rspamd_logger.infox(task, 'apply maxscore = %s', nset.actions)
apply_settings(task, nset, nil)
return true
return nset, nil, 1
end
end

@@ -291,19 +290,46 @@ local function check_settings(task)
end

-- Check if we have override as query argument
if check_query_settings(task) then
return
local query_apply,id_elt,priority = check_query_settings(task)

local function maybe_apply_query_settings()
if query_apply then
if id_elt then
apply_settings(task, query_apply, id_elt.id)
rspamd_logger.infox(task, "applied settings id %s(%s)",
id_elt.name, id_elt.id)
else
apply_settings(task, query_apply, nil)
rspamd_logger.infox(task, "applied settings from query")
end
end
end

local min_pri = 1
if query_apply then
if priority > min_pri then
-- Do not check lower priorities
min_pri = priority
end

if priority > max_pri then
-- Our internal priorities are lower then a priority from query, so no need to check
maybe_apply_query_settings()

return
end
end

-- Do not waste resources
if not settings_initialized then
maybe_apply_query_settings()
return
end

-- Match rules according their order
local applied = false

for pri = max_pri,1,-1 do
for pri = max_pri,min_pri,-1 do
if not applied and settings[pri] then
for _,s in ipairs(settings[pri]) do
local matched = {}
@@ -348,6 +374,10 @@ local function check_settings(task)
end
end

if not applied then
maybe_apply_query_settings()
end

end

-- Process settings based on their priority

Loading…
취소
저장