summaryrefslogtreecommitdiffstats
path: root/src/lua
diff options
context:
space:
mode:
authorMikhail Galanin <mgalanin@mimecast.com>2018-07-31 15:53:51 +0100
committerMikhail Galanin <mgalanin@mimecast.com>2018-07-31 15:53:51 +0100
commitdaa0c73eee23fea675fc733482248722657f6a56 (patch)
treecd1b224cede1b8766f865789261801a03ba875ee /src/lua
parent8da3d333136e031cd4888dbd850eb60406cee5e7 (diff)
downloadrspamd-daa0c73eee23fea675fc733482248722657f6a56.tar.gz
rspamd-daa0c73eee23fea675fc733482248722657f6a56.zip
[Minor] added test parsing html/phished urls
Diffstat (limited to 'src/lua')
-rw-r--r--src/lua/lua_task.c59
-rw-r--r--src/lua/lua_util.c58
2 files changed, 112 insertions, 5 deletions
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
*/
@@ -666,17 +666,67 @@ lua_util_load_rspamd_config (lua_State *L)
}
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;