#include "util.h"
#include "images.h"
#include "cfg_file.h"
+#include "email_addr.h"
#include "utlist.h"
#include "xxhash.h"
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) {
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 */
case RSPAMD_ADDRESS_ANY:
default:
if (task->rcpt_envelope) {
- addrs = task->rcpt_envelope;
+ ptrs = task->rcpt_envelope;
}
else {
addrs = task->rcpt_mime;
if (addrs) {
lua_push_internet_address_list (L, addrs);
}
+ else if (ptrs) {
+ lua_push_emails_address_list (L, ptrs);
+ }
else {
lua_pushnil (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)
{
}
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);
}
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);
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) {
}
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;
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);
}