local dmarc_grammar = gen_dmarc_grammar()
-local function dmarc_report(task, spf_ok, dkim_ok, disposition)
+local function dmarc_report(task, spf_ok, dkim_ok, disposition, sampled_out)
local ip = task:get_from_ip()
if not ip:is_valid() then
return nil
end
- local res = string.format('%d,%s,%s,%s,%s', task:get_date(0),
+ local res = string.format('%d,%s,%s,%s,%s,%s', task:get_date(0),
ip:to_string(), tostring(spf_ok), tostring(dkim_ok),
- disposition)
+ disposition, (sampled_out and 'sampled_out' or ''))
return res
end
end
local disposition = 'none'
+ local sampled_out = false
+
if not (spf_ok or dkim_ok) then
local reason_str = table.concat(reason, ", ")
res = 1.0
if not pct or pct == 100 or (math.random(100) <= pct) then
task:insert_result(dmarc_symbols['quarantine'], res, lookup_domain .. ' : ' .. reason_str, dmarc_policy)
disposition = "quarantine"
+ else
+ task:insert_result(dmarc_symbols['softfail'], res, lookup_domain .. ' : ' .. reason_str, dmarc_policy, "sampled_out")
+ sampled_out = true
end
elseif dmarc_policy == 'reject' then
if not pct or pct == 100 or (math.random(100) <= pct) then
task:insert_result(dmarc_symbols['reject'], res, lookup_domain .. ' : ' .. reason_str, dmarc_policy)
disposition = "reject"
+ else
+ task:insert_result(dmarc_symbols['quarantine'], res, lookup_domain .. ' : ' .. reason_str, dmarc_policy, "sampled_out")
+ disposition = "quarantine"
+ sampled_out = true
end
else
task:insert_result(dmarc_symbols['softfail'], res, lookup_domain .. ' : ' .. reason_str, dmarc_policy)
if rua and redis_params and dmarc_reporting then
-- Prepare and send redis report element
local redis_key = dmarc_redis_key_prefix .. from[1]['domain']
- local report_data = dmarc_report(task, spf_ok, dkim_ok, disposition)
+ local report_data = dmarc_report(task, spf_ok, dkim_ok, disposition, sampled_out)
if report_data then
local ret,conn,_ = rspamd_redis_make_request(task,