]> source.dussan.org Git - rspamd.git/commitdiff
Add routines to parse mime addresses from ucl.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 30 Mar 2015 14:26:35 +0000 (15:26 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 30 Mar 2015 14:26:35 +0000 (15:26 +0100)
src/libserver/cfg_rcl.c
src/libserver/cfg_rcl.h

index 66247cf61c78334c973adcd0247a0e018391b62e..98be1b0791b1a2d0bd8ee715de081a7f081efd86 100644 (file)
@@ -1984,7 +1984,7 @@ rspamd_rcl_parse_struct_addr (rspamd_mempool_t *pool,
 
        target = (rspamd_inet_addr_t **)(((gchar *)pd->user_struct) + pd->offset);
 
-       if (obj->type == UCL_STRING) {
+       if (ucl_object_type (obj) == UCL_STRING) {
                val = ucl_object_tostring (obj);
 
                if (!rspamd_parse_inet_address (target, val)) {
@@ -2006,6 +2006,74 @@ rspamd_rcl_parse_struct_addr (rspamd_mempool_t *pool,
        return TRUE;
 }
 
+gboolean
+rspamd_rcl_parse_struct_mime_addr (rspamd_mempool_t *pool,
+       const ucl_object_t *obj,
+       gpointer ud,
+       struct rspamd_rcl_section *section,
+       GError **err)
+{
+       struct rspamd_rcl_struct_parser *pd = ud;
+       InternetAddressList **target, *tmp_addr;
+       const gchar *val;
+       ucl_object_iter_t it;
+       const ucl_object_t *cur;
+
+       target = (InternetAddressList **)(((gchar *)pd->user_struct) + pd->offset);
+       if (*target == NULL) {
+               *target = internet_address_list_new ();
+       #ifdef GMIME24
+                       rspamd_mempool_add_destructor (pool,
+                                       (rspamd_mempool_destruct_t) g_object_unref,
+                                       *target);
+       #else
+                       rspamd_mempool_add_destructor (pool,
+                                       (rspamd_mempool_destruct_t) internet_address_list_destroy,
+                                       *target);
+       #endif
+       }
+
+       it = ucl_object_iterate_new (obj);
+
+       while ((cur = ucl_object_iterate_safe (it, true)) != NULL) {
+
+               if (ucl_object_type (cur) == UCL_STRING) {
+                       val = ucl_object_tostring (obj);
+                       tmp_addr = internet_address_list_parse_string (val);
+
+                       if (tmp_addr) {
+                               internet_address_list_append (*target, tmp_addr);
+#ifdef GMIME24
+                               g_object_unref (tmp_addr);
+#else
+                               internet_address_list_destroy (tmp_addr);
+#endif
+                       }
+                       else {
+                               g_set_error (err,
+                                               CFG_RCL_ERROR,
+                                               EINVAL,
+                                               "cannot parse inet address: %s", val);
+                               ucl_object_iterate_free (it);
+
+                               return FALSE;
+                       }
+               }
+               else {
+                       g_set_error (err,
+                                       CFG_RCL_ERROR,
+                                       EINVAL,
+                                       "cannot get inet address from ucl object");
+                       ucl_object_iterate_free (it);
+
+                       return FALSE;
+               }
+       }
+
+       ucl_object_iterate_free (it);
+       return TRUE;
+}
+
 void
 rspamd_rcl_register_worker_option (struct rspamd_config *cfg,
        gint type,
index df9aa35b6381fd318368816dcce81edff6e383a6..fe06d95a092083a16d53d1503a99503617225879 100644 (file)
@@ -245,6 +245,21 @@ gboolean rspamd_rcl_parse_struct_addr (rspamd_mempool_t *pool,
        struct rspamd_rcl_section *section,
        GError **err);
 
+/**
+ * Parse a gmime inet address field of a structure
+ * @param cfg config pointer
+ * @param obj object to parse
+ * @param ud struct_parser structure (flags mean the exact structure used)
+ * @param section the current section
+ * @param err error pointer
+ * @return TRUE if a value has been successfully parsed
+ */
+gboolean rspamd_rcl_parse_struct_mime_addr (rspamd_mempool_t *pool,
+       const ucl_object_t *obj,
+       gpointer ud,
+       struct rspamd_rcl_section *section,
+       GError **err);
+
 /**
  * Utility functions
  */