summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-04-15 15:10:26 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-04-15 15:10:26 +0100
commit89876fcf9bd2df947747c5fbc1b5267c92b5c021 (patch)
tree98799d12f91328938277437c479644d390c1cf0a
parent055c4b9f6fb365c80a4075b26fb3b5d005e79cc4 (diff)
downloadrspamd-89876fcf9bd2df947747c5fbc1b5267c92b5c021.tar.gz
rspamd-89876fcf9bd2df947747c5fbc1b5267c92b5c021.zip
Move url functions to a separate module.
-rw-r--r--src/lua/CMakeLists.txt3
-rw-r--r--src/lua/lua_common.h4
-rw-r--r--src/lua/lua_task.c150
-rw-r--r--src/lua/lua_url.c220
4 files changed, 229 insertions, 148 deletions
diff --git a/src/lua/CMakeLists.txt b/src/lua/CMakeLists.txt
index 57503a3b6..4c7867b71 100644
--- a/src/lua/CMakeLists.txt
+++ b/src/lua/CMakeLists.txt
@@ -19,6 +19,7 @@ SET(LUASRC ${CMAKE_CURRENT_SOURCE_DIR}/lua_common.c
${CMAKE_CURRENT_SOURCE_DIR}/lua_ip.c
${CMAKE_CURRENT_SOURCE_DIR}/lua_expression.c
${CMAKE_CURRENT_SOURCE_DIR}/lua_trie.c
- ${CMAKE_CURRENT_SOURCE_DIR}/lua_mimepart.c)
+ ${CMAKE_CURRENT_SOURCE_DIR}/lua_mimepart.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/lua_url.c)
SET(RSPAMD_LUA ${LUASRC} PARENT_SCOPE) \ No newline at end of file
diff --git a/src/lua/lua_common.h b/src/lua/lua_common.h
index ebea72c39..fe4344c20 100644
--- a/src/lua/lua_common.h
+++ b/src/lua/lua_common.h
@@ -67,6 +67,10 @@ struct rspamd_lua_text {
gsize len;
};
+struct rspamd_lua_url {
+ struct rspamd_url *url;
+};
+
/* Common utility functions */
diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c
index 90bf39e1b..1789fbe24 100644
--- a/src/lua/lua_task.c
+++ b/src/lua/lua_task.c
@@ -517,27 +517,6 @@ static const struct luaL_reg imagelib_m[] = {
{NULL, NULL}
};
-/* URL methods */
-LUA_FUNCTION_DEF (url, get_length);
-LUA_FUNCTION_DEF (url, get_host);
-LUA_FUNCTION_DEF (url, get_user);
-LUA_FUNCTION_DEF (url, get_path);
-LUA_FUNCTION_DEF (url, get_text);
-LUA_FUNCTION_DEF (url, is_phished);
-LUA_FUNCTION_DEF (url, get_phished);
-
-static const struct luaL_reg urllib_m[] = {
- LUA_INTERFACE_DEF (url, get_length),
- LUA_INTERFACE_DEF (url, get_host),
- LUA_INTERFACE_DEF (url, get_user),
- LUA_INTERFACE_DEF (url, get_path),
- LUA_INTERFACE_DEF (url, get_text),
- LUA_INTERFACE_DEF (url, is_phished),
- LUA_INTERFACE_DEF (url, get_phished),
- {"__tostring", rspamd_lua_class_tostring},
- {NULL, NULL}
-};
-
/* Blob methods */
LUA_FUNCTION_DEF (text, len);
LUA_FUNCTION_DEF (text, str);
@@ -566,14 +545,6 @@ lua_check_image (lua_State * L)
return ud ? *((struct rspamd_image **)ud) : NULL;
}
-static struct rspamd_url *
-lua_check_url (lua_State * L)
-{
- void *ud = luaL_checkudata (L, 1, "rspamd{url}");
- luaL_argcheck (L, ud != NULL, 1, "'url' expected");
- return ud ? *((struct rspamd_url **)ud) : NULL;
-}
-
struct rspamd_lua_text *
lua_check_text (lua_State * L, gint pos)
{
@@ -817,12 +788,12 @@ struct lua_tree_cb_data {
static void
lua_tree_url_callback (gpointer key, gpointer value, gpointer ud)
{
- struct rspamd_url **purl;
+ struct rspamd_lua_url *url;
struct lua_tree_cb_data *cb = ud;
- purl = lua_newuserdata (cb->L, sizeof (struct rspamd_url *));
+ url = lua_newuserdata (cb->L, sizeof (struct rspamd_lua_url));
rspamd_lua_setclass (cb->L, "rspamd{url}", -1);
- *purl = value;
+ url->url = value;
lua_rawseti (cb->L, -2, cb->i++);
}
@@ -1980,114 +1951,6 @@ lua_image_get_filename (lua_State *L)
return 1;
}
-/* URL part */
-static gint
-lua_url_get_length (lua_State *L)
-{
- struct rspamd_url *url = lua_check_url (L);
-
- if (url != NULL) {
- lua_pushinteger (L, strlen (struri (url)));
- }
- else {
- lua_pushnil (L);
- }
- return 1;
-}
-
-static gint
-lua_url_get_host (lua_State *L)
-{
- struct rspamd_url *url = lua_check_url (L);
-
- if (url != NULL) {
- lua_pushlstring (L, url->host, url->hostlen);
- }
- else {
- lua_pushnil (L);
- }
- return 1;
-}
-
-static gint
-lua_url_get_user (lua_State *L)
-{
- struct rspamd_url *url = lua_check_url (L);
-
- if (url != NULL && url->user != NULL) {
- lua_pushlstring (L, url->user, url->userlen);
- }
- else {
- lua_pushnil (L);
- }
-
- return 1;
-}
-
-static gint
-lua_url_get_path (lua_State *L)
-{
- struct rspamd_url *url = lua_check_url (L);
-
- if (url != NULL) {
- lua_pushlstring (L, url->data, url->datalen);
- }
- else {
- lua_pushnil (L);
- }
-
- return 1;
-}
-
-static gint
-lua_url_get_text (lua_State *L)
-{
- struct rspamd_url *url = lua_check_url (L);
-
- if (url != NULL) {
- lua_pushstring (L, struri (url));
- }
- else {
- lua_pushnil (L);
- }
-
- return 1;
-}
-
-static gint
-lua_url_is_phished (lua_State *L)
-{
- struct rspamd_url *url = lua_check_url (L);
-
- if (url != NULL) {
- lua_pushboolean (L, url->is_phished);
- }
- else {
- lua_pushnil (L);
- }
-
- return 1;
-}
-
-static gint
-lua_url_get_phished (lua_State *L)
-{
- struct rspamd_url **purl, *url = lua_check_url (L);
-
- if (url) {
- if (url->is_phished && url->phished_url != NULL) {
- purl = lua_newuserdata (L, sizeof (struct rspamd_url *));
- rspamd_lua_setclass (L, "rspamd{url}", -1);
- *purl = url->phished_url;
-
- return 1;
- }
- }
-
- lua_pushnil (L);
- return 1;
-}
-
/* Text methods */
static gint
lua_text_len (lua_State *L)
@@ -2147,13 +2010,6 @@ luaopen_image (lua_State * L)
}
void
-luaopen_url (lua_State * L)
-{
- rspamd_lua_new_class (L, "rspamd{url}", urllib_m);
- lua_pop (L, 1); /* remove metatable from stack */
-}
-
-void
luaopen_text (lua_State *L)
{
rspamd_lua_new_class (L, "rspamd{text}", textlib_m);
diff --git a/src/lua/lua_url.c b/src/lua/lua_url.c
new file mode 100644
index 000000000..35486d0da
--- /dev/null
+++ b/src/lua/lua_url.c
@@ -0,0 +1,220 @@
+/* Copyright (c) 2015, Vsevolod Stakhov
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "lua_common.h"
+
+/* URL methods */
+LUA_FUNCTION_DEF (url, get_length);
+LUA_FUNCTION_DEF (url, get_host);
+LUA_FUNCTION_DEF (url, get_user);
+LUA_FUNCTION_DEF (url, get_path);
+LUA_FUNCTION_DEF (url, get_text);
+LUA_FUNCTION_DEF (url, is_phished);
+LUA_FUNCTION_DEF (url, get_phished);
+LUA_FUNCTION_DEF (url, create);
+
+static const struct luaL_reg urllib_m[] = {
+ LUA_INTERFACE_DEF (url, get_length),
+ LUA_INTERFACE_DEF (url, get_host),
+ LUA_INTERFACE_DEF (url, get_user),
+ LUA_INTERFACE_DEF (url, get_path),
+ LUA_INTERFACE_DEF (url, get_text),
+ LUA_INTERFACE_DEF (url, is_phished),
+ LUA_INTERFACE_DEF (url, get_phished),
+ {"__tostring", lua_url_get_text},
+ {NULL, NULL}
+};
+
+static const struct luaL_reg urllib_f[] = {
+ LUA_INTERFACE_DEF (url, create),
+ {NULL, NULL}
+};
+
+static struct rspamd_lua_url *
+lua_check_url (lua_State * L, gint pos)
+{
+ void *ud = luaL_checkudata (L, pos, "rspamd{url}");
+ luaL_argcheck (L, ud != NULL, pos, "'url' expected");
+ return ud ? ((struct rspamd_lua_url *)ud) : NULL;
+}
+
+
+static gint
+lua_url_get_length (lua_State *L)
+{
+ struct rspamd_lua_url *url = lua_check_url (L, 1);
+
+ if (url != NULL) {
+ lua_pushinteger (L, url->url->urllen);
+ }
+ else {
+ lua_pushnil (L);
+ }
+ return 1;
+}
+
+static gint
+lua_url_get_host (lua_State *L)
+{
+ struct rspamd_lua_url *url = lua_check_url (L, 1);
+
+ if (url != NULL) {
+ lua_pushlstring (L, url->url->host, url->url->hostlen);
+ }
+ else {
+ lua_pushnil (L);
+ }
+ return 1;
+}
+
+static gint
+lua_url_get_user (lua_State *L)
+{
+ struct rspamd_lua_url *url = lua_check_url (L, 1);
+
+ if (url != NULL && url->url->user != NULL) {
+ lua_pushlstring (L, url->url->user, url->url->userlen);
+ }
+ else {
+ lua_pushnil (L);
+ }
+
+ return 1;
+}
+
+static gint
+lua_url_get_path (lua_State *L)
+{
+ struct rspamd_lua_url *url = lua_check_url (L, 1);
+
+ if (url != NULL) {
+ lua_pushlstring (L, url->url->data, url->url->datalen);
+ }
+ else {
+ lua_pushnil (L);
+ }
+
+ return 1;
+}
+
+static gint
+lua_url_get_text (lua_State *L)
+{
+ struct rspamd_lua_url *url = lua_check_url (L, 1);
+
+ if (url != NULL) {
+ lua_pushlstring (L, url->url->string, url->url->urllen);
+ }
+ else {
+ lua_pushnil (L);
+ }
+
+ return 1;
+}
+
+static gint
+lua_url_is_phished (lua_State *L)
+{
+ struct rspamd_lua_url *url = lua_check_url (L, 1);
+
+ if (url != NULL) {
+ lua_pushboolean (L, url->url->is_phished);
+ }
+ else {
+ lua_pushnil (L);
+ }
+
+ return 1;
+}
+
+static gint
+lua_url_get_phished (lua_State *L)
+{
+ struct rspamd_lua_url *purl, *url = lua_check_url (L, 1);
+
+ if (url) {
+ if (url->url->is_phished && url->url->phished_url != NULL) {
+ purl = lua_newuserdata (L, sizeof (struct rspamd_lua_url));
+ rspamd_lua_setclass (L, "rspamd{url}", -1);
+ purl->url = url->url->phished_url;
+
+ return 1;
+ }
+ }
+
+ lua_pushnil (L);
+ return 1;
+}
+
+static gint
+lua_url_create (lua_State *L)
+{
+ struct rspamd_url *url;
+ struct rspamd_lua_url *lua_url;
+ rspamd_mempool_t *pool = rspamd_lua_check_mempool (L, 1);
+ const gchar *text;
+
+ if (pool == NULL) {
+ lua_pushnil (L);
+ }
+ else {
+ text = luaL_checkstring (L, 2);
+
+ if (text != NULL) {
+ url = rspamd_url_get_next (pool, text, NULL, NULL);
+
+ if (url == NULL) {
+ lua_pushnil (L);
+ }
+ else {
+ lua_url = lua_newuserdata (L, sizeof (struct rspamd_lua_url));
+ rspamd_lua_setclass (L, "rspamd{url}", -1);
+ lua_url->url = url;
+ }
+ }
+ else {
+ lua_pushnil (L);
+ }
+ }
+
+
+ return 1;
+}
+
+static gint
+lua_load_url (lua_State * L)
+{
+ lua_newtable (L);
+ luaL_register (L, NULL, urllib_f);
+
+ return 1;
+}
+
+void
+luaopen_url (lua_State * L)
+{
+ rspamd_lua_new_class (L, "rspamd{url}", urllib_m);
+ lua_pop (L, 1);
+
+ rspamd_lua_add_preload (L, "rspamd_url", lua_load_url);
+}