Browse Source

[Minor] Allow lua maps to process opaque texts

tags/2.4
Vsevolod Stakhov 4 years ago
parent
commit
b0cf71db43
2 changed files with 27 additions and 6 deletions
  1. 18
    3
      src/lua/lua_map.c
  2. 9
    3
      src/plugins/lua/settings.lua

+ 18
- 3
src/lua/lua_map.c View File

@@ -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,

+ 9
- 3
src/plugins/lua/settings.lua View File

@@ -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

Loading…
Cancel
Save