aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-07-21 14:58:21 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-07-21 15:04:02 +0100
commite72d601aa62fb517415e77fb5a4de95651939872 (patch)
tree93c5a5ced9929004e572a9e20a1648645595012d
parent9c549e66a047b61d71e087617f67932781158f6b (diff)
downloadrspamd-e72d601aa62fb517415e77fb5a4de95651939872.tar.gz
rspamd-e72d601aa62fb517415e77fb5a4de95651939872.zip
Fix lua plugins with the new DNS API.
-rw-r--r--src/plugins/lua/dmarc.lua22
-rw-r--r--src/plugins/lua/emails.lua140
-rw-r--r--src/plugins/lua/multimap.lua25
-rw-r--r--src/plugins/lua/once_received.lua6
-rw-r--r--src/plugins/lua/rbl.lua65
5 files changed, 142 insertions, 116 deletions
diff --git a/src/plugins/lua/dmarc.lua b/src/plugins/lua/dmarc.lua
index e3417c42f..978070dd8 100644
--- a/src/plugins/lua/dmarc.lua
+++ b/src/plugins/lua/dmarc.lua
@@ -92,8 +92,11 @@ local function dmarc_callback(task)
local lookup_domain = string.sub(to_resolve, 8)
if not results then
if lookup_domain ~= dmarc_domain then
- task:get_resolver():resolve_txt(task:get_session(),
- task:get_mempool(), '_dmarc.' .. dmarc_domain, dmarc_dns_cb)
+ local resolve_name = '_dmarc.' .. dmarc_domain
+ task:get_resolver():resolve_txt({
+ task=task,
+ name = resolve_name,
+ callback = dmarc_dns_cb})
return
end
@@ -191,8 +194,12 @@ local function dmarc_callback(task)
if not found_policy then
if lookup_domain ~= dmarc_domain then
- task:get_resolver():resolve_txt(task:get_session(),
- task:get_mempool(), '_dmarc.' .. dmarc_domain, dmarc_dns_cb)
+ local resolve_name = '_dmarc.' .. dmarc_domain
+ task:get_resolver():resolve_txt({
+ task=task,
+ name = resolve_name,
+ callback = dmarc_dns_cb})
+
return
else
return
@@ -266,8 +273,11 @@ local function dmarc_callback(task)
end
-- Do initial request
- task:get_resolver():resolve_txt(task:get_session(), task:get_mempool(),
- '_dmarc.' .. from[1]['domain'], dmarc_dns_cb)
+ local resolve_name = '_dmarc.' .. from[1]['domain']
+ task:get_resolver():resolve_txt({
+ task=task,
+ name = resolve_name,
+ callback = dmarc_dns_cb})
end
local opts = rspamd_config:get_all_opt('dmarc')
diff --git a/src/plugins/lua/emails.lua b/src/plugins/lua/emails.lua
index 36776a089..3fce13421 100644
--- a/src/plugins/lua/emails.lua
+++ b/src/plugins/lua/emails.lua
@@ -34,84 +34,86 @@ local logger = require "rspamd_logger"
-- Check rule for a single email
local function check_email_rule(task, rule, addr)
- local function emails_dns_cb(resolver, to_resolve, results, err)
- task:inc_dns_req()
- if results then
- logger.infox('<%1> email: [%2] resolved for symbol: %3',
- task:get_message_id(), to_resolve, rule['symbol'])
- task:insert_result(rule['symbol'], 1)
- end
- end
- if rule['dnsbl'] then
- local to_resolve = ''
- if rule['domain_only'] then
- to_resolve = string.format('%s.%s', addr:get_host(), rule['dnsbl'])
- else
- to_resolve = string.format('%s.%s.%s', addr:get_user(), addr:get_host(), rule['dnsbl'])
- end
- task:get_resolver():resolve_a(task:get_session(), task:get_mempool(),
- to_resolve, emails_dns_cb)
- elseif rule['map'] then
- if rule['domain_only'] then
- local key = addr:get_host()
- if rule['map']:get_key(key) then
- task:insert_result(rule['symbol'], 1)
- logger.infox('<%1> email: \'%2\' is found in list: %3',
- task:get_message_id(), key, rule['symbol'])
- end
- else
- local key = string.format('%s@%s', addr:get_user(), addr:get_host())
- if rule['map']:get_key(key) then
- task:insert_result(rule['symbol'], 1)
- logger.infox('<%1> email: \'%2\' is found in list: %3',
- task:get_message_id(), key, rule['symbol'])
- end
- end
- end
+ local function emails_dns_cb(resolver, to_resolve, results, err)
+ if results then
+ logger.infox('<%1> email: [%2] resolved for symbol: %3',
+ task:get_message_id(), to_resolve, rule['symbol'])
+ task:insert_result(rule['symbol'], 1)
+ end
+ end
+ if rule['dnsbl'] then
+ local to_resolve = ''
+ if rule['domain_only'] then
+ to_resolve = string.format('%s.%s', addr:get_host(), rule['dnsbl'])
+ else
+ to_resolve = string.format('%s.%s.%s', addr:get_user(), addr:get_host(), rule['dnsbl'])
+ end
+
+ task:get_resolver():resolve_a({
+ task=task,
+ name = to_resolve,
+ callback = emails_dns_cb})
+ elseif rule['map'] then
+ if rule['domain_only'] then
+ local key = addr:get_host()
+ if rule['map']:get_key(key) then
+ task:insert_result(rule['symbol'], 1)
+ logger.infox('<%1> email: \'%2\' is found in list: %3',
+ task:get_message_id(), key, rule['symbol'])
+ end
+ else
+ local key = string.format('%s@%s', addr:get_user(), addr:get_host())
+ if rule['map']:get_key(key) then
+ task:insert_result(rule['symbol'], 1)
+ logger.infox('<%1> email: \'%2\' is found in list: %3',
+ task:get_message_id(), key, rule['symbol'])
+ end
+ end
+ end
end
-- Check email
local function check_emails(task)
- local emails = task:get_emails()
- local checked = {}
- if emails then
- for _,addr in ipairs(emails) do
- local to_check = string.format('%s@%s', addr:get_user(), addr:get_host())
- if not checked['to_check'] then
- for _,rule in ipairs(rules) do
- check_email_rule(task, rule, addr)
- end
- checked[to_check] = true
- end
- end
- end
+ local emails = task:get_emails()
+ local checked = {}
+ if emails then
+ for _,addr in ipairs(emails) do
+ local to_check = string.format('%s@%s', addr:get_user(), addr:get_host())
+ if not checked['to_check'] then
+ for _,rule in ipairs(rules) do
+ check_email_rule(task, rule, addr)
+ end
+ checked[to_check] = true
+ end
+ end
+ end
end
local opts = rspamd_config:get_all_opt('emails', 'rule')
if opts and type(opts) == 'table' then
- for k,v in pairs(opts) do
- if k == 'rule' and type(v) == 'table' then
- local rule = v
- if not rule['symbol'] then
- rule['symbol'] = k
- end
- if rule['map'] then
- rule['name'] = rule['map']
- rule['map'] = rspamd_config:add_hash_map (rule['name'])
- end
- if not rule['symbol'] or (not rule['map'] and not rule['dnsbl']) then
- logger.err('incomplete rule')
- else
- table.insert(rules, rule)
- end
- end
- end
+ for k,v in pairs(opts) do
+ if k == 'rule' and type(v) == 'table' then
+ local rule = v
+ if not rule['symbol'] then
+ rule['symbol'] = k
+ end
+ if rule['map'] then
+ rule['name'] = rule['map']
+ rule['map'] = rspamd_config:add_hash_map (rule['name'])
+ end
+ if not rule['symbol'] or (not rule['map'] and not rule['dnsbl']) then
+ logger.err('incomplete rule')
+ else
+ table.insert(rules, rule)
+ end
+ end
+ end
end
if table.maxn(rules) > 0 then
- -- add fake symbol to check all maps inside a single callback
- local id = rspamd_config:register_callback_symbol(1.0, check_emails)
- for _,rule in ipairs(rules) do
- rspamd_config:register_virtual_symbol(rule['symbol'], 1.0, id)
- end
+ -- add fake symbol to check all maps inside a single callback
+ local id = rspamd_config:register_callback_symbol(1.0, check_emails)
+ for _,rule in ipairs(rules) do
+ rspamd_config:register_virtual_symbol(rule['symbol'], 1.0, id)
+ end
end
diff --git a/src/plugins/lua/multimap.lua b/src/plugins/lua/multimap.lua
index cd6aa5a1c..3f41921f1 100644
--- a/src/plugins/lua/multimap.lua
+++ b/src/plugins/lua/multimap.lua
@@ -37,17 +37,6 @@ local function ip_to_rbl(ip, rbl)
end
local function check_multimap(task)
- -- Generate dns callback closure
- local function dns_cb_generator(r)
- local cb = function (resolver, to_resolve, results, err, rbl)
- task:inc_dns_req()
- if results then
- task:insert_result(r['symbol'], 1, r['map'])
- end
- end
- return cb
- end
-
-- Match a single value for against a single rule
local function match_rule(r, value)
local ret = false
@@ -142,9 +131,17 @@ local function check_multimap(task)
-- RBL rules
if ip:is_valid() then
_.each(function(r)
- task:get_resolver():resolve_a(task:get_session(), task:get_mempool(),
- ip_to_rbl(ip, r['map']), dns_cb_generator(r))
- end,
+ local cb = function (resolver, to_resolve, results, err, rbl)
+ if results then
+ task:insert_result(r['symbol'], 1, r['map'])
+ end
+ end
+
+ task:get_resolver():resolve_a({task = task,
+ name = ip_to_rbl(ip, r['map']),
+ callback = cb,
+ })
+ end,
_.filter(function(r) return r['type'] == 'dnsbl' end, rules))
end
end
diff --git a/src/plugins/lua/once_received.lua b/src/plugins/lua/once_received.lua
index 7cbdacf50..f4502e504 100644
--- a/src/plugins/lua/once_received.lua
+++ b/src/plugins/lua/once_received.lua
@@ -79,8 +79,10 @@ local function check_quantity_received (task)
if r['real_ip'] and r['real_ip']:is_valid() then
-- Try to resolve it again
- task:get_resolver():resolve_ptr(task:get_session(), task:get_mempool(),
- r['real_ip']:to_string(), recv_dns_cb)
+ task:get_resolver():resolve_ptr({task = task,
+ name = r['real_ip']:to_string(),
+ callback = recv_dns_cb
+ })
else
task:insert_result(symbol_strict, 1)
end
diff --git a/src/plugins/lua/rbl.lua b/src/plugins/lua/rbl.lua
index a2dc7abbc..8dfb7b5ed 100644
--- a/src/plugins/lua/rbl.lua
+++ b/src/plugins/lua/rbl.lua
@@ -168,25 +168,27 @@ local function rbl_cb (task)
return
end
end
- task:get_resolver():resolve_a(task:get_session(), task:get_mempool(),
- havegot['helo'] .. '.' .. rbl['rbl'], rbl_dns_cb, k)
+ task:get_resolver():resolve_a({task = task,
+ name = havegot['helo'] .. '.' .. rbl['rbl'],
+ callback = rbl_dns_cb,
+ option = k})
end)()
end
if rbl['dkim'] then
- (function()
- if notgot['dkim'] then
- return
- end
- if not havegot['dkim'] then
+ (function()
+ if notgot['dkim'] then
+ return
+ end
+ if not havegot['dkim'] then
local das = task:get_symbol(symbols['dkim_allow_symbol'])
if das and das[1] and das[1]['options'] and das[1]['options'][0] then
havegot['dkim'] = das[1]['options']
- else
- notgot['dkim'] = true
- return
- end
- end
+ else
+ notgot['dkim'] = true
+ return
+ end
+ end
for _, d in pairs(havegot['dkim']) do
if rbl['dkim_domainonly'] then
local url_from = rspamd_url.create(task:get_mempool(), d)
@@ -196,10 +198,13 @@ local function rbl_cb (task)
return
end
end
- task:get_resolver():resolve_a(task:get_session(), task:get_mempool(),
- d .. '.' .. rbl['rbl'], rbl_dns_cb, k)
+
+ task:get_resolver():resolve_a({task = task,
+ name = d .. '.' .. rbl['rbl'],
+ callback = rbl_dns_cb,
+ option = k})
end
- end)()
+ end)()
end
if rbl['emails'] then
@@ -235,13 +240,17 @@ local function rbl_cb (task)
end
if rbl['emails'] == 'domain_only' then
for domain, _ in pairs(havegot['emails']) do
- task:get_resolver():resolve_a(task:get_session(), task:get_mempool(),
- domain .. '.' .. rbl['rbl'], rbl_dns_cb, k)
+ task:get_resolver():resolve_a({task = task,
+ name = domain .. '.' .. rbl['rbl'],
+ callback = rbl_dns_cb,
+ option = k})
end
else
for _, email in pairs(havegot['emails']) do
- task:get_resolver():resolve_a(task:get_session(), task:get_mempool(),
- email .. '.' .. rbl['rbl'], rbl_dns_cb, k)
+ task:get_resolver():resolve_a({task = task,
+ name = email .. '.' .. rbl['rbl'],
+ callback = rbl_dns_cb,
+ option = k})
end
end
end)()
@@ -259,8 +268,10 @@ local function rbl_cb (task)
return
end
end
- task:get_resolver():resolve_a(task:get_session(), task:get_mempool(),
- havegot['rdns'] .. '.' .. rbl['rbl'], rbl_dns_cb, k)
+ task:get_resolver():resolve_a({task = task,
+ name = havegot['rdns'] .. '.' .. rbl['rbl'],
+ callback = rbl_dns_cb,
+ option = k})
end)()
end
@@ -278,8 +289,10 @@ local function rbl_cb (task)
end
if (havegot['from']:get_version() == 6 and rbl['ipv6']) or
(havegot['from']:get_version() == 4 and rbl['ipv4']) then
- task:get_resolver():resolve_a(task:get_session(), task:get_mempool(),
- ip_to_rbl(havegot['from'], rbl['rbl']), rbl_dns_cb, k)
+ task:get_resolver():resolve_a({task = task,
+ name = ip_to_rbl(havegot['from'], rbl['rbl']),
+ callback = rbl_dns_cb,
+ option = k})
end
end)()
end
@@ -303,8 +316,10 @@ local function rbl_cb (task)
((rbl['exclude_private_ips'] and not is_private_ip(rh['real_ip'])) or
not rbl['exclude_private_ips']) and ((rbl['exclude_local_ips'] and
not is_excluded_ip(rh['real_ip'])) or not rbl['exclude_local_ips']) then
- task:get_resolver():resolve_a(task:get_session(), task:get_mempool(),
- ip_to_rbl(rh['real_ip'], rbl['rbl']), rbl_dns_cb, k)
+ task:get_resolver():resolve_a({task = task,
+ name = ip_to_rbl(rh['real_ip'], rbl['rbl']),
+ callback = rbl_dns_cb,
+ option = k})
end
end
end