From 0e3bc7a86a600b88c57207a0a4442cbe9840d081 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 7 Aug 2023 14:52:12 +0100 Subject: [PATCH] [Fix] Fix lua schema enrichment logic for Redis params --- lualib/lua_redis.lua | 42 +++++++++++++++---------------- src/plugins/lua/bimi.lua | 2 +- src/plugins/lua/history_redis.lua | 2 +- src/plugins/lua/reputation.lua | 11 ++++---- 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/lualib/lua_redis.lua b/lualib/lua_redis.lua index 47da29899..6d2a9e4f1 100644 --- a/lualib/lua_redis.lua +++ b/lualib/lua_redis.lua @@ -24,19 +24,19 @@ local exports = {} local E = {} local N = "lua_redis" -local common_schema = ts.shape { - timeout = (ts.number + ts.string / lutil.parse_time_interval):is_optional(), - db = ts.string:is_optional(), - database = ts.string:is_optional(), - dbname = ts.string:is_optional(), - prefix = ts.string:is_optional(), - password = ts.string:is_optional(), - expand_keys = ts.boolean:is_optional(), - sentinels = (ts.string + ts.array_of(ts.string)):is_optional(), - sentinel_watch_time = (ts.number + ts.string / lutil.parse_time_interval):is_optional(), - sentinel_masters_pattern = ts.string:is_optional(), - sentinel_master_maxerrors = (ts.number + ts.string / tonumber):is_optional(), - sentinel_password = ts.string:is_optional(), +local common_schema = { + timeout = (ts.number + ts.string / lutil.parse_time_interval):is_optional():describe("Connection timeout"), + db = ts.string:is_optional():describe("Database number"), + database = ts.string:is_optional():describe("Database number"), + dbname = ts.string:is_optional():describe("Database number"), + prefix = ts.string:is_optional():describe("Key prefix"), + password = ts.string:is_optional():describe("Password"), + expand_keys = ts.boolean:is_optional():describe("Expand keys"), + sentinels = (ts.string + ts.array_of(ts.string)):is_optional():describe("Sentinel servers"), + sentinel_watch_time = (ts.number + ts.string / lutil.parse_time_interval):is_optional():describe("Sentinel watch time"), + sentinel_masters_pattern = ts.string:is_optional():describe("Sentinel masters pattern"), + sentinel_master_maxerrors = (ts.number + ts.string / tonumber):is_optional():describe("Sentinel master max errors"), + sentinel_password = ts.string:is_optional():describe("Sentinel password"), } local read_schema = lutil.table_merge({ @@ -60,18 +60,18 @@ local server_schema = lutil.table_merge({ server = ts.string + ts.array_of(ts.string), }, common_schema) -local generate_schema = function(external) +local enrich_schema = function(external) return ts.one_of { - ts.shape(external), - ts.shape(lutil.table_merge(read_schema, external)), - ts.shape(lutil.table_merge(write_schema, external)), - ts.shape(lutil.table_merge(rw_schema, external)), - ts.shape(lutil.table_merge(servers_schema, external)), - ts.shape(lutil.table_merge(server_schema, external)), + ts.shape(external), -- no specific redis parameters + ts.shape(lutil.table_merge(read_schema, external)), -- read_servers specified + ts.shape(lutil.table_merge(write_schema, external)), -- write_servers specified + ts.shape(lutil.table_merge(rw_schema, external)), -- both read and write servers defined + ts.shape(lutil.table_merge(servers_schema, external)), -- just servers for both ops + ts.shape(lutil.table_merge(server_schema, external)), -- legacy `server` attribute } end -exports.generate_schema = generate_schema +exports.enrich_schema = enrich_schema local function redis_query_sentinel(ev_base, params, initialised) local function flatten_redis_table(tbl) diff --git a/src/plugins/lua/bimi.lua b/src/plugins/lua/bimi.lua index 5dbb83623..914484543 100644 --- a/src/plugins/lua/bimi.lua +++ b/src/plugins/lua/bimi.lua @@ -34,7 +34,7 @@ local settings = { } local redis_params -local settings_schema = lua_redis.generate_schema({ +local settings_schema = lua_redis.enrich_schema({ helper_url = ts.string, helper_timeout = ts.number + ts.string / lua_util.parse_time_interval, helper_sync = ts.boolean, diff --git a/src/plugins/lua/history_redis.lua b/src/plugins/lua/history_redis.lua index 9cbe7caf7..d0aa5aec7 100644 --- a/src/plugins/lua/history_redis.lua +++ b/src/plugins/lua/history_redis.lua @@ -65,7 +65,7 @@ local settings = { subject_privacy_length = 16, -- cut the length of the hash } -local settings_schema = lua_redis.generate_schema({ +local settings_schema = lua_redis.enrich_schema({ key_prefix = ts.string, expire = (ts.number + ts.string / lua_util.parse_time_interval):is_optional(), nrows = ts.number, diff --git a/src/plugins/lua/reputation.lua b/src/plugins/lua/reputation.lua index fc7001eb1..a3af26c91 100644 --- a/src/plugins/lua/reputation.lua +++ b/src/plugins/lua/reputation.lua @@ -1089,14 +1089,14 @@ end --]] local backends = { redis = { - schema = lua_redis.generate_schema({ - prefix = ts.string, - expiry = ts.number + ts.string / lua_util.parse_time_interval, + schema = lua_redis.enrich_schema({ + prefix = ts.string:is_optional(), + expiry = (ts.number + ts.string / lua_util.parse_time_interval):is_optional(), buckets = ts.array_of(ts.shape { time = ts.number + ts.string / lua_util.parse_time_interval, name = ts.string, mult = ts.number + ts.string / tonumber - }), + }) :is_optional(), }), config = { expiry = default_expiry, @@ -1263,7 +1263,7 @@ local function parse_rule(name, tbl) rspamd_logger.errx(rspamd_config, "cannot parse whitelist map config for %s: (%s)", sel_type, rule.config.whitelist) - return + return false end end @@ -1362,6 +1362,7 @@ local function parse_rule(name, tbl) } end + return true end redis_params = lua_redis.parse_redis_server('reputation') -- 2.39.5