From 9d6b1b71b6fb63d13d0cd026118340c0bf8c82af Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 17 Dec 2018 16:42:18 +0000 Subject: [PATCH] [Project] Rspamadm: Allow to add footers to text parts and recode them --- lualib/rspamadm/mime.lua | 84 ++++++++++++++++++++++++++++++++++++++-- 1 file 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 "
" :count "*" +modify:option "-t --text-footer" + :description "Adds footer to text/plain parts from a specific file" + :argname "" +modify:option "-H --html-footer" + :description "Adds footer to text/html parts from a specific file" + :argname "" 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 -- 2.39.5