commit e341239: [Project] Adopt Lua API

Vsevolod Stakhov vsevolod at highsecure.ru
Fri Jul 12 16:42:26 UTC 2019


Author: Vsevolod Stakhov
Date: 2019-07-12 15:11:36 +0100
URL: https://github.com/rspamd/rspamd/commit/e3412399bb82853e6e622188e683080791cf5de6

[Project] Adopt Lua API

---
 src/lua/lua_common.h   |   8 +-
 src/lua/lua_mimepart.c |  34 +++---
 src/lua/lua_task.c     | 281 +++++++++++++++++++++++++------------------------
 src/lua/lua_trie.c     |  10 +-
 4 files changed, 173 insertions(+), 160 deletions(-)

diff --git a/src/lua/lua_common.h b/src/lua/lua_common.h
index d14ebba54..bef163c3c 100644
--- a/src/lua/lua_common.h
+++ b/src/lua/lua_common.h
@@ -120,7 +120,7 @@ struct rspamd_lua_map {
 
 struct rspamd_lua_cached_entry {
 	gint ref;
-	guint id;
+	guchar id[4];
 };
 
 /* Common utility functions */
@@ -234,8 +234,10 @@ gint rspamd_lua_push_header (lua_State *L,
  * Push specific header to lua
  */
 gint rspamd_lua_push_header_array (lua_State *L,
-								   GPtrArray *hdrs,
-								   enum rspamd_lua_task_header_type how);
+								   const gchar *name,
+								   struct rspamd_mime_header *rh,
+								   enum rspamd_lua_task_header_type how,
+								   gboolean strong);
 
 /**
  * Check for task at the specified position
diff --git a/src/lua/lua_mimepart.c b/src/lua/lua_mimepart.c
index 5401ed031..dfc4ee8fa 100644
--- a/src/lua/lua_mimepart.c
+++ b/src/lua/lua_mimepart.c
@@ -21,6 +21,8 @@
 #include "libcryptobox/cryptobox.h"
 #include "libutil/shingles.h"
 
+#include "contrib/uthash/utlist.h"
+
 /* Textpart methods */
 /***
  * @module rspamd_textpart
@@ -1558,16 +1560,21 @@ lua_mimepart_get_header_common (lua_State *L, enum rspamd_lua_task_header_type h
 {
 	struct rspamd_mime_part *part = lua_check_mimepart (L);
 	const gchar *name;
-	GPtrArray *ar;
+	gboolean strong = FALSE;
 
 	name = luaL_checkstring (L, 2);
 
 	if (name && part) {
 
-		ar = rspamd_message_get_header_from_hash (part->raw_headers, NULL,
-				name, FALSE);
+		if (lua_isboolean (L, 3)) {
+			strong = lua_toboolean (L, 3);
+		}
 
-		return rspamd_lua_push_header_array (L, ar, how);
+		return rspamd_lua_push_header_array (L,
+				name,
+				rspamd_message_get_header_from_hash (part->raw_headers, name),
+				how,
+				strong);
 	}
 
 	lua_pushnil (L);
@@ -1915,8 +1922,7 @@ lua_mimepart_headers_foreach (lua_State *L)
 	struct rspamd_mime_part *part = lua_check_mimepart (L);
 	enum rspamd_lua_task_header_type how = RSPAMD_TASK_HEADER_PUSH_SIMPLE;
 	struct rspamd_lua_regexp *re = NULL;
-	GList *cur;
-	struct rspamd_mime_header *hdr;
+	struct rspamd_mime_header *hdr, *cur;
 	gint old_top;
 
 	if (part && lua_isfunction (L, 2)) {
@@ -1951,23 +1957,20 @@ lua_mimepart_headers_foreach (lua_State *L)
 		}
 
 		if (part->headers_order) {
-			cur = part->headers_order->head;
-
-			while (cur) {
-				hdr = cur->data;
+			hdr = part->headers_order;
 
+			LL_FOREACH (hdr, cur) {
 				if (re && re->re) {
-					if (!rspamd_regexp_match (re->re, hdr->name,
-							strlen (hdr->name),FALSE)) {
-						cur = g_list_next (cur);
+					if (!rspamd_regexp_match (re->re, cur->name,
+							strlen (cur->name),FALSE)) {
 						continue;
 					}
 				}
 
 				old_top = lua_gettop (L);
 				lua_pushvalue (L, 2);
-				lua_pushstring (L, hdr->name);
-				rspamd_lua_push_header (L, hdr, how);
+				lua_pushstring (L, cur->name);
+				rspamd_lua_push_header (L, cur, how);
 
 				if (lua_pcall (L, 2, LUA_MULTRET, 0) != 0) {
 					msg_err ("call to header_foreach failed: %s",
@@ -1987,7 +1990,6 @@ lua_mimepart_headers_foreach (lua_State *L)
 				}
 
 				lua_settop (L, old_top);
-				cur = g_list_next (cur);
 			}
 		}
 	}
diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c
index 3f69adfcc..afe83c1a5 100644
--- a/src/lua/lua_task.c
+++ b/src/lua/lua_task.c
@@ -1251,7 +1251,7 @@ lua_check_text (lua_State * L, gint pos)
 
 static void
 lua_task_set_cached (lua_State *L, struct rspamd_task *task, const gchar *key,
-		gint pos, guint id)
+		gint pos)
 {
 	LUA_TRACE_POINT;
 	struct rspamd_lua_cached_entry *entry;
@@ -1271,20 +1271,20 @@ lua_task_set_cached (lua_State *L, struct rspamd_task *task, const gchar *key,
 	}
 
 	entry->ref = luaL_ref (L, LUA_REGISTRYINDEX);
-	entry->id = id;
+	memcpy (entry->id, MESSAGE_FIELD (task, digest), sizeof (entry->id));
 }
 
 
 static gboolean
-lua_task_get_cached (lua_State *L, struct rspamd_task *task, const gchar *key,
-		guint id)
+lua_task_get_cached (lua_State *L, struct rspamd_task *task, const gchar *key)
 {
 	LUA_TRACE_POINT;
 	struct rspamd_lua_cached_entry *entry;
 
 	entry = g_hash_table_lookup (task->lua_cache, key);
 
-	if (entry != NULL && entry->id == id) {
+	if (entry != NULL && memcmp (entry->id, MESSAGE_FIELD (task, digest),
+			sizeof (entry->id)) == 0) {
 		lua_rawgeti (L, LUA_REGISTRYINDEX, entry->ref);
 
 		return TRUE;
@@ -2031,38 +2031,45 @@ lua_task_get_urls (lua_State * L)
 		cb.mask = protocols_mask;
 
 		if (protocols_mask & PROTOCOL_MAILTO) {
-			sz = g_hash_table_size (task->urls) + g_hash_table_size (task->emails);
+			sz = g_hash_table_size (MESSAGE_FIELD (task, urls)) +
+					g_hash_table_size (MESSAGE_FIELD (task, emails));
 
 			if (protocols_mask == (default_mask|PROTOCOL_MAILTO)) {
 				/* Can use cached version */
-				if (!lua_task_get_cached (L, task, "emails+urls", sz)) {
+				if (!lua_task_get_cached (L, task, "emails+urls")) {
 					lua_createtable (L, sz, 0);
-					g_hash_table_foreach (task->urls, lua_tree_url_callback, &cb);
-					g_hash_table_foreach (task->emails, lua_tree_url_callback, &cb);
+					g_hash_table_foreach (MESSAGE_FIELD (task, urls),
+							lua_tree_url_callback, &cb);
+					g_hash_table_foreach (MESSAGE_FIELD (task, emails),
+							lua_tree_url_callback, &cb);
 
-					lua_task_set_cached (L, task, "emails+urls", -1, sz);
+					lua_task_set_cached (L, task, "emails+urls", -1);
 				}
 			}
 			else {
 				lua_createtable (L, sz, 0);
-				g_hash_table_foreach (task->urls, lua_tree_url_callback, &cb);
-				g_hash_table_foreach (task->emails, lua_tree_url_callback, &cb);
+				g_hash_table_foreach (MESSAGE_FIELD (task, urls),
+						lua_tree_url_callback, &cb);
+				g_hash_table_foreach (MESSAGE_FIELD (task, emails),
+						lua_tree_url_callback, &cb);
 			}
 
 		}
 		else {
-			sz = g_hash_table_size (task->urls);
+			sz = g_hash_table_size (MESSAGE_FIELD (task, urls));
 
 			if (protocols_mask == (default_mask)) {
-				if (!lua_task_get_cached (L, task, "urls", sz)) {
+				if (!lua_task_get_cached (L, task, "urls")) {
 					lua_createtable (L, sz, 0);
-					g_hash_table_foreach (task->urls, lua_tree_url_callback, &cb);
-					lua_task_set_cached (L, task, "urls", -1, sz);
+					g_hash_table_foreach (MESSAGE_FIELD (task, urls),
+							lua_tree_url_callback, &cb);
+					lua_task_set_cached (L, task, "urls", -1);
 				}
 			}
 			else {
 				lua_createtable (L, sz, 0);
-				g_hash_table_foreach (task->urls, lua_tree_url_callback, &cb);
+				g_hash_table_foreach (MESSAGE_FIELD (task, urls),
+						lua_tree_url_callback, &cb);
 			}
 		}
 	}
