]> source.dussan.org Git - rspamd.git/commitdiff
[Project] Allow to pass callbacks to maps configuration
authorVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 5 Nov 2022 13:30:24 +0000 (13:30 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 19 Nov 2022 12:44:13 +0000 (12:44 +0000)
lualib/lua_maps.lua

index 9c109fac221a594b82ac4c45d07b424734fb9750..9ebdbbbe64692fce8bc7aa66835263095b10b2a5 100644 (file)
@@ -93,14 +93,21 @@ end
 -- @param {string or table} opt data for map (or URL)
 -- @param {string} mtype type of map (`set`, `map`, `radix`, `regexp`)
 -- @param {string} description human-readable description of map
+-- @param {function} callback optional callback that will be called on map match (required for external maps)
 -- @return {bool} true on success, or `nil`
 --]]
 
-local function rspamd_map_add_from_ucl(opt, mtype, description)
+local function rspamd_map_add_from_ucl(opt, mtype, description, callback)
   local ret = {
     get_key = function(t, k)
       if t.__data then
-        return t.__data:get_key(k)
+        local result = t.__data:get_key(k)
+
+        if callback then
+          callback(result)
+        else
+          return result
+        end
       end
 
       return nil
@@ -123,7 +130,7 @@ local function rspamd_map_add_from_ucl(opt, mtype, description)
   if type(opt) == 'string' then
     opt,mtype = maybe_adjust_type(opt, mtype)
     local cache_key = map_hash_key(opt, mtype)
-    if maps_cache[cache_key] then
+    if not callback and maps_cache[cache_key] then
       rspamd_logger.infox(rspamd_config, 'reuse url for %s(%s)',
           opt, mtype)
 
@@ -145,7 +152,7 @@ local function rspamd_map_add_from_ucl(opt, mtype, description)
     end
   elseif type(opt) == 'table' then
     local cache_key = lua_util.table_digest(opt)
-    if maps_cache[cache_key] then
+    if not callback and maps_cache[cache_key] then
       rspamd_logger.infox(rspamd_config, 'reuse url for complex map definition %s: %s',
           cache_key:sub(1,8), description)
 
@@ -307,13 +314,14 @@ end
 -- @param {string} optname option name to use
 -- @param {string} mtype type of map ('set', 'hash', 'radix', 'regexp', 'glob')
 -- @param {string} description human-readable description of map
+-- @param {function} callback optional callback that will be called on map match (required for external maps)
 -- @return {bool} true on success, or `nil`
 --]]
 
-local function rspamd_map_add(mname, optname, mtype, description)
+local function rspamd_map_add(mname, optname, mtype, description, callback)
   local opt = rspamd_config:get_module_opt(mname, optname)
 
-  return rspamd_map_add_from_ucl(opt, mtype, description)
+  return rspamd_map_add_from_ucl(opt, mtype, description, callback)
 end
 
 exports.rspamd_map_add = rspamd_map_add