aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorAndrew Lewis <nerf@judo.za.org>2015-08-19 17:32:43 +0200
committerAndrew Lewis <nerf@judo.za.org>2015-08-19 18:15:53 +0200
commit4e8b22d80c606e764db91b4cab4083d07413e0f1 (patch)
tree75ee6fe57c9705d7e142d317fd32eb16317ba413 /src/plugins
parente58ee7df16b4dc74a1976dd44b219b4ac48925d8 (diff)
downloadrspamd-4e8b22d80c606e764db91b4cab4083d07413e0f1.tar.gz
rspamd-4e8b22d80c606e764db91b4cab4083d07413e0f1.zip
Add redirector_domains setting
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/lua/phishing.lua158
1 files changed, 91 insertions, 67 deletions
diff --git a/src/plugins/lua/phishing.lua b/src/plugins/lua/phishing.lua
index a96977d05..22c0c3cc1 100644
--- a/src/plugins/lua/phishing.lua
+++ b/src/plugins/lua/phishing.lua
@@ -30,86 +30,110 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
local symbol = 'PHISHED_URL'
local domains = nil
local strict_domains = {}
+local redirector_domains = {}
local rspamd_logger = require "rspamd_logger"
+local opts = rspamd_config:get_all_opt('phishing')
local function phishing_cb(task)
- local urls = task:get_urls();
+ local urls = task:get_urls()
+
+ if urls then
+ for _,url in ipairs(urls) do
+ if url:is_phished() then
+ local found = false
+ local purl = url:get_phished()
+ if table.maxn(redirector_domains) > 0 then
+ local tld = url:get_tld()
+ if tld then
+ for _,rule in ipairs(redirector_domains) do
+ if rule['map']:get_key(url:get_tld()) then
+ task:insert_result(rule['symbol'], 1, url:get_host())
+ found = true
+ end
+ end
+ end
+ end
+ if not found and table.maxn(strict_domains) > 0 then
+ local tld = purl:get_tld()
+ if tld then
+ for _,rule in ipairs(redirector_domains) do
+ if rule['map']:get_key(url:get_tld()) then
+ task:insert_result(rule['symbol'], 1, purl:get_host())
+ found = true
+ end
+ end
+ for _,rule in ipairs(strict_domains) do
+ if rule['map']:get_key(tld) then
+ task:insert_result(rule['symbol'], 1, purl:get_host())
+ found = true
+ end
+ end
+ end
+ end
+ if not found then
+ if domains then
+ local tld = purl:get_tld()
+ if tld then
+ if domains:get_key(tld) then
+ task:insert_result(symbol, 1, purl:get_host())
+ end
+ end
+ else
+ task:insert_result(symbol, 1, purl:get_host())
+ end
+ end
+ end
+ end
+ end
+end
- if urls then
- for _,url in ipairs(urls) do
- if url:is_phished() then
- local found = false
- local purl = url:get_phished()
- if table.maxn(strict_domains) > 0 then
- local tld = purl:get_tld()
- if tld then
- for _,rule in ipairs(strict_domains) do
- if rule['map']:get_key(tld) then
- task:insert_result(rule['symbol'], 1, purl:get_host())
- found = true
- end
- end
- end
- end
- if not found then
- if domains then
- local tld = purl:get_tld()
- if tld then
- if domains:get_key(tld) then
- task:insert_result(symbol, 1, purl:get_host())
- end
- end
- else
- task:insert_result(symbol, 1, purl:get_host())
- end
- end
- end
- end
- end
+local function phishing_map(mapname, phishmap)
+ if opts[mapname] then
+ local xd = {}
+ if type(opts[mapname]) == 'table' then
+ xd = opts[mapname]
+ else
+ xd[1] = opts[mapname]
+ end
+ for _,d in ipairs(xd) do
+ local s, _ = string.find(d, ':[^:]+$')
+ if s then
+ local sym = string.sub(d, s + 1, -1)
+ local map = string.sub(d, 1, s - 1)
+ rspamd_config:register_virtual_symbol(sym, 1, id)
+ local rmap = rspamd_config:add_hash_map (map, 'Phishing ' .. mapname .. ' map')
+ if rmap then
+ local rule = {symbol = sym, map = rmap}
+ table.insert(phishmap, rule)
+ else
+ rspamd_logger.info('cannot add map: ' .. map .. ' for symbol: ' .. sym)
+ end
+ else
+ rspamd_logger.info(mapname .. ' option must be in format <map>:<symbol>')
+ end
+ end
+ end
end
-- Registration
if type(rspamd_config.get_api_version) ~= 'nil' then
- if rspamd_config:get_api_version() >= 1 then
- rspamd_config:register_module_option('phishing', 'symbol', 'string')
- rspamd_config:register_module_option('phishing', 'domains', 'map')
- rspamd_config:register_module_option('phishing', 'strict_domains', 'string')
- end
+ if rspamd_config:get_api_version() >= 1 then
+ rspamd_config:register_module_option('phishing', 'symbol', 'string')
+ rspamd_config:register_module_option('phishing', 'domains', 'map')
+ rspamd_config:register_module_option('phishing', 'strict_domains', 'string')
+ rspamd_config:register_module_option('phishing', 'redirector_domains', 'string')
+ end
end
-local opts = rspamd_config:get_all_opt('phishing')
if opts then
if opts['symbol'] then
symbol = opts['symbol']
-- Register symbol's callback
- local id = rspamd_config:register_symbol(symbol, 1.0, phishing_cb)
- if opts['domains'] and type(opt['domains']) == 'string' then
- domains = rspamd_config:add_hash_map (opts['domains'])
- end
- if opts['strict_domains'] then
- local sd = {}
- if type(opts['strict_domains']) == 'table' then
- sd = opts['strict_domains']
- else
- sd[1] = opts['strict_domains']
- end
- for _,d in ipairs(sd) do
- local s, _ = string.find(d, ':[^:]+$')
- if s then
- local sym = string.sub(d, s + 1, -1)
- local map = string.sub(d, 1, s - 1)
- rspamd_config:register_virtual_symbol(sym, 1, id)
- local rmap = rspamd_config:add_hash_map (map, 'Phishing strict domains map')
- if rmap then
- local rule = {symbol = sym, map = rmap}
- table.insert(strict_domains, rule)
- else
- rspamd_logger.info('cannot add map: ' .. map .. ' for symbol: ' .. sym)
- end
- else
- rspamd_logger.info('strict_domains option must be in format <map>:<symbol>')
- end
- end
- end
+ rspamd_config:register_symbol(symbol, 1.0, phishing_cb)
+ end
+ if opts['domains'] and type(opt['domains']) == 'string' then
+ domains = rspamd_config:add_hash_map (opts['domains'])
end
+ phishing_map('strict_domains', strict_domains)
+ phishing_map('redirector_domains', redirector_domains)
end