From 17f7015829b1fa71dc51e8904bdc25bab87e1420 Mon Sep 17 00:00:00 2001 From: Andrew Lewis Date: Sun, 31 Jul 2016 15:30:05 +0200 Subject: [Feature] Allow for matching hostnames in multimap (#773) --- src/plugins/lua/multimap.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/plugins/lua/multimap.lua b/src/plugins/lua/multimap.lua index 222cf3f06..56ea68214 100644 --- a/src/plugins/lua/multimap.lua +++ b/src/plugins/lua/multimap.lua @@ -486,6 +486,9 @@ local function multimap_callback(task, rule) end elseif rt == 'content' then match_content(rule) + elseif rt == 'hostname' then + local hostname = task:get_hostname() + match_rule(rule, hostname) end end @@ -559,7 +562,8 @@ local function add_multimap_rule(key, newrule) or newrule['type'] == 'from' or newrule['type'] == 'filename' or newrule['type'] == 'url' - or newrule['type'] == 'content' then + or newrule['type'] == 'content' + or newrule['type'] == 'hostname' then if newrule['regexp'] then newrule['hash'] = rspamd_config:add_map ({ url = newrule['map'], -- cgit v1.2.3 From 9bbeac06c1d7671267aec7d29ca3e339402ec2da Mon Sep 17 00:00:00 2001 From: Andrew Lewis Date: Sun, 31 Jul 2016 22:52:32 +0200 Subject: [Minor] Support filters for hostnames in multimap --- src/plugins/lua/multimap.lua | 52 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/plugins/lua/multimap.lua b/src/plugins/lua/multimap.lua index 56ea68214..506fd4455 100644 --- a/src/plugins/lua/multimap.lua +++ b/src/plugins/lua/multimap.lua @@ -221,6 +221,33 @@ local function multimap_callback(task, rule) return ret end + local function apply_hostname_filter(filter, hostname, r) + if filter == 'tld' then + local tld = util.get_tld(hostname) + return tld + else + if not r['re_filter'] then + local pat = string.match(filter, 'tld:regexp:(.+)') + if not pat then + rspamd_logger.errx(task, 'bad search filter: %s', filter) + return + end + r['re_filter'] = regexp.create(pat) + if not r['re_filter'] then + rspamd_logger.errx(task, 'couldnt create regex: %s', pat) + return + end + end + local tld = util.get_tld(hostname) + local res = r['re_filter']:search(tld) + if res then + return res[1] + else + return nil + end + end + end + local function apply_url_filter(filter, url, r) if filter == 'tld' then return url:get_tld() @@ -312,6 +339,27 @@ local function multimap_callback(task, rule) end end + local function match_hostname(r, hostname) + local value + local ret = false + + if r['filter'] then + value = apply_hostname_filter(r['filter'], hostname, r) + else + value = hostname + end + + ret = match_element(r, value) + + if ret then + task:insert_result(r['symbol'], 1) + + if pre_filter then + task:set_pre_result(r['action'], 'Matched map: ' .. r['symbol']) + end + end + end + local function apply_filename_filter(filter, fn, r) if filter == 'extension' or filter == 'ext' then return string.match(fn, '%.([^.]+)$') @@ -488,7 +536,9 @@ local function multimap_callback(task, rule) match_content(rule) elseif rt == 'hostname' then local hostname = task:get_hostname() - match_rule(rule, hostname) + if hostname ~= 'unknown' then + match_hostname(rule, hostname) + end end end -- cgit v1.2.3