-- 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 = {}
-- 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
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] = {
: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"
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(".*%/([^%.]+)")
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