]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix empty prefilters that require mime structures
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 13 Oct 2019 08:34:27 +0000 (09:34 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 13 Oct 2019 08:50:43 +0000 (09:50 +0100)
src/plugins/lua/asn.lua
src/plugins/lua/ratelimit.lua
src/plugins/lua/settings.lua
src/plugins/lua/whitelist.lua

index 7f236ca99cc15e04c662550d93d39e4424ccc70d..ea698f5aa46de8b1e42d92ad105af7088602a838 100644 (file)
@@ -126,10 +126,9 @@ end
 if configure_asn_module() then
   local id = rspamd_config:register_symbol({
     name = 'ASN_CHECK',
-    type = 'prefilter,nostat',
+    type = 'prefilter,nostat,empty',
     callback = asn_check,
     priority = 8,
-    flags = 'empty',
   })
   if options['symbol'] then
     rspamd_config:register_symbol({
index bd77b1ad6e8909143702df1b81e1a89d5681c127..dbaffd97534a8acd7348e28075adda7e5651279a 100644 (file)
@@ -396,11 +396,13 @@ local keywords = {
     ['get_value'] = function(task)
       return task:get_principal_recipient()
     end,
+    need_process = true,
   },
   ['digest'] = {
     ['get_value'] = function(task)
       return task:get_digest()
     end,
+    need_process = true,
   },
   ['attachments'] = {
     ['get_value'] = function(task)
@@ -419,6 +421,7 @@ local keywords = {
 
       return nil
     end,
+    need_process = true,
   },
   ['files'] = {
     ['get_value'] = function(task)
@@ -438,6 +441,7 @@ local keywords = {
 
       return nil
     end,
+    need_process = true,
   },
 }
 
@@ -445,12 +449,18 @@ local function gen_rate_key(task, rtype, bucket)
   local key_t = {tostring(lua_util.round(100000.0 / bucket.burst))}
   local key_keywords = lua_util.str_split(rtype, '_')
   local have_user = false
+  local message_processed = false
 
   for _, v in ipairs(key_keywords) do
     local ret
-
     if keywords[v] and type(keywords[v]['get_value']) == 'function' then
-      ret = keywords[v]['get_value'](task)
+      if keywords[v].need_process and not message_processed then
+        lua_util.debugm(N, task, 'process message as %s needs mime elts',
+            v)
+        message_processed = task:process_message()
+        message_processed = true
+      end
+      ret = keywords[v].get_value(task)
     end
     if not ret then return nil end
     if v == 'user' then have_user = true end
@@ -495,6 +505,9 @@ local function limit_to_prefixes(task, k, v, prefixes)
   local n = 0
   for _,bucket in ipairs(v.buckets) do
     if v.selector then
+      lua_util.debugm(N, task, 'process message as selectors need mime elts',
+          v)
+      task:process_message()
       local selectors = lua_selectors.process_selectors(task, v.selector)
       if selectors then
         local combined = lua_selectors.combine_selectors(task, selectors, ':')
@@ -855,11 +868,10 @@ if opts then
     lua_util.disable_module(N, "redis")
   else
     local s = {
-      type = 'prefilter,nostat',
+      type = 'prefilter,nostat,empty',
       name = 'RATELIMIT_CHECK',
       priority = 7,
       callback = ratelimit_cb,
-      flags = 'empty',
     }
 
     if settings.symbol then
index 0f895dc0b59b309d00ad2fa5b78ba1da300c880b..98e46a2e6c1c3150c6fd16667960500cf121a03a 100644 (file)
@@ -256,6 +256,7 @@ end
 
 -- Check limit for a task
 local function check_settings(task)
+  local message_processed = false
   local function check_specific_setting(rule, matched)
     local res = false
 
@@ -263,6 +264,13 @@ local function check_settings(task)
       local elt = rule.checks[atom]
 
       if elt then
+        if elt.need_process and not message_processed then
+          lua_util.debugm(N, task, 'process message as %s needs mime elts',
+              atom)
+          message_processed = task:process_message()
+          message_processed = true
+        end
+
         local input = elt.extract(task)
         if not input then return false end
 
@@ -616,6 +624,7 @@ local function process_settings_table(tbl, allow_ids, mempool)
           extract = function(task)
             return task:get_from(2)
           end,
+          need_process = true,
         }
       end
     end
@@ -630,6 +639,7 @@ local function process_settings_table(tbl, allow_ids, mempool)
           extract = function(task)
             return task:get_recipients(2)
           end,
+          need_process = true,
         }
       end
     end
@@ -773,6 +783,7 @@ local function process_settings_table(tbl, allow_ids, mempool)
                 return v
               end,
               extract = extractor_func(k),
+              need_process = true,
             }
 
             local skey = process_compound_condition(cond, table_element,
@@ -815,6 +826,7 @@ local function process_settings_table(tbl, allow_ids, mempool)
             end, values)
           end,
           extract = sel,
+          need_process = true,
         }
         local skey = process_compound_condition(cond, 'selector', elt.selector)
         lua_util.debugm(N, rspamd_config, 'added selector condition to "%s": %s',
index 11c01134bc74dfdc1cbc359ca3e5418fc0493a27..0d18a5d87182701c350fd7468cafb65564f6fce8 100644 (file)
@@ -389,9 +389,9 @@ local configure_whitelist_module = function()
           return
         end
 
-        local flags = 'nice,empty'
-        if rule['blacklist'] then
-          flags = 'empty'
+        local flags
+        if not rule['blacklist'] then
+          flags = 'nice'
         end
 
         local id = rspamd_config:register_symbol({