|
|
@@ -4971,36 +4971,60 @@ lua_task_set_settings (lua_State *L) |
|
|
|
|
|
|
|
act = ucl_object_lookup (task->settings, "actions"); |
|
|
|
|
|
|
|
if (act) { |
|
|
|
if (act && ucl_object_type (act) == UCL_OBJECT) { |
|
|
|
/* Adjust desired actions */ |
|
|
|
mres = task->result; |
|
|
|
|
|
|
|
for (i = 0; i < mres->nactions; i++) { |
|
|
|
struct rspamd_action_result *act_res = &mres->actions_limits[i]; |
|
|
|
elt = ucl_object_lookup (act, act_res->action->name); |
|
|
|
it = NULL; |
|
|
|
|
|
|
|
if (elt == NULL && |
|
|
|
act_res->action->action_type != METRIC_ACTION_CUSTOM) { |
|
|
|
/* Also try alt name ... */ |
|
|
|
elt = ucl_object_lookup (act, |
|
|
|
rspamd_action_to_str_alt (act_res->action->action_type)); |
|
|
|
} |
|
|
|
while ((cur = ucl_object_iterate (act, &it, true)) != NULL) { |
|
|
|
const gchar *act_name = ucl_object_key (cur); |
|
|
|
double act_score = ucl_object_type (cur) == UCL_NULL ? |
|
|
|
NAN : ucl_object_todouble (cur), old_score = NAN; |
|
|
|
int act_type; |
|
|
|
gboolean found = FALSE; |
|
|
|
|
|
|
|
if (elt) { |
|
|
|
if (ucl_object_type (elt) == UCL_FLOAT || |
|
|
|
ucl_object_type (elt) == UCL_INT) { |
|
|
|
gdouble nscore = ucl_object_todouble (elt); |
|
|
|
if (!rspamd_action_from_str (act_name, &act_type)) { |
|
|
|
act_type = -1; |
|
|
|
} |
|
|
|
|
|
|
|
msg_debug_task ("adjusted action %s: %.2f -> %.2f", |
|
|
|
ucl_object_key (elt), |
|
|
|
act_res->cur_limit, |
|
|
|
nscore); |
|
|
|
act_res->cur_limit = nscore; |
|
|
|
for (i = 0; i < mres->nactions; i++) { |
|
|
|
struct rspamd_action_result *act_res = &mres->actions_limits[i]; |
|
|
|
|
|
|
|
if (act_res->action->action_type == METRIC_ACTION_CUSTOM && |
|
|
|
act_type == -1) { |
|
|
|
/* Compare by name */ |
|
|
|
if (g_ascii_strcasecmp (act_name, act_res->action->name) == 0) { |
|
|
|
old_score = act_res->cur_limit; |
|
|
|
act_res->cur_limit = act_score; |
|
|
|
found = TRUE; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
if (act_res->action->action_type == act_type) { |
|
|
|
old_score = act_res->cur_limit; |
|
|
|
act_res->cur_limit = act_score; |
|
|
|
found = TRUE; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
else if (ucl_object_type (elt) == UCL_NULL) { |
|
|
|
act_res->cur_limit = NAN; |
|
|
|
} |
|
|
|
|
|
|
|
if (!found) { |
|
|
|
msg_warn_task ("cannot set custom score %.2f for unknown action %s", |
|
|
|
act_score, act_name); |
|
|
|
} |
|
|
|
else { |
|
|
|
if (isnan (act_score)) { |
|
|
|
msg_info_task ("disabled action %s due to settings", |
|
|
|
ucl_object_key (elt)); |
|
|
|
act_name); |
|
|
|
} |
|
|
|
else { |
|
|
|
msg_debug_task ("adjusted action %s: %.2f -> %.2f", |
|
|
|
act_name, |
|
|
|
old_score, |
|
|
|
act_score); |
|
|
|
} |
|
|
|
} |
|
|
|
} |