[Feature] Add maps cache and type refinement

This commit is contained in:
Vsevolod Stakhov 2019-05-21 16:58:44 +01:00
parent 231cfdc796
commit 9a26b96cf2

View File

@ -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