[Rspamd] Temp. pre-add proposed upstream change in metadata exporter

master
andryyy 2020-10-23 21:49:06 +02:00
parent efc6f214d1
commit d85241f518
No known key found for this signature in database
GPG Key ID: 8EC34FF2794E25EF
2 changed files with 41 additions and 130 deletions

View File

@ -23,6 +23,7 @@ RUN apt-get update && apt-get install -y \
&& chown _rspamd:_rspamd /run/rspamd && chown _rspamd:_rspamd /run/rspamd
COPY settings.conf /etc/rspamd/settings.conf COPY settings.conf /etc/rspamd/settings.conf
COPY metadata_exporter.lua /usr/share/rspamd/plugins/metadata_exporter.lua
COPY docker-entrypoint.sh /docker-entrypoint.sh COPY docker-entrypoint.sh /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"] ENTRYPOINT ["/docker-entrypoint.sh"]

View File

@ -24,7 +24,6 @@ end
local redis_params local redis_params
local lua_util = require "lua_util" local lua_util = require "lua_util"
local rspamd_http = require "rspamd_http" local rspamd_http = require "rspamd_http"
local rspamd_tcp = require "rspamd_tcp"
local rspamd_util = require "rspamd_util" local rspamd_util = require "rspamd_util"
local rspamd_logger = require "rspamd_logger" local rspamd_logger = require "rspamd_logger"
local ucl = require "ucl" local ucl = require "ucl"
@ -80,6 +79,21 @@ local function get_general_metadata(task, flatten, no_content)
local s = task:get_metric_score('default')[1] local s = task:get_metric_score('default')[1]
r.score = flatten and string.format('%.2f', s) or s r.score = flatten and string.format('%.2f', s) or s
local fuzzy = task:get_mempool():get_variable("fuzzy_hashes", "fstrings")
if fuzzy and #fuzzy > 0 then
local fz = {}
for _,h in ipairs(fuzzy) do
table.insert(fz, h)
end
if not flatten then
r.fuzzy = fz
else
r.fuzzy = table.concat(fz, ', ')
end
else
r.fuzzy = 'unknown'
end
local rcpt = task:get_recipients('smtp') local rcpt = task:get_recipients('smtp')
if rcpt then if rcpt then
local l = {} local l = {}
@ -145,32 +159,34 @@ end
local formatters = { local formatters = {
default = function(task) default = function(task)
return task:get_content() return task:get_content(), {}
end, end,
email_alert = function(task, rule, extra) email_alert = function(task, rule, extra)
local meta = get_general_metadata(task, true) local meta = get_general_metadata(task, true)
local display_emails = {} local display_emails = {}
local mail_targets = {}
meta.mail_from = rule.mail_from or settings.mail_from meta.mail_from = rule.mail_from or settings.mail_from
local mail_targets = rule.mail_to or settings.mail_to local mail_rcpt = rule.mail_to or settings.mail_to
if type(mail_targets) ~= 'table' then if type(mail_rcpt) ~= 'table' then
table.insert(display_emails, string.format('<%s>', mail_targets)) table.insert(display_emails, string.format('<%s>', mail_rcpt))
mail_targets = {[mail_targets] = true} table.insert(mail_targets, mail_rcpt)
else else
for _, e in ipairs(mail_targets) do for _, e in ipairs(mail_rcpt) do
table.insert(display_emails, string.format('<%s>', e)) table.insert(display_emails, string.format('<%s>', e))
table.insert(mail_targets, mail_rcpt)
end end
end end
if rule.email_alert_sender then if rule.email_alert_sender then
local x = task:get_from('smtp') local x = task:get_from('smtp')
if x and string.len(x[1].addr) > 0 then if x and string.len(x[1].addr) > 0 then
mail_targets[x] = true table.insert(mail_targets, x)
table.insert(display_emails, string.format('<%s>', x[1].addr)) table.insert(display_emails, string.format('<%s>', x[1].addr))
end end
end end
if rule.email_alert_user then if rule.email_alert_user then
local x = task:get_user() local x = task:get_user()
if x then if x then
mail_targets[x] = true table.insert(mail_targets, x)
table.insert(display_emails, string.format('<%s>', x)) table.insert(display_emails, string.format('<%s>', x))
end end
end end
@ -179,7 +195,7 @@ local formatters = {
if x then if x then
for _, e in ipairs(x) do for _, e in ipairs(x) do
if string.len(e.addr) > 0 then if string.len(e.addr) > 0 then
mail_targets[e.addr] = true table.insert(mail_targets, e.addr)
table.insert(display_emails, string.format('<%s>', e.addr)) table.insert(display_emails, string.format('<%s>', e.addr))
end end
end end
@ -292,129 +308,23 @@ local pushers = {
}) })
end, end,
send_mail = function(task, formatted, rule, extra) send_mail = function(task, formatted, rule, extra)
local function mail_cb(err, data, conn) local lua_smtp = require "lua_smtp"
local function no_error(merr, mdata, wantcode) local function sendmail_cb(ret, err)
wantcode = wantcode or '2' if not ret then
if merr then rspamd_logger.errx(task, 'SMTP export error: %s', err)
rspamd_logger.errx(task, 'got error in tcp callback: %s', merr) maybe_defer(task, rule)
if conn then
conn:close()
end
maybe_defer(task, rule)
return false
end
if mdata then
if type(mdata) ~= 'string' then
mdata = tostring(mdata)
end
if string.sub(mdata, 1, 1) ~= wantcode then
rspamd_logger.errx(task, 'got bad smtp response: %s', mdata)
if conn then
conn:close()
end
maybe_defer(task, rule)
return false
end
else
rspamd_logger.errx(task, 'no data')
if conn then
conn:close()
end
maybe_defer(task, rule)
return false
end
return true
end
local function all_done_cb(merr, mdata)
if conn then
conn:close()
end
return true
end
local function quit_done_cb(merr, mdata)
conn:add_read(all_done_cb, '\r\n')
end
local function quit_cb(merr, mdata)
if no_error(merr, mdata) then
conn:add_write(quit_done_cb, 'QUIT\r\n')
end
end
local function pre_quit_cb(merr, mdata)
if no_error(merr, '2') then
conn:add_read(quit_cb, '\r\n')
end
end
local function data_done_cb(merr, mdata)
if no_error(merr, mdata, '3') then
conn:add_write(pre_quit_cb, {formatted, '\r\n.\r\n'})
end
end
local function data_cb(merr, mdata)
if no_error(merr, '2') then
conn:add_read(data_done_cb, '\r\n')
end
end
local from_done_cb
local function rcpt_done_cb(merr, mdata)
if no_error(merr, mdata) then
local k = next(extra.mail_targets)
if not k then
conn:add_write(data_cb, 'DATA\r\n')
else
from_done_cb('2', '2')
end
end
end
local function rcpt_cb(merr, mdata)
if no_error(merr, '2') then
conn:add_read(rcpt_done_cb, '\r\n')
end
end
from_done_cb = function(merr, mdata)
local k
if extra then
k = next(extra.mail_targets)
else
extra = {mail_targets = {}}
if type(rule.mail_to) == 'string' then
extra = {mail_targets = {}}
k = rule.mail_to
elseif type(rule.mail_to) == 'table' then
for _, r in ipairs(rule.mail_to) do
extra.mail_targets[r] = true
end
k = next(extra.mail_targets)
end
end
extra.mail_targets[k] = nil
conn:add_write(rcpt_cb, {'RCPT TO: <', k, '>\r\n'})
end
local function from_cb(merr, mdata)
if no_error(merr, '2') then
conn:add_read(from_done_cb, '\r\n')
end
end
local function hello_done_cb(merr, mdata)
if no_error(merr, mdata) then
conn:add_write(from_cb, {'MAIL FROM: <', rule.mail_from or settings.mail_from, '>\r\n'})
end
end
local function hello_cb(merr)
if no_error(merr, '2') then
conn:add_read(hello_done_cb, '\r\n')
end
end
if no_error(err, data) then
conn:add_write(hello_cb, {'HELO ', rule.helo or settings.helo, '\r\n'})
end end
end end
rspamd_tcp.request({
lua_smtp.sendmail({
task = task, task = task,
callback = mail_cb,
stop_pattern = '\r\n',
host = rule.smtp, host = rule.smtp,
port = rule.smtp_port or settings.smtp_port or 25, port = rule.smtp_port or settings.smtp_port or 25,
}) from = rule.mail_from or settings.mail_from,
recipients = extra.mail_targets or rule.mail_to or settings.mail_to,
helo = rule.helo or settings.helo,
timeout = rule.timeout or settings.timeout,
}, formatted, sendmail_cb)
end, end,
} }
@ -714,9 +624,9 @@ end
for k, r in pairs(settings.rules) do for k, r in pairs(settings.rules) do
rspamd_config:register_symbol({ rspamd_config:register_symbol({
name = 'EXPORT_METADATA_' .. k, name = 'EXPORT_METADATA_' .. k,
type = 'postfilter,idempotent', type = 'idempotent',
callback = gen_exporter(r), callback = gen_exporter(r),
priority = 10, priority = 10,
flags = 'empty', flags = 'empty,explicit_disable,ignore_passthrough',
}) })
end end