aboutsummaryrefslogtreecommitdiffstats
path: root/src/libmime
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-03-24 12:44:53 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-03-24 12:44:53 +0000
commite62051bb31def15690dbd83765865ae9810da4a7 (patch)
treed4020b5b93406cb74c13a64c903b74c344fc7a60 /src/libmime
parent8bb02c7ed562f715b5760c71932dc4f9ac2620e2 (diff)
downloadrspamd-e62051bb31def15690dbd83765865ae9810da4a7.tar.gz
rspamd-e62051bb31def15690dbd83765865ae9810da4a7.zip
Allow global lua functions in mime_regexp.
Diffstat (limited to 'src/libmime')
-rw-r--r--src/libmime/mime_expressions.c29
1 files changed, 29 insertions, 0 deletions
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);