]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Process high priority settings even if settings/id has been specified
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 3 Feb 2020 13:02:18 +0000 (13:02 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 3 Feb 2020 13:02:18 +0000 (13:02 +0000)
lualib/lua_settings.lua
src/plugins/lua/settings.lua

index 31c74bc988a64b12b953abdf98270faf9e269659..61cc9d2ad937f32f250ea36e50ef70dda6ba4bae 100644 (file)
@@ -240,6 +240,7 @@ local function register_settings_id(str, settings)
   else
     known_ids[numeric_id] = {
       name = str,
+      id = numeric_id,
       settings = transform_settings_maybe(settings, str),
       symbols = {}
     }
index 0f895dc0b59b309d00ad2fa5b78ba1da300c880b..be22bf1e5d9c4f184d6b28ebdf144ec1d1d5620a 100644 (file)
@@ -95,8 +95,12 @@ local function apply_settings(task, to_apply, id)
   end
 end
 
--- Checks for overridden settings within query params and returns 'true' if
--- settings are overridden
+-- Checks for overridden settings within query params and returns 3 values:
+-- * Apply element
+-- * Settings ID element if found
+-- * Priority of the settings according to the place where it is found
+--
+-- If no override has been found, it returns `false`
 local function check_query_settings(task)
   -- Try 'settings' attribute
   local settings_id = task:get_settings_id()
@@ -111,9 +115,9 @@ local function check_query_settings(task)
             tostring(settings_id))
       end
       local settings_obj = parser:get_object()
-      apply_settings(task, settings_obj, nil)
 
-      return true
+      -- Treat as low priority
+      return settings_obj,nil,1
     else
       rspamd_logger.errx(task, 'Parse error: %s', err)
     end
@@ -145,8 +149,8 @@ local function check_query_settings(task)
 
       if not settings_id then
         rspamd_logger.infox(task, 'apply maxscore = %s', nset.actions)
-        apply_settings(task, nset, nil)
-        return true
+        -- Maxscore is low priority
+        return nset, nil, 1
       end
     end
   end
@@ -164,24 +168,19 @@ local function check_query_settings(task)
         if nset then
           elt.apply = lua_util.override_defaults(nset, elt.apply)
         end
-        apply_settings(task, elt['apply'], settings_id)
-        rspamd_logger.infox(task, "applied settings id %s(%s)",
-            cached.name, settings_id)
-        return true
+        return elt.apply, cached, cached.priority or 1
       end
     else
       rspamd_logger.warnx(task, 'no settings id "%s" has been found', settings_id)
       if nset then
         rspamd_logger.infox(task, 'apply maxscore = %s', nset.actions)
-        apply_settings(task, nset, nil)
-        return true
+        return nset, nil, 1
       end
     end
   else
     if nset then
       rspamd_logger.infox(task, 'apply maxscore = %s', nset.actions)
-      apply_settings(task, nset, nil)
-      return true
+      return nset, nil, 1
     end
   end
 
@@ -291,19 +290,46 @@ local function check_settings(task)
   end
 
   -- Check if we have override as query argument
-  if check_query_settings(task) then
-    return
+  local query_apply,id_elt,priority = check_query_settings(task)
+
+  local function maybe_apply_query_settings()
+    if query_apply then
+      if id_elt then
+        apply_settings(task, query_apply, id_elt.id)
+        rspamd_logger.infox(task, "applied settings id %s(%s)",
+            id_elt.name, id_elt.id)
+      else
+        apply_settings(task, query_apply, nil)
+        rspamd_logger.infox(task, "applied settings from query")
+      end
+    end
+  end
+
+  local min_pri = 1
+  if query_apply then
+    if priority > min_pri then
+      -- Do not check lower priorities
+      min_pri = priority
+    end
+
+    if priority > max_pri then
+      -- Our internal priorities are lower then a priority from query, so no need to check
+      maybe_apply_query_settings()
+
+      return
+    end
   end
 
   -- Do not waste resources
   if not settings_initialized then
+    maybe_apply_query_settings()
     return
   end
 
   -- Match rules according their order
   local applied = false
 
-  for pri = max_pri,1,-1 do
+  for pri = max_pri,min_pri,-1 do
     if not applied and settings[pri] then
       for _,s in ipairs(settings[pri]) do
         local matched = {}
@@ -348,6 +374,10 @@ local function check_settings(task)
     end
   end
 
+  if not applied then
+    maybe_apply_query_settings()
+  end
+
 end
 
 -- Process settings based on their priority