commit b4679a3: [Project] Fix lua bindings
Vsevolod Stakhov
vsevolod at highsecure.ru
Thu Jul 15 19:07:08 UTC 2021
Author: Vsevolod Stakhov
Date: 2021-07-15 19:49:58 +0100
URL: https://github.com/rspamd/rspamd/commit/b4679a32d4a586200399d941fa1acc982deeb98c
[Project] Fix lua bindings
---
src/libserver/cfg_rcl.c | 3 +-
src/libserver/composites/composites.h | 8 ++-
src/libserver/composites/composites_internal.hxx | 1 +
src/libserver/composites/composites_manager.cxx | 73 ++++++++++++++++++------
src/lua/lua_config.c | 37 ++----------
5 files changed, 71 insertions(+), 51 deletions(-)
diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c
index a8f3c57a6..b19a1dedc 100644
--- a/src/libserver/cfg_rcl.c
+++ b/src/libserver/cfg_rcl.c
@@ -1382,7 +1382,8 @@ rspamd_rcl_composite_handler (rspamd_mempool_t *pool,
composite_name = key;
- if ((composite = rspamd_composites_manager_add_from_ucl(cfg->composites_manager, obj)) != NULL) {
+ if ((composite = rspamd_composites_manager_add_from_ucl(cfg->composites_manager,
+ composite_name, obj)) != NULL) {
rspamd_symcache_add_symbol (cfg->cache, composite_name, 0,
NULL, composite, SYMBOL_TYPE_COMPOSITE, -1);
}
diff --git a/src/libserver/composites/composites.h b/src/libserver/composites/composites.h
index 2db020e74..6ccfbd58f 100644
--- a/src/libserver/composites/composites.h
+++ b/src/libserver/composites/composites.h
@@ -47,7 +47,13 @@ gsize rspamd_composites_manager_nelts(void *);
* Adds a composite from config
* @return
*/
-void* rspamd_composites_manager_add_from_ucl(void *, const ucl_object_t *);
+void* rspamd_composites_manager_add_from_ucl(void *, const char *, const ucl_object_t *);
+
+/**
+ * Adds a composite from config
+ * @return
+ */
+void* rspamd_composites_manager_add_from_string(void *, const char *, const char *);
#ifdef __cplusplus
}
diff --git a/src/libserver/composites/composites_internal.hxx b/src/libserver/composites/composites_internal.hxx
index d06f592db..12fa3ecb2 100644
--- a/src/libserver/composites/composites_internal.hxx
+++ b/src/libserver/composites/composites_internal.hxx
@@ -71,6 +71,7 @@ public:
}
auto add_composite(std::string_view, const ucl_object_t *) -> rspamd_composite *;
+ auto add_composite(std::string_view name, std::string_view expression) -> rspamd_composite *;
private:
~composites_manager() = default;
static void composites_manager_dtor(void *ptr) {
diff --git a/src/libserver/composites/composites_manager.cxx b/src/libserver/composites/composites_manager.cxx
index 0cffcdcf3..c2e719c89 100644
--- a/src/libserver/composites/composites_manager.cxx
+++ b/src/libserver/composites/composites_manager.cxx
@@ -30,13 +30,13 @@ composite_policy_from_str(const std::string_view &inp) -> enum rspamd_composite_
{
const static robin_hood::unordered_flat_map<std::string_view,
enum rspamd_composite_policy> names{
- {"remove", rspamd_composite_policy::RSPAMD_COMPOSITE_POLICY_REMOVE_ALL},
- {"remove_all", rspamd_composite_policy::RSPAMD_COMPOSITE_POLICY_REMOVE_ALL},
- {"default", rspamd_composite_policy::RSPAMD_COMPOSITE_POLICY_REMOVE_ALL},
+ {"remove", rspamd_composite_policy::RSPAMD_COMPOSITE_POLICY_REMOVE_ALL},
+ {"remove_all", rspamd_composite_policy::RSPAMD_COMPOSITE_POLICY_REMOVE_ALL},
+ {"default", rspamd_composite_policy::RSPAMD_COMPOSITE_POLICY_REMOVE_ALL},
{"remove_symbol", rspamd_composite_policy::RSPAMD_COMPOSITE_POLICY_REMOVE_SYMBOL},
{"remove_weight", rspamd_composite_policy::RSPAMD_COMPOSITE_POLICY_REMOVE_WEIGHT},
- {"leave", rspamd_composite_policy::RSPAMD_COMPOSITE_POLICY_LEAVE},
- {"remove_none", rspamd_composite_policy::RSPAMD_COMPOSITE_POLICY_LEAVE},
+ {"leave", rspamd_composite_policy::RSPAMD_COMPOSITE_POLICY_LEAVE},
+ {"remove_none", rspamd_composite_policy::RSPAMD_COMPOSITE_POLICY_LEAVE},
};
auto found = names.find(inp);
@@ -51,8 +51,8 @@ auto
composites_manager::add_composite(std::string_view composite_name, const ucl_object_t *obj) -> rspamd_composite *
{
- const auto *val = ucl_object_lookup (obj, "enabled");
- if (val != nullptr && !ucl_object_toboolean (val)) {
+ const auto *val = ucl_object_lookup(obj, "enabled");
+ if (val != nullptr && !ucl_object_toboolean(val)) {
msg_info_config ("composite %s is disabled", composite_name.data());
return nullptr;
}
@@ -62,9 +62,9 @@ composites_manager::add_composite(std::string_view composite_name, const ucl_obj
}
const char *composite_expression = nullptr;
- val = ucl_object_lookup (obj, "expression");
+ val = ucl_object_lookup(obj, "expression");
- if (val == NULL || !ucl_object_tostring_safe (val, &composite_expression)) {
+ if (val == NULL || !ucl_object_tostring_safe(val, &composite_expression)) {
msg_err_config ("composite must have an expression defined in %s",
composite_name.data());
return nullptr;
@@ -92,20 +92,20 @@ composites_manager::add_composite(std::string_view composite_name, const ucl_obj
composite->sym = composite_name;
double score;
- val = ucl_object_lookup (obj, "score");
- if (val != nullptr && ucl_object_todouble_safe (val, &score)) {
+ val = ucl_object_lookup(obj, "score");
+ if (val != nullptr && ucl_object_todouble_safe(val, &score)) {
/* Also set score in the metric */
const auto *group = "composite";
- val = ucl_object_lookup (obj, "group");
+ val = ucl_object_lookup(obj, "group");
if (val != nullptr) {
- group = ucl_object_tostring (val);
+ group = ucl_object_tostring(val);
}
const auto *description = composite_expression;
- val = ucl_object_lookup (obj, "description");
+ val = ucl_object_lookup(obj, "description");
if (val != nullptr) {
- description = ucl_object_tostring (val);
+ description = ucl_object_tostring(val);
}
else {
description = composite_expression;
@@ -114,13 +114,13 @@ composites_manager::add_composite(std::string_view composite_name, const ucl_obj
rspamd_config_add_symbol(cfg, composite_name.data(), score,
description, group,
0,
- ucl_object_get_priority (obj), /* No +1 as it is default... */
+ ucl_object_get_priority(obj), /* No +1 as it is default... */
1);
- const auto *elt = ucl_object_lookup (obj, "groups");
+ const auto *elt = ucl_object_lookup(obj, "groups");
if (elt) {
const ucl_object_t *cur_gr;
- auto *gr_it = ucl_object_iterate_new (elt);
+ auto *gr_it = ucl_object_iterate_new(elt);
while ((cur_gr = ucl_object_iterate_safe(gr_it, true)) != nullptr) {
rspamd_config_add_symbol_group(cfg, composite_name.data(),
@@ -146,6 +146,37 @@ composites_manager::add_composite(std::string_view composite_name, const ucl_obj
return composite.get();
}
+auto
+composites_manager::add_composite(std::string_view composite_name,
+ std::string_view composite_expression) -> rspamd_composite *
+{
+ GError *err = nullptr;
+ rspamd_expression *expr = nullptr;
+
+ if (!rspamd_parse_expression(composite_expression.data(),
+ composite_expression.size(), &composite_expr_subr,
+ nullptr, cfg->cfg_pool, &err, &expr)) {
+ msg_err_config ("cannot parse composite expression for %s: %e",
+ composite_name.data(), err);
+
+ if (err) {
+ g_error_free(err);
+ }
+
+ return nullptr;
+ }
+
+ auto &composite = all_composites.emplace_back(std::make_shared<rspamd_composite>());
+ composite->expr = expr;
+ composite->id = all_composites.size();
+ composite->str_expr = composite_expression;
+ composite->sym = composite_name;
+
+ composites[std::string(composite_name)] = composite;
+
+ return composite.get();
+}
+
}
@@ -169,3 +200,9 @@ rspamd_composites_manager_add_from_ucl(void *cm, const char *sym, const ucl_obje
{
return reinterpret_cast<void *>(COMPOSITE_MANAGER_FROM_PTR(cm)->add_composite(sym, obj));
}
+
+void*
+rspamd_composites_manager_add_from_string(void *cm, const char *sym, const char *expr)
+{
+ return reinterpret_cast<void *>(COMPOSITE_MANAGER_FROM_PTR(cm)->add_composite(sym, expr));
+}
diff --git a/src/lua/lua_config.c b/src/lua/lua_config.c
index c2f5efb42..b0e2df672 100644
--- a/src/lua/lua_config.c
+++ b/src/lua/lua_config.c
@@ -2600,47 +2600,22 @@ lua_config_add_composite (lua_State * L)
{
LUA_TRACE_POINT;
struct rspamd_config *cfg = lua_check_config (L, 1);
- struct rspamd_expression *expr;
gchar *name;
const gchar *expr_str;
struct rspamd_composite *composite;
- gboolean ret = FALSE, new = TRUE;
- GError *err = NULL;
+ gboolean ret = FALSE;
if (cfg) {
name = rspamd_mempool_strdup (cfg->cfg_pool, luaL_checkstring (L, 2));
expr_str = luaL_checkstring (L, 3);
if (name && expr_str) {
- if (!rspamd_parse_expression (expr_str, 0, &composite_expr_subr,
- NULL, cfg->cfg_pool, &err, &expr)) {
- msg_err_config ("cannot parse composite expression %s: %e",
- expr_str,
- err);
- g_error_free (err);
- }
- else {
- if (g_hash_table_lookup (cfg->composite_symbols, name) != NULL) {
- msg_warn_config ("composite %s is redefined", name);
- new = FALSE;
- }
-
- composite = rspamd_mempool_alloc0 (cfg->cfg_pool,
- sizeof (struct rspamd_composite));
- composite->expr = expr;
- composite->id = g_hash_table_size (cfg->composite_symbols);
- composite->str_expr = rspamd_mempool_strdup (cfg->cfg_pool,
- expr_str);
- composite->sym = name;
- g_hash_table_insert (cfg->composite_symbols,
- (gpointer)name,
- composite);
-
- if (new) {
- rspamd_symcache_add_symbol (cfg->cache, name,
- 0, NULL, composite, SYMBOL_TYPE_COMPOSITE, -1);
- }
+ composite = rspamd_composites_manager_add_from_string(cfg->composites_manager,
+ name, expr_str);
+ if (composite) {
+ rspamd_symcache_add_symbol (cfg->cache, name,
+ 0, NULL, composite, SYMBOL_TYPE_COMPOSITE, -1);
ret = TRUE;
}
}
More information about the Commits
mailing list