commit 5aac570: [Project] Allow `=` separated augmentations to be treated as kv pairs

Vsevolod Stakhov vsevolod at rspamd.com
Sun Aug 14 23:00:03 UTC 2022


Author: Vsevolod Stakhov
Date: 2022-08-14 23:55:40 +0100
URL: https://github.com/rspamd/rspamd/commit/5aac570c5680ccfdd550f4ef8c0f7218b7fe698a (HEAD -> master)

[Project] Allow `=` separated augmentations to be treated as kv pairs

---
 src/lua/lua_config.c | 43 +++++++++++++++++++++++++++++++++++++------
 1 file changed, 37 insertions(+), 6 deletions(-)

diff --git a/src/lua/lua_config.c b/src/lua/lua_config.c
index 948aa165f..de4388746 100644
--- a/src/lua/lua_config.c
+++ b/src/lua/lua_config.c
@@ -2086,14 +2086,45 @@ lua_config_register_symbol (lua_State * L)
 			if (lua_type (L, -1) == LUA_TTABLE) {
 				int tbl_idx = lua_gettop(L);
 				for (lua_pushnil(L); lua_next(L, tbl_idx); lua_pop (L, 1)) {
-					const char *augmentation = lua_tostring(L, -1);
+					size_t len;
+					const char *augmentation = lua_tolstring(L, -1, &len), *eqsign_pos;
 
-					if (!rspamd_symcache_add_symbol_augmentation(cfg->cache, ret,
-							augmentation, NULL)) {
-						lua_settop(L, prev_top);
+					/* Find `=` symbol and use it as a separator */
+					eqsign_pos = memchr(augmentation, '=', len);
+					if (eqsign_pos != NULL && eqsign_pos + 1 < augmentation + len) {
+						rspamd_ftok_t tok;
 
-						return luaL_error (L, "unknown augmentation %s in symbol %s",
-								augmentation, name);
+						tok.begin = augmentation;
+						tok.len = eqsign_pos - augmentation;
+						char *augentation_name = rspamd_ftokdup(&tok);
+
+						tok.begin = eqsign_pos + 1;
+						tok.len = (augmentation + len) - tok.begin;
+
+						char *augmentation_value = rspamd_ftokdup(&tok);
+
+						if (!rspamd_symcache_add_symbol_augmentation(cfg->cache, ret,
+								augentation_name, augmentation_value)) {
+							lua_settop(L, prev_top);
+							g_free(augmentation_value);
+							g_free(augentation_name);
+
+							return luaL_error(L, "unknown or invalid augmentation %s in symbol %s",
+									augmentation, name);
+						}
+
+						g_free(augmentation_value);
+						g_free(augentation_name);
+					}
+					else {
+						/* Just a value */
+						if (!rspamd_symcache_add_symbol_augmentation(cfg->cache, ret,
+								augmentation, NULL)) {
+							lua_settop(L, prev_top);
+
+							return luaL_error(L, "unknown augmentation %s in symbol %s",
+									augmentation, name);
+						}
 					}
 				}
 			}


More information about the Commits mailing list