summaryrefslogtreecommitdiffstats
path: root/src/lua
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua')
-rw-r--r--src/lua/lua_common.c97
-rw-r--r--src/lua/lua_common.h15
-rw-r--r--src/lua/lua_task.c46
-rw-r--r--src/lua/lua_util.c90
4 files changed, 72 insertions, 176 deletions
diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c
index 5a1cc7101..3dc02991b 100644
--- a/src/lua/lua_common.c
+++ b/src/lua/lua_common.c
@@ -1006,103 +1006,6 @@ rspamd_lua_table_size (lua_State *L, gint tbl_pos)
return tbl_size;
}
-gboolean
-lua_push_internet_address (lua_State *L, InternetAddress *ia)
-{
- const char *addr, *at;
-
-#ifndef GMIME24
- if (internet_address_get_type (ia) == INTERNET_ADDRESS_NAME) {
- lua_newtable (L);
- addr = internet_address_get_addr (ia);
- rspamd_lua_table_set (L, "name", internet_address_get_name (ia));
- rspamd_lua_table_set (L, "addr", addr);
-
- if (addr) {
- at = strchr (addr, '@');
- if (at != NULL) {
- lua_pushstring(L, "user");
- lua_pushlstring(L, addr, at - addr);
- lua_settable (L, -3);
- lua_pushstring (L, "domain");
- lua_pushstring (L, at + 1);
- lua_settable (L, -3);
- }
- }
-
- return TRUE;
- }
- return FALSE;
-#else
- InternetAddressMailbox *iamb;
-
- if (ia && INTERNET_ADDRESS_IS_MAILBOX (ia)) {
- lua_newtable (L);
- iamb = INTERNET_ADDRESS_MAILBOX (ia);
- addr = internet_address_mailbox_get_addr (iamb);
-
- if (addr) {
- rspamd_lua_table_set (L, "name", internet_address_get_name (ia));
- rspamd_lua_table_set (L, "addr", addr);
- /* Set optional fields */
-
- at = strchr (addr, '@');
- if (at != NULL) {
- lua_pushstring(L, "user");
- lua_pushlstring(L, addr, at - addr);
- lua_settable (L, -3);
- lua_pushstring (L, "domain");
- lua_pushstring (L, at + 1);
- lua_settable (L, -3);
- }
- return TRUE;
- }
- }
-
- return FALSE;
-#endif
-}
-
-/*
- * Push internet addresses to lua as a table
- */
-void
-lua_push_internet_address_list (lua_State *L, InternetAddressList *addrs)
-{
- InternetAddress *ia;
- gint idx = 1;
-
-#ifndef GMIME24
- /* Gmime 2.2 version */
- InternetAddressList *cur;
-
- lua_newtable (L);
- cur = addrs;
- while (cur) {
- ia = internet_address_list_get_address (cur);
- if (lua_push_internet_address (L, ia)) {
- lua_rawseti (L, -2, idx++);
- }
- cur = internet_address_list_next (cur);
- }
-#else
- /* Gmime 2.4 version */
- gsize len, i;
-
- lua_newtable (L);
- if (addrs != NULL) {
- len = internet_address_list_length (addrs);
- for (i = 0; i < len; i++) {
- ia = internet_address_list_get_address (addrs, i);
- if (lua_push_internet_address (L, ia)) {
- lua_rawseti (L, -2, idx++);
- }
- }
- }
-#endif
-}
-
-
static void *
rspamd_lua_check_udata_common (lua_State *L, gint pos, const gchar *classname,
gboolean fatal)
diff --git a/src/lua/lua_common.h b/src/lua/lua_common.h
index a2b886098..dbb46c822 100644
--- a/src/lua/lua_common.h
+++ b/src/lua/lua_common.h
@@ -312,20 +312,7 @@ gint rspamd_lua_traceback (lua_State *L);
*/
guint rspamd_lua_table_size (lua_State *L, gint tbl_pos);
-/**
- * Pushes a single InternetAddress as lua table
- * @param L
- * @param addrs
- */
-void lua_push_internet_address_list (lua_State *L, InternetAddressList *addrs);
-
-/**
- * Pushes internet address list to Lua as table of tables
- * @param L
- * @param ia
- * @return
- */
-gboolean lua_push_internet_address (lua_State *L, InternetAddress *ia);
+void lua_push_emails_address_list (lua_State *L, GPtrArray *addrs);
/**
* Log lua object to string
diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c
index 7e6ba5b10..f79de9b92 100644
--- a/src/lua/lua_task.c
+++ b/src/lua/lua_task.c
@@ -1765,7 +1765,7 @@ static void
lua_push_email_address (lua_State *L, struct rspamd_email_address *addr)
{
if (addr) {
- lua_createtable (L, 0, 3);
+ lua_createtable (L, 0, 4);
if (addr->addr_len > 0) {
lua_pushstring (L, "addr");
@@ -1797,10 +1797,21 @@ lua_push_email_address (lua_State *L, struct rspamd_email_address *addr)
lua_pushstring (L, "");
lua_settable (L, -3);
}
+
+ if (addr->name_len > 0) {
+ lua_pushstring (L, "name");
+ lua_pushlstring (L, addr->name, addr->name_len);
+ lua_settable (L, -3);
+ }
+ else {
+ lua_pushstring (L, "name");
+ lua_pushstring (L, "");
+ lua_settable (L, -3);
+ }
}
}
-static void
+void
lua_push_emails_address_list (lua_State *L, GPtrArray *addrs)
{
struct rspamd_email_address *addr;
@@ -1819,7 +1830,6 @@ static gint
lua_task_get_recipients (lua_State *L)
{
struct rspamd_task *task = lua_check_task (L, 1);
- InternetAddressList *addrs = NULL;
GPtrArray *ptrs = NULL;
gint what = 0;
@@ -1836,7 +1846,7 @@ lua_task_get_recipients (lua_State *L)
break;
case RSPAMD_ADDRESS_MIME:
/* Here we check merely mime rcpt */
- addrs = task->rcpt_mime;
+ ptrs = task->rcpt_mime;
break;
case RSPAMD_ADDRESS_ANY:
default:
@@ -1844,15 +1854,11 @@ lua_task_get_recipients (lua_State *L)
ptrs = task->rcpt_envelope;
}
else {
- addrs = task->rcpt_mime;
+ ptrs = task->rcpt_mime;
}
break;
}
-
- if (addrs) {
- lua_push_internet_address_list (L, addrs);
- }
- else if (ptrs) {
+ if (ptrs) {
lua_push_emails_address_list (L, ptrs);
}
else {
@@ -1866,14 +1872,6 @@ lua_task_get_recipients (lua_State *L)
return 1;
}
-#define CHECK_ADDR(addr) do { \
- if (addr == NULL) { \
- ret = 0; \
- } \
- else { \
- ret = internet_address_list_length (addr) > 0 ? 1 : 0; \
- } \
-} while (0)
#define CHECK_EMAIL_ADDR(addr) do { \
if (addr == NULL) { \
@@ -1913,14 +1911,14 @@ lua_task_has_from (lua_State *L)
break;
case RSPAMD_ADDRESS_MIME:
/* Here we check merely mime rcpt */
- CHECK_ADDR (task->from_mime);
+ CHECK_EMAIL_ADDR_LIST (task->from_mime);
break;
case RSPAMD_ADDRESS_ANY:
default:
CHECK_EMAIL_ADDR (task->from_envelope);
if (!ret) {
- CHECK_ADDR (task->from_mime);
+ CHECK_EMAIL_ADDR_LIST (task->from_mime);
}
break;
}
@@ -1954,14 +1952,14 @@ lua_task_has_recipients (lua_State *L)
break;
case RSPAMD_ADDRESS_MIME:
/* Here we check merely mime rcpt */
- CHECK_ADDR (task->rcpt_mime);
+ CHECK_EMAIL_ADDR_LIST (task->rcpt_mime);
break;
case RSPAMD_ADDRESS_ANY:
default:
CHECK_EMAIL_ADDR_LIST (task->rcpt_envelope);
if (!ret) {
- CHECK_ADDR (task->rcpt_mime);
+ CHECK_EMAIL_ADDR_LIST (task->rcpt_mime);
}
break;
}
@@ -1979,7 +1977,7 @@ static gint
lua_task_get_from (lua_State *L)
{
struct rspamd_task *task = lua_check_task (L, 1);
- InternetAddressList *addrs = NULL;
+ GPtrArray *addrs = NULL;
struct rspamd_email_address *addr = NULL;
gint what = 0;
@@ -2010,7 +2008,7 @@ lua_task_get_from (lua_State *L)
}
if (addrs) {
- lua_push_internet_address_list (L, addrs);
+ lua_push_emails_address_list (L, addrs);
}
else if (addr) {
/* Create table to preserve compatibility */
diff --git a/src/lua/lua_util.c b/src/lua/lua_util.c
index 9b3d5265d..923713783 100644
--- a/src/lua/lua_util.c
+++ b/src/lua/lua_util.c
@@ -22,6 +22,7 @@
#include "libserver/url.h"
#include "unix-std.h"
#include "contrib/zstd/zstd.h"
+#include "libmime/email_addr.h"
#include <math.h>
#include <glob.h>
@@ -1043,41 +1044,36 @@ lua_util_levenshtein_distance (lua_State *L)
static gint
lua_util_parse_addr (lua_State *L)
{
- InternetAddressList *ia;
- InternetAddress *addr;
- const gchar *str = luaL_checkstring (L, 1);
- int i, cnt;
+ GPtrArray *addrs;
+ gsize len;
+ const gchar *str = luaL_checklstring (L, 1, &len);
+ rspamd_mempool_t *pool;
+ gboolean own_pool = FALSE;
if (str) {
- ia = internet_address_list_parse_string (str);
- if (ia == NULL) {
- lua_pushnil (L);
+ if (lua_type (L, 2) == LUA_TUSERDATA) {
+ pool = rspamd_lua_check_mempool (L, 2);
+
+ if (pool == NULL) {
+ return luaL_error (L, "invalid arguments");
+ }
}
else {
- cnt = internet_address_list_length (ia);
- lua_createtable (L, cnt, 0);
-
- for (i = 0; i < cnt; i ++) {
- addr = internet_address_list_get_address (ia, i);
-
- lua_createtable (L, 0, 2);
- lua_pushstring (L, "name");
- lua_pushstring (L, internet_address_get_name (addr));
- lua_settable (L, -3);
-
- if (INTERNET_ADDRESS_IS_MAILBOX (addr)) {
- lua_pushstring (L, "addr");
- lua_pushstring (L, internet_address_mailbox_get_addr (
- INTERNET_ADDRESS_MAILBOX (addr)));
- lua_settable (L, -3);
- }
+ pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), "lua util");
+ own_pool = TRUE;
+ }
- lua_rawseti (L, -2, (i + 1));
- }
+ addrs = rspamd_email_address_from_mime (pool, str, len, NULL);
- g_object_unref (ia);
+ if (addrs == NULL) {
+ lua_pushnil (L);
+ }
+ else {
+ lua_push_emails_address_list (L, addrs);
}
+
+ rspamd_mempool_delete (pool);
}
else {
lua_pushnil (L);
@@ -1226,26 +1222,38 @@ lua_util_glob (lua_State *L)
static gint
lua_util_parse_mail_address (lua_State *L)
{
- InternetAddressList *ia;
- const gchar *str = luaL_checkstring (L, 1);
- gboolean ret = FALSE;
+ GPtrArray *addrs;
+ gsize len;
+ const gchar *str = luaL_checklstring (L, 1, &len);
+ rspamd_mempool_t *pool;
+ gboolean own_pool = FALSE;
if (str) {
- ia = internet_address_list_parse_string (str);
- if (ia != NULL) {
- ret = TRUE;
+ if (lua_type (L, 2) == LUA_TUSERDATA) {
+ pool = rspamd_lua_check_mempool (L, 2);
- lua_push_internet_address_list (L, ia);
-#ifdef GMIME24
- g_object_unref (ia);
-#else
- internet_address_list_destroy (ia);
-#endif
+ if (pool == NULL) {
+ return luaL_error (L, "invalid arguments");
+ }
+ }
+ else {
+ pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), "lua util");
+ own_pool = TRUE;
}
- }
- if (!ret) {
+ addrs = rspamd_email_address_from_mime (pool, str, len, NULL);
+
+ if (addrs == NULL) {
+ lua_pushnil (L);
+ }
+ else {
+ lua_push_emails_address_list (L, addrs);
+ }
+
+ rspamd_mempool_delete (pool);
+ }
+ else {
lua_pushnil (L);
}