From faeb2b01cc97a2051404b207133df2f14bc64c7a Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 20 Apr 2015 15:56:12 +0100 Subject: [PATCH] Fix DMARC plugin. --- src/plugins/lua/dmarc.lua | 48 +++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/src/plugins/lua/dmarc.lua b/src/plugins/lua/dmarc.lua index ec3d88e2d..e3417c42f 100644 --- a/src/plugins/lua/dmarc.lua +++ b/src/plugins/lua/dmarc.lua @@ -64,6 +64,18 @@ end local function dmarc_callback(task) local from = task:get_from(2) + local dmarc_domain + + if from and from[1]['domain'] and not from[2] then + local url_from = rspamd_url.create(task:get_mempool(), from[1]['domain']) + if url_from then + dmarc_domain = url_from:get_tld() + else + return + end + else + return + end local function dmarc_report_cb(task, err, data) if not err then @@ -83,8 +95,9 @@ local function dmarc_callback(task) task:get_resolver():resolve_txt(task:get_session(), task:get_mempool(), '_dmarc.' .. dmarc_domain, dmarc_dns_cb) return - else - return + end + + return end local strict_spf = false @@ -183,7 +196,9 @@ local function dmarc_callback(task) return else return + end end + if failed_policy then return end -- Check dkim and spf symbols @@ -192,15 +207,15 @@ local function dmarc_callback(task) if task:get_symbol(symbols['spf_allow_symbol']) then efrom = task:get_from(1) if efrom and efrom[1] and efrom[1]['domain'] then - if efrom[1]['domain'] == from[1]['domain'] then + if efrom[1]['domain'] == from[1]['domain'] then + spf_ok = true + elseif not strict_spf then + if string.sub(efrom[1]['domain'], + -string.len('.' .. lookup_domain)) + == '.' .. lookup_domain then spf_ok = true - elseif not strict_spf then - if string.sub(efrom[1]['domain'], - -string.len('.' .. lookup_domain)) - == '.' .. lookup_domain then - spf_ok = true - end end + end end end local das = task:get_symbol(symbols['dkim_allow_symbol']) @@ -210,8 +225,8 @@ local function dmarc_callback(task) elseif not strict_dkim then if string.sub(das[1]['options'][0], -string.len('.' .. lookup_domain)) - == '.' .. lookup_domain then - dkim_ok = true + == '.' .. lookup_domain then + dkim_ok = true end end end @@ -249,15 +264,10 @@ local function dmarc_callback(task) -- XXX: handle rua and push data to redis end - - if from and from[1]['domain'] and not from[2] then - local url_from = rspamd_url.create(task:get_mempool(), from[1]['domain']) - if url_from then - dmarc_domain = url_from:get_tld() - task:get_resolver():resolve_txt(task:get_session(), task:get_mempool(), + + -- Do initial request + task:get_resolver():resolve_txt(task:get_session(), task:get_mempool(), '_dmarc.' .. from[1]['domain'], dmarc_dns_cb) - end - end end local opts = rspamd_config:get_all_opt('dmarc') -- 2.39.5