diff options
author | Vsevolod Stakhov <vsevolod@rspamd.com> | 2022-08-14 23:55:40 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rspamd.com> | 2022-08-14 23:55:40 +0100 |
commit | 5aac570c5680ccfdd550f4ef8c0f7218b7fe698a (patch) | |
tree | 944dd74fcf6a65227e35255c428387bb33bafb32 /src/lua | |
parent | c256285b71ca1ce9fed556992d301026f8c40a6f (diff) | |
download | rspamd-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.c | 43 |
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); + } } } } |