aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lualib/lua_mime.lua41
-rw-r--r--lualib/rspamadm/mime.lua44
2 files changed, 67 insertions, 18 deletions
diff --git a/lualib/lua_mime.lua b/lualib/lua_mime.lua
index 167939189..ce14a49f3 100644
--- a/lualib/lua_mime.lua
+++ b/lualib/lua_mime.lua
@@ -951,21 +951,26 @@ exports.anonymize_message = function(task, settings)
-- Process headers
local modified_headers = {}
- for name, processor in pairs(header_processors) do
- local hdrs = task:get_header_full(name, true)
- if hdrs then
- for _, hdr in ipairs(hdrs) do
- local new_value = processor(hdr)
- if new_value then
- table.insert(modified_headers, {
- name = name,
- value = new_value
- })
- end
+ local function process_hdr(name, hdr)
+ local processor = header_processors[name:lower()]
+ if processor then
+ local new_value = processor(hdr)
+ if new_value then
+ table.insert(modified_headers, {
+ name = name,
+ value = new_value
+ })
end
+ else
+ table.insert(modified_headers, {
+ name = name,
+ value = hdr.value,
+ })
end
end
+ task:headers_foreach(process_hdr, { full = true })
+
-- Create new text content
local text_content = {}
local urls = {}
@@ -974,12 +979,14 @@ exports.anonymize_message = function(task, settings)
-- Extract text content, URLs and emails
local text_parts = task:get_text_parts()
for _, part in ipairs(text_parts) do
- if part:is_html() then
- local words = part:get_words('norm')
- if words then
- text_content = words
+ if not part:get_mimepart():is_attachment() then
+ if part:is_html() then
+ local words = part:get_words('norm')
+ if words then
+ text_content = words
+ end
+ break -- Use only first HTML part
end
- break -- Use only first HTML part
end
end
@@ -1027,9 +1034,7 @@ exports.anonymize_message = function(task, settings)
local new_text = table.concat(text_content, ' ')
-- Create new message structure
- local boundaries = {}
local cur_boundary = '--XXX'
- boundaries[1] = cur_boundary
-- Add headers
out[#out + 1] = {
diff --git a/lualib/rspamadm/mime.lua b/lualib/rspamadm/mime.lua
index 7750c5a78..617f57a77 100644
--- a/lualib/rspamadm/mime.lua
+++ b/lualib/rspamadm/mime.lua
@@ -179,6 +179,13 @@ strip:option "--max-text-size"
:convert(tonumber)
:default(math.huge)
+local anonymize = parser:command "anonymize"
+ :description "Try to remove sensitive information from a message"
+anonymize:argument "file"
+ :description "File to process"
+ :argname "<file>"
+ :args "+"
+
local sign = parser:command "sign"
:description "Performs DKIM signing"
sign:argument "file"
@@ -968,6 +975,41 @@ local function strip_handler(opts)
end
end
+local function anonymize_handler(opts)
+ load_config(opts)
+ rspamd_url.init(rspamd_config:get_tld_path())
+
+ for _, fname in ipairs(opts.file) do
+ local task = load_task(opts, fname)
+ local newline_s = newline(task)
+
+ local rewrite = lua_mime.anonymize_message(task, opts) or {}
+
+ for _, o in ipairs(rewrite.out) do
+ if type(o) == 'string' then
+ io.write(o)
+ io.write(newline_s)
+ elseif type(o) == 'table' then
+ io.flush()
+ if type(o[1]) == 'string' then
+ io.write(o[1])
+ else
+ o[1]:save_in_file(1)
+ end
+
+ if o[2] then
+ io.write(newline_s)
+ end
+ else
+ o:save_in_file(1)
+ io.write(newline_s)
+ end
+ end
+
+ task:destroy() -- No automatic dtor
+ end
+end
+
-- Strips directories and .extensions (if present) from a filepath
local function filename_only(filepath)
local filename = filepath:match(".*%/([^%.]+)")
@@ -1076,6 +1118,8 @@ local function handler(args)
sign_handler(opts)
elseif command == 'dump' then
dump_handler(opts)
+ elseif command == 'anonymize' then
+ anonymize_handler(opts)
else
parser:error('command %s is not implemented', command)
end