diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-02-04 13:52:48 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-02-04 13:52:48 +0000 |
commit | f8972718df531c3608e9693d72d290573f9b5d20 (patch) | |
tree | 06f534ea12c5c3310b9f26b6026c513771622a2f /lualib | |
parent | 39108d6c752bfc582da88b7d29de95d73129dc0e (diff) | |
download | rspamd-f8972718df531c3608e9693d72d290573f9b5d20.tar.gz rspamd-f8972718df531c3608e9693d72d290573f9b5d20.zip |
[Minor] Rspamadm: Store intermediate message in a table
Diffstat (limited to 'lualib')
-rw-r--r-- | lualib/rspamadm/mime.lua | 112 |
1 files changed, 59 insertions, 53 deletions
diff --git a/lualib/rspamadm/mime.lua b/lualib/rspamadm/mime.lua index 7b633b75d..6765c9e43 100644 --- a/lualib/rspamadm/mime.lua +++ b/lualib/rspamadm/mime.lua @@ -16,7 +16,7 @@ limitations under the License. local argparse = require "argparse" local ansicolors = require "ansicolors" ---local rspamd_util = require "rspamd_util" +local rspamd_util = require "rspamd_util" local rspamd_task = require "rspamd_task" local rspamd_logger = require "rspamd_logger" local lua_meta = require "lua_meta" @@ -584,7 +584,6 @@ local function urls_handler(opts) end local function modify_handler(opts) - local rspamd_util = require "rspamd_util" load_config(opts) rspamd_url.init(rspamd_config:get_tld_path()) @@ -607,7 +606,7 @@ local function modify_handler(opts) return content end - local function do_append_footer(task, part, footer, is_multipart) + local function do_append_footer(task, part, footer, is_multipart, out) local newline_s = newline(task) local tp = part:get_text() local ct = 'text/plain' @@ -622,10 +621,10 @@ local function modify_handler(opts) end if is_multipart then - io.write(string.format('Content-Type: %s; charset=utf-8%s'.. - 'Content-Transfer-Encoding: %s%s%s', - ct, newline_s, cte, newline_s, newline_s)) - io.flush() + out[#out + 1] = string.format('Content-Type: %s; charset=utf-8%s'.. + 'Content-Transfer-Encoding: %s', + ct, newline_s, cte) + out[#out + 1] = '' end local content = tostring(tp:get_content('raw_utf') or '') @@ -636,17 +635,16 @@ local function modify_handler(opts) 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) - io.write(double_nline) + out[#out + 1] = {rspamd_util.encode_qp(content, + 80, task:get_newlines_type()), true} + out[#out + 1] = '' else content = content .. footer - rspamd_util.encode_qp(content, - 80, task:get_newlines_type()):save_in_file(1) - io.write(double_nline) + out[#out + 1] = {rspamd_util.encode_qp(content, + 80, task:get_newlines_type()), true} + out[#out + 1] = '' end - end local text_footer, html_footer @@ -665,6 +663,7 @@ local function modify_handler(opts) local need_rewrite_ct = false local parsed_ct local seen_cte = false + local out = {} local function process_headers_cb(name, hdr) @@ -678,31 +677,31 @@ local function modify_handler(opts) local hname,hpattern = h:match('^([^=]+)=(.+)$') if hname == name then local new_value = string.format(hpattern, hdr.decoded) - new_value = string.format('%s:%s%s%s', + new_value = string.format('%s:%s%s', name, hdr.separator, rspamd_util.fold_header(name, rspamd_util.mime_header_encode(new_value), - task:get_newlines_type()), newline_s) - io.write(new_value) + task:get_newlines_type())) + out[#out + 1] = new_value return end end if need_rewrite_ct then if name:lower() == 'content-type' then - local nct = string.format('%s: %s/%s; charset=utf-8%s', - 'Content-Type', parsed_ct.type, parsed_ct.subtype, newline_s) - io.write(nct) + local nct = string.format('%s: %s/%s; charset=utf-8', + 'Content-Type', parsed_ct.type, parsed_ct.subtype) + out[#out + 1] = nct return elseif name:lower() == 'content-transfer-encoding' then seen_cte = true - io.write(string.format('%s: %s%s', - 'Content-Transfer-Encoding', 'quoted-printable', newline_s)) + out[#out + 1] = string.format('%s: %s', + 'Content-Transfer-Encoding', 'quoted-printable') return end end - io.write(hdr.raw) + out[#out + 1] = hdr.raw:gsub('\r?\n?$', '') end if html_footer or text_footer then @@ -755,19 +754,19 @@ local function modify_handler(opts) local hname,hvalue = h:match('^([^=]+)=(.+)$') if hname and hvalue then - io.write(string.format('%s: %s%s', hname, - rspamd_util.fold_header(hname, hvalue, task:get_newlines_type()), - newline_s)) + out[#out + 1] = string.format('%s: %s', hname, + rspamd_util.fold_header(hname, hvalue, task:get_newlines_type())) end end if not seen_cte and need_rewrite_ct then - io.write(string.format('%s: %s%s', - 'Content-Transfer-Encoding', 'quoted-printable', newline_s)) + out[#out + 1] = string.format('%s: %s', + 'Content-Transfer-Encoding', 'quoted-printable') end -- End of headers - io.write(newline_s) + local eoh_pos = #out + out[#out + 1] = '' local boundaries = {} local cur_boundary @@ -776,36 +775,31 @@ local function modify_handler(opts) local boundary = part:get_boundary() if part:is_multipart() then if cur_boundary then - io.write(string.format('--%s%s', - boundaries[#boundaries], newline_s)) + out[#out + 1] = string.format('--%s', + boundaries[#boundaries]) end boundaries[#boundaries + 1] = boundary or '--XXX' cur_boundary = boundary - io.flush () local rh = part:get_raw_headers() if #rh > 0 then - rh:save_in_file(1) - io.write(newline_s) - io.flush() + out[#out + 1] = {rh, true} end elseif part:is_message() then if boundary then if cur_boundary and boundary ~= cur_boundary then -- Need to close boundary - io.write(string.format('--%s--%s%s', - boundaries[#boundaries], newline_s, newline_s)) + out[#out + 1] = string.format('--%s--%s', + boundaries[#boundaries], newline_s) table.remove(boundaries) cur_boundary = nil end - io.write(string.format('--%s%s', - boundary, newline_s)) + out[#out + 1] = string.format('--%s', + boundary) end - io.flush() - part:get_raw_headers():save_in_file(1) - io.write(newline_s) + out[#out + 1] = {part:get_raw_headers(), true} else local append_footer = false local skip_footer = part:is_attachment() @@ -838,25 +832,23 @@ local function modify_handler(opts) if boundary then if cur_boundary and boundary ~= cur_boundary then -- Need to close boundary - io.write(string.format('--%s--%s%s', - boundaries[#boundaries], newline_s, newline_s)) + out[#out + 1] = string.format('--%s--%s', + boundaries[#boundaries], newline_s) table.remove(boundaries) cur_boundary = boundary end - io.write(string.format('--%s%s', - boundary, newline_s)) + out[#out + 1] = string.format('--%s', + boundary) end io.flush() if append_footer and not skip_footer then do_append_footer(task, part, append_footer, - parent and parent:is_multipart()) + parent and parent:is_multipart(), out) else - part:get_raw_headers():save_in_file(1) - io.write(newline_s) - io.flush() - part:get_raw_content():save_in_file(1) + out[#out + 1] = {part:get_raw_headers(), true} + out[#out + 1] = {part:get_raw_content(), false} end end end @@ -864,13 +856,27 @@ local function modify_handler(opts) -- Close remaining local b = table.remove(boundaries) while b do - io.write(string.format('--%s--%s', b, newline_s)) + out[#out + 1] = string.format('--%s--', b) if #boundaries > 0 then - io.write(newline_s) + out[#out + 1] = '' end b = table.remove(boundaries) end + for _,o in ipairs(out) do + if type(o) == 'string' then + io.write(o) + io.write(newline_s) + else + io.flush() + o[1]:save_in_file(1) + + if o[2] then + io.write(newline_s) + end + end + end + task:destroy() -- No automatic dtor end end |