aboutsummaryrefslogtreecommitdiffstats
path: root/lualib/lua_selectors
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2020-07-14 16:48:23 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2020-07-14 16:48:40 +0100
commitf688e88f182a0bceb99ce203c2d9933855cbedc3 (patch)
tree881dc18c3180e0b33806a74e1e7747a5cf7f544d /lualib/lua_selectors
parent9c69e1fb3ef5f4cf855497ac6c2e1d6819a48d79 (diff)
downloadrspamd-f688e88f182a0bceb99ce203c2d9933855cbedc3.tar.gz
rspamd-f688e88f182a0bceb99ce203c2d9933855cbedc3.zip
[Minor] Add caching for attachments digests
Diffstat (limited to 'lualib/lua_selectors')
-rw-r--r--lualib/lua_selectors/common.lua43
-rw-r--r--lualib/lua_selectors/extractors.lua10
2 files changed, 41 insertions, 12 deletions
diff --git a/lualib/lua_selectors/common.lua b/lualib/lua_selectors/common.lua
index cb2ffc37f..336c16695 100644
--- a/lualib/lua_selectors/common.lua
+++ b/lualib/lua_selectors/common.lua
@@ -27,12 +27,10 @@ end
exports.digest_schema = digest_schema
-local function create_digest(data, args)
-
- local encoding = args[1] or 'hex'
+local function create_raw_digest(data, args)
local ht = args[2] or 'blake2'
- local h, s
+ local h
if ht == 'blake2' then
-- Hack to be compatible with various 'get_digest' methods
@@ -41,6 +39,13 @@ local function create_digest(data, args)
h = cr_hash.create_specific(ht):update(data)
end
+ return h
+end
+
+local function encode_digest(h, args)
+ local encoding = args[1] or 'hex'
+
+ local s
if encoding == 'hex' then
s = h:hex()
elseif encoding == 'base32' then
@@ -56,6 +61,36 @@ local function create_digest(data, args)
return s
end
+local function create_digest(data, args)
+ local h = create_raw_digest(data, args)
+ return encode_digest(h, args)
+end
+
+
+local function get_cached_or_raw_digest(task, idx, mime_part, args)
+ if #args == 0 then
+ -- Optimise as we already have this hash in the API
+ return mime_part:get_digest()
+ end
+
+ local ht = args[2] or 'blake2'
+ local cache_key = 'mp_digest_' .. ht .. tostring(idx)
+
+ local cached = task:cache_get(cache_key)
+
+ if cached then
+ return encode_digest(cached, args)
+ end
+
+ local h = create_raw_digest(mime_part:get_content('raw_parsed'), args)
+ task:cache_set(cache_key, h)
+
+ return encode_digest(h, args)
+end
+
exports.create_digest = create_digest
+exports.create_raw_digest = create_raw_digest
+exports.get_cached_or_raw_digest = get_cached_or_raw_digest
+exports.encode_digest = encode_digest
return exports \ No newline at end of file
diff --git a/lualib/lua_selectors/extractors.lua b/lualib/lua_selectors/extractors.lua
index 532c56592..d88eaa216 100644
--- a/lualib/lua_selectors/extractors.lua
+++ b/lualib/lua_selectors/extractors.lua
@@ -134,15 +134,9 @@ uses any type by default)]],
['get_value'] = function(task, args)
local parts = task:get_parts() or E
local digests = {}
- for _,p in ipairs(parts) do
+ for i,p in ipairs(parts) do
if p:get_filename() then
- if #args == 0 then
- -- Optimise as we already have this hash in the API
- table.insert(digests, p:get_digest())
- else
- table.insert(digests, common.create_digest(p:get_content('raw_parsed'), args))
- end
-
+ table.insert(digests, common.get_cached_or_raw_digest(task, i, p, args))
end
end