From f9ca3cf827fac604a85b2642d64f6632db2a9810 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 14 Apr 2015 18:17:14 +0100 Subject: [PATCH] Imlement maximum group score for symbols. --- src/libmime/filter.c | 31 +++++++++++++++++++++++++++++-- src/libmime/filter.h | 1 + 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/libmime/filter.c b/src/libmime/filter.c index d0fe7498e..c6d038ca7 100644 --- a/src/libmime/filter.c +++ b/src/libmime/filter.c @@ -95,10 +95,14 @@ rspamd_create_metric_result (struct rspamd_task *task, const gchar *name) sizeof (struct metric_result)); metric_res->symbols = g_hash_table_new (rspamd_str_hash, rspamd_str_equal); - metric_res->checked = FALSE; rspamd_mempool_add_destructor (task->task_pool, (rspamd_mempool_destruct_t) g_hash_table_unref, metric_res->symbols); + metric_res->sym_groups = g_hash_table_new (g_direct_hash, g_direct_equal); + rspamd_mempool_add_destructor (task->task_pool, + (rspamd_mempool_destruct_t) g_hash_table_unref, + metric_res->sym_groups); + metric_res->checked = FALSE; metric_res->metric = metric; metric_res->grow_factor = 0; metric_res->score = 0; @@ -119,8 +123,9 @@ insert_metric_result (struct rspamd_task *task, { struct metric_result *metric_res; struct symbol *s; - gdouble w; + gdouble w, *gr_score = NULL; struct rspamd_symbol_def *sdef; + struct rspamd_symbols_group *gr = NULL; const ucl_object_t *mobj, *sobj; metric_res = rspamd_create_metric_result (task, metric->name); @@ -131,6 +136,16 @@ insert_metric_result (struct rspamd_task *task, } else { w = (*sdef->weight_ptr) * flag; + gr = sdef->gr; + + if (gr != NULL) { + gr_score = g_hash_table_lookup (metric_res->sym_groups, gr); + + if (gr_score == NULL) { + gr_score = rspamd_mempool_alloc (task->task_pool, sizeof (gdouble)); + *gr_score = 0; + } + } } if (task->settings) { @@ -147,6 +162,18 @@ insert_metric_result (struct rspamd_task *task, } } + /* XXX: does not take grow factor into account */ + if (gr != NULL && gr_score != NULL && gr->max_score > 0.0) { + *gr_score += w; + + if (*gr_score > gr->max_score) { + msg_info ("maximum group score %.2f for group %s has been reached," + " ignoring symbol %s with weight %.2f", gr->max_score, + gr->name, symbol, w); + return; + } + } + /* Add metric score */ if ((s = g_hash_table_lookup (metric_res->symbols, symbol)) != NULL) { if (sdef && sdef->one_shot) { diff --git a/src/libmime/filter.h b/src/libmime/filter.h index 3eef17525..49cb7e465 100644 --- a/src/libmime/filter.h +++ b/src/libmime/filter.h @@ -67,6 +67,7 @@ struct metric_result { double score; /**< total score */ enum rspamd_metric_action action; /**< the current action */ GHashTable *symbols; /**< symbols of metric */ + GHashTable *sym_groups; /**< groups of symbols */ gboolean checked; /**< whether metric result is consolidated */ double grow_factor; /**< current grow factor */ }; -- 2.39.5