From 6e392c55b2ded0ec4f1712879d9f7d74fbb0f623 Mon Sep 17 00:00:00 2001 From: Andrew Lewis Date: Fri, 12 May 2017 16:46:42 +0200 Subject: [PATCH] [Minor] DMARC reporting: couple of small fixes - Add policy override to report - Check parent domains for DMARC policies - Fix log message - Also drop formatting from report; apply table.concat --- src/plugins/lua/dmarc.lua | 102 +++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/src/plugins/lua/dmarc.lua b/src/plugins/lua/dmarc.lua index 375079837..3f1e62eab 100644 --- a/src/plugins/lua/dmarc.lua +++ b/src/plugins/lua/dmarc.lua @@ -661,38 +661,37 @@ if opts['reporting'] == true then local cursor = 0 local function entry_to_xml(data) local buf = { - string.format( -[[ - - %s - %d - - %s - %s - %s - - - - %s - - -]], data.ip, data.count, data.disposition, data.dkim_disposition, data.spf_disposition, data.header_from), + table.concat({ + '', data.ip, '', + data.count, '', + data.disposition, '', data.dkim_disposition, + '', data.spf_disposition, '' + }), } + if data.override ~= '' then + table.insert(buf, string.format('%s', data.override)) + end + table.insert(buf, table.concat({ + '', data.header_from, + '', + })) if data.dkim_results[1] or (data.spf_result ~= '' and data.spf_domain ~= '') then - table.insert(buf, '\t\t\n') + table.insert(buf, '') for _, d in ipairs(data.dkim_results) do - table.insert(buf, string.format( - '\t\t\t\n\t\t\t\t%s\n\t\t\t\t%s\n\t\t\t\n', - d.domain, d.result)) + table.insert(buf, table.concat({ + '', d.domain, '', + d.result, '', + })) end if (data.spf_result ~= '' and data.spf_domain ~= '') then - table.insert(buf, string.format( - '\t\t\t\n\t\t\t\t%s\n\t\t\t\t%s\n\t\t\t\n', - data.spf_domain, data.spf_result)) + table.insert(buf, table.concat({ + '', data.spf_domain, '', + data.spf_result, 't', + })) end - table.insert(buf, '\t\t\n') + table.insert(buf, '') end - table.insert(buf, '\t\n') + table.insert(buf, '') return table.concat(buf) end local function dmarc_report_xml() @@ -742,28 +741,17 @@ if opts['reporting'] == true then table.insert(entries, row) end, header = function() - return string.format( -[[ - - %s - %s - %s - - %d - %d - - - - %s - %s - %s -

%s

- %s - %s -
-]], escape_xml(report_settings.org_name), escape_xml(report_settings.email), report_id, report_start, report_end, - reporting_domain, escape_xml(domain_policy.adkim), escape_xml(domain_policy.aspf), escape_xml(domain_policy.p), - escape_xml(domain_policy.sp), escape_xml(domain_policy.pct)) + return table.concat({ + '', + escape_xml(report_settings.org_name), '', + escape_xml(report_settings.email), '', + report_id, '', report_start, + '', report_end, '', + reporting_domain, '', escape_xml(domain_policy.adkim), '', + escape_xml(domain_policy.aspf), '

', escape_xml(domain_policy.p), + '

', escape_xml(domain_policy.sp), '', escape_xml(domain_policy.pct), + '
' + }) end, footer = function() return [[
]] @@ -955,7 +943,7 @@ if opts['reporting'] == true then if err then rspamd_logger.errx(rspamd_config, 'Error deleting reports: %s', err) end - rspamd_logger.infox(rspamd_config, 'Deleted reports for %s') + rspamd_logger.infox(rspamd_config, 'Deleted reports for %s', reporting_domain) get_reporting_domain() end local ret = redis_make_request(ev_base, @@ -1020,8 +1008,14 @@ if opts['reporting'] == true then local function check_addr_cb(resolver, to_resolve, results, err, _, authenticated) if err then if err == 'no records with this name' or err == 'requested record is not found' then - rspamd_logger.errx(rspamd_config, 'No DMARC record found for %s', reporting_domain) - delete_reports() + local esld = rspamd_util.get_tld(reporting_domain) + if reporting_domain ~= esld then + rspamd_config:get_resolver():resolve_txt(nil, pool, + string.format('_dmarc.%s', esld), check_addr_cb) + else + rspamd_logger.errx(rspamd_config, 'No DMARC record found for %s', reporting_domain) + delete_reports() + end else rspamd_logger.errx(rspamd_config, 'Lookup error [%s]: %s', to_resolve, err) -- XXX: retry? @@ -1041,7 +1035,13 @@ if opts['reporting'] == true then end if not found_policy then rspamd_logger.errx(rspamd_config, 'No policy: %s', to_resolve) - delete_reports() + local esld = rspamd_util.get_tld(reporting_domain) + if reporting_domain ~= esld then + rspamd_config:get_resolver():resolve_txt(nil, pool, + string.format('_dmarc.%s', esld), check_addr_cb) + else + delete_reports() + end elseif failed_policy then rspamd_logger.errx(rspamd_config, 'Duplicate policies: %s', to_resolve) delete_reports() -- 2.39.5