Browse Source

[Feature] Add SPF selector to reputation

tags/1.7.9
Vsevolod Stakhov 5 years ago
parent
commit
8e1063f4df
1 changed files with 77 additions and 1 deletions
  1. 77
    1
      src/plugins/lua/reputation.lua

+ 77
- 1
src/plugins/lua/reputation.lua View File

@@ -543,10 +543,86 @@ local ip_selector = {
idempotent = ip_reputation_idempotent -- used to set scores
}

-- SPF Selector functions

local function spf_reputation_filter(task, rule)
local spf_record = task:get_mempool():get_variable('spf_record')
local spf_allow = task:has_symbol('R_SPF_ALLOW')

-- Don't care about bad/missing spf
if not spf_record or not spf_allow then return end

local function tokens_cb(err, token, values)
if values then
local score = generic_reputation_calc(token, rule, values)

if math.abs(score) > 1e-3 then
-- TODO: add description
task:insert_result(rule.symbol, score)
end
end
end

rule.backend.get_token(task, rule, spf_record, tokens_cb)
end

local function spf_reputation_idempotent(task, rule)
local action = task:get_metric_action()
local spf_record = task:get_mempool():get_variable('spf_record')
local spf_allow = task:has_symbol('R_SPF_ALLOW')
local token = {
}
local cfg = rule.selector.config
local need_set = false

if not spf_record or not spf_allow then return end

-- TODO: take metric score into consideration
local k = cfg.keys_map[action]

if k then
token[k] = 1.0
need_set = true
end

if need_set then
rule.backend.set_token(task, rule, spf_record, token)
end
end


local spf_selector = {
config = {
-- keys map between actions and hash elements in bucket,
-- h is for ham,
-- s is for spam,
-- p is for probable spam
keys_map = {
['reject'] = 's',
['add header'] = 'p',
['rewrite subject'] = 'p',
['no action'] = 'h'
},
symbol = 'SPF_SCORE', -- symbol to be inserted
lower_bound = 10, -- minimum number of messages to be scored
min_score = nil,
max_score = nil,
outbound = true,
inbound = true,
max_accept_adjustment = 2.0, -- How to adjust accepted DKIM score
max_reject_adjustment = 3.0 -- How to adjust rejected DKIM score
},
dependencies = {"R_SPF_ALLOW"},
filter = spf_reputation_filter, -- used to get scores
idempotent = spf_reputation_idempotent -- used to set scores
}


local selectors = {
ip = ip_selector,
url = url_selector,
dkim = dkim_selector
dkim = dkim_selector,
spf = spf_selector
}

local function reputation_dns_init(rule, _, _, _)

Loading…
Cancel
Save