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