From: Vsevolod Stakhov Date: Tue, 16 Feb 2021 14:14:25 +0000 (+0000) Subject: [Feature] Rbl: Distinguish flattened and non-flattened selectors in RBL requests X-Git-Tag: 3.0~675 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a1281498414a7efdb4c275eee647273be4d92c4b;p=rspamd.git [Feature] Rbl: Distinguish flattened and non-flattened selectors in RBL requests Issue: #3648 --- diff --git a/lualib/plugins/rbl.lua b/lualib/plugins/rbl.lua index 78f2c9064..3bddf52ba 100644 --- a/lualib/plugins/rbl.lua +++ b/lualib/plugins/rbl.lua @@ -53,6 +53,7 @@ local default_options = { ['default_exclude_local'] = true, ['default_no_ip'] = false, ['default_dkim_match_from'] = false, + ['default_selector_flatten'] = true, } local return_codes_schema = ts.map_of( @@ -126,6 +127,7 @@ local rule_schema_tbl = { returnbits = return_bits_schema:is_optional(), returncodes = return_codes_schema:is_optional(), selector = ts.one_of{ts.string, ts.table}:is_optional(), + selector_flatten = ts.boolean:is_optional(), symbol = ts.string:is_optional(), symbols_prefixes = ts.map_of(ts.string, ts.string):is_optional(), unknown = ts.boolean:is_optional(), diff --git a/src/plugins/lua/rbl.lua b/src/plugins/lua/rbl.lua index 5878b2f3d..87b97e171 100644 --- a/src/plugins/lua/rbl.lua +++ b/src/plugins/lua/rbl.lua @@ -601,9 +601,14 @@ local function gen_rbl_callback(rule) local res = selector(task) if res then - for _,r in ipairs(res) do - add_dns_request(task, r, false, false, requests_table, - selector_label, whitelist) + if rule.selector_flatten then + add_dns_request(task, table.concat(res, ''), false, false, + requests_table, selector_label, whitelist) + else + for _,r in ipairs(res) do + add_dns_request(task, r, false, false, requests_table, + selector_label, whitelist) + end end end end @@ -904,8 +909,9 @@ local function add_rbl(key, rbl, global_opts) known_selectors[selector].id) rbl.selectors[selector_label] = known_selectors[selector].selector else - -- Create a new flattened closure - local sel = selectors.create_selector_closure(rspamd_config, selector, '', true) + + local sel = selectors.create_selector_closure(rspamd_config, selector, '', + rbl.selector_flatten) if not sel then rspamd_logger.errx('invalid selector for rbl rule %s: %s', key, selector)