rspamd_add_passthrough_result (task, action,
RSPAMD_PASSTHROUGH_CRITICAL,
- score, "Gtube pattern", "GTUBE", 0);
+ score, "Gtube pattern", "GTUBE", 0, NULL);
}
rspamd_task_insert_result (task, GTUBE_SYMBOL, 0, NULL);
}
void
-rspamd_add_passthrough_result (struct rspamd_task *task,
- struct rspamd_action *action,
- guint priority,
- double target_score,
- const gchar *message,
- const gchar *module,
- guint flags)
+rspamd_add_passthrough_result (struct rspamd_task *task, struct rspamd_action *action, guint priority,
+ double target_score, const gchar *message, const gchar *module, guint flags,
+ struct rspamd_scan_result *scan_result)
{
- struct rspamd_scan_result *metric_res;
struct rspamd_passthrough_result *pr;
- metric_res = task->result;
+ if (scan_result == NULL) {
+ scan_result = task->result;
+ }
pr = rspamd_mempool_alloc (task->task_pool, sizeof (*pr));
pr->action = action;
pr->target_score = target_score;
pr->flags = flags;
- DL_APPEND (metric_res->passthrough_result, pr);
- DL_SORT (metric_res->passthrough_result, rspamd_pr_sort);
+ DL_APPEND (scan_result->passthrough_result, pr);
+ DL_SORT (scan_result->passthrough_result, rspamd_pr_sort);
if (!isnan (target_score)) {
return ret;
}
-struct rspamd_action*
+struct rspamd_action *
rspamd_check_action_metric (struct rspamd_task *task,
- struct rspamd_passthrough_result **ppr)
+ struct rspamd_passthrough_result **ppr,
+ struct rspamd_scan_result *scan_result)
{
struct rspamd_action_result *action_lim,
*noaction = NULL;
struct rspamd_passthrough_result *pr, *sel_pr = NULL;
double max_score = -(G_MAXDOUBLE), sc;
int i;
- struct rspamd_scan_result *mres = task->result;
gboolean seen_least = FALSE;
- if (mres->passthrough_result != NULL) {
- DL_FOREACH (mres->passthrough_result, pr) {
+ if (scan_result == NULL) {
+ scan_result = task->result;
+ }
+
+ if (scan_result->passthrough_result != NULL) {
+ DL_FOREACH (scan_result->passthrough_result, pr) {
if (!seen_least || !(pr->flags & RSPAMD_PASSTHROUGH_LEAST)) {
sc = pr->target_score;
selected_action = pr->action;
if (!(pr->flags & RSPAMD_PASSTHROUGH_LEAST)) {
if (!isnan (sc)) {
if (pr->action->action_type == METRIC_ACTION_NOACTION) {
- mres->score = MIN (sc, mres->score);
+ scan_result->score = MIN (sc, scan_result->score);
}
else {
- mres->score = sc;
+ scan_result->score = sc;
}
}
}
}
}
- /* We are not certain about the results during processing */
/*
* Select result by score
*/
- for (i = mres->nactions - 1; i >= 0; i--) {
- action_lim = &mres->actions_limits[i];
+ for (i = scan_result->nactions - 1; i >= 0; i--) {
+ action_lim = &scan_result->actions_limits[i];
sc = action_lim->cur_limit;
if (action_lim->action->action_type == METRIC_ACTION_NOACTION) {
continue;
}
- if (mres->score >= sc && sc > max_score) {
+ if (scan_result->score >= sc && sc > max_score) {
selected_action = action_lim->action;
max_score = sc;
}
if (selected_action) {
if (seen_least) {
-
+ /* Adjust least action */
if (least_action->flags & RSPAMD_ACTION_NO_THRESHOLD) {
if (selected_action->action_type != METRIC_ACTION_REJECT &&
selected_action->action_type != METRIC_ACTION_DISCARD) {
}
else {
/* Adjust score if needed */
- if (max_score > mres->score) {
+ if (max_score > scan_result->score) {
if (ppr) {
*ppr = sel_pr;
}
- mres->score = max_score;
+ scan_result->score = max_score;
}
}
}
* @param module
*/
void rspamd_add_passthrough_result (struct rspamd_task *task,
- struct rspamd_action *action,
- guint priority,
- double target_score,
- const gchar *message,
- const gchar *module,
- guint flags);
+ struct rspamd_action *action, guint priority,
+ double target_score, const gchar *message,
+ const gchar *module, guint flags,
+ struct rspamd_scan_result *scan_result);
enum rspamd_symbol_insert_flags {
RSPAMD_SYMBOL_INSERT_DEFAULT = 0,
* @param func
* @param ud
*/
-void rspamd_task_symbol_result_foreach (struct rspamd_task *task, struct rspamd_scan_result *result, GHFunc func,
+void rspamd_task_symbol_result_foreach (struct rspamd_task *task,
+ struct rspamd_scan_result *result,
+ GHFunc func,
gpointer ud);
/**
* @return
*/
struct rspamd_action *rspamd_check_action_metric (struct rspamd_task *task,
- struct rspamd_passthrough_result **ppr);
+ struct rspamd_passthrough_result **ppr,
+ struct rspamd_scan_result *scan_result);
#ifdef __cplusplus
}
const gchar *subject;
struct rspamd_passthrough_result *pr = NULL;
- action = rspamd_check_action_metric (task, &pr);
+ action = rspamd_check_action_metric (task, &pr, NULL);
is_spam = !(action->flags & RSPAMD_ACTION_HAM);
if (task->cmd == CMD_CHECK) {
if (metric_res != NULL) {
- action = rspamd_check_action_metric (task, NULL);
+ action = rspamd_check_action_metric (task, NULL, NULL);
/* TODO: handle custom actions in stats */
if (action->action_type == METRIC_ACTION_SOFT_REJECT &&
(task->flags & RSPAMD_TASK_FLAG_GREYLISTED)) {
}
else {
row->score = metric_res->score;
- action = rspamd_check_action_metric (task, NULL);
+ action = rspamd_check_action_metric (task, NULL, NULL);
row->action = action->action_type;
row->required_score = rspamd_task_get_required_score (task, metric_res);
cbdata.pos = row->symbols;
khiter_t k;
mres = task->result;
- act = rspamd_check_action_metric (task, NULL);
+ act = rspamd_check_action_metric (task, NULL, NULL);
if (mres != NULL) {
switch (lf->type) {
if (task->cfg->soft_reject_on_timeout) {
struct rspamd_action *action, *soft_reject;
- action = rspamd_check_action_metric (task, NULL);
+ action = rspamd_check_action_metric (task, NULL, NULL);
if (action->action_type != METRIC_ACTION_REJECT) {
soft_reject = rspamd_config_get_action_by_type (task->cfg,
NAN,
"timeout processing message",
"task timeout",
- 0);
+ 0, NULL);
}
}
if (task->cfg->soft_reject_on_timeout) {
struct rspamd_action *action, *soft_reject;
- action = rspamd_check_action_metric (task, NULL);
+ action = rspamd_check_action_metric (task, NULL, NULL);
if (action->action_type != METRIC_ACTION_REJECT) {
soft_reject = rspamd_config_get_action_by_type (task->cfg,
NAN,
"timeout post-processing message",
"task timeout",
- 0);
+ 0, NULL);
}
}
score,
rspamd_mempool_strdup (task->task_pool, message),
rspamd_mempool_strdup (task->task_pool, module),
- flags);
+ flags, NULL);
/* Don't classify or filter message if pre-filter sets results */
lua_pushnumber (L, metric_res->score);
lua_settable (L, -3);
- action = rspamd_check_action_metric (task, NULL);
+ action = rspamd_check_action_metric (task, NULL, NULL);
if (action) {
lua_pushstring (L, "action");
struct rspamd_action *action;
if (task) {
- action = rspamd_check_action_metric (task, NULL);
+ action = rspamd_check_action_metric (task, NULL, NULL);
lua_pushstring (L, action->name);
}
else {