diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-03-30 15:26:35 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-03-30 15:26:35 +0100 |
commit | 407cafe8c24aaa1190b4d11c3175ffea9c4a8396 (patch) | |
tree | 7567325e06180f4fe482443e043d693720578fdb | |
parent | 179af280e97a94471e2946cb275c24994379e471 (diff) | |
download | rspamd-407cafe8c24aaa1190b4d11c3175ffea9c4a8396.tar.gz rspamd-407cafe8c24aaa1190b4d11c3175ffea9c4a8396.zip |
Add routines to parse mime addresses from ucl.
-rw-r--r-- | src/libserver/cfg_rcl.c | 70 | ||||
-rw-r--r-- | src/libserver/cfg_rcl.h | 15 |
2 files changed, 84 insertions, 1 deletions
diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c index 66247cf61..98be1b079 100644 --- a/src/libserver/cfg_rcl.c +++ b/src/libserver/cfg_rcl.c @@ -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, diff --git a/src/libserver/cfg_rcl.h b/src/libserver/cfg_rcl.h index df9aa35b6..fe06d95a0 100644 --- a/src/libserver/cfg_rcl.h +++ b/src/libserver/cfg_rcl.h @@ -246,6 +246,21 @@ gboolean rspamd_rcl_parse_struct_addr (rspamd_mempool_t *pool, 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 */ |