From b0cf71db435fa0e010b1cc372f6b7ef834d7bb22 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 22 Feb 2020 09:59:43 +0000 Subject: [PATCH] [Minor] Allow lua maps to process opaque texts --- src/lua/lua_map.c | 21 ++++++++++++++++++--- src/plugins/lua/settings.lua | 12 +++++++++--- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/lua/lua_map.c b/src/lua/lua_map.c index 087478ccc..b279bacbd 100644 --- a/src/lua/lua_map.c +++ b/src/lua/lua_map.c @@ -129,6 +129,7 @@ static const struct luaL_reg maplib_m[] = { struct lua_map_callback_data { lua_State *L; gint ref; + gboolean opaque; rspamd_fstring_t *data; struct rspamd_lua_map *lua_map; }; @@ -442,7 +443,19 @@ lua_map_fin (struct map_cb_data *data, void **target) } else if (cbdata->data != NULL && cbdata->data->len != 0) { lua_rawgeti (cbdata->L, LUA_REGISTRYINDEX, cbdata->ref); - lua_pushlstring (cbdata->L, cbdata->data->str, cbdata->data->len); + + if (cbdata->opaque) { + lua_pushlstring (cbdata->L, cbdata->data->str, cbdata->data->len); + } + else { + struct rspamd_lua_text *t; + + t = lua_newuserdata (cbdata->L, sizeof (*t)); + t->flags = 0; + t->len = cbdata->data->len; + t->start = cbdata->data->str; + } + pmap = lua_newuserdata (cbdata->L, sizeof (void *)); *pmap = cbdata->lua_map; rspamd_lua_setclass (cbdata->L, "rspamd{map}", -1); @@ -493,14 +506,15 @@ lua_config_add_map (lua_State *L) struct lua_map_callback_data *cbdata; struct rspamd_lua_map *map, **pmap; struct rspamd_map *m; + gboolean opaque_data = FALSE; int cbidx = -1, ret; GError *err = NULL; if (cfg) { if (!rspamd_lua_parse_table_arguments (L, 2, &err, RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT, - "*url=O;description=S;callback=F;type=S", - &map_obj, &description, &cbidx, &type)) { + "*url=O;description=S;callback=F;type=S;opaque_data=B", + &map_obj, &description, &cbidx, &type, &opaque_data)) { ret = luaL_error (L, "invalid table arguments: %s", err->message); g_error_free (err); if (map_obj) { @@ -529,6 +543,7 @@ lua_config_add_map (lua_State *L) cbdata->data = NULL; cbdata->lua_map = map; cbdata->ref = cbidx; + cbdata->opaque = opaque_data; if ((m = rspamd_map_add_from_ucl (cfg, map_obj, description, lua_map_read, diff --git a/src/plugins/lua/settings.lua b/src/plugins/lua/settings.lua index bc91bf4c8..7427e779d 100644 --- a/src/plugins/lua/settings.lua +++ b/src/plugins/lua/settings.lua @@ -1036,9 +1036,9 @@ end -- Parse settings map from the ucl line local settings_map_pool -local function process_settings_map(string) +local function process_settings_map(map_text) local parser = ucl.parser() - local res,err = parser:parse_string(string) + local res,err = parser:parse_string(map_text) if not res then rspamd_logger.warnx(rspamd_config, 'cannot parse settings map: ' .. err) else @@ -1162,7 +1162,13 @@ local set_section = rspamd_config:get_all_opt("settings") if set_section and set_section[1] and type(set_section[1]) == "string" then -- Just a map of ucl - if not rspamd_config:add_map(set_section[1], "settings map", process_settings_map) then + local map_attrs = { + url = set_section[1], + description = "settings map", + callback = process_settings_map, + opaque_data = true + } + if not rspamd_config:add_map(map_attrs) then rspamd_logger.errx(rspamd_config, 'cannot load settings from %1', set_section) end elseif set_section and type(set_section) == "table" then -- 2.39.5