]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Rework] Composites: Start rework of the composites framework
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 15 Jul 2021 09:54:08 +0000 (10:54 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 15 Jul 2021 09:54:08 +0000 (10:54 +0100)
src/libserver/CMakeLists.txt
src/libserver/cfg_rcl.c
src/libserver/composites/composites.cxx [moved from src/libserver/composites.c with 88% similarity]
src/libserver/composites/composites.h [moved from src/libserver/composites.h with 75% similarity]
src/libserver/task.c
src/lua/lua_cfg_file.c
src/lua/lua_config.c

index 189e9fe03c961fd16eb0f7a083556444452db0f5..75fad36ac424d090cfba246500bba3a94f8898ec 100644 (file)
@@ -3,7 +3,7 @@ ADD_SUBDIRECTORY(css)
 SET(LIBRSPAMDSERVERSRC
                                ${CMAKE_CURRENT_SOURCE_DIR}/cfg_utils.c
                                ${CMAKE_CURRENT_SOURCE_DIR}/cfg_rcl.c
-                               ${CMAKE_CURRENT_SOURCE_DIR}/composites.c
+                               ${CMAKE_CURRENT_SOURCE_DIR}/composites/composites.cxx
                                ${CMAKE_CURRENT_SOURCE_DIR}/dkim.c
                                ${CMAKE_CURRENT_SOURCE_DIR}/dns.c
                                ${CMAKE_CURRENT_SOURCE_DIR}/dynamic_cfg.c
index 73b9a3b1d11de50b77c2c4d97ebdec5d86689b23..68b94abfe9b914d16fdd35b0123ebc7f1b773a4b 100644 (file)
@@ -20,7 +20,7 @@
 #include "cfg_file.h"
 #include "lua/lua_common.h"
 #include "expression.h"
-#include "composites.h"
+#include "src/libserver/composites/composites.h"
 #include "libserver/worker_util.h"
 #include "unix-std.h"
 #include "cryptobox.h"
similarity index 88%
rename from src/libserver/composites.c
rename to src/libserver/composites/composites.cxx
index 6f3e8a7b06e99408f4f8587baa7ca1283816f30d..0d95346815b43248e7443a69391b7bb9b6c7b8d1 100644 (file)
 #include "scan_result.h"
 #include "composites.h"
 
-#include <math.h>
+#include <cmath>
+#include <vector>
+#include <variant>
+#include "contrib/robin-hood/robin_hood.h"
 
 #define msg_err_composites(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
         "composites", task->task_pool->tag.uid, \
 
 INIT_LOG_MODULE(composites)
 
+
+namespace rspamd::composites {
+static rspamd_expression_atom_t *rspamd_composite_expr_parse(const gchar *line, gsize len,
+                                                                                                                        rspamd_mempool_t *pool,
+                                                                                                                        gpointer ud, GError **err);
+static gdouble rspamd_composite_expr_process(void *ud, rspamd_expression_atom_t *atom);
+static gint rspamd_composite_expr_priority(rspamd_expression_atom_t *atom);
+static void rspamd_composite_expr_destroy(rspamd_expression_atom_t *atom);
+}
+
+const struct rspamd_atom_subr composite_expr_subr = {
+               .parse = rspamd::composites::rspamd_composite_expr_parse,
+               .process = rspamd::composites::rspamd_composite_expr_process,
+               .priority = rspamd::composites::rspamd_composite_expr_priority,
+               .destroy = rspamd::composites::rspamd_composite_expr_destroy
+};
+
+namespace rspamd::composites {
+
+enum class rspamd_composite_policy {
+       RSPAMD_COMPOSITE_POLICY_REMOVE_ALL = 0,
+       RSPAMD_COMPOSITE_POLICY_REMOVE_SYMBOL,
+       RSPAMD_COMPOSITE_POLICY_REMOVE_WEIGHT,
+       RSPAMD_COMPOSITE_POLICY_LEAVE,
+       RSPAMD_COMPOSITE_POLICY_UNKNOWN
+};
+
+/**
+ * Static composites structure
+ */
+struct rspamd_composite {
+       std::string str_expr;
+       std::string sym;
+       struct rspamd_expression *expr;
+       gint id;
+       rspamd_composite_policy policy;
+};
+
 struct composites_data {
        struct rspamd_task *task;
        struct rspamd_composite *composite;
@@ -53,59 +94,42 @@ struct composites_data {
 };
 
 struct rspamd_composite_option_match {
-       enum {
-               RSPAMD_COMPOSITE_OPTION_PLAIN,
-               RSPAMD_COMPOSITE_OPTION_RE
-       } type;
-
-       union {
-               rspamd_regexp_t *re;
-               gchar *match;
-       } data;
-       struct rspamd_composite_option_match *prev, *next;
+       std::variant<rspamd_regexp_t *, std::string> match;
+
+       ~rspamd_composite_option_match() {
+               if (std::holds_alternative<rspamd_regexp_t *>(match)) {
+                       rspamd_regexp_unref(std::get<rspamd_regexp_t *>(match));
+               }
+       }
 };
 
+enum class rspamd_composite_atom_type {
+       ATOM_UNKNOWN,
+       ATOM_COMPOSITE,
+       ATOM_PLAIN
+};
 struct rspamd_composite_atom {
-       gchar *symbol;
-       enum {
-               ATOM_UNKNOWN,
-               ATOM_COMPOSITE,
-               ATOM_PLAIN
-       } comp_type;
-
+       std::string symbol;
+       rspamd_composite_atom_type comp_type;
        struct rspamd_composite *ncomp; /* underlying composite */
-       struct rspamd_composite_option_match *opts;
+       std::vector<rspamd_composite_option_match> opts;
 };
 
-enum rspamd_composite_action {
+enum rspamd_composite_action : std::uint8_t {
        RSPAMD_COMPOSITE_UNTOUCH = 0,
-       RSPAMD_COMPOSITE_REMOVE_SYMBOL = (1 << 0),
-       RSPAMD_COMPOSITE_REMOVE_WEIGHT = (1 << 1),
-       RSPAMD_COMPOSITE_REMOVE_FORCED = (1 << 2)
+       RSPAMD_COMPOSITE_REMOVE_SYMBOL = (1u << 0),
+       RSPAMD_COMPOSITE_REMOVE_WEIGHT = (1u << 1),
+       RSPAMD_COMPOSITE_REMOVE_FORCED = (1u << 2)
 };
 
 struct symbol_remove_data {
-       const gchar *sym;
+       const char *sym;
        struct rspamd_composite *comp;
        GNode *parent;
-       guint action;
+       std::uint8_t action;
        struct symbol_remove_data *prev, *next;
 };
 
-static rspamd_expression_atom_t * rspamd_composite_expr_parse (const gchar *line, gsize len,
-               rspamd_mempool_t *pool, gpointer ud, GError **err);
-static gdouble rspamd_composite_expr_process (void *ud, rspamd_expression_atom_t *atom);
-static gint rspamd_composite_expr_priority (rspamd_expression_atom_t *atom);
-static void rspamd_composite_expr_destroy (rspamd_expression_atom_t *atom);
-static void composites_foreach_callback (gpointer key, gpointer value, void *data);
-
-const struct rspamd_atom_subr composite_expr_subr = {
-       .parse = rspamd_composite_expr_parse,
-       .process = rspamd_composite_expr_process,
-       .priority = rspamd_composite_expr_priority,
-       .destroy = rspamd_composite_expr_destroy
-};
-
 static GQuark
 rspamd_composites_quark (void)
 {
@@ -113,8 +137,9 @@ rspamd_composites_quark (void)
 }
 
 static rspamd_expression_atom_t *
-rspamd_composite_expr_parse (const gchar *line, gsize len,
-               rspamd_mempool_t *pool, gpointer ud, GError **err)
+rspamd_composite_expr_parse(const gchar *line, gsize len,
+                                                       rspamd_mempool_t *pool,
+                                                       gpointer ud, GError **err)
 {
        gsize clen = 0;
        rspamd_expression_atom_t *res;
@@ -142,7 +167,7 @@ rspamd_composite_expr_parse (const gchar *line, gsize len,
 
                switch (state) {
                case comp_state_read_symbol:
-                       clen = rspamd_memcspn (p, "[; \t()><!|&\n", len);
+                       clen = rspamd_memcspn(p, "[; \t()><!|&\n", len);
                        p += clen;
 
                        if (*p == '[') {
@@ -153,10 +178,10 @@ rspamd_composite_expr_parse (const gchar *line, gsize len,
                        }
                        break;
                case comp_state_read_obrace:
-                       p ++;
+                       p++;
 
                        if (*p == '/') {
-                               p ++;
+                               p++;
                                state = comp_state_read_regexp;
                        }
                        else {
@@ -166,25 +191,25 @@ rspamd_composite_expr_parse (const gchar *line, gsize len,
                case comp_state_read_regexp:
                        if (*p == '\\' && p + 1 < end) {
                                /* Escaping */
-                               p ++;
+                               p++;
                        }
                        else if (*p == '/') {
                                /* End of regexp, possible flags */
                                state = comp_state_read_regexp_end;
                        }
-                       p ++;
+                       p++;
                        break;
                case comp_state_read_option:
                case comp_state_read_regexp_end:
                        if (*p == ',') {
-                               p ++;
+                               p++;
                                state = comp_state_read_comma;
                        }
                        else if (*p == ']') {
                                state = comp_state_read_ebrace;
                        }
                        else {
-                               p ++;
+                               p++;
                        }
                        break;
                case comp_state_read_comma:
@@ -201,11 +226,11 @@ rspamd_composite_expr_parse (const gchar *line, gsize len,
                        }
                        else {
                                /* Skip spaces after comma */
-                               p ++;
+                               p++;
                        }
                        break;
                case comp_state_read_ebrace:
-                       p ++;
+                       p++;
                        state = comp_state_read_end;
                        break;
                case comp_state_read_end:
@@ -214,8 +239,8 @@ rspamd_composite_expr_parse (const gchar *line, gsize len,
        }
 
        if (state != comp_state_read_end) {
-               g_set_error (err, rspamd_composites_quark (), 100, "invalid composite: %s;"
-                                                                                                                  "parser stopped in state %d",
+               g_set_error(err, rspamd_composites_quark(), 100, "invalid composite: %s;"
+                                                                                                                "parser stopped in state %d",
                                line, state);
                return NULL;
        }
@@ -224,9 +249,9 @@ rspamd_composite_expr_parse (const gchar *line, gsize len,
        p = line;
        state = comp_state_read_symbol;
 
-       atom = rspamd_mempool_alloc0 (pool, sizeof (*atom));
+       atom = rspamd_mempool_alloc0 (pool, sizeof(*atom));
        atom->comp_type = ATOM_UNKNOWN;
-       res = rspamd_mempool_alloc0 (pool, sizeof (*res));
+       res = rspamd_mempool_alloc0 (pool, sizeof(*res));
        res->len = clen;
        res->str = line;
 
@@ -242,7 +267,7 @@ rspamd_composite_expr_parse (const gchar *line, gsize len,
 
                switch (state) {
                case comp_state_read_symbol:
-                       clen = rspamd_memcspn (p, "[; \t()><!|&\n", len);
+                       clen = rspamd_memcspn(p, "[; \t()><!|&\n", len);
                        p += clen;
 
                        if (*p == '[') {
@@ -253,15 +278,15 @@ rspamd_composite_expr_parse (const gchar *line, gsize len,
                        }
 
                        atom->symbol = rspamd_mempool_alloc (pool, clen + 1);
-                       rspamd_strlcpy (atom->symbol, line, clen + 1);
+                       rspamd_strlcpy(atom->symbol, line, clen + 1);
 
                        break;
                case comp_state_read_obrace:
-                       p ++;
+                       p++;
 
                        if (*p == '/') {
                                opt_start = p;
-                               p ++; /* Starting slash */
+                               p++; /* Starting slash */
                                state = comp_state_read_regexp;
                        }
                        else {
@@ -273,23 +298,23 @@ rspamd_composite_expr_parse (const gchar *line, gsize len,
                case comp_state_read_regexp:
                        if (*p == '\\' && p + 1 < end) {
                                /* Escaping */
-                               p ++;
+                               p++;
                        }
                        else if (*p == '/') {
                                /* End of regexp, possible flags */
                                state = comp_state_read_regexp_end;
                        }
-                       p ++;
+                       p++;
                        break;
                case comp_state_read_option:
                        if (*p == ',' || *p == ']') {
-                               opt_match = rspamd_mempool_alloc (pool, sizeof (*opt_match));
+                               opt_match = rspamd_mempool_alloc (pool, sizeof(*opt_match));
                                /* Plain match */
                                gchar *opt_buf;
                                gint opt_len = p - opt_start;
 
                                opt_buf = rspamd_mempool_alloc (pool, opt_len + 1);
-                               rspamd_strlcpy (opt_buf, opt_start, opt_len + 1);
+                               rspamd_strlcpy(opt_buf, opt_start, opt_len + 1);
 
                                opt_match->data.match = opt_buf;
                                opt_match->type = RSPAMD_COMPOSITE_OPTION_PLAIN;
@@ -305,33 +330,33 @@ rspamd_composite_expr_parse (const gchar *line, gsize len,
                                }
                        }
                        else {
-                               p ++;
+                               p++;
                        }
                        break;
                case comp_state_read_regexp_end:
                        if (*p == ',' || *p == ']') {
-                               opt_match = rspamd_mempool_alloc (pool, sizeof (*opt_match));
+                               opt_match = rspamd_mempool_alloc (pool, sizeof(*opt_match));
                                /* Plain match */
                                gchar *opt_buf;
                                gint opt_len = p - opt_start;
 
                                opt_buf = rspamd_mempool_alloc (pool, opt_len + 1);
-                               rspamd_strlcpy (opt_buf, opt_start, opt_len + 1);
+                               rspamd_strlcpy(opt_buf, opt_start, opt_len + 1);
 
                                rspamd_regexp_t *re;
                                GError *re_err = NULL;
 
-                               re = rspamd_regexp_new (opt_buf, NULL, &re_err);
+                               re = rspamd_regexp_new(opt_buf, NULL, &re_err);
 
                                if (re == NULL) {
                                        msg_err_pool ("cannot create regexp from string %s: %e",
                                                        opt_buf, re_err);
 
-                                       g_error_free (re_err);
+                                       g_error_free(re_err);
                                }
                                else {
                                        rspamd_mempool_add_destructor (pool,
-                                                       (rspamd_mempool_destruct_t)rspamd_regexp_unref,
+                                                       (rspamd_mempool_destruct_t) rspamd_regexp_unref,
                                                        re);
                                        opt_match->data.re = re;
                                        opt_match->type = RSPAMD_COMPOSITE_OPTION_RE;
@@ -348,7 +373,7 @@ rspamd_composite_expr_parse (const gchar *line, gsize len,
                                }
                        }
                        else {
-                               p ++;
+                               p++;
                        }
                        break;
                case comp_state_read_comma:
@@ -367,11 +392,11 @@ rspamd_composite_expr_parse (const gchar *line, gsize len,
                        }
                        else {
                                /* Skip spaces after comma */
-                               p ++;
+                               p++;
                        }
                        break;
                case comp_state_read_ebrace:
-                       p ++;
+                       p++;
                        state = comp_state_read_end;
                        break;
                case comp_state_read_end:
@@ -384,6 +409,11 @@ rspamd_composite_expr_parse (const gchar *line, gsize len,
        return res;
 }
 
+}
+
+static void composites_foreach_callback (gpointer key, gpointer value, void *data);
+
+
 static gdouble
 rspamd_composite_process_single_symbol (struct composites_data *cd,
                                                                                const gchar *sym,
similarity index 75%
rename from src/libserver/composites.h
rename to src/libserver/composites/composites.h
index bb7eb899407516f753a12a6f0fe5572f218a56bf..d39863b88cd258c83d07ac80e351c48f2714be2e 100644 (file)
@@ -29,25 +29,6 @@ struct rspamd_task;
  */
 extern const struct rspamd_atom_subr composite_expr_subr;
 
-enum rspamd_composite_policy {
-       RSPAMD_COMPOSITE_POLICY_REMOVE_ALL = 0,
-       RSPAMD_COMPOSITE_POLICY_REMOVE_SYMBOL,
-       RSPAMD_COMPOSITE_POLICY_REMOVE_WEIGHT,
-       RSPAMD_COMPOSITE_POLICY_LEAVE,
-       RSPAMD_COMPOSITE_POLICY_UNKNOWN
-};
-
-/**
- * Composite structure
- */
-struct rspamd_composite {
-       const gchar *str_expr;
-       const gchar *sym;
-       struct rspamd_expression *expr;
-       gint id;
-       enum rspamd_composite_policy policy;
-};
-
 /**
  * Process all results and form composite metrics from existent metrics as it is defined in config
  * @param task worker's task that present message from user
index aae374c2130b6036b325b044f3572a799df648b0..c9f3fb627a6b5324afbaafe7da887c5a39cde01c 100644 (file)
@@ -21,7 +21,7 @@
 #include "message.h"
 #include "lua/lua_common.h"
 #include "email_addr.h"
-#include "composites.h"
+#include "src/libserver/composites/composites.h"
 #include "stat_api.h"
 #include "unix-std.h"
 #include "utlist.h"
index 68acdd36834fca8299870487a7b5f557de14e9c6..af8964b32c772b939804c2ea118f21d00132decd 100644 (file)
@@ -15,7 +15,7 @@
  */
 #include "lua_common.h"
 #include "expression.h"
-#include "composites.h"
+#include "src/libserver/composites/composites.h"
 
 #ifdef HAVE_SYS_UTSNAME_H
 #endif
index 2631f1cecdd77e5b76e79c2ceda3979b62319437..c2f5efb42e5f6defa16b59758dde21488ffe114b 100644 (file)
@@ -16,7 +16,7 @@
 #include "lua_common.h"
 #include "libmime/message.h"
 #include "libutil/expression.h"
-#include "libserver/composites.h"
+#include "src/libserver/composites/composites.h"
 #include "libserver/cfg_file_private.h"
 #include "libmime/lang_detection.h"
 #include "lua/lua_map.h"