aboutsummaryrefslogtreecommitdiffstats
path: root/src/lua/lua_url.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua/lua_url.c')
-rw-r--r--src/lua/lua_url.c89
1 files changed, 77 insertions, 12 deletions
diff --git a/src/lua/lua_url.c b/src/lua/lua_url.c
index 648de08d8..5dec8ddaa 100644
--- a/src/lua/lua_url.c
+++ b/src/lua/lua_url.c
@@ -59,6 +59,7 @@ LUA_FUNCTION_DEF (url, is_obscured);
LUA_FUNCTION_DEF (url, is_html_displayed);
LUA_FUNCTION_DEF (url, is_subject);
LUA_FUNCTION_DEF (url, get_phished);
+LUA_FUNCTION_DEF (url, set_redirected);
LUA_FUNCTION_DEF (url, get_count);
LUA_FUNCTION_DEF (url, get_visible);
LUA_FUNCTION_DEF (url, create);
@@ -89,6 +90,7 @@ static const struct luaL_reg urllib_m[] = {
LUA_INTERFACE_DEF (url, get_count),
LUA_INTERFACE_DEF (url, get_flags),
{"get_redirected", lua_url_get_phished},
+ LUA_INTERFACE_DEF (url, set_redirected),
{"__tostring", lua_url_tostring},
{NULL, NULL}
};
@@ -108,6 +110,17 @@ lua_check_url (lua_State * L, gint pos)
return ud ? ((struct rspamd_lua_url *)ud) : NULL;
}
+static void
+lua_url_single_inserter (struct rspamd_url *url, gsize start_offset,
+ gsize end_offset, gpointer ud)
+{
+ lua_State *L = ud;
+ struct rspamd_lua_url *lua_url;
+
+ lua_url = lua_newuserdata (L, sizeof (struct rspamd_lua_url));
+ rspamd_lua_setclass (L, "rspamd{url}", -1);
+ lua_url->url = url;
+}
/***
* @method url:get_length()
@@ -462,6 +475,70 @@ lua_url_get_phished (lua_State *L)
}
/***
+ * @method url:set_redirected(url,[ pool])
+ * Set url as redirected to another url
+ * @param {string|url} url new url that is redirecting an old one
+ * @param {pool} pool if url is a string this is required for parsing
+ * @return {url} parsed redirected url (if needed)
+ */
+static gint
+lua_url_set_redirected (lua_State *L)
+{
+ LUA_TRACE_POINT;
+ struct rspamd_lua_url *url = lua_check_url (L, 1), *redir;
+ rspamd_mempool_t *pool = NULL;
+
+ if (url == NULL) {
+ return luaL_error (L, "url is required as the first argument");
+ }
+
+ if (lua_type (L, 2) == LUA_TSTRING) {
+ /* Parse url */
+ if (lua_type (L, 3) != LUA_TUSERDATA) {
+ return luaL_error (L, "mempool is required as the third argument");
+ }
+
+ pool = rspamd_lua_check_mempool (L, 3);
+
+ if (pool == NULL) {
+ return luaL_error (L, "mempool is required as the third argument");
+ }
+
+ gsize len;
+ const gchar *urlstr = lua_tolstring (L, 2, &len);
+
+ rspamd_url_find_single (pool, urlstr, len, RSPAMD_URL_FIND_ALL,
+ lua_url_single_inserter, L);
+
+ if (lua_type (L, -1) != LUA_TUSERDATA) {
+ /* URL is actually not found */
+ lua_pushnil (L);
+ }
+ else {
+ redir = lua_check_url (L, -1);
+
+ url->url->flags |= RSPAMD_URL_FLAG_REDIRECTED;
+ url->url->phished_url = redir->url;
+ }
+ }
+ else {
+ redir = lua_check_url (L, 2);
+
+ if (redir == NULL) {
+ return luaL_error (L, "url is required as the second argument");
+ }
+
+ url->url->flags |= RSPAMD_URL_FLAG_REDIRECTED;
+ url->url->phished_url = redir->url;
+
+ /* Push back on stack */
+ lua_pushvalue (L, 2);
+ }
+
+ return 1;
+}
+
+/***
* @method url:get_tld()
* Get effective second level domain part (eSLD) of the url host
* @return {string} effective second level domain part (eSLD) of the url host
@@ -625,18 +702,6 @@ lua_url_to_table (lua_State *L)
return 1;
}
-static void
-lua_url_single_inserter (struct rspamd_url *url, gsize start_offset,
- gsize end_offset, gpointer ud)
-{
- lua_State *L = ud;
- struct rspamd_lua_url *lua_url;
-
- lua_url = lua_newuserdata (L, sizeof (struct rspamd_lua_url));
- rspamd_lua_setclass (L, "rspamd{url}", -1);
- lua_url->url = url;
-}
-
/***
* @function url.create([mempool,] str)