Browse Source

[Fix] Adopt lua task API for the new email addresses structure

tags/1.3.0
Vsevolod Stakhov 8 years ago
parent
commit
6ccbb48de4
1 changed files with 88 additions and 19 deletions
  1. 88
    19
      src/lua/lua_task.c

+ 88
- 19
src/lua/lua_task.c View File

@@ -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);
}

Loading…
Cancel
Save