From: Vsevolod Stakhov Date: Sun, 24 Apr 2016 12:11:24 +0000 (+0100) Subject: [Fix] Adopt lua task API for the new email addresses structure X-Git-Tag: 1.3.0~644 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=6ccbb48de456f91927012682e88845621ce4f646;p=rspamd.git [Fix] Adopt lua task API for the new email addresses structure --- 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); }