aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Lewis <nerf@judo.za.org>2023-10-24 13:53:03 +0200
committerAndrew Lewis <nerf@judo.za.org>2023-10-24 13:53:03 +0200
commit06618f8a52242c8678eed659b56cebb23a34ed38 (patch)
tree2d0c1a26d5a053608e3421f45f64203dcd682d3c
parentfea6bf4c35ae7fd40c9d61edc2283d335347d998 (diff)
downloadrspamd-06618f8a52242c8678eed659b56cebb23a34ed38.tar.gz
rspamd-06618f8a52242c8678eed659b56cebb23a34ed38.zip
[Feature] rbl: support checking returncodes by regex
-rw-r--r--lualib/plugins/rbl.lua2
-rw-r--r--src/plugins/lua/rbl.lua13
-rw-r--r--test/functional/configs/merged-override.conf10
3 files changed, 20 insertions, 5 deletions
diff --git a/lualib/plugins/rbl.lua b/lualib/plugins/rbl.lua
index 1a25c1ed3..bc5fbe278 100644
--- a/lualib/plugins/rbl.lua
+++ b/lualib/plugins/rbl.lua
@@ -107,7 +107,7 @@ local rule_schema_tbl = {
ipv6 = ts.boolean:is_optional(),
is_whitelist = ts.boolean:is_optional(),
local_exclude_ip_map = ts.string:is_optional(),
- matcher = ts.one_of { "equality", "luapattern" }:is_optional(),
+ matcher = ts.one_of { "equality", "luapattern", "regexp" }:is_optional(),
monitored_address = ts.string:is_optional(),
no_ip = ts.boolean:is_optional(),
process_script = ts.string:is_optional(),
diff --git a/src/plugins/lua/rbl.lua b/src/plugins/lua/rbl.lua
index b6467c103..a36131b1b 100644
--- a/src/plugins/lua/rbl.lua
+++ b/src/plugins/lua/rbl.lua
@@ -21,6 +21,7 @@ end
local hash = require 'rspamd_cryptobox_hash'
local rspamd_logger = require 'rspamd_logger'
+local rspamd_regexp = require 'rspamd_regexp'
local rspamd_util = require 'rspamd_util'
local rspamd_ip = require "rspamd_ip"
local fun = require 'fun'
@@ -225,6 +226,18 @@ matchers.luapattern = function(to_match, pattern)
return string.find(to_match, '^' .. pattern .. '$') and true or false
end
+matchers.regexp = function(to_match, pattern)
+ local re = rspamd_regexp.get_cached(pattern)
+ if not re then
+ re = rspamd_regexp.create_cached(pattern)
+ if not re then
+ rspamd_logger.errx('regexp did not compile: %s', pattern)
+ return false
+ end
+ end
+ return re:match(to_match)
+end
+
local function rbl_dns_process(task, rbl, to_resolve, results, err, resolve_table_elt, match)
local function make_option(ip, label)
if ip then
diff --git a/test/functional/configs/merged-override.conf b/test/functional/configs/merged-override.conf
index 28d554b83..0c9b7a3e2 100644
--- a/test/functional/configs/merged-override.conf
+++ b/test/functional/configs/merged-override.conf
@@ -269,9 +269,10 @@ rbl {
from = 'FAKE_RBL',
}
unknown = true;
+ matcher = "regexp";
returncodes = {
- "CODE_2" = "127.0.0.2";
- "CODE_3" = "127.0.0.3";
+ "CODE_2" = '^127\.0\.0\.2$';
+ "CODE_3" = '^127\.0\.0\.3$';
}
}
fake_whitelist {
@@ -283,9 +284,10 @@ rbl {
rbl = "fake.wl";
symbol = "FAKE_WL_RBL_UNKNOWN";
unknown = true;
+ #matcher = "luapattern";
returncodes = {
- "FAKE_WL_RBL_CODE_2" = "127.0.0.2";
- "FAKE_WL_RBL_CODE_3" = "127.0.0.3";
+ "FAKE_WL_RBL_CODE_2" = "127%.0%.0%.2";
+ "FAKE_WL_RBL_CODE_3" = "127%.0%.0%.3";
}
}
RSPAMD_EMAILBL {