]> source.dussan.org Git - rspamd.git/commitdiff
Parse composites in ucl.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 7 Nov 2013 22:23:23 +0000 (22:23 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 7 Nov 2013 22:23:23 +0000 (22:23 +0000)
src/cfg_rcl.c

index eedcd9ee2a2b282ed2318215e8322f35891d8b69..41a1cd8c8b3730a9806dd9522299ecdf165e1c64 100644 (file)
@@ -26,6 +26,7 @@
 #include "settings.h"
 #include "cfg_file.h"
 #include "lua/lua_common.h"
+#include "expressions.h"
 #include "classifiers/classifiers.h"
 #include "tokenizers/tokenizers.h"
 
@@ -812,6 +813,41 @@ rspamd_rcl_classifier_handler (struct config_file *cfg, ucl_object_t *obj,
        return res;
 }
 
+static gboolean
+rspamd_rcl_composite_handler (struct config_file *cfg, ucl_object_t *obj,
+               gpointer ud, struct rspamd_rcl_section *section, GError **err)
+{
+       ucl_object_t *val;
+       struct expression *expr;
+       struct rspamd_composite *composite;
+       const gchar *composite_name, *composite_expression;
+
+       val = ucl_object_find_key (obj, "name");
+       if (val == NULL || !ucl_object_tostring_safe (val, &composite_name)) {
+               g_set_error (err, CFG_RCL_ERROR, EINVAL, "composite must have a name defined");
+               return FALSE;
+       }
+
+       val = ucl_object_find_key (obj, "expression");
+       if (val == NULL || !ucl_object_tostring_safe (val, &composite_expression)) {
+               g_set_error (err, CFG_RCL_ERROR, EINVAL, "composite must have an expression defined");
+               return FALSE;
+       }
+
+       if ((expr = parse_expression (cfg->cfg_pool, (gchar *)composite_expression)) == NULL) {
+               g_set_error (err, CFG_RCL_ERROR, EINVAL, "cannot parse composite expression: %s", composite_expression);
+               return FALSE;
+       }
+
+       composite = memory_pool_alloc (cfg->cfg_pool, sizeof (struct rspamd_composite));
+       composite->expr = expr;
+       composite->id = g_hash_table_size (cfg->composite_symbols) + 1;
+       g_hash_table_insert (cfg->composite_symbols, (gpointer)composite_name, composite);
+       register_virtual_symbol (&cfg->cache, composite_name, 1);
+
+       return TRUE;
+}
+
 /**
  * Fake handler to parse default options only, uses struct cfg_file as pointer
  * for default handlers
@@ -989,6 +1025,12 @@ rspamd_rcl_config_init (void)
        rspamd_rcl_add_default_handler (ssub, "spam", rspamd_rcl_parse_struct_boolean,
                        G_STRUCT_OFFSET (struct statfile, is_spam), 0);
 
+       /**
+        * Composites handler
+        */
+       sub = rspamd_rcl_add_section (&new, "composite", rspamd_rcl_composite_handler, UCL_OBJECT,
+                               FALSE, TRUE);
+
        return new;
 }