diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-03-18 10:54:51 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-03-18 10:54:51 +0000 |
commit | e8fab1263b5a4ea21a93967f85f1827c289c5467 (patch) | |
tree | 53052d067e73adcaaff93c96dd50d7545fd2b6c8 | |
parent | aa5ebcb8b9d42000aa141adbfef87012aeb18c77 (diff) | |
download | rspamd-e8fab1263b5a4ea21a93967f85f1827c289c5467.tar.gz rspamd-e8fab1263b5a4ea21a93967f85f1827c289c5467.zip |
[Fix] Fix resetting symbols to their default values in WebUI
-rw-r--r-- | src/controller.c | 11 | ||||
-rw-r--r-- | src/libserver/dynamic_cfg.c | 83 | ||||
-rw-r--r-- | src/libserver/dynamic_cfg.h | 9 |
3 files changed, 103 insertions, 0 deletions
diff --git a/src/controller.c b/src/controller.c index 1c26a802a..f5a624b7c 100644 --- a/src/controller.c +++ b/src/controller.c @@ -1612,6 +1612,11 @@ rspamd_controller_handle_saveactions ( add_dynamic_action (ctx->cfg, DEFAULT_METRIC, act, score); added ++; } + else { + if (remove_dynamic_action (ctx->cfg, DEFAULT_METRIC, act)) { + added ++; + } + } } if (dump_dynamic_config (ctx->cfg)) { @@ -1729,6 +1734,12 @@ rspamd_controller_handle_savesymbols ( } added ++; } + else if (sym) { + if (remove_dynamic_symbol (ctx->cfg, DEFAULT_METRIC, + ucl_object_tostring (jname))) { + added ++; + } + } } if (added > 0) { diff --git a/src/libserver/dynamic_cfg.c b/src/libserver/dynamic_cfg.c index 48ce0725a..8845032f5 100644 --- a/src/libserver/dynamic_cfg.c +++ b/src/libserver/dynamic_cfg.c @@ -439,6 +439,47 @@ add_dynamic_symbol (struct rspamd_config *cfg, return TRUE; } +gboolean +remove_dynamic_symbol (struct rspamd_config *cfg, + const gchar *metric_name, + const gchar *symbol) +{ + ucl_object_t *metric, *syms; + gboolean ret = FALSE; + + if (cfg->dynamic_conf == NULL) { + msg_info ("dynamic conf is disabled"); + return FALSE; + } + + metric = dynamic_metric_find_metric (cfg->current_dynamic_conf, + metric_name); + if (metric == NULL) { + return FALSE; + } + + syms = (ucl_object_t *)ucl_object_lookup (metric, "symbols"); + if (syms != NULL) { + ucl_object_t *sym; + + sym = dynamic_metric_find_elt (syms, symbol); + + if (sym) { + ret = ucl_array_delete ((ucl_object_t *)syms, sym) != NULL; + + if (ret) { + ucl_object_unref (sym); + } + } + } + + if (ret) { + apply_dynamic_conf (cfg->current_dynamic_conf, cfg); + } + + return TRUE; +} + /** * Add action for specified metric @@ -485,3 +526,45 @@ add_dynamic_action (struct rspamd_config *cfg, return TRUE; } + +gboolean +remove_dynamic_action (struct rspamd_config *cfg, + const gchar *metric_name, + guint action) +{ + ucl_object_t *metric, *acts; + const gchar *action_name = rspamd_action_to_str (action); + gboolean ret = FALSE; + + if (cfg->dynamic_conf == NULL) { + msg_info ("dynamic conf is disabled"); + return FALSE; + } + + metric = dynamic_metric_find_metric (cfg->current_dynamic_conf, + metric_name); + if (metric == NULL) { + return FALSE; + } + + acts = (ucl_object_t *)ucl_object_lookup (metric, "actions"); + + if (acts != NULL) { + ucl_object_t *act; + + act = dynamic_metric_find_elt (acts, action_name); + + if (act) { + ret = ucl_array_delete (acts, act) != NULL; + } + if (ret) { + ucl_object_unref (act); + } + } + + if (ret) { + apply_dynamic_conf (cfg->current_dynamic_conf, cfg); + } + + return ret; +} diff --git a/src/libserver/dynamic_cfg.h b/src/libserver/dynamic_cfg.h index f3c606851..ebbc8b650 100644 --- a/src/libserver/dynamic_cfg.h +++ b/src/libserver/dynamic_cfg.h @@ -45,6 +45,9 @@ gboolean add_dynamic_symbol (struct rspamd_config *cfg, const gchar *symbol, gdouble value); +gboolean remove_dynamic_symbol (struct rspamd_config *cfg, + const gchar *metric, + const gchar *symbol); /** * Add action for specified metric @@ -59,5 +62,11 @@ gboolean add_dynamic_action (struct rspamd_config *cfg, guint action, gdouble value); +/** + * Removes dynamic action + */ +gboolean remove_dynamic_action (struct rspamd_config *cfg, + const gchar *metric, + guint action); #endif /* DYNAMIC_CFG_H_ */ |