summaryrefslogtreecommitdiffstats
path: root/src/plugins/lua/once_received.lua
blob: 88432d873b509d65c3a9a04efef73fb692e1c40a (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
54
55
56
57
58
59
60
61
62
63
64
-- 0 or 1 received: = spam

local metric = 'default'
local symbol = 'ONCE_RECEIVED'
-- Symbol for strict checks
local symbol_strict = nil
local bad_hosts = {}
local good_hosts = {}

function check_quantity_received (task)
	local recvh = task:get_received_headers()
	print (symbol)
	if table.maxn(recvh) <= 1 then
		task:insert_result(metric, symbol, 1)
	end
	-- Strict checks
	if symbol_strict then
		local r = recvh[1]
		-- Unresolved host
		if not r['real_hostname'] or r['real_hostname'] == 'unknown' or string.match(r['real_hostname'], '(%d+)\.(%d+)\.(%d+)\.(%d+)') then
			task:insert_result(metric, symbol_strict, 1)
		end
		local i = true
		for _,h in ipairs(bad_hosts) do
			if string.find(r['real_hostname'], h) then
				-- Check for good hostname
				for _,gh in ipairs(good_hosts) do
					if string.find(r['real_hostname'], gh) then
						i = false
						break
					end
				end
				if i then
					task:insert_result(metric, symbol_strict, 1, h)
					return
				end
			end
		end
	end
end

-- Configuration
local opts =  rspamd_config:get_all_opt('once_received')
if opts then
    if opts['symbol'] then
        symbol = opts['symbol']

	    for n,v in pairs(opts) do
			if n == 'symbol_strict' then
				symbol_strict = v
			elseif n == 'bad_host' then
			    table.insert(bad_hosts, v)
			elseif n == 'good_host' then
			    table.insert(good_hosts, v)
		    elseif n == 'metric' then
			    metric = v
		    end
	    end

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