summaryrefslogtreecommitdiffstats
path: root/src/plugins/lua/received_rbl.lua
blob: fa29cabc8059d4a1dcb1b62441dfe264f3dc98fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
-- This plugin is designed for testing received headers via rbl
-- Configuration:
-- .module 'received_rbl' {
--      rbl = "insecure-bl.rambler.ru";
--      rbl = "xbl.spamhaus.org";
--      metric = "default";
--      symbol = "RECEIVED_RBL";
-- };


local metric = 'default'
local symbol = 'RECEIVED_RBL'
local rbls = {}

function dns_cb(task, to_resolve, results, err)
	if results then
		local _,_,rbl = string.find(to_resolve, '%d+\.%d+\.%d+\.%d+\.(.+)')
		task:insert_result(metric, symbol, 1, rbl)
	end
end

function received_cb (task)
	local recvh = task:get_received_headers()
    for _,rh in ipairs(recvh) do
        for k,v in pairs(rh) do
			if k == 'real_ip' then
				local _,_,o1,o2,o3,o4 = string.find(v, '(%d+)\.(%d+)\.(%d+)\.(%d+)')
				for _,rbl in ipairs(rbls) do
					rbl_str = o4 .. '.' .. o3 .. '.' .. o2 .. '.' .. o1 .. '.' .. rbl
					task:resolve_dns_a(rbl_str, 'dns_cb')
				end
			end
        end
    end
end

-- Configuration
local opts =  rspamd_config:get_all_opt('received_rbl')
if opts then
	for n,v in pairs(opts) do
		if n == 'rbl' then
			table.insert(rbls, v)
		elseif n == 'metric' then
			metric = v
		elseif n == 'symbol' then
			symbol = v
		end
	end
end

-- Register symbol's callback
local m = rspamd_config:get_metric(metric)
m:register_symbol(symbol, 1.0, 'received_cb')