diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2020-12-09 17:32:54 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2020-12-09 17:34:00 +0000 |
commit | 0c90e73443254ec4684bd5a142eb627d20e7df18 (patch) | |
tree | f4b0c92b6bcc596d41e7ad41385f222cd5276159 /src | |
parent | abc43462c390b761d2673863d5e14571f5e90dd0 (diff) | |
download | rspamd-0c90e73443254ec4684bd5a142eb627d20e7df18.tar.gz rspamd-0c90e73443254ec4684bd5a142eb627d20e7df18.zip |
[Rework] Milter_headers: improve extended_headers_rcpt support
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/lua/milter_headers.lua | 57 |
1 files changed, 23 insertions, 34 deletions
diff --git a/src/plugins/lua/milter_headers.lua b/src/plugins/lua/milter_headers.lua index 1512417ca..106f07098 100644 --- a/src/plugins/lua/milter_headers.lua +++ b/src/plugins/lua/milter_headers.lua @@ -25,6 +25,7 @@ local logger = require "rspamd_logger" local util = require "rspamd_util" local N = 'milter_headers' local lua_util = require "lua_util" +local lua_maps = require "lua_maps" local ts = require("tableshape").types local E = {} @@ -36,7 +37,6 @@ local settings = { skip_authenticated = true, local_headers = {}, authenticated_headers = {}, - extended_headers_rcpt = {}, routines = { ['remove-headers'] = { headers = {}, @@ -132,16 +132,27 @@ local function milter_headers(task) local found for _, r in ipairs(rcpts) do found = false - for k, v in pairs(settings.extended_headers_rcpt) do - for _, ehr in ipairs(v) do - if r[k] == ehr then - found = true - break - end + -- Try full addr match + if r.addr and r.domain and r.user then + if settings.extended_headers_rcpt:get_key(r.addr) then + lua_util.debugm(N, task, 'found full addr in recipients for extended headers: %s', + r.addr) + found = true + end + -- Try user as plain match + if not found and settings.extended_headers_rcpt:get_key(r.user) then + lua_util.debugm(N, task, 'found user in recipients for extended headers: %s (%s)', + r.user, r.addr) + found = true + end + -- Try @domain to match domain + if not found and settings.extended_headers_rcpt:get_key('@' .. r.domain) then + lua_util.debugm(N, task, 'found domain in recipients for extended headers: @%s (%s)', + r.domain, r.addr) + found = true end - if found then break end end - if not found then break end + if found then break end end return found end @@ -549,8 +560,7 @@ local config_schema = ts.shape({ skip_authenticated = ts.boolean:is_optional(), local_headers = ts.array_of(ts.string):is_optional(), authenticated_headers = ts.array_of(ts.string):is_optional(), - extended_headers_rcpt = - (ts.array_of(ts.string) + ts.string / function(s) return {s} end):is_optional(), + extended_headers_rcpt = lua_maps.map_schema, custom = ts.map_of(ts.string, ts.string):is_optional(), }, { extra_fields = ts.map_of(ts.string, ts.any) @@ -646,29 +656,8 @@ logger.infox(rspamd_config, 'active routines [%s]', table.concat(active_routines, ',')) if opts.extended_headers_rcpt then - for _, e in ipairs(opts.extended_headers_rcpt) do - if string.find(e, '^[^@]+@[^@]+$') then - if not settings.extended_headers_rcpt.addr then - settings.extended_headers_rcpt.addr = {} - end - table.insert(settings.extended_headers_rcpt['addr'], e) - elseif string.find(e, '^[^@]+$') then - if not settings.extended_headers_rcpt.user then - settings.extended_headers_rcpt.user = {} - end - table.insert(settings.extended_headers_rcpt['user'], e) - else - local d = string.match(e, '^@([^@]+)$') - if d then - if not settings.extended_headers_rcpt.domain then - settings.extended_headers_rcpt.domain = {} - end - table.insert(settings.extended_headers_rcpt['domain'], d) - else - logger.errx(rspamd_config, 'extended_headers_rcpt: unexpected entry: %s', e) - end - end - end + settings.extended_headers_rcpt = lua_maps.rspamd_map_add_from_ucl(opts.extended_headers_rcpt, + 'set', 'Extended headers recipients') end rspamd_config:register_symbol({ |