Browse Source

Imlement maximum group score for symbols.

tags/0.9.0
Vsevolod Stakhov 9 years ago
parent
commit
f9ca3cf827
2 changed files with 30 additions and 2 deletions
  1. 29
    2
      src/libmime/filter.c
  2. 1
    0
      src/libmime/filter.h

+ 29
- 2
src/libmime/filter.c View File

@@ -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) {

+ 1
- 0
src/libmime/filter.h View File

@@ -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 */
};

Loading…
Cancel
Save