From daa0c73eee23fea675fc733482248722657f6a56 Mon Sep 17 00:00:00 2001
From: Mikhail Galanin <mgalanin@mimecast.com>
Date: Tue, 31 Jul 2018 15:53:51 +0100
Subject: [Minor] added test parsing html/phished urls

---
 src/lua/lua_task.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/lua/lua_util.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 112 insertions(+), 5 deletions(-)

(limited to 'src')

diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c
index ca10a94e7..e4fcea3a4 100644
--- a/src/lua/lua_task.c
+++ b/src/lua/lua_task.c
@@ -53,6 +53,12 @@ end
  * @return {boolean},{rspamd_task|error} status + new task or error message
  */
 LUA_FUNCTION_DEF (task, load_from_file);
+/***
+ * @function rspamd_task.load_from_string(message[, cfg])
+ * Loads a message from specific file
+ * @return {boolean},{rspamd_task|error} status + new task or error message
+ */
+LUA_FUNCTION_DEF (task, load_from_string);
 
 LUA_FUNCTION_DEF (task, get_message);
 /***
@@ -908,6 +914,7 @@ LUA_FUNCTION_DEF (task, get_stat_tokens);
 
 static const struct luaL_reg tasklib_f[] = {
 	LUA_INTERFACE_DEF (task, load_from_file),
+	LUA_INTERFACE_DEF (task, load_from_string),
 	{NULL, NULL}
 };
 
@@ -1237,7 +1244,7 @@ lua_task_unmap_dtor (gpointer p)
 	}
 }
 
-static int
+static gint
 lua_task_load_from_file (lua_State * L)
 {
 	struct rspamd_task *task = NULL, **ptask;
@@ -1295,6 +1302,56 @@ lua_task_load_from_file (lua_State * L)
 	return 2;
 }
 
+static gint
+lua_task_load_from_string (lua_State * L)
+{
+	struct rspamd_task *task = NULL, **ptask;
+	const gchar *str_message = luaL_checkstring (L, 1), *err = NULL;
+	gsize message_len = lua_strlen(L, 1);
+	struct rspamd_config *cfg = NULL;
+	gboolean res = FALSE;
+
+	if (str_message) {
+
+		if (lua_type (L, 2) == LUA_TUSERDATA) {
+			gpointer p;
+			p = rspamd_lua_check_udata_maybe (L, 2, "rspamd{config}");
+
+			if (p) {
+				cfg = *(struct rspamd_config **)p;
+			}
+		}
+
+		task = rspamd_task_new (NULL, cfg, NULL, NULL);
+		task->msg.begin = str_message;
+		task->msg.len   = message_len;
+		rspamd_mempool_add_destructor (task->task_pool,
+									   lua_task_unmap_dtor, task);
+		res = TRUE;
+	}
+	else {
+		return luaL_error (L, "invalid arguments");
+	}
+
+	lua_pushboolean (L, res);
+
+	if (res) {
+		ptask = lua_newuserdata (L, sizeof (*ptask));
+		*ptask = task;
+		rspamd_lua_setclass (L, "rspamd{task}", -1);
+	}
+	else {
+		if (err) {
+			lua_pushstring (L, err);
+		}
+		else {
+			lua_pushnil (L);
+		}
+	}
+
+	return 2;
+}
+
 static int
 lua_task_get_mempool (lua_State * L)
 {
diff --git a/src/lua/lua_util.c b/src/lua/lua_util.c
index 063a7aab7..f0feb7f2e 100644
--- a/src/lua/lua_util.c
+++ b/src/lua/lua_util.c
@@ -45,7 +45,7 @@ LUA_FUNCTION_DEF (util, create_event_base);
  */
 LUA_FUNCTION_DEF (util, load_rspamd_config);
 /***
- * @function util.config_from_ucl(any)
+ * @function util.config_from_ucl(any, string)
  * Load rspamd config from ucl reperesented by any lua table
  * @return {confg} new configuration object suitable for access
  */
@@ -665,18 +665,68 @@ lua_util_load_rspamd_config (lua_State *L)
 	return 1;
 }
 
+static gint
+parse_config_options(const char *str_options)
+{
+	gint ret = 0;
+	gchar **vec;
+	const gchar *str;
+	guint i, l;
+
+	vec = g_strsplit_set (str_options, ",;", -1);
+	if (vec) {
+		l = g_strv_length (vec);
+		for (i = 0; i < l; i ++) {
+			str = vec[i];
+
+			if (g_ascii_strcasecmp (str, "INIT_URL") == 0) {
+				ret |= RSPAMD_CONFIG_INIT_URL;
+			} else if (g_ascii_strcasecmp (str, "INIT_LIBS") == 0) {
+				ret |= RSPAMD_CONFIG_INIT_LIBS;
+			} else if (g_ascii_strcasecmp (str, "INIT_SYMCACHE") == 0) {
+				ret |= RSPAMD_CONFIG_INIT_SYMCACHE;
+			} else if (g_ascii_strcasecmp (str, "INIT_VALIDATE") == 0) {
+				ret |= RSPAMD_CONFIG_INIT_VALIDATE;
+			} else if (g_ascii_strcasecmp (str, "INIT_NO_TLD") == 0) {
+				ret |= RSPAMD_CONFIG_INIT_NO_TLD;
+			} else if (g_ascii_strcasecmp (str, "INIT_PRELOAD_MAPS") == 0) {
+				ret |= RSPAMD_CONFIG_INIT_PRELOAD_MAPS;
+			} else {
+				msg_warn ("bad type: %s", str);
+			}
+		}
+
+		g_strfreev (vec);
+	}
+
+	return ret;
+}
+
 static gint
 lua_util_config_from_ucl (lua_State *L)
 {
-	struct rspamd_config *cfg, **pcfg;
+	struct rspamd_config *cfg = NULL, **pcfg;
 	struct rspamd_rcl_section *top;
 	GError *err = NULL;
 	ucl_object_t *obj;
+	const char *str_options = NULL;
+	gint int_options = 0;
+
 
 	obj = ucl_object_lua_import (L, 1);
+	if (lua_gettop (L) == 2) {
+		if (lua_type (L, 2) == LUA_TSTRING) {
+			str_options = lua_tostring (L, 2);
+			int_options = parse_config_options(str_options);
+		}
+		else {
+			msg_err_config ("config_from_ucl: second parameter is expected to be string");
+			ucl_object_unref (obj);
+			lua_pushnil (L);
+		}
+	}
 
 	if (obj) {
-		cfg = g_malloc0 (sizeof (struct rspamd_config));
 		cfg = rspamd_config_new (RSPAMD_CONFIG_INIT_SKIP_LUA);
 		cfg->lua_state = L;
 
@@ -690,7 +740,7 @@ lua_util_config_from_ucl (lua_State *L)
 			lua_pushnil (L);
 		}
 		else {
-			rspamd_config_post_load (cfg, 0);
+			rspamd_config_post_load (cfg, int_options);
 			pcfg = lua_newuserdata (L, sizeof (struct rspamd_config *));
 			rspamd_lua_setclass (L, "rspamd{config}", -1);
 			*pcfg = cfg;
-- 
cgit v1.2.3