]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Skip updates for messages scanned via controller
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 1 Jul 2017 15:11:45 +0000 (16:11 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 1 Jul 2017 15:11:45 +0000 (16:11 +0100)
Rationale: controller worker is not designed to perform scan jobs,
hence, we check for `Password` header or check `User-Agent` for `rspamc`
and skip some of rules parts:

- DMARC reports
- Greylisting
- Ratelimits
- Ip score update
- Clickhouse export

lualib/lua_util.lua
src/plugins/lua/clickhouse.lua
src/plugins/lua/dmarc.lua
src/plugins/lua/greylist.lua
src/plugins/lua/ip_score.lua
src/plugins/lua/ratelimit.lua

index 387952fef4c81dd7a2c19de0295f49b9545e493e..c401610d50908cce4a73845f7d9ac627c3e83f32 100644 (file)
@@ -135,4 +135,13 @@ exports.remove_email_aliases = function(email_addr)
   end
 end
 
+exports.is_rspamc_or_controller = function(task)
+  local ua = task:get_request_header('User-Agent') or ''
+  local pwd = task:get_request_header('Password')
+  local is_rspamc = false
+  if tostring(ua) == 'rspamc' or pwd then is_rspamc = true end
+
+  return is_rspamc
+end
+
 return exports
index baee79ca720f0efe17d56c08b998e78e9304c705..eb4ad57b7b90d6af31101aebdc433332851cdc48 100644 (file)
@@ -16,6 +16,7 @@ limitations under the License.
 
 local rspamd_logger = require 'rspamd_logger'
 local rspamd_http = require "rspamd_http"
+local rspamd_lua_utils = require "lua_util"
 
 if confighelp then
   return
@@ -345,6 +346,7 @@ local function clickhouse_quote(str)
 end
 
 local function clickhouse_collect(task)
+  if rspamd_lua_utils.is_rspamc_or_controller(task) then return end
   local from_domain = ''
   local from_user = ''
   if task:has_from('smtp') then
index 02dc0bb975f7fbe0da27514dec3fe95057d6a88b..10aa955898c4d810b101a216ea58ababf92feda4 100644 (file)
@@ -197,11 +197,14 @@ end
 
 local dmarc_grammar = gen_dmarc_grammar()
 
-local function dmarc_report(task, spf_ok, dkim_ok, disposition, sampled_out, hfromdom, spfdom, dres, spf_result)
+local function dmarc_report(task, spf_ok, dkim_ok, disposition,
+    sampled_out, hfromdom, spfdom, dres, spf_result)
   local ip = task:get_from_ip()
   if not ip:is_valid() then
     return nil
   end
+  local rspamd_lua_utils = require "lua_util"
+  if rspamd_lua_utils.is_rspamc_or_controller(task) then return end
   local dkim_pass = table.concat(dres.pass or E, '|')
   local dkim_fail = table.concat(dres.fail or E, '|')
   local dkim_temperror = table.concat(dres.temperror or E, '|')
index 424cf55093c6dedda66b6f44c215016251ffeb47..586661d44d27c6b2e0a5b00e85ce90b2cd5e2e19 100644 (file)
@@ -62,6 +62,7 @@ local rspamd_logger = require "rspamd_logger"
 local rspamd_util = require "rspamd_util"
 local fun = require "fun"
 local hash = require "rspamd_cryptobox_hash"
+local rspamd_lua_utils = require "lua_util"
 
 local function data_key(task)
   local cached = task:get_mempool():get_variable("grey_bodyhash")
@@ -206,9 +207,7 @@ local function greylist_check(task)
           end_time, type)
         task:insert_result(settings['symbol'], 0.0, 'greylisted', end_time)
 
-        local ua = task:get_request_header('User-Agent') or ''
-        if tostring(ua) == 'rspamc' then return end -- Likely rspamc scan
-
+        if rspamd_lua_utils.is_rspamc_or_controller(task) then return end
         if settings.message_func then
           task:set_pre_result('soft reject',
             settings.message_func(task, end_time))
@@ -310,9 +309,7 @@ local function greylist_set(task)
     end
   end
 
-  local ua = task:get_request_header('User-Agent') or ''
-  local is_rspamc = false
-  if tostring(ua) == 'rspamc' then is_rspamc = true end
+  local is_rspamc = rspamd_lua_utils.is_rspamc_or_controller(task)
 
   if is_whitelisted then
     if action == 'greylist' then
index a1a88d4b2a84efedfc3e2f007b4c5392da3fa8fe..879aff74c1d44a7ff3174680f3e2781003f9a0fa 100644 (file)
@@ -22,6 +22,7 @@ end
 local rspamd_logger = require "rspamd_logger"
 local rspamd_regexp = require "rspamd_regexp"
 local rspamd_util = require "rspamd_util"
+local rspamd_lua_utils = require "lua_util"
 
 -- Default settings
 local redis_params = nil
@@ -96,6 +97,7 @@ end
 
 -- Set score based on metric's action
 local ip_score_set = function(task)
+  if rspamd_lua_utils.is_rspamc_or_controller(task) then return end
   local function new_score_set(score, old_score, old_total)
     local new_total
     if old_total == -1 or old_total ~= old_total then
index 02e9d4d6f18ccaccb93bf20320f622337149fe33..beb9eb283b1c9a4c860ac5e9475e970e3fdc4e70 100644 (file)
@@ -48,6 +48,7 @@ end
 
 local rspamd_logger = require "rspamd_logger"
 local rspamd_util = require "rspamd_util"
+local rspamd_lua_utils = require "lua_util"
 local fun = require "fun"
 
 local user_keywords = {'user'}
@@ -545,6 +546,7 @@ end
 
 --- Check limit
 local function rate_test(task)
+  if rspamd_lua_utils.is_rspamc_or_controller(task) then return end
   rate_test_set(task, check_limits)
 end
 --- Update limit
@@ -552,6 +554,7 @@ local function rate_set(task)
   local action = task:get_metric_action('default')
 
   if action ~= 'soft reject' then
+    if rspamd_lua_utils.is_rspamc_or_controller(task) then return end
     rate_test_set(task, set_limits)
   end
 end