summaryrefslogtreecommitdiffstats
path: root/src/lua/lua_task.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-04-24 13:11:24 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-04-24 13:11:24 +0100
commit6ccbb48de456f91927012682e88845621ce4f646 (patch)
treef92643e422650adcb19c8562d28c86aec0800cc9 /src/lua/lua_task.c
parent4b001cae83b179b2c3360e3d0cea8e3f5c6e577d (diff)
downloadrspamd-6ccbb48de456f91927012682e88845621ce4f646.tar.gz
rspamd-6ccbb48de456f91927012682e88845621ce4f646.zip
[Fix] Adopt lua task API for the new email addresses structure
Diffstat (limited to 'src/lua/lua_task.c')
-rw-r--r--src/lua/lua_task.c107
1 files changed, 88 insertions, 19 deletions
diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c
index 83a039813..b8e49424f 100644
--- a/src/lua/lua_task.c
+++ b/src/lua/lua_task.c
@@ -21,6 +21,7 @@
#include "util.h"
#include "images.h"
#include "cfg_file.h"
+#include "email_addr.h"
#include "utlist.h"
#include "xxhash.h"
@@ -1521,11 +1522,51 @@ lua_task_str_to_get_type (lua_State *L, gint pos)
return ret;
}
+static void
+lua_push_email_address (lua_State *L, struct rspamd_email_address *addr)
+{
+ if (addr) {
+ lua_createtable (L, 0, 3);
+
+ if (addr->addr_len > 0) {
+ lua_pushstring (L, "addr");
+ lua_pushlstring (L, addr->addr, addr->addr_len);
+ lua_settable (L, -3);
+ }
+ if (addr->domain_len > 0) {
+ lua_pushstring (L, "domain");
+ lua_pushlstring (L, addr->domain, addr->domain_len);
+ lua_settable (L, -3);
+ }
+ if (addr->user_len > 0) {
+ lua_pushstring (L, "user");
+ lua_pushlstring (L, addr->user, addr->user_len);
+ lua_settable (L, -3);
+ }
+ }
+}
+
+static void
+lua_push_emails_address_list (lua_State *L, GPtrArray *addrs)
+{
+ struct rspamd_email_address *addr;
+ guint i;
+
+ lua_createtable (L, addrs->len, 0);
+
+ for (i = 0; i < addrs->len; i ++) {
+ addr = g_ptr_array_index (addrs, i);
+ lua_push_email_address (L, addr);
+ lua_rawseti (L, -2, i + 1);
+ }
+}
+
static gint
lua_task_get_recipients (lua_State *L)
{
struct rspamd_task *task = lua_check_task (L, 1);
- InternetAddressList *addrs;
+ InternetAddressList *addrs = NULL;
+ GPtrArray *ptrs = NULL;
gint what = 0;
if (task) {
@@ -1537,7 +1578,7 @@ lua_task_get_recipients (lua_State *L)
switch (what) {
case RSPAMD_ADDRESS_SMTP:
/* Here we check merely envelope rcpt */
- addrs = task->rcpt_envelope;
+ ptrs = task->rcpt_envelope;
break;
case RSPAMD_ADDRESS_MIME:
/* Here we check merely mime rcpt */
@@ -1546,7 +1587,7 @@ lua_task_get_recipients (lua_State *L)
case RSPAMD_ADDRESS_ANY:
default:
if (task->rcpt_envelope) {
- addrs = task->rcpt_envelope;
+ ptrs = task->rcpt_envelope;
}
else {
addrs = task->rcpt_mime;
@@ -1557,6 +1598,9 @@ lua_task_get_recipients (lua_State *L)
if (addrs) {
lua_push_internet_address_list (L, addrs);
}
+ else if (ptrs) {
+ lua_push_emails_address_list (L, ptrs);
+ }
else {
lua_pushnil (L);
}
@@ -1577,6 +1621,24 @@ lua_task_get_recipients (lua_State *L)
} \
} while (0)
+#define CHECK_EMAIL_ADDR(addr) do { \
+ if (addr == NULL) { \
+ ret = 0; \
+ } \
+ else { \
+ ret = addr->flags & RSPAMD_EMAIL_ADDR_VALID; \
+ } \
+} while (0)
+
+#define CHECK_EMAIL_ADDR_LIST(addr) do { \
+ if (addr == NULL) { \
+ ret = 0; \
+ } \
+ else { \
+ ret = addr->len > 0; \
+ } \
+} while (0)
+
static gint
lua_task_has_from (lua_State *L)
{
@@ -1591,17 +1653,17 @@ lua_task_has_from (lua_State *L)
}
switch (what) {
- case 1:
+ case RSPAMD_ADDRESS_SMTP:
/* Here we check merely envelope rcpt */
- CHECK_ADDR (task->from_envelope);
+ CHECK_EMAIL_ADDR (task->from_envelope);
break;
- case 2:
+ case RSPAMD_ADDRESS_MIME:
/* Here we check merely mime rcpt */
CHECK_ADDR (task->from_mime);
break;
- case 0:
+ case RSPAMD_ADDRESS_ANY:
default:
- CHECK_ADDR (task->from_envelope);
+ CHECK_EMAIL_ADDR (task->from_envelope);
if (!ret) {
CHECK_ADDR (task->from_mime);
@@ -1632,17 +1694,17 @@ lua_task_has_recipients (lua_State *L)
}
switch (what) {
- case 1:
+ case RSPAMD_ADDRESS_SMTP:
/* Here we check merely envelope rcpt */
- CHECK_ADDR (task->rcpt_envelope);
+ CHECK_EMAIL_ADDR_LIST (task->rcpt_envelope);
break;
- case 2:
+ case RSPAMD_ADDRESS_MIME:
/* Here we check merely mime rcpt */
CHECK_ADDR (task->rcpt_mime);
break;
- case 0:
+ case RSPAMD_ADDRESS_ANY:
default:
- CHECK_ADDR (task->rcpt_envelope);
+ CHECK_EMAIL_ADDR_LIST (task->rcpt_envelope);
if (!ret) {
CHECK_ADDR (task->rcpt_mime);
@@ -1663,7 +1725,8 @@ static gint
lua_task_get_from (lua_State *L)
{
struct rspamd_task *task = lua_check_task (L, 1);
- InternetAddressList *addrs;
+ InternetAddressList *addrs = NULL;
+ struct rspamd_email_address *addr = NULL;
gint what = 0;
if (task) {
@@ -1673,18 +1736,18 @@ lua_task_get_from (lua_State *L)
}
switch (what) {
- case 1:
+ case RSPAMD_ADDRESS_SMTP:
/* Here we check merely envelope rcpt */
- addrs = task->from_envelope;
+ addr = task->from_envelope;
break;
- case 2:
+ case RSPAMD_ADDRESS_MIME:
/* Here we check merely mime rcpt */
addrs = task->from_mime;
break;
- case 0:
+ case RSPAMD_ADDRESS_ANY:
default:
if (task->from_envelope) {
- addrs = task->from_envelope;
+ addr = task->from_envelope;
}
else {
addrs = task->from_mime;
@@ -1695,6 +1758,12 @@ lua_task_get_from (lua_State *L)
if (addrs) {
lua_push_internet_address_list (L, addrs);
}
+ else if (addr) {
+ /* Create table to preserve compatibility */
+ lua_createtable (L, 1, 0);
+ lua_push_email_address (L, addr);
+ lua_rawseti (L, -2, 1);
+ }
else {
lua_pushnil (L);
}