aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortwesterhever <40121680+twesterhever@users.noreply.github.com>2024-03-24 16:29:22 +0000
committertwesterhever <40121680+twesterhever@users.noreply.github.com>2024-04-28 08:28:38 +0000
commit5e84a82f8742ed2bcef65859759c0dd14aa9c4ca (patch)
treef3d4164279bef4fc65b19728404b829d155b49eb
parent65e43f908e39fe60707bdc345862151c7962a67d (diff)
downloadrspamd-5e84a82f8742ed2bcef65859759c0dd14aa9c4ca.tar.gz
rspamd-5e84a82f8742ed2bcef65859759c0dd14aa9c4ca.zip
[Enhancement] Implement Message-ID RHS checks against DNSBLs
-rw-r--r--lualib/plugins/rbl.lua2
-rw-r--r--src/plugins/lua/rbl.lua26
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,