@@ -2085,11 +2092,11 @@ lua_task_has_urls (lua_State * L)
 			need_emails = lua_toboolean (L, 2);
 		}
 
-		if (g_hash_table_size (task->urls) > 0) {
+		if (g_hash_table_size (MESSAGE_FIELD (task, urls)) > 0) {
 			ret = TRUE;
 		}
 
-		if (need_emails && g_hash_table_size (task->emails) > 0) {
+		if (need_emails && g_hash_table_size (MESSAGE_FIELD (task, emails)) > 0) {
 			ret = TRUE;
 		}
 	}
@@ -2155,10 +2162,10 @@ lua_task_get_rawbody (lua_State * L)
 		t = lua_newuserdata (L, sizeof (*t));
 		rspamd_lua_setclass (L, "rspamd{text}", -1);
 
-		if (task->raw_headers_content.len > 0) {
-			g_assert (task->raw_headers_content.len <= task->msg.len);
-			t->start = task->msg.begin + task->raw_headers_content.len;
-			t->len = task->msg.len - task->raw_headers_content.len;
+		if (MESSAGE_FIELD (task, raw_headers_content).len > 0) {
+			g_assert (MESSAGE_FIELD (task, raw_headers_content).len <= task->msg.len);
+			t->start = task->msg.begin + MESSAGE_FIELD (task, raw_headers_content).len;
+			t->len = task->msg.len - MESSAGE_FIELD (task, raw_headers_content).len;
 		}
 		else {
 			t->len = task->msg.len;
@@ -2182,11 +2189,12 @@ lua_task_get_emails (lua_State * L)
 	struct lua_tree_cb_data cb;
 
 	if (task) {
-		lua_createtable (L, g_hash_table_size (task->emails), 0);
+		lua_createtable (L, g_hash_table_size (MESSAGE_FIELD (task, emails)), 0);
 		cb.i = 1;
 		cb.L = L;
 		cb.mask = PROTOCOL_MAILTO;
-		g_hash_table_foreach (task->emails, lua_tree_url_callback, &cb);
+		g_hash_table_foreach (MESSAGE_FIELD (task, emails),
+				lua_tree_url_callback, &cb);
 	}
 	else {
 		return luaL_error (L, "invalid arguments");
@@ -2205,11 +2213,10 @@ lua_task_get_text_parts (lua_State * L)
 
 	if (task != NULL) {
 
-		if (!lua_task_get_cached (L, task, "text_parts", task->text_parts->len)) {
-			lua_createtable (L, task->text_parts->len, 0);
+		if (!lua_task_get_cached (L, task, "text_parts")) {
+			lua_createtable (L, MESSAGE_FIELD (task, text_parts)->len, 0);
 
-			for (i = 0; i < task->text_parts->len; i ++) {
-				part = g_ptr_array_index (task->text_parts, i);
+			PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, text_parts), i, part) {
 				ppart = lua_newuserdata (L, sizeof (struct rspamd_mime_text_part *));
 				*ppart = part;
 				rspamd_lua_setclass (L, "rspamd{textpart}", -1);
@@ -2217,7 +2224,7 @@ lua_task_get_text_parts (lua_State * L)
 				lua_rawseti (L, -2, i + 1);
 			}
 
-			lua_task_set_cached (L, task, "text_parts", -1, task->text_parts->len);
+			lua_task_set_cached (L, task, "text_parts", -1);
 		}
 	}
 	else {
@@ -2236,11 +2243,10 @@ lua_task_get_parts (lua_State * L)
 	struct rspamd_mime_part *part, **ppart;
 
 	if (task != NULL) {
-		if (!lua_task_get_cached (L, task, "mime_parts", task->parts->len)) {
-			lua_createtable (L, task->parts->len, 0);
+		if (!lua_task_get_cached (L, task, "mime_parts")) {
+			lua_createtable (L, MESSAGE_FIELD (task, parts)->len, 0);
 
-			for (i = 0; i < task->parts->len; i ++) {
-				part = g_ptr_array_index (task->parts, i);
+			PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, parts), i, part) {
 				ppart = lua_newuserdata (L, sizeof (struct rspamd_mime_part *));
 				*ppart = part;
 				rspamd_lua_setclass (L, "rspamd{mimepart}", -1);
@@ -2248,7 +2254,7 @@ lua_task_get_parts (lua_State * L)
 				lua_rawseti (L, -2, i + 1);
 			}
 
-			lua_task_set_cached (L, task, "mime_parts", -1, task->parts->len);
+			lua_task_set_cached (L, task, "mime_parts", -1);
 		}
 	}
 	else {
@@ -2301,7 +2307,7 @@ lua_task_set_request_header (lua_State *L)
 	rspamd_fstring_t *buf;
 	struct rspamd_lua_text *t;
 	rspamd_ftok_t *hdr, *new_name;
-	gsize len, vlen;
+	gsize len, vlen = 0;
 
 	s = luaL_checklstring (L, 2, &len);
 
@@ -2364,10 +2370,10 @@ rspamd_lua_push_header (lua_State *L, struct rspamd_mime_header *rh,
 		}
 
 		lua_pushstring (L, "tab_separated");
-		lua_pushboolean (L, rh->tab_separated);
+		lua_pushboolean (L, rh->flags & RSPAMD_HEADER_TAB_SEPARATED);
 		lua_settable (L, -3);
 		lua_pushstring (L, "empty_separator");
-		lua_pushboolean (L, rh->empty_separator);
+		lua_pushboolean (L, rh->flags & RSPAMD_HEADER_EMPTY_SEPARATOR);
 		lua_settable (L, -3);
 		rspamd_lua_table_set (L, "separator", rh->separator);
 		lua_pushstring (L, "order");
@@ -2400,15 +2406,17 @@ rspamd_lua_push_header (lua_State *L, struct rspamd_mime_header *rh,
 }
 
 gint
-rspamd_lua_push_header_array (lua_State * L,
-							  GPtrArray *ar,
-							  enum rspamd_lua_task_header_type how)
+rspamd_lua_push_header_array (lua_State *L,
+							  const gchar *name,
+							  struct rspamd_mime_header *rh,
+							  enum rspamd_lua_task_header_type how,
+							  gboolean strong)
 {
 	LUA_TRACE_POINT;
-	struct rspamd_mime_header *rh;
+	struct rspamd_mime_header *cur;
 	guint i;
 
-	if (ar == NULL || ar->len == 0) {
+	if (rh == NULL) {
 		if (how == RSPAMD_TASK_HEADER_PUSH_COUNT) {
 			lua_pushnumber (L, 0);
 		}
@@ -2420,18 +2428,28 @@ rspamd_lua_push_header_array (lua_State * L,
 	}
 
 	if (how == RSPAMD_TASK_HEADER_PUSH_FULL) {
-		lua_createtable (L, ar->len, 0);
-		PTR_ARRAY_FOREACH (ar, i, rh) {
-			rspamd_lua_push_header (L, rh, how);
-			lua_rawseti (L, -2, i + 1);
+		lua_createtable (L, 0, 0);
+		i = 0;
+
+		DL_FOREACH (rh, cur) {
+			if (!strong || strcmp (name, cur->name) == 0) {
+				rspamd_lua_push_header (L, cur, how);
+				lua_rawseti (L, -2, ++i);
+			}
 		}
 	}
 	else if (how == RSPAMD_TASK_HEADER_PUSH_COUNT) {
-		lua_pushinteger (L, ar->len);
+		i = 0;
+
+		DL_FOREACH (rh, cur) {
+			if (!strong || strcmp (name, cur->name) == 0) {
+				i++;
+			}
+		}
+
+		lua_pushinteger (L, i);
 	}
 	else {
-		rh = g_ptr_array_index (ar, 0);
-
 		return rspamd_lua_push_header (L, rh, how);
 	}
 
@@ -2444,8 +2462,8 @@ lua_task_get_header_common (lua_State *L, enum rspamd_lua_task_header_type how)
 	LUA_TRACE_POINT;
 	gboolean strong = FALSE;
 	struct rspamd_task *task = lua_check_task (L, 1);
+	struct rspamd_mime_header *rh;
 	const gchar *name;
-	GPtrArray *ar;
 
 	name = luaL_checkstring (L, 2);
 
@@ -2454,9 +2472,9 @@ lua_task_get_header_common (lua_State *L, enum rspamd_lua_task_header_type how)
 			strong = lua_toboolean (L, 3);
 		}
 
-		ar = rspamd_message_get_header_array (task, name, strong);
+		rh = rspamd_message_get_header_array (task, name);
 
-		return rspamd_lua_push_header_array (L, ar, how);
+		return rspamd_lua_push_header_array (L, name, rh, how, strong);
 	}
 	else {
 		return luaL_error (L, "invalid arguments");
@@ -2497,8 +2515,8 @@ lua_task_get_raw_headers (lua_State *L)
 	if (task) {
 		t = lua_newuserdata (L, sizeof (*t));
 		rspamd_lua_setclass (L, "rspamd{text}", -1);
-		t->start = task->raw_headers_content.begin;
-		t->len = task->raw_headers_content.len;
+		t->start = MESSAGE_FIELD (task, raw_headers_content).begin;
+		t->len = MESSAGE_FIELD (task, raw_headers_content).len;
 		t->flags = 0;
 	}
 	else {
@@ -2516,15 +2534,13 @@ lua_task_get_received_headers (lua_State * L)
 	struct rspamd_task *task = lua_check_task (L, 1);
 	struct rspamd_received_header *rh;
 	const gchar *proto;
-	guint i, k = 1;
+	guint k = 1;
 
 	if (task) {
-		if (!lua_task_get_cached (L, task, "received", task->received->len)) {
-			lua_createtable (L, task->received->len, 0);
-
-			for (i = 0; i < task->received->len; i ++) {
-				rh = g_ptr_array_index (task->received, i);
+		if (!lua_task_get_cached (L, task, "received")) {
+			lua_createtable (L, 0, 0);
 
+			DL_FOREACH (MESSAGE_FIELD (task, received), rh) {
 				lua_createtable (L, 0, 10);
 
 				if (rh->hdr && rh->hdr->decoded) {
@@ -2581,7 +2597,7 @@ lua_task_get_received_headers (lua_State * L)
 				lua_settable (L, -3);
 				lua_pushstring (L, "proto");
 
-				switch (rh->type) {
+				switch (rh->flags & RSPAMD_RECEIVED_FLAG_TYPE_MASK) {
 				case RSPAMD_RECEIVED_SMTP:
 					proto = "smtp";
 					break;
@@ -2630,7 +2646,7 @@ lua_task_get_received_headers (lua_State * L)
 				lua_rawseti (L, -2, k ++);
 			}
 
-			lua_task_set_cached (L, task, "received", -1, task->received->len);
+			lua_task_set_cached (L, task, "received", -1);
 		}
 	}
 	else {
@@ -3082,7 +3098,7 @@ lua_task_get_recipients (lua_State *L)
 			break;
 		case RSPAMD_ADDRESS_MIME:
 			/* Here we check merely mime rcpt */
-			ptrs = task->rcpt_mime;
+			ptrs = MESSAGE_FIELD (task, rcpt_mime);
 			break;
 		case RSPAMD_ADDRESS_ANY:
 		default:
@@ -3090,7 +3106,7 @@ lua_task_get_recipients (lua_State *L)
 				ptrs = task->rcpt_envelope;
 			}
 			else {
-				ptrs = task->rcpt_mime;
+				ptrs = MESSAGE_FIELD (task, rcpt_mime);
 			}
 			break;
 		}
@@ -3117,6 +3133,7 @@ lua_task_set_recipients (lua_State *L)
 	struct rspamd_email_address *addr = NULL;
 	gint what = 0, pos = 3;
 	const gchar *how = "rewrite";
+	gboolean need_update_digest = FALSE;
 
 	if (task && lua_gettop (L) >= 3) {
 
@@ -3134,7 +3151,8 @@ lua_task_set_recipients (lua_State *L)
 			break;
 		case RSPAMD_ADDRESS_MIME:
 			/* Here we check merely mime rcpt */
-			ptrs = task->rcpt_mime;
+			ptrs = MESSAGE_FIELD (task, rcpt_mime);
+			need_update_digest = TRUE;
 			break;
 		case RSPAMD_ADDRESS_ANY:
 		default:
@@ -3142,7 +3160,8 @@ lua_task_set_recipients (lua_State *L)
 				ptrs = task->rcpt_envelope;
 			}
 			else {
-				ptrs = task->rcpt_mime;
+				ptrs = MESSAGE_FIELD (task, rcpt_mime);
+				need_update_digest = TRUE;
 			}
 			break;
 		}
@@ -3162,6 +3181,11 @@ lua_task_set_recipients (lua_State *L)
 
 			for (lua_pushnil (L); lua_next (L, -2); lua_pop (L, 1)) {
 				if (lua_import_email_address (L, task, lua_gettop (L), &addr)) {
+
+					if (need_update_digest) {
+						rspamd_message_update_digest (task->message,
+								addr->addr, addr->addr_len);
+					}
 					g_ptr_array_add (ptrs, addr);
 				}
 			}
@@ -3220,14 +3244,14 @@ lua_task_has_from (lua_State *L)
 			break;
 		case RSPAMD_ADDRESS_MIME:
 			/* Here we check merely mime rcpt */
-			CHECK_EMAIL_ADDR_LIST (task->from_mime);
+			CHECK_EMAIL_ADDR_LIST (MESSAGE_FIELD (task, from_mime));
 			break;
 		case RSPAMD_ADDRESS_ANY:
 		default:
 			CHECK_EMAIL_ADDR (task->from_envelope);
 
 			if (!ret) {
-				CHECK_EMAIL_ADDR_LIST (task->from_mime);
+				CHECK_EMAIL_ADDR_LIST (MESSAGE_FIELD (task, from_mime));
 			}
 			break;
 		}
@@ -3262,14 +3286,14 @@ lua_task_has_recipients (lua_State *L)
 			break;
 		case RSPAMD_ADDRESS_MIME:
 			/* Here we check merely mime rcpt */
-			CHECK_EMAIL_ADDR_LIST (task->rcpt_mime);
+			CHECK_EMAIL_ADDR_LIST (MESSAGE_FIELD (task, rcpt_mime));
 			break;
 		case RSPAMD_ADDRESS_ANY:
 		default:
 			CHECK_EMAIL_ADDR_LIST (task->rcpt_envelope);
 
 			if (!ret) {
-				CHECK_EMAIL_ADDR_LIST (task->rcpt_mime);
+				CHECK_EMAIL_ADDR_LIST (MESSAGE_FIELD (task, rcpt_mime));
 			}
 			break;
 		}
@@ -3305,7 +3329,7 @@ lua_task_get_from (lua_State *L)
 			break;
 		case RSPAMD_ADDRESS_MIME:
 			/* Here we check merely mime rcpt */
-			addrs = task->from_mime;
+			addrs = MESSAGE_FIELD (task, from_mime);
 			break;
 		case RSPAMD_ADDRESS_ANY:
 		default:
@@ -3313,7 +3337,7 @@ lua_task_get_from (lua_State *L)
 				addr = task->from_envelope;
 			}
 			else {
-				addrs = task->from_mime;
+				addrs = MESSAGE_FIELD (task, from_mime);
 			}
 			break;
 		}
@@ -3351,6 +3375,7 @@ lua_task_set_from (lua_State *L)
 	const gchar *how = "rewrite";
 	GPtrArray *addrs = NULL;
 	struct rspamd_email_address **paddr = NULL, *addr;
+	gboolean need_update_digest = FALSE;
 	gint what = 0;
 
 	if (task && lua_gettop (L) >= 3) {
@@ -3367,7 +3392,8 @@ lua_task_set_from (lua_State *L)
 			break;
 		case RSPAMD_ADDRESS_MIME:
 			/* Here we check merely mime rcpt */
-			addrs = task->from_mime;
+			addrs = MESSAGE_FIELD (task, from_mime);
+			need_update_digest = TRUE;
 			break;
 		case RSPAMD_ADDRESS_ANY:
 		default:
@@ -3375,7 +3401,8 @@ lua_task_set_from (lua_State *L)
 				paddr = &task->from_envelope;
 			}
 			else {
-				addrs = task->from_mime;
+				addrs = MESSAGE_FIELD (task, from_mime);
+				need_update_digest = TRUE;
 			}
 			break;
 		}
@@ -3393,6 +3420,11 @@ lua_task_set_from (lua_State *L)
 					tmp->flags |= flags_add;
 				}
 
+				if (need_update_digest) {
+					rspamd_message_update_digest (task->message,
+							addr->addr, addr->addr_len);
+				}
+
 				g_ptr_array_add (addrs, addr);
 				lua_pushboolean (L, true);
 			}
@@ -3456,18 +3488,18 @@ lua_task_get_reply_sender (lua_State *L)
 	struct rspamd_mime_header *rh;
 
 	if (task) {
-		GPtrArray *ar;
 
-		ar = rspamd_message_get_header_array (task, "Reply-To", false);
+		rh = rspamd_message_get_header_array (task, "Reply-To");
 
-		if (ar && ar->len == 1) {
-			rh = (struct rspamd_mime_header *)g_ptr_array_index (ar, 0);
+		if (rh) {
 			lua_pushstring (L, rh->decoded);
 		}
-		else if (task->from_mime && task->from_mime->len == 1) {
+		else if (MESSAGE_FIELD (task, from_mime) &&
+				MESSAGE_FIELD (task, from_mime)->len == 1) {
 			struct rspamd_email_address *addr;
 
-			addr = (struct rspamd_email_address *)g_ptr_array_index (task->from_mime, 0);
+			addr = (struct rspamd_email_address *)g_ptr_array_index (
+					MESSAGE_FIELD (task, from_mime), 0);
 
 			lua_pushlstring (L, addr->addr, addr->addr_len);
 		}
@@ -3650,8 +3682,8 @@ lua_task_get_subject (lua_State *L)
 	struct rspamd_task *task = lua_check_task (L, 1);
 
 	if (task) {
-		if (task->subject != NULL) {
-			lua_pushstring (L, task->subject);
+		if (MESSAGE_FIELD (task, subject) != NULL) {
+			lua_pushstring (L, MESSAGE_FIELD (task, subject));
 			return 1;
 		}
 		else {
@@ -3751,12 +3783,10 @@ lua_task_get_images (lua_State *L)
 	struct rspamd_image **pimg;
 
 	if (task) {
-		if (!lua_task_get_cached (L, task, "images", task->parts->len)) {
-			lua_createtable (L, task->parts->len, 0);
-
-			for (i = 0; i < task->parts->len; i ++) {
-				part = g_ptr_array_index (task->parts, i);
+		if (!lua_task_get_cached (L, task, "images")) {
+			lua_createtable (L, MESSAGE_FIELD (task, parts)->len, 0);
 
+			PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, parts), i, part) {
 				if (part->flags & RSPAMD_MIME_PART_IMAGE) {
 					pimg = lua_newuserdata (L, sizeof (struct rspamd_image *));
 					rspamd_lua_setclass (L, "rspamd{image}", -1);
@@ -3765,7 +3795,7 @@ lua_task_get_images (lua_State *L)
 				}
 			}
 
-			lua_task_set_cached (L, task, "images", -1, task->parts->len);
+			lua_task_set_cached (L, task, "images", -1);
 		}
 	}
 	else {
@@ -3785,12 +3815,10 @@ lua_task_get_archives (lua_State *L)
 	struct rspamd_archive **parch;
 
 	if (task) {
-		if (!lua_task_get_cached (L, task, "archives", task->parts->len)) {
-			lua_createtable (L, task->parts->len, 0);
-
-			for (i = 0; i < task->parts->len; i ++) {
-				part = g_ptr_array_index (task->parts, i);
+		if (!lua_task_get_cached (L, task, "archives")) {
+			lua_createtable (L, MESSAGE_FIELD (task, parts)->len, 0);
 
+			PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, parts), i, part) {
 				if (part->flags & RSPAMD_MIME_PART_ARCHIVE) {
 					parch = lua_newuserdata (L, sizeof (struct rspamd_archive *));
 					rspamd_lua_setclass (L, "rspamd{archive}", -1);
@@ -3799,7 +3827,7 @@ lua_task_get_archives (lua_State *L)
 				}
 			}
 
-			lua_task_set_cached (L, task, "archives", -1, task->parts->len);
+			lua_task_set_cached (L, task, "archives", -1);
 		}
*** OUTPUT TRUNCATED, 210 LINES SKIPPED ***


More information about the Commits mailing list