|
|
@@ -19,8 +19,62 @@ See the License for the specific language governing permissions and |
|
|
|
limitations under the License. |
|
|
|
]]-- |
|
|
|
|
|
|
|
local rspamd_logger = require "rspamd_logger" |
|
|
|
|
|
|
|
local exports = {} |
|
|
|
|
|
|
|
local maps_cache = {} |
|
|
|
|
|
|
|
local function map_hash_key(data, mtype) |
|
|
|
local hash = require "rspamd_cryptobox_hash" |
|
|
|
local st = hash.create_specific('xxh64') |
|
|
|
st:update(data) |
|
|
|
st:update(mtype) |
|
|
|
|
|
|
|
return st:hex() |
|
|
|
end |
|
|
|
|
|
|
|
local function starts(where,st) |
|
|
|
return string.sub(where,1,string.len(st))==st |
|
|
|
end |
|
|
|
|
|
|
|
local function cut_prefix(where,st) |
|
|
|
return string.sub(where,#st + 1) |
|
|
|
end |
|
|
|
|
|
|
|
local function maybe_adjust_type(data,mtype) |
|
|
|
local function check_prefix(prefix, t) |
|
|
|
if starts(data, prefix) then |
|
|
|
data = cut_prefix(data, prefix) |
|
|
|
mtype = t |
|
|
|
|
|
|
|
return true |
|
|
|
end |
|
|
|
|
|
|
|
return false |
|
|
|
end |
|
|
|
|
|
|
|
local known_types = { |
|
|
|
{'regexp;', 'regexp'}, |
|
|
|
{'re;', 'regexp'}, |
|
|
|
{'glob;', 'glob'}, |
|
|
|
{'radix;', 'radix'}, |
|
|
|
{'ipnet;', 'radix'}, |
|
|
|
{'set;', 'set'}, |
|
|
|
{'hash;', 'hash'}, |
|
|
|
{'plain;', 'hash'} |
|
|
|
} |
|
|
|
|
|
|
|
for _,t in ipairs(known_types) do |
|
|
|
if check_prefix(t[1], t[2]) then |
|
|
|
return data,mtype |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
-- No change |
|
|
|
return data,mtype |
|
|
|
end |
|
|
|
|
|
|
|
--[[[ |
|
|
|
-- @function lua_maps.map_add_from_ucl(opt, mtype, description) |
|
|
|
-- Creates a map from static data |
|
|
@@ -56,6 +110,14 @@ local function rspamd_map_add_from_ucl(opt, mtype, description) |
|
|
|
end |
|
|
|
|
|
|
|
if type(opt) == 'string' then |
|
|
|
opt,mtype = maybe_adjust_type(opt, mtype) |
|
|
|
local k = map_hash_key(opt, mtype) |
|
|
|
if maps_cache[k] then |
|
|
|
rspamd_logger.infox(rspamd_config, 'reuse url for %s(%s)', |
|
|
|
opt, mtype) |
|
|
|
|
|
|
|
return maps_cache[k] |
|
|
|
end |
|
|
|
-- We have a single string, so we treat it as a map |
|
|
|
local map = rspamd_config:add_map{ |
|
|
|
type = mtype, |
|
|
@@ -65,11 +127,14 @@ local function rspamd_map_add_from_ucl(opt, mtype, description) |
|
|
|
|
|
|
|
if map then |
|
|
|
ret.__data = map |
|
|
|
ret.hash = k |
|
|
|
setmetatable(ret, ret_mt) |
|
|
|
maps_cache[k] = ret |
|
|
|
return ret |
|
|
|
end |
|
|
|
elseif type(opt) == 'table' then |
|
|
|
-- it might be plain map or map of plain elements |
|
|
|
-- no caching in this case (yet) |
|
|
|
if opt[1] then |
|
|
|
if mtype == 'radix' then |
|
|
|
|
|
|
@@ -201,10 +266,6 @@ exports.map_add_from_ucl = rspamd_map_add_from_ucl |
|
|
|
local function rspamd_maybe_check_map(key, what) |
|
|
|
local fun = require "fun" |
|
|
|
|
|
|
|
local function starts(where,st) |
|
|
|
return string.sub(where,1,string.len(st))==st |
|
|
|
end |
|
|
|
|
|
|
|
if type(what) == "table" then |
|
|
|
return fun.any(function(elt) return rspamd_maybe_check_map(key, elt) end, what) |
|
|
|
end |