diff options
author | twesterhever <40121680+twesterhever@users.noreply.github.com> | 2024-03-24 16:29:22 +0000 |
---|---|---|
committer | twesterhever <40121680+twesterhever@users.noreply.github.com> | 2024-04-28 08:28:38 +0000 |
commit | 5e84a82f8742ed2bcef65859759c0dd14aa9c4ca (patch) | |
tree | f3d4164279bef4fc65b19728404b829d155b49eb | |
parent | 65e43f908e39fe60707bdc345862151c7962a67d (diff) | |
download | rspamd-5e84a82f8742ed2bcef65859759c0dd14aa9c4ca.tar.gz rspamd-5e84a82f8742ed2bcef65859759c0dd14aa9c4ca.zip |
[Enhancement] Implement Message-ID RHS checks against DNSBLs
-rw-r--r-- | lualib/plugins/rbl.lua | 2 | ||||
-rw-r--r-- | src/plugins/lua/rbl.lua | 26 |
2 files changed, 26 insertions, 2 deletions
diff --git a/lualib/plugins/rbl.lua b/lualib/plugins/rbl.lua index af5d6bd91..9dacbaa42 100644 --- a/lualib/plugins/rbl.lua +++ b/lualib/plugins/rbl.lua @@ -33,6 +33,7 @@ local check_types = { numeric_urls = {}, emails = {}, replyto = {}, + mid = {}, dkim = {}, rdns = { connfilter = true, @@ -118,6 +119,7 @@ local rule_schema_tbl = { received_min_pos = ts.number:is_optional(), received_nflags = ts.array_of(ts.string):is_optional(), replyto = ts.boolean:is_optional(), + mid = ts.boolean:is_optional(), requests_limit = (ts.integer + ts.string / tonumber):is_optional(), require_symbols = ( ts.array_of(ts.string) + (ts.string / function(s) diff --git a/src/plugins/lua/rbl.lua b/src/plugins/lua/rbl.lua index b2ccf8699..065a58fda 100644 --- a/src/plugins/lua/rbl.lua +++ b/src/plugins/lua/rbl.lua @@ -829,6 +829,24 @@ local function gen_rbl_callback(rule) return true end + local function check_mid(task, requests_table, whitelist) + local function get_raw_header(name) + return ((task:get_header_full(name) or {})[1] or {})['value'] + end + + local mid = get_raw_header('Message-ID') + if mid then + local md = rspamd_util.parse_mail_address(mid, task:get_mempool()) + lua_util.debugm(N, task, 'check message-id %s', md[1]) + + if md and md[1] and (md[1].addr and #md[1].addr > 0) then + check_email_table(task, md[1], requests_table, whitelist, 'mid') + end + end + + return true + end + -- Create function pipeline depending on rbl settings local pipeline = { is_alive, -- check monitored status @@ -866,6 +884,10 @@ local function gen_rbl_callback(rule) pipeline[#pipeline + 1] = check_replyto description[#description + 1] = 'replyto' end + if rule.mid then + pipeline[#pipeline + 1] = check_mid + description[#description + 1] = 'mid' + end if rule.urls or rule.content_urls or rule.images or rule.numeric_urls then pipeline[#pipeline + 1] = check_urls @@ -1028,7 +1050,7 @@ local function add_rbl(key, rbl, global_opts) end -- Check if rbl is available for empty tasks - if not (rbl.emails or rbl.urls or rbl.dkim or rbl.received or rbl.selector or rbl.replyto) or + if not (rbl.emails or rbl.urls or rbl.dkim or rbl.received or rbl.selector or rbl.replyto or rbl.mid) or rbl.is_empty then flags_tbl[#flags_tbl + 1] = 'empty' end @@ -1118,7 +1140,7 @@ local function add_rbl(key, rbl, global_opts) end if not rbl.whitelist and not rbl.ignore_url_whitelist and (global_opts.url_whitelist or rbl.url_whitelist) and - (rbl.urls or rbl.emails or rbl.dkim or rbl.replyto) and + (rbl.urls or rbl.emails or rbl.dkim or rbl.replyto or rbl.mid) and not (rbl.from or rbl.received) then local def_type = 'set' rbl.whitelist = lua_maps.map_add_from_ucl(rbl.url_whitelist or global_opts.url_whitelist, def_type, |