commit 1d5ddb1: [Minor] Lua_task: Add support of shadow results

Vsevolod Stakhov vsevolod at highsecure.ru
Thu Apr 23 15:14:06 UTC 2020


Author: Vsevolod Stakhov
Date: 2020-04-23 16:07:52 +0100
URL: https://github.com/rspamd/rspamd/commit/1d5ddb1345f757a3af4cfde6a5213ac751d29baf

[Minor] Lua_task: Add support of shadow results

---
 src/lua/lua_task.c | 64 ++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 41 insertions(+), 23 deletions(-)

diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c
index 2ceb1c3c2..43f8580f3 100644
--- a/src/lua/lua_task.c
+++ b/src/lua/lua_task.c
@@ -642,7 +642,7 @@ LUA_FUNCTION_DEF (task, get_archives);
  */
 LUA_FUNCTION_DEF (task, get_dkim_results);
 /***
- * @method task:get_symbol(name)
+ * @method task:get_symbol(name, [shadow_result_name])
  * Searches for a symbol `name` in all metrics results and returns a list of tables
  * one per metric that describes the symbol inserted. Please note that this function
  * is intended to return values for **inserted** symbols, so if this symbol was not
@@ -654,7 +654,7 @@ LUA_FUNCTION_DEF (task, get_dkim_results);
  * - `options` - a table of strings representing options of a symbol
  * - `group` - a group of symbol (or 'ungrouped')
  * @param {string} name symbol's name
- * @return {list of tables} list of tables or nil if symbol was not found in any metric
+ * @return {list of tables} list of tables or nil if symbol was not found
  */
 LUA_FUNCTION_DEF (task, get_symbol);
 /***
@@ -664,7 +664,7 @@ LUA_FUNCTION_DEF (task, get_symbol);
  */
 LUA_FUNCTION_DEF (task, get_symbols_all);
 /***
- * @method task:get_symbols()
+ * @method task:get_symbols([shadow_result_name])
  * Returns array of all symbols matched for this task
  * @return {table, table} table of strings with symbols names + table of theirs scores
  */
@@ -704,7 +704,7 @@ LUA_FUNCTION_DEF (task, get_symbols_tokens);
 LUA_FUNCTION_DEF (task, process_ann_tokens);
 
 /***
- * @method task:has_symbol(name)
+ * @method task:has_symbol(name, [shadow_result_name])
  * Fast path to check if a specified symbol is in the task's results
  * @param {string} name symbol's name
  * @return {boolean} `true` if symbol has been found
@@ -4250,25 +4250,26 @@ lua_task_get_dkim_results (lua_State *L)
 
 static inline gboolean
 lua_push_symbol_result (lua_State *L,
-		struct rspamd_task *task,
-		const gchar *symbol,
-		struct rspamd_symbol_result *symbol_result,
-		gboolean add_metric,
-		gboolean add_name)
+						struct rspamd_task *task,
+						const gchar *symbol,
+						struct rspamd_symbol_result *symbol_result,
+						struct rspamd_scan_result *metric_res,
+						gboolean add_metric,
+						gboolean add_name)
 {
-	struct rspamd_scan_result *metric_res;
+
 	struct rspamd_symbol_result *s = NULL;
 	struct rspamd_symbol_option *opt;
 	struct rspamd_symbols_group *sym_group;
 	guint i;
-	gint j = 1, e = 4;
+	gint j = 1, table_fields_cnt = 4;
 
-	if (!symbol_result) {
+	if (!metric_res) {
 		metric_res = task->result;
+	}
 
-		if (metric_res) {
-			s = rspamd_task_find_symbol_result (task, symbol, NULL);
-		}
+	if (!symbol_result) {
+		s = rspamd_task_find_symbol_result (task, symbol, metric_res);
 	}
 	else {
 		s = symbol_result;
@@ -4276,13 +4277,13 @@ lua_push_symbol_result (lua_State *L,
 
 	if (s) {
 		if (add_metric) {
-			e++;
+			table_fields_cnt++;
 		}
 		if (add_name) {
-			e++;
+			table_fields_cnt++;
 		}
 
-		lua_createtable (L, 0, e);
+		lua_createtable (L, 0, table_fields_cnt);
 
 		if (add_name) {
 			lua_pushstring (L, "name");
@@ -4339,16 +4340,27 @@ lua_task_get_symbol (lua_State *L)
 	struct rspamd_task *task = lua_check_task (L, 1);
 	const gchar *symbol;
 	gboolean found = FALSE;
-	gint i = 1;
 
 	symbol = luaL_checkstring (L, 2);
 
 	if (task && symbol) {
+		struct rspamd_scan_result *sres = NULL;
+
+		if (lua_isstring (L, 3)) {
+			sres = rspamd_find_metric_result (task, lua_tostring (L, 3));
+
+			if (sres == NULL) {
+				return luaL_error (L, "invalid scan result: %s",
+						lua_tostring (L, 3));
+			}
+		}
+
+		/* Always push as a table for compatibility :( */
 		lua_createtable (L, 1, 0);
 
 		if ((found = lua_push_symbol_result (L, task, symbol,
-				NULL, TRUE, FALSE))) {
-			lua_rawseti (L, -2, i++);
+				NULL, sres, TRUE, FALSE))) {
+			lua_rawseti (L, -2, 1);
 		}
 		else {
 			/* Pop table */
@@ -4377,7 +4389,13 @@ lua_task_has_symbol (lua_State *L)
 	symbol = luaL_checkstring (L, 2);
 
 	if (task && symbol) {
-		found = (rspamd_task_find_symbol_result (task, symbol, NULL) != NULL);
+		if (lua_isstring (L, 3)) {
+			found = (rspamd_task_find_symbol_result (task, symbol,
+					rspamd_find_metric_result (task, lua_tostring (L, 3))) != NULL);
+		}
+		else {
+			found = (rspamd_task_find_symbol_result (task, symbol, NULL) != NULL);
+		}
 		lua_pushboolean (L, found);
 	}
 	else {
@@ -4494,7 +4512,7 @@ lua_task_get_symbols_all (lua_State *L)
 
 			kh_foreach_value_ptr (mres->symbols, s, {
 				if (!(s->flags & RSPAMD_SYMBOL_RESULT_IGNORED)) {
-					lua_push_symbol_result (L, task, s->name, s, FALSE, TRUE);
+					lua_push_symbol_result (L, task, s->name, s, mres, FALSE, TRUE);
 					lua_rawseti (L, -2, i++);
 				}
 			});


More information about the Commits mailing list