summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libserver/url.c22
-rw-r--r--src/libserver/url.h8
-rw-r--r--src/lua/lua_url.c81
3 files changed, 101 insertions, 10 deletions
diff --git a/src/libserver/url.c b/src/libserver/url.c
index 7df4cb98a..4252d5ac1 100644
--- a/src/libserver/url.c
+++ b/src/libserver/url.c
@@ -48,6 +48,7 @@
#include "http.h"
#include "multipattern.h"
#include "http_parser.h"
+#include "contrib/uthash/utlist.h"
typedef struct url_match_s {
const gchar *m_begin;
@@ -2543,15 +2544,28 @@ rspamd_url_task_callback (struct rspamd_url *url, gsize start_offset,
void
rspamd_url_add_tag (struct rspamd_url *url, const gchar *tag,
+ const gchar *value,
rspamd_mempool_t *pool)
{
- g_assert (url != NULL && tag != NULL);
+ struct rspamd_url_tag *found, *ntag;
+
+ g_assert (url != NULL && tag != NULL && value != NULL);
if (url->tags == NULL) {
- url->tags = g_ptr_array_sized_new (2);
- rspamd_mempool_add_destructor (pool, rspamd_ptr_array_free_hard, url->tags);
+ url->tags = g_hash_table_new (rspamd_strcase_hash, rspamd_strcase_equal);
+ rspamd_mempool_add_destructor (pool,
+ (rspamd_mempool_destruct_t)g_hash_table_unref, url->tags);
}
- g_ptr_array_add (url->tags, rspamd_mempool_strdup (pool, tag));
+ found = g_hash_table_lookup (url->tags, tag);
+
+ ntag = rspamd_mempool_alloc0 (pool, sizeof (*ntag));
+ ntag->data = rspamd_mempool_strdup (pool, value);
+
+ if (found == NULL) {
+ g_hash_table_insert (url->tags, rspamd_mempool_strdup (pool, tag),
+ ntag);
+ }
+ DL_APPEND (found, ntag);
}
diff --git a/src/libserver/url.h b/src/libserver/url.h
index eb70a9672..dbe3eb00b 100644
--- a/src/libserver/url.h
+++ b/src/libserver/url.h
@@ -16,6 +16,11 @@ enum rspamd_url_flags {
RSPAMD_URL_FLAG_REDIRECTED = 1 << 3,
};
+struct rspamd_url_tag {
+ const gchar *data;
+ struct rspamd_url_tag *prev, *next;
+};
+
struct rspamd_url {
gchar *string;
gint protocol;
@@ -42,7 +47,7 @@ struct rspamd_url {
guint urllen;
enum rspamd_url_flags flags;
- GPtrArray *tags;
+ GHashTable *tags;
};
enum uri_errno {
@@ -169,6 +174,7 @@ void rspamd_url_task_callback (struct rspamd_url *url, gsize start_offset,
* @param pool
*/
void rspamd_url_add_tag (struct rspamd_url *url, const gchar *tag,
+ const gchar *value,
rspamd_mempool_t *pool);
#endif
diff --git a/src/lua/lua_url.c b/src/lua/lua_url.c
index eddef32d6..cdc74e8d8 100644
--- a/src/lua/lua_url.c
+++ b/src/lua/lua_url.c
@@ -14,6 +14,7 @@
* limitations under the License.
*/
#include "lua_common.h"
+#include "contrib/uthash/utlist.h"
/***
* @module rspamd_url
@@ -52,6 +53,7 @@ LUA_FUNCTION_DEF (url, is_phished);
LUA_FUNCTION_DEF (url, is_redirected);
LUA_FUNCTION_DEF (url, is_obscured);
LUA_FUNCTION_DEF (url, get_phished);
+LUA_FUNCTION_DEF (url, get_tag);
LUA_FUNCTION_DEF (url, get_tags);
LUA_FUNCTION_DEF (url, add_tag);
LUA_FUNCTION_DEF (url, create);
@@ -73,6 +75,7 @@ static const struct luaL_reg urllib_m[] = {
LUA_INTERFACE_DEF (url, is_redirected),
LUA_INTERFACE_DEF (url, is_obscured),
LUA_INTERFACE_DEF (url, get_phished),
+ LUA_INTERFACE_DEF (url, get_tag),
LUA_INTERFACE_DEF (url, get_tags),
LUA_INTERFACE_DEF (url, add_tag),
{"get_redirected", lua_url_get_phished},
@@ -314,6 +317,53 @@ lua_url_is_obscured (lua_State *L)
}
/***
+ * @method url:get_tag(tag)
+ * Returns list of string for a specific tagname for an url
+ * @return {table/strings} list of tags for an url
+ */
+static gint
+lua_url_get_tag (lua_State *L)
+{
+ struct rspamd_lua_url *url = lua_check_url (L, 1);
+ guint i;
+ const gchar *tag = luaL_checkstring (L, 2);
+ GHashTableIter it;
+ struct rspamd_url_tag *tval, *cur;
+ gpointer k, v;
+
+ if (url != NULL && tag != NULL) {
+
+ if (url->url->tags == NULL) {
+ lua_createtable (L, 0, 0);
+ }
+ else {
+ tval = g_hash_table_lookup (url->url->tags, tag);
+
+ if (tval) {
+ lua_newtable (L);
+ i = 1;
+
+ DL_FOREACH (tval, cur) {
+ lua_pushstring (L, cur->data);
+ lua_rawseti (L, -2, i ++);
+ }
+
+ lua_settable (L, -3);
+ }
+ else {
+ lua_createtable (L, 0, 0);
+ }
+ }
+ }
+ else {
+ lua_pushnil (L);
+ }
+
+ return 1;
+}
+
+
+/***
* @method url:get_tags()
* Returns list of string tags for an url
* @return {table/strings} list of tags for an url
@@ -324,17 +374,30 @@ lua_url_get_tags (lua_State *L)
struct rspamd_lua_url *url = lua_check_url (L, 1);
guint i;
const gchar *tag;
+ GHashTableIter it;
+ struct rspamd_url_tag *tval, *cur;
+ gpointer k, v;
if (url != NULL) {
if (url->url->tags == NULL) {
lua_createtable (L, 0, 0);
}
else {
- lua_createtable (L, url->url->tags->len, 0);
+ lua_createtable (L, 0, g_hash_table_size (url->url->tags));
+ g_hash_table_iter_init (&it, url->url->tags);
+
+ while (g_hash_table_iter_next (&it, &k, &v)) {
+ tval = v;
+ lua_pushstring (L, (const gchar *)k);
+ lua_newtable (L);
+ i = 1;
+
+ DL_FOREACH (tval, cur) {
+ lua_pushstring (L, cur->data);
+ lua_rawseti (L, -2, i ++);
+ }
- PTR_ARRAY_FOREACH (url->url->tags, i, tag) {
- lua_pushstring (L, tag);
- lua_rawseti (L, -2, i + 1);
+ lua_settable (L, -3);
}
}
}
@@ -357,9 +420,17 @@ lua_url_add_tag (lua_State *L)
struct rspamd_lua_url *url = lua_check_url (L, 1);
rspamd_mempool_t *mempool = rspamd_lua_check_mempool (L, 3);
const gchar *tag = luaL_checkstring (L, 2);
+ const gchar *value;
+
+ if (lua_type (L, 3) == LUA_TSTRING) {
+ value = lua_tostring (L, 3);
+ }
+ else {
+ value = "1"; /* Some stupid placeholder */
+ }
if (url != NULL && mempool != NULL && tag != NULL) {
- rspamd_url_add_tag (url->url, tag, mempool);
+ rspamd_url_add_tag (url->url, tag, value, mempool);
}
else {
return luaL_error (L, "invalid arguments");