Skip to content

Commit

Permalink
[Feature] external_relay: add ip_map strategy
Browse files Browse the repository at this point in the history
  • Loading branch information
moesoha committed Jul 11, 2023
1 parent da4b2e9 commit 3e81b1d
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 0 deletions.
42 changes: 42 additions & 0 deletions src/plugins/lua/external_relay.lua
Expand Up @@ -61,6 +61,12 @@ local config_schema = ts.shape{
strategy = 'hostname_map',
symbol = ts.string:is_optional(),
},
ts.shape{
ip_map = lua_maps.map_schema,
priority = ts.number:is_optional(),
strategy = 'ip_map',
symbol = ts.string:is_optional(),
},
}
),
}
Expand Down Expand Up @@ -182,6 +188,42 @@ strategies.hostname_map = function(rule)
end
end

strategies.ip_map = function(rule)
local ip_map = lua_maps.map_add_from_ucl(rule.ip_map, 'radix', 'external relay IPs')
if not ip_map then
rspamd_logger.errx(rspamd_config, "couldn't add map %s; won't register symbol %s",
rule.ip_map, rule.symbol)
return
end

return function(task)
local from_ip = task:get_from_ip()
if not (from_ip and from_ip:is_valid()) then
lua_util.debugm(N, task, 'sender\'s IP is missing')
return
end

if not ip_map:get_key(from_ip) then
lua_util.debugm(N, task, 'sender\'s ip (%s) is not a relay', from_ip)
return
end

local rcvd_hdrs = task:get_received_headers()
local num_rcvd = #rcvd_hdrs
-- Try find sending IP in Received headers
for i, rcvd in ipairs(rcvd_hdrs) do
if rcvd.real_ip then
local rcvd_ip = rcvd.real_ip
if rcvd_ip:is_valid() and (not ip_map:get_key(rcvd_ip) or i == num_rcvd) then
return set_from_rcvd(task, rcvd)
end
end
end

rspamd_logger.errx(task, 'found nothing useful in Received headers')
end
end

strategies['local'] = function(rule)
return function(task)
local from_ip = task:get_from_ip()
Expand Down
7 changes: 7 additions & 0 deletions test/functional/cases/380_external_relay.robot
Expand Up @@ -33,6 +33,13 @@ EXTERNAL RELAY HOSTNAME MAP
Expect Symbol With Exact Options EXTERNAL_RELAY_TEST
... IP=192.0.2.1 HOSTNAME=mail.example.org HELO=mail.example.org

EXTERNAL RELAY IP MAP
Scan File ${RSPAMD_TESTDIR}/messages/received7.eml
... Settings={symbols_enabled [EXTERNAL_RELAY_TEST, EXTERNAL_RELAY_IP_MAP]}
... IP=198.51.100.1
Expect Symbol With Exact Options EXTERNAL_RELAY_TEST
... IP=4.31.198.44 HOSTNAME=foobar.example.org HELO=foobar.example.org

EXTERNAL RELAY LOCAL
Scan File ${RSPAMD_TESTDIR}/messages/ham.eml
... Settings={symbols_enabled [EXTERNAL_RELAY_TEST, EXTERNAL_RELAY_LOCAL]}
Expand Down
2 changes: 2 additions & 0 deletions test/functional/configs/maps/external_relay.ip_map
@@ -0,0 +1,2 @@
2001:db8::/32
198.51.100.0/24
4 changes: 4 additions & 0 deletions test/functional/configs/merged-local.conf
Expand Up @@ -48,6 +48,10 @@ external_relay {
hostname_map = "{= env.TESTDIR =}/configs/maps/external_relay.hostname_map";
strategy = "hostname_map";
}
EXTERNAL_RELAY_IP_MAP {
ip_map = "{= env.TESTDIR =}/configs/maps/external_relay.ip_map";
strategy = "ip_map";
}
EXTERNAL_RELAY_LOCAL {
strategy = "local";
}
Expand Down
17 changes: 17 additions & 0 deletions test/functional/messages/received7.eml
@@ -0,0 +1,17 @@
Received: from localhost (localhost [2001:db8:114::514])
by ietfa.amsl.com (Postfix) with ESMTP id 00E7712024B
for <cfrg@ietfa.amsl.com>; Tue, 7 May 2019 14:01:07 -0700 (PDT)
Received: from mail.example.org ([198.51.100.233])
by lame.example.net (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024)
with ESMTP id k8UsBTUjeiTe for <cfrg@ietfa.amsl.com>;
Tue, 7 May 2019 14:01:04 -0700 (PDT)
Received: from foobar.example.org ([4.31.198.44])
by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024)
with ESMTP id k8UsBTUjeiTe for <cfrg@ietfa.amsl.com>;
Tue, 7 May 2019 14:01:04 -0700 (PDT)
Received: from mail.example.org ([198.51.100.2])
by foobar.example.org (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024)
with ESMTP id k8UsBTUjeiTe for <cfrg@ietfa.amsl.com>;
Tue, 7 May 2019 14:01:04 -0700 (PDT)

haha

0 comments on commit 3e81b1d

Please sign in to comment.