]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Lua_maps: Allow static maps for key-value pairs
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 19 Jul 2019 12:41:12 +0000 (13:41 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 19 Jul 2019 12:41:12 +0000 (13:41 +0100)
lualib/lua_maps.lua

index 6b1a3759046e401258250ae3a4b14722efe04f53..6b478ded8b703dffc24596fca04d1d4185e6515f 100644 (file)
@@ -206,14 +206,30 @@ local function rspamd_map_add_from_ucl(opt, mtype, description)
         else
           local data = {}
           local nelts = 0
+          -- Plain array of keys, count merely numeric elts
           for _,elt in ipairs(opt) do
             if type(elt) == 'string' then
-              data[elt] = true
+              -- Numeric table
+              if mtype == 'hash' then
+                -- Treat as KV pair
+                local lua_util = require "lua_util"
+                local pieces = lua_util.str_split(elt, ' ')
+                if #pieces > 1 then
+                  local key = table.remove(pieces, 1)
+                  data[key] = table.concat(pieces, ' ')
+                else
+                  data[elt] = true
+                end
+              else
+                data[elt] = true
+              end
+
               nelts = nelts + 1
             end
           end
 
           if nelts > 0 then
+            -- Plain Lua table that is used as a map
             ret.__data = data
             ret.get_key = function(t, k)
               if k ~= '__data' then
@@ -222,11 +238,17 @@ local function rspamd_map_add_from_ucl(opt, mtype, description)
 
               return nil
             end
+
             return ret
+          else
+            -- Empty map, huh?
+            rspamd_logger.errx(rspamd_config, 'invalid map element: %s',
+                opt)
           end
         end
       end
     else
+      -- We have some non-trivial object so let C code to deal with it somehow...
       local map = rspamd_config:add_map{
         type = mtype,
         description = description,
@@ -237,7 +259,7 @@ local function rspamd_map_add_from_ucl(opt, mtype, description)
         setmetatable(ret, ret_mt)
         return ret
       end
-    end
+    end -- opt[1]
   end
 
   return nil