Browse Source

[Feature] Reuse URL tags in SURBL module

tags/1.5.0
Vsevolod Stakhov 7 years ago
parent
commit
8139a5cd39
2 changed files with 95 additions and 0 deletions
  1. 94
    0
      src/plugins/surbl.c
  2. 1
    0
      src/plugins/surbl.h

+ 94
- 0
src/plugins/surbl.c View File

@@ -717,6 +717,15 @@ surbl_module_config (struct rspamd_config *cfg)
else {
surbl_module_ctx->url_expire = DEFAULT_SURBL_URL_EXPIRE;
}

if ((value =
rspamd_config_get_module_opt (cfg, "surbl", "use_tags")) != NULL) {
surbl_module_ctx->use_tags = ucl_obj_toboolean (value);
}
else {
surbl_module_ctx->use_tags = TRUE;
}

if ((value =
rspamd_config_get_module_opt (cfg, "surbl",
"redirector_connect_timeout")) != NULL) {
@@ -1407,6 +1416,87 @@ register_redirector_call (struct rspamd_url *url, struct rspamd_task *task,
rule);
}

static gboolean
surbl_test_tags (struct rspamd_task *task, struct redirector_param *param,
struct rspamd_url *url)
{
struct rspamd_url_tag *tag = NULL, *rtag = NULL, *cur;
struct rspamd_url *redirected_url = NULL;
gchar *ftld = NULL;
rspamd_ftok_t tld;
gboolean processed = FALSE;

if (url->tags) {
tag = g_hash_table_lookup (url->tags, "surbl");
rtag = g_hash_table_lookup (url->tags, "redirector");
}

if (rtag) {
/* This is a redirected URL */
gint r;

redirected_url = rspamd_mempool_alloc0 (task->task_pool,
sizeof (*redirected_url));
r = rspamd_url_parse (redirected_url, (gchar *)rtag->data,
strlen (rtag->data),
task->task_pool);

if (r == URI_ERRNO_OK) {
if (!g_hash_table_lookup (task->urls, redirected_url)) {
g_hash_table_insert (task->urls, redirected_url,
redirected_url);
redirected_url->phished_url = param->url;
redirected_url->flags |= RSPAMD_URL_FLAG_REDIRECTED;
}
}
else {
redirected_url = NULL;
}
}

if (tag || redirected_url) {
if (redirected_url) {
tld.begin = redirected_url->tld;
tld.len = redirected_url->tldlen;
}
else {
tld.begin = param->url->tld;
tld.len = param->url->tldlen;
}

ftld = rspamd_mempool_ftokdup (task->task_pool, &tld);
}

if (tag) {
/* We know results for this URL */

DL_FOREACH (tag, cur) {
rspamd_task_insert_result (task, tag->data, 1, ftld);
}

processed = TRUE;
}
else if (redirected_url) {
/* Just register surbl call for the redirected url */
make_surbl_requests (redirected_url,
param->task,
param->suffix,
FALSE,
param->tree);

if (surbl_module_ctx->redirector_symbol != NULL) {
rspamd_task_insert_result (param->task,
surbl_module_ctx->redirector_symbol,
1,
ftld);
}

processed = TRUE;
}

return processed;
}

static void
surbl_tree_url_callback (gpointer key, gpointer value, void *data)
{
@@ -1425,6 +1515,10 @@ surbl_tree_url_callback (gpointer key, gpointer value, void *data)
return;
}

if (surbl_module_ctx->use_tags && surbl_test_tags (task, param, url)) {
return;
}

if (surbl_module_ctx->use_redirector && surbl_module_ctx->redirector_tlds) {
/* Search in trie */
srch.begin = url->tld;

+ 1
- 0
src/plugins/surbl.h View File

@@ -23,6 +23,7 @@ struct surbl_ctx {
guint16 weight;
gdouble connect_timeout;
gdouble read_timeout;
gboolean use_tags;
guint max_urls;
guint url_expire;
GList *suffixes;

Loading…
Cancel
Save