Browse Source

fix: redis schema parsing

pull/4562/head
Simon Hauser 2 years ago
parent
commit
c04808c938
No known key found for this signature in database GPG Key ID: B2E16EBB243E757F
  1. 60
      lualib/lua_redis.lua
  2. 13
      lualib/lua_util.lua
  3. 6
      src/plugins/lua/bimi.lua
  4. 4
      src/plugins/lua/history_redis.lua
  5. 4
      src/plugins/lua/reputation.lua

60
lualib/lua_redis.lua

@ -39,25 +39,39 @@ local common_schema = ts.shape {
sentinel_password = ts.string:is_optional(),
}
local config_schema = -- Allow separate read/write servers to allow usage in the `extra_fields`
ts.shape({
local read_schema = lutil.table_merge({
read_servers = ts.string + ts.array_of(ts.string),
}, { extra_fields = common_schema }) +
ts.shape({
write_servers = ts.string + ts.array_of(ts.string),
}, { extra_fields = common_schema }) +
ts.shape({
read_servers = ts.string + ts.array_of(ts.string),
write_servers = ts.string + ts.array_of(ts.string),
}, { extra_fields = common_schema }) +
ts.shape({
servers = ts.string + ts.array_of(ts.string),
}, { extra_fields = common_schema }) +
ts.shape({
server = ts.string + ts.array_of(ts.string),
}, { extra_fields = common_schema })
exports.config_schema = config_schema
}, common_schema)
local write_schema = lutil.table_merge({
write_servers = ts.string + ts.array_of(ts.string),
}, common_schema)
local rw_schema = lutil.table_merge({
read_servers = ts.string + ts.array_of(ts.string),
write_servers = ts.string + ts.array_of(ts.string),
}, common_schema)
local servers_schema = lutil.table_merge({
servers = ts.string + ts.array_of(ts.string),
}, common_schema)
local server_schema = lutil.table_merge({
server = ts.string + ts.array_of(ts.string),
}, common_schema)
local generate_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)),
}
end
exports.generate_schema = generate_schema
local function redis_query_sentinel(ev_base, params, initialised)
local function flatten_redis_table(tbl)
@ -1122,20 +1136,14 @@ local function script_set_loaded(script)
end
local function prepare_redis_call(script)
local function merge_tables(t1, t2)
for k, v in pairs(t2) do
t1[k] = v
end
end
local servers = {}
local options = {}
if script.redis_params.read_servers then
merge_tables(servers, script.redis_params.read_servers:all_upstreams())
lutil.table_merge(servers, script.redis_params.read_servers:all_upstreams())
end
if script.redis_params.write_servers then
merge_tables(servers, script.redis_params.write_servers:all_upstreams())
lutil.table_merge(servers, script.redis_params.write_servers:all_upstreams())
end
-- Call load script on each server, set loaded flag

13
lualib/lua_util.lua

@ -618,6 +618,19 @@ end
exports.table_cmp = table_cmp
--[[[
-- @function lua_util.table_merge(t1, t2)
-- Merge two tables
--]]
local function table_merge(t1, t2)
for k, v in pairs(t2) do
t1[k] = v
end
return t1
end
exports.table_merge = table_merge
--[[[
-- @function lua_util.table_cmp(task, name, value, stop_chars)
-- Performs header folding

6
src/plugins/lua/bimi.lua

@ -34,7 +34,7 @@ local settings = {
}
local redis_params
local settings_schema = ts.shape({
local settings_schema = lua_redis.generate_schema({
helper_url = ts.string,
helper_timeout = ts.number + ts.string / lua_util.parse_time_interval,
helper_sync = ts.boolean,
@ -42,7 +42,7 @@ local settings_schema = ts.shape({
redis_min_expiry = ts.number + ts.string / lua_util.parse_time_interval,
redis_prefix = ts.string,
enabled = ts.boolean:is_optional(),
}, {extra_fields = lua_redis.config_schema})
})
local function check_dmarc_policy(task)
local dmarc_sym = task:get_symbol('DMARC_POLICY_ALLOW')
@ -378,4 +378,4 @@ if redis_params then
rspamd_config:register_dependency('BIMI_CHECK', 'DMARC_CHECK')
else
lua_util.disable_module(N, "redis")
end
end

4
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 = ts.shape({
local settings_schema = lua_redis.generate_schema({
key_prefix = ts.string,
expire = (ts.number + ts.string / lua_util.parse_time_interval):is_optional(),
nrows = ts.number,
@ -74,7 +74,7 @@ local settings_schema = ts.shape({
subject_privacy_alg = ts.string:is_optional(),
subject_privacy_prefix = ts.string:is_optional(),
subject_privacy_length = ts.number:is_optional(),
}, {extra_fields = lua_redis.config_schema})
})
local function process_addr(addr)
if addr then

4
src/plugins/lua/reputation.lua

@ -1064,7 +1064,7 @@ end
--]]
local backends = {
redis = {
schema = ts.shape({
schema = lua_redis.generate_schema({
prefix = ts.string,
expiry = ts.number + ts.string / lua_util.parse_time_interval,
buckets = ts.array_of(ts.shape{
@ -1072,7 +1072,7 @@ local backends = {
name = ts.string,
mult = ts.number + ts.string / tonumber
}),
}, {extra_fields = lua_redis.config_schema}),
}),
config = {
expiry = default_expiry,
prefix = default_prefix,

Loading…
Cancel
Save