Browse Source

[Feature] RBL: Support type specific prefixes

tags/2.0
Vsevolod Stakhov 4 years ago
parent
commit
cd4e5e1c1e
1 changed files with 67 additions and 15 deletions
  1. 67
    15
      src/plugins/lua/rbl.lua

+ 67
- 15
src/plugins/lua/rbl.lua View File

@@ -197,6 +197,22 @@ local function rbl_dns_process(task, rbl, to_resolve, results, err, resolve_tabl
resolve_table_elt.what)
end
end

local function insert_result(s, ip)
if rbl.symbols_prefixes then
local prefix = rbl.symbols_prefixes[resolve_table_elt.what]

if not prefix then
rspamd_logger.warnx(task, 'unlisted symbol prefix for %s', resolve_table_elt.what)
task:insert_result(s, 1.0, make_option(ip))
else
task:insert_result(prefix .. '_' .. s, 1.0, make_option(ip))
end
else
task:insert_result(s, 1.0, make_option(ip))
end
end

if err and (err ~= 'requested record is not found' and
err ~= 'no records with this name') then
rspamd_logger.infox(task, 'error looking up %s: %s', to_resolve, err)
@@ -217,7 +233,7 @@ local function rbl_dns_process(task, rbl, to_resolve, results, err, resolve_tabl
end

if rbl.returncodes == nil and rbl.returnbits == nil and rbl.symbol ~= nil then
task:insert_result(rbl.symbol, 1, make_option())
insert_result(rbl.symbol)
return
end

@@ -232,7 +248,7 @@ local function rbl_dns_process(task, rbl, to_resolve, results, err, resolve_tabl
for _,check_bit in ipairs(bits) do
if bit.band(ipnum, check_bit) == check_bit then
foundrc = true
task:insert_result(s, 1, make_option())
insert_result(s)
-- Here, we continue with other bits
end
end
@@ -242,7 +258,7 @@ local function rbl_dns_process(task, rbl, to_resolve, results, err, resolve_tabl
for _,v in ipairs(codes) do
if string.find(ipstr, '^' .. v .. '$') then
foundrc = true
task:insert_result(s, 1, make_option())
insert_result(s)
break
end
end
@@ -251,7 +267,7 @@ local function rbl_dns_process(task, rbl, to_resolve, results, err, resolve_tabl

if not foundrc then
if rbl.unknown and rbl.symbol then
task:insert_result(rbl.symbol, 1, make_option(ipstr))
insert_result(rbl.symbol, ipstr)
else
rspamd_logger.errx(task, 'RBL %1 returned unknown result: %2',
rbl.rbl, ipstr)
@@ -848,12 +864,36 @@ local function add_rbl(key, rbl, global_opts)
local callback,description = gen_rbl_callback(rbl)

if callback then
local id = rspamd_config:register_symbol{
type = 'callback',
callback = callback,
name = rbl.symbol,
flags = table.concat(flags_tbl, ',')
}
local id

if rbl.symbols_prefixes then
if not rbl.symbol:match('_CHECK$') then
rbl.symbol = rbl.symbol .. '_CHECK'
end

id = rspamd_config:register_symbol{
type = 'callback',
callback = callback,
name = rbl.symbol,
flags = table.concat(flags_tbl, ',')
}

for _,prefix in pairs(rbl.symbols_prefixes) do
rspamd_config:register_symbol{
type = 'virtual',
parent = id,
name = prefix .. '_' .. rbl.symbol,
}
end
else
id = rspamd_config:register_symbol{
type = 'callback',
callback = callback,
name = rbl.symbol,
flags = table.concat(flags_tbl, ',')
}
end


rspamd_logger.infox(rspamd_config, 'added rbl rule %s: %s',
rbl.symbol, description)
@@ -875,11 +915,22 @@ local function add_rbl(key, rbl, global_opts)
local function process_return_code(s)
if s ~= rbl.symbol then
-- hack
rspamd_config:register_symbol({
name = s,
parent = id,
type = 'virtual'
})
if rbl.symbols_prefixes then
for _,prefix in pairs(rbl.symbols_prefixes) do
rspamd_config:register_symbol{
type = 'virtual',
parent = id,
name = prefix .. '_' .. s,
}
end
else
rspamd_config:register_symbol({
name = s,
parent = id,
type = 'virtual'
})
end

end

if rbl.is_whitelist then
@@ -1019,6 +1070,7 @@ local rule_schema = ts.shape({
requests_limit = (ts.integer + ts.string / tonumber):is_optional(),
process_script = ts.string:is_optional(),
emails_delimiter = ts.string:is_optional(),
symbols_prefixes = ts.map_of(ts.string, ts.string):is_optional(),
}, {
-- Covers boolean defaults
extra_fields = ts.map_of(ts.string, ts.boolean)

Loading…
Cancel
Save