From e62051bb31def15690dbd83765865ae9810da4a7 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 24 Mar 2015 12:44:53 +0000 Subject: [PATCH] Allow global lua functions in mime_regexp. --- src/libmime/mime_expressions.c | 29 +++++++++++++++++++++++++++++ src/lua/lua_common.h | 5 +++++ src/lua/lua_task.c | 9 +++++++++ 3 files changed, 43 insertions(+) diff --git a/src/libmime/mime_expressions.c b/src/libmime/mime_expressions.c index 036620984..1a3179e90 100644 --- a/src/libmime/mime_expressions.c +++ b/src/libmime/mime_expressions.c @@ -617,6 +617,9 @@ set: goto err; } } + else if (type == MIME_ATOM_LUA_FUNCTION) { + mime_atom->d.lua_function = mime_atom->str; + } else { mime_atom->d.func = rspamd_mime_expr_parse_function_atom (mime_atom->str); if (mime_atom->d.func == NULL) { @@ -955,6 +958,7 @@ rspamd_mime_expr_process (gpointer input, rspamd_expression_atom_t *atom) { struct rspamd_task *task = input; struct rspamd_mime_atom *mime_atom; + lua_State *L; gint ret = 0; g_assert (task != NULL); @@ -965,6 +969,31 @@ rspamd_mime_expr_process (gpointer input, rspamd_expression_atom_t *atom) if (mime_atom->type == MIME_ATOM_REGEXP) { ret = rspamd_mime_expr_process_regexp (mime_atom->d.re, task); } + else if (mime_atom->type == MIME_ATOM_LUA_FUNCTION) { + L = task->cfg->lua_state; + lua_getglobal (L, mime_atom->d.lua_function); + rspamd_lua_task_push (L, task); + + if (lua_pcall (L, 1, 1, 0) != 0) { + msg_info ("call to %s failed: %s", + mime_atom->str, + lua_tostring (L, -1)); + } + else { + if (lua_type (L, -1) == LUA_TBOOLEAN) { + ret = lua_toboolean (L, -1); + } + else if (lua_type (L, -1) == LUA_TNUMBER) { + ret = lua_tonumber (L, 1); + } + else { + msg_err ("%s returned wrong return type: %s", + mime_atom->str, lua_typename (L, lua_type (L, -1))); + } + /* Remove result */ + lua_pop (L, 1); + } + } else { ret = rspamd_mime_expr_process_function (mime_atom->d.func, task, task->cfg->lua_state); diff --git a/src/lua/lua_common.h b/src/lua/lua_common.h index ea0947c8a..d084f2096 100644 --- a/src/lua/lua_common.h +++ b/src/lua/lua_common.h @@ -122,6 +122,11 @@ void rspamd_free_lua_locked (struct lua_locked_state *st); */ void rspamd_lua_ip_push (lua_State *L, rspamd_inet_addr_t *addr); +/** + * Push rspamd task structure to lua + */ +void rspamd_lua_task_push (lua_State *L, struct rspamd_task *task); + /** * Return lua ip structure at the specified address */ diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c index b15d3e181..703043599 100644 --- a/src/lua/lua_task.c +++ b/src/lua/lua_task.c @@ -2502,3 +2502,12 @@ luaopen_url (lua_State * L) lua_pop (L, 1); /* remove metatable from stack */ } +void +rspamd_lua_task_push (lua_State *L, struct rspamd_task *task) +{ + struct rspamd_task **ptask; + + ptask = lua_newuserdata (L, sizeof (gpointer)); + rspamd_lua_setclass (L, "rspamd{task}", -1); + *ptask = task; +} -- 2.39.5