]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix lua schema enrichment logic for Redis params
authorVsevolod Stakhov <vsevolod@rspamd.com>
Mon, 7 Aug 2023 13:52:12 +0000 (14:52 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Mon, 7 Aug 2023 13:52:12 +0000 (14:52 +0100)
lualib/lua_redis.lua
src/plugins/lua/bimi.lua
src/plugins/lua/history_redis.lua
src/plugins/lua/reputation.lua

index 47da2989963cb442ca6fcdc0b256790d766f716d..6d2a9e4f196e501678b4dd8cad87eb8f5031f770 100644 (file)
@@ -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)
index 5dbb836235d768ea12aef3f592c546ab3df4491a..9144845438030166d33606502bda90e196c01264 100644 (file)
@@ -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,
index 9cbe7caf7222a985dca9f87eb117cc4bd893cd99..d0aa5aec7990d140a0ba1ce3d57be5de7780d410 100644 (file)
@@ -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,
index fc7001eb10a8c062858e3e68490207bba0a33e25..a3af26c91c2b31f8e7ef63365d81493c3de605aa 100644 (file)
@@ -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')