]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Allow lua maps to process opaque texts
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 22 Feb 2020 09:59:43 +0000 (09:59 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 22 Feb 2020 09:59:43 +0000 (09:59 +0000)
src/lua/lua_map.c
src/plugins/lua/settings.lua

index 087478ccc5c8fde937ea06ed5d9e9a99f4254074..b279bacbda2bbca446359fa7debfca7188e779c9 100644 (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,
index bc91bf4c8e7fdd0b0786d7a6a671e38243cb45ce..7427e779da9c5db8e64dc90f7cfdde220de0169a 100644 (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