diff options
Diffstat (limited to 'src/lua')
-rw-r--r-- | src/lua/lua_common.c | 97 | ||||
-rw-r--r-- | src/lua/lua_common.h | 15 | ||||
-rw-r--r-- | src/lua/lua_task.c | 46 | ||||
-rw-r--r-- | src/lua/lua_util.c | 90 |
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); } |