]> source.dussan.org Git - rspamd.git/commitdiff
fix: redis schema parsing 4562/head
authorSimon Hauser <simon.hauser@helsinki-systems.de>
Fri, 4 Aug 2023 14:12:01 +0000 (16:12 +0200)
committerSimon Hauser <simon.hauser@helsinki-systems.de>
Fri, 4 Aug 2023 14:30:05 +0000 (16:30 +0200)
lualib/lua_redis.lua
lualib/lua_util.lua
src/plugins/lua/bimi.lua
src/plugins/lua/history_redis.lua
src/plugins/lua/reputation.lua

index 2a43a915c3ba16902f5a1109087027559f08d4a0..47da2989963cb442ca6fcdc0b256790d766f716d 100644 (file)
@@ -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
index c2bdf40a9ace2aab2059dcf455de73280b4e84ce..289e2ed3a493828fa3d831190600a1f7860d32c6 100644 (file)
@@ -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
index bcf5a823dc04ebf77c4dafc7abf16f993e046c6b..e90a4e3b917384e2ef4ecc42e82cdcf585f6ee49 100644 (file)
@@ -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
\ No newline at end of file
+end
index d4ee71cd1eb93048da9a2999e727ef2ec9d4b73f..cfedfeac336c187c3ef85beb4f557b88a7b85c11 100644 (file)
@@ -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
index 19e7085efee37b2d1b13a7994efd808bcdca7d31..e0530a42eec3d81aa02f6675aa1ee9cc1e577141 100644 (file)
@@ -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,