[Rspamd] Temp. pre-add proposed upstream change in metadata exporter
parent
efc6f214d1
commit
d85241f518
|
@ -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"]
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue