aboutsummaryrefslogtreecommitdiffstats
path: root/src/lua
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2011-06-10 17:28:19 +0400
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2011-06-10 17:28:19 +0400
commit2b5a8d60da266be61d35b285bc14a8c5d71798e7 (patch)
treec0319c35813e6060d358b3f929e6b4422053caa7 /src/lua
parent8535693674a5e6d6b8a01c9fee43ef4d836c0909 (diff)
downloadrspamd-2b5a8d60da266be61d35b285bc14a8c5d71798e7.tar.gz
rspamd-2b5a8d60da266be61d35b285bc14a8c5d71798e7.zip
* Add LRU caching structure
* Add SPF records cache * Add ability to parse doubles to xmlrpc Several fixes to dns interface. Trie plugin now checks urls as well.
Diffstat (limited to 'src/lua')
-rw-r--r--src/lua/lua_http.c23
-rw-r--r--src/lua/lua_task.c16
-rw-r--r--src/lua/lua_xmlrpc.c65
3 files changed, 93 insertions, 11 deletions
diff --git a/src/lua/lua_http.c b/src/lua/lua_http.c
index 25cfa6948..89bd024bf 100644
--- a/src/lua/lua_http.c
+++ b/src/lua/lua_http.c
@@ -67,6 +67,15 @@ lua_check_task (lua_State * L)
}
static void
+lua_http_fin (void *arg)
+{
+ struct lua_http_ud *ud = arg;
+
+ rspamd_remove_dispatcher (ud->io_dispatcher);
+ close (ud->fd);
+}
+
+static void
lua_http_push_error (gint code, struct lua_http_ud *ud)
{
struct worker_task **ptask;
@@ -93,6 +102,7 @@ lua_http_push_error (gint code, struct lua_http_ud *ud)
}
ud->parser_state = 3;
+ remove_normal_event (ud->task->s, lua_http_fin, ud);
ud->task->save.saved--;
if (ud->task->save.saved == 0) {
@@ -140,6 +150,7 @@ lua_http_push_reply (f_str_t *in, struct lua_http_ud *ud)
ud->headers = NULL;
}
+ remove_normal_event (ud->task->s, lua_http_fin, ud);
ud->task->save.saved--;
if (ud->task->save.saved == 0) {
/* Call other filters */
@@ -148,7 +159,6 @@ lua_http_push_reply (f_str_t *in, struct lua_http_ud *ud)
}
}
-
/*
* Parsing utils
*/
@@ -246,8 +256,6 @@ lua_http_read_cb (f_str_t * in, void *arg)
case 2:
/* Get reply */
lua_http_push_reply (in, ud);
- rspamd_remove_dispatcher (ud->io_dispatcher);
- close (ud->fd);
return FALSE;
}
@@ -264,10 +272,13 @@ lua_http_err_cb (GError * err, void *arg)
if (ud->parser_state != 3) {
lua_http_push_error (500, ud);
}
- rspamd_remove_dispatcher (ud->io_dispatcher);
- close (ud->fd);
+ else {
+ remove_normal_event (ud->task->s, lua_http_fin, ud);
+ }
}
+
+
static void
lua_http_dns_callback (struct rspamd_dns_reply *reply, gpointer arg)
{
@@ -304,6 +315,8 @@ lua_http_dns_callback (struct rspamd_dns_reply *reply, gpointer arg)
close (ud->fd);
return;
}
+
+ register_async_event (ud->task->s, lua_http_fin, ud, FALSE);
}
/**
diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c
index 2ab56b29c..0931eb13c 100644
--- a/src/lua/lua_task.c
+++ b/src/lua/lua_task.c
@@ -57,6 +57,7 @@ LUA_FUNCTION_DEF (task, resolve_dns_txt);
LUA_FUNCTION_DEF (task, call_rspamd_function);
LUA_FUNCTION_DEF (task, get_recipients);
LUA_FUNCTION_DEF (task, get_from);
+LUA_FUNCTION_DEF (task, get_user);
LUA_FUNCTION_DEF (task, get_recipients_headers);
LUA_FUNCTION_DEF (task, get_from_headers);
LUA_FUNCTION_DEF (task, get_from_ip);
@@ -86,6 +87,7 @@ static const struct luaL_reg tasklib_m[] = {
LUA_INTERFACE_DEF (task, call_rspamd_function),
LUA_INTERFACE_DEF (task, get_recipients),
LUA_INTERFACE_DEF (task, get_from),
+ LUA_INTERFACE_DEF (task, get_user),
LUA_INTERFACE_DEF (task, get_recipients_headers),
LUA_INTERFACE_DEF (task, get_from_headers),
LUA_INTERFACE_DEF (task, get_from_ip),
@@ -833,6 +835,20 @@ lua_task_get_from (lua_State *L)
return 1;
}
+static gint
+lua_task_get_user (lua_State *L)
+{
+ struct worker_task *task = lua_check_task (L);
+
+ if (task && task->user != NULL) {
+ lua_pushstring (L, task->user);
+ return 1;
+ }
+
+ lua_pushnil (L);
+ return 1;
+}
+
/*
* Headers versions
*/
diff --git a/src/lua/lua_xmlrpc.c b/src/lua/lua_xmlrpc.c
index f0ba2d6c0..4589405cc 100644
--- a/src/lua/lua_xmlrpc.c
+++ b/src/lua/lua_xmlrpc.c
@@ -38,6 +38,7 @@ struct lua_xmlrpc_ud {
gint parser_state;
gint depth;
gint param_count;
+ gboolean got_text;
lua_State *L;
};
@@ -126,9 +127,15 @@ xmlrpc_start_element (GMarkupParseContext *context, const gchar *name, const gch
}
else if (g_ascii_strcasecmp (name, "string") == 0) {
ud->parser_state = 11;
+ ud->got_text = FALSE;
}
else if (g_ascii_strcasecmp (name, "int") == 0) {
ud->parser_state = 12;
+ ud->got_text = FALSE;
+ }
+ else if (g_ascii_strcasecmp (name, "double") == 0) {
+ ud->parser_state = 13;
+ ud->got_text = FALSE;
}
else {
/* Error state */
@@ -171,9 +178,15 @@ xmlrpc_start_element (GMarkupParseContext *context, const gchar *name, const gch
/* Primitives */
if (g_ascii_strcasecmp (name, "string") == 0) {
ud->parser_state = 11;
+ ud->got_text = FALSE;
}
else if (g_ascii_strcasecmp (name, "int") == 0) {
ud->parser_state = 12;
+ ud->got_text = FALSE;
+ }
+ else if (g_ascii_strcasecmp (name, "double") == 0) {
+ ud->parser_state = 13;
+ ud->got_text = FALSE;
}
/* Structure */
else if (g_ascii_strcasecmp (name, "struct") == 0) {
@@ -300,7 +313,15 @@ xmlrpc_end_element (GMarkupParseContext *context, const gchar *name, gpointer us
break;
case 11:
case 12:
+ case 13:
/* Parse any values */
+ /* Handle empty tags */
+ if (!ud->got_text) {
+ lua_pushnil (ud->L);
+ }
+ else {
+ ud->got_text = FALSE;
+ }
/* Primitives */
if (g_ascii_strcasecmp (name, "string") == 0) {
ud->parser_state = 8;
@@ -308,6 +329,9 @@ xmlrpc_end_element (GMarkupParseContext *context, const gchar *name, gpointer us
else if (g_ascii_strcasecmp (name, "int") == 0) {
ud->parser_state = 8;
}
+ else if (g_ascii_strcasecmp (name, "double") == 0) {
+ ud->parser_state = 8;
+ }
else {
/* Error state */
ud->parser_state = 99;
@@ -326,6 +350,7 @@ xmlrpc_text (GMarkupParseContext *context, const gchar *text, gsize text_len, gp
{
struct lua_xmlrpc_ud *ud = user_data;
gint num;
+ gdouble dnum;
/* Strip line */
while (g_ascii_isspace (*text) && text_len > 0) {
@@ -352,7 +377,13 @@ xmlrpc_text (GMarkupParseContext *context, const gchar *text, gsize text_len, gp
num = strtoul (text, NULL, 10);
lua_pushinteger (ud->L, num);
break;
+ case 13:
+ /* Push integer value */
+ dnum = strtod (text, NULL);
+ lua_pushnumber (ud->L, dnum);
+ break;
}
+ ud->got_text = TRUE;
}
}
@@ -400,7 +431,8 @@ lua_xmlrpc_parse_reply (lua_State *L)
static gint
lua_xmlrpc_parse_table (lua_State *L, gint pos, gchar *databuf, gint pr, gsize size)
{
- gint r = pr;
+ gint r = pr, num;
+ double dnum;
r += rspamd_snprintf (databuf + r, size - r, "<struct>");
lua_pushnil (L); /* first key */
@@ -415,8 +447,18 @@ lua_xmlrpc_parse_table (lua_State *L, gint pos, gchar *databuf, gint pr, gsize s
lua_tostring (L, -2));
switch (lua_type (L, -1)) {
case LUA_TNUMBER:
- r += rspamd_snprintf (databuf + r, size - r, "<int>%d</int>",
- lua_tointeger (L, -1));
+ num = lua_tointeger (L, -1);
+ dnum = lua_tonumber (L, -1);
+
+ /* Try to avoid conversion errors */
+ if (dnum != (double)num) {
+ r += rspamd_snprintf (databuf + r, sizeof (databuf) - r, "<double>%f</double>",
+ dnum);
+ }
+ else {
+ r += rspamd_snprintf (databuf + r, sizeof (databuf) - r, "<int>%d</int>",
+ num);
+ }
break;
case LUA_TBOOLEAN:
r += rspamd_snprintf (databuf + r, size - r, "<boolean>%d</boolean>",
@@ -449,7 +491,8 @@ lua_xmlrpc_make_request (lua_State *L)
{
gchar databuf[BUFSIZ * 2];
const gchar *func;
- gint r, top, i;
+ gint r, top, i, num;
+ double dnum;
func = luaL_checkstring (L, 1);
@@ -465,8 +508,18 @@ lua_xmlrpc_make_request (lua_State *L)
r += rspamd_snprintf (databuf + r, sizeof (databuf) - r, "<param><value>");
switch (lua_type (L, i)) {
case LUA_TNUMBER:
- r += rspamd_snprintf (databuf + r, sizeof (databuf) - r, "<int>%d</int>",
- lua_tointeger (L, i));
+ num = lua_tointeger (L, i);
+ dnum = lua_tonumber (L, i);
+
+ /* Try to avoid conversion errors */
+ if (dnum != (double)num) {
+ r += rspamd_snprintf (databuf + r, sizeof (databuf) - r, "<double>%f</double>",
+ dnum);
+ }
+ else {
+ r += rspamd_snprintf (databuf + r, sizeof (databuf) - r, "<int>%d</int>",
+ num);
+ }
break;
case LUA_TBOOLEAN:
r += rspamd_snprintf (databuf + r, sizeof (databuf) - r, "<boolean>%d</boolean>",