aboutsummaryrefslogtreecommitdiffstats
path: root/lualib/rspamadm/mime.lua
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2018-12-17 16:42:18 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2018-12-17 16:42:18 +0000
commit9d6b1b71b6fb63d13d0cd026118340c0bf8c82af (patch)
treeaf32cf082f58963ecff55276ac3990199a052044 /lualib/rspamadm/mime.lua
parent5dd8971d088e8175b06dd89a36cffb5d200a6a8c (diff)
downloadrspamd-9d6b1b71b6fb63d13d0cd026118340c0bf8c82af.tar.gz
rspamd-9d6b1b71b6fb63d13d0cd026118340c0bf8c82af.zip
[Project] Rspamadm: Allow to add footers to text parts and recode them
Diffstat (limited to 'lualib/rspamadm/mime.lua')
-rw-r--r--lualib/rspamadm/mime.lua84
1 files changed, 80 insertions, 4 deletions
diff --git a/lualib/rspamadm/mime.lua b/lualib/rspamadm/mime.lua
index 0b30f59e7..daadbab98 100644
--- a/lualib/rspamadm/mime.lua
+++ b/lualib/rspamadm/mime.lua
@@ -142,6 +142,12 @@ modify:option "-r --remove-header"
:description "Removes specific header (all occurrences)"
:argname "<header>"
:count "*"
+modify:option "-t --text-footer"
+ :description "Adds footer to text/plain parts from a specific file"
+ :argname "<file>"
+modify:option "-H --html-footer"
+ :description "Adds footer to text/html parts from a specific file"
+ :argname "<file>"
local function load_config(opts)
local _r,err = rspamd_config:load_ucl(opts['config'])
@@ -590,6 +596,54 @@ local function modify_handler(opts)
return '\r\n'
end
+ local function read_file(file)
+ local f = assert(io.open(file, "rb"))
+ local content = f:read("*all")
+ f:close()
+ return content
+ end
+
+ local function do_append_footer(task, part, footer)
+ local newline_s = newline(task)
+ local tp = part:get_text()
+ local ct = 'text/plain'
+
+ if tp:is_html() then
+ ct = 'text/html'
+ end
+
+ io.write(string.format('Content-Type: %s; charset=utf-8%s'..
+ 'Content-Transfer-Encoding: quoted-printable%s%s',
+ ct, newline_s, newline_s, newline_s))
+ io.flush()
+ local content = tostring(tp:get_content('raw_utf') or '')
+ local double_nline = newline_s .. newline_s
+ local nlen = #double_nline
+ -- Hack, if part ends with 2 newline, then we append it after footer
+ if content:sub(-(nlen), nlen + 1) == double_nline then
+ content = string.format('%s%s',
+ content:sub(-(#newline_s), #newline_s + 1), -- content without last newline
+ footer)
+ rspamd_util.encode_qp(content,
+ 80, task:get_newlines_type()):save_in_file(1)
+ else
+ rspamd_util.encode_qp(content .. footer,
+ 80, task:get_newlines_type()):save_in_file(1)
+ end
+
+ io.write(double_nline)
+ end
+
+ local text_footer, html_footer
+
+ if opts['text_footer'] then
+ text_footer = read_file(opts['text_footer'])
+ end
+
+ if opts['html_footer'] then
+ html_footer = read_file(opts['html_footer'])
+ end
+
for _,fname in ipairs(opts.file) do
local task = load_task(opts, fname)
local newline_s = newline(task)
@@ -659,6 +713,23 @@ local function modify_handler(opts)
part:get_raw_headers():save_in_file(1)
io.write(newline_s)
else
+ local append_footer = false
+ if text_footer and part:is_text() then
+ local tp = part:get_text()
+
+ if not tp:is_html() then
+ append_footer = text_footer
+ end
+ end
+
+ if html_footer and part:is_text() then
+ local tp = part:get_text()
+
+ if tp:is_html() then
+ append_footer = html_footer
+ end
+ end
+
if boundary then
if cur_boundary and boundary ~= cur_boundary then
-- Need to close boundary
@@ -672,10 +743,15 @@ local function modify_handler(opts)
end
io.flush()
- part:get_raw_headers():save_in_file(1)
- io.write(newline_s)
- io.flush()
- part:get_raw_content():save_in_file(1)
+
+ if append_footer then
+ do_append_footer(task, part, append_footer)
+ else
+ part:get_raw_headers():save_in_file(1)
+ io.write(newline_s)
+ io.flush()
+ part:get_raw_content():save_in_file(1)
+ end
end
end