diff options
author | Andrew Lewis <nerf@judo.za.org> | 2023-10-24 13:53:03 +0200 |
---|---|---|
committer | Andrew Lewis <nerf@judo.za.org> | 2023-10-24 13:53:03 +0200 |
commit | 06618f8a52242c8678eed659b56cebb23a34ed38 (patch) | |
tree | 2d0c1a26d5a053608e3421f45f64203dcd682d3c | |
parent | fea6bf4c35ae7fd40c9d61edc2283d335347d998 (diff) | |
download | rspamd-06618f8a52242c8678eed659b56cebb23a34ed38.tar.gz rspamd-06618f8a52242c8678eed659b56cebb23a34ed38.zip |
[Feature] rbl: support checking returncodes by regex
-rw-r--r-- | lualib/plugins/rbl.lua | 2 | ||||
-rw-r--r-- | src/plugins/lua/rbl.lua | 13 | ||||
-rw-r--r-- | test/functional/configs/merged-override.conf | 10 |
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 { |