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, _, _, _)