Browse Source

Rework once_received module

- Fix priority for `good_hosts`
- If a good host has been found do not add once_received symbols
- Fix priorities for strict once_received
- Add ability to whitelist IP addresses
tags/1.2.0
Vsevolod Stakhov 8 years ago
parent
commit
c44e6068da
1 changed files with 71 additions and 49 deletions
  1. 71
    49
      src/plugins/lua/once_received.lua

+ 71
- 49
src/plugins/lua/once_received.lua View File

@@ -21,84 +21,104 @@ local symbol = 'ONCE_RECEIVED'
local symbol_strict = nil
local bad_hosts = {}
local good_hosts = {}
local whitelist = nil
local rspamd_logger = require "rspamd_logger"

local function check_quantity_received (task)
local function recv_dns_cb(resolver, to_resolve, results, err)
task:inc_dns_req()

if not results then
task:insert_result(symbol_strict, 1)
local res = true
if res then
task:insert_result(symbol, 1)
task:insert_result(symbol_strict, 1)
end
else
rspamd_logger.infox(task, 'SMTP resolver failed to resolve: %1 is %2',
to_resolve, results[1])
local i = true
for _,h in ipairs(bad_hosts) do
if string.find(results[1], h) then
-- Check for good hostname
if good_hosts then
for _,gh in ipairs(good_hosts) do
if string.find(results[1], gh) then
i = false
break
end
end
end
if i then
task:insert_result(symbol_strict, 1, h)
if good_hosts then
for _,gh in ipairs(good_hosts) do
if string.find(results[1], gh) then
return
end
end
end

task:insert_result(symbol, 1)
for _,h in ipairs(bad_hosts) do
if string.find(results[1], h) then

task:insert_result(symbol_strict, 1, h)
return
end
end
end
end

if task:get_user() ~= nil then
return
end

if whitelist then
local addr = task:get_from_ip()

if addr and whitelist:get_key(addr) then
rspamd_logger.infox(task, 'whitelisted mail from %s',
addr:to_string())
return
end
end

local recvh = task:get_received_headers()
if table.maxn(recvh) <= 1 then
task:insert_result(symbol, 1)
-- Strict checks
if symbol_strict then
local r = recvh[1]
if not r then
return
end
-- Unresolved host
if not r['real_hostname'] or string.lower(r['real_hostname']) == 'unknown' or
string.match(r['real_hostname'], '^%d+%.%d+%.%d+%.%d+$') then
if r['real_ip'] and r['real_ip']:is_valid() then
-- Try to resolve it again
task:get_resolver():resolve_ptr({task = task,
name = r['real_ip']:to_string(),
callback = recv_dns_cb
})
else
task:insert_result(symbol_strict, 1)
if recvh and #recvh <= 1 then
local ret = true
local r = recvh[1]

if not r then
return
end

local hn = string.lower(r['real_hostname'])
-- Check for good hostname
if hn and good_hosts then
for _,gh in ipairs(good_hosts) do
if string.find(hn, gh) then
ret = false
break
end
return
end
end

local i = true
local hn = string.lower(r['real_hostname'])
if ret then
-- Strict checks
if symbol_strict then
-- Unresolved host
if not r['real_hostname'] or string.lower(r['real_hostname']) == 'unknown' or
string.match(r['real_hostname'], '^%d+%.%d+%.%d+%.%d+$') then

for _,h in ipairs(bad_hosts) do
if string.find(hn, h) then
-- Check for good hostname
if good_hosts then
for _,gh in ipairs(good_hosts) do
if string.find(hn, gh) then
i = false
break
end
end
if r['real_ip'] and r['real_ip']:is_valid() then
-- Try to resolve it again
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
if i then
return
end

task:insert_result(symbol, 1)

for _,h in ipairs(bad_hosts) do
if string.find(hn, h) then
task:insert_result(symbol_strict, 1, h)
return
end
end
else
task:insert_result(symbol, 1)
end
end
end
@@ -138,6 +158,8 @@ if opts then
else
good_hosts = v
end
elseif n == 'whitelist' then
whitelist = rspamd_config:add_radix_map (v, 'once received whitelist')
end
end
end

Loading…
Cancel
Save