aboutsummaryrefslogtreecommitdiffstats
path: root/src/lua
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rspamd.com>2022-08-14 23:55:40 +0100
committerVsevolod Stakhov <vsevolod@rspamd.com>2022-08-14 23:55:40 +0100
commit5aac570c5680ccfdd550f4ef8c0f7218b7fe698a (patch)
tree944dd74fcf6a65227e35255c428387bb33bafb32 /src/lua
parentc256285b71ca1ce9fed556992d301026f8c40a6f (diff)
downloadrspamd-5aac570c5680ccfdd550f4ef8c0f7218b7fe698a.tar.gz
rspamd-5aac570c5680ccfdd550f4ef8c0f7218b7fe698a.zip
[Project] Allow `=` separated augmentations to be treated as kv pairs
Diffstat (limited to 'src/lua')
-rw-r--r--src/lua/lua_config.c43
1 files 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);
+ }
}
}
}