From 52420396f67209a08372ccf3e472aa3f2a24441b Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 23 May 2016 09:24:21 +0100 Subject: [PATCH] [Feature] Allow to parse pubkeys from the rcl config --- src/libserver/cfg_rcl.c | 44 ++++++++++++++++++++++++++++++++++++++++- src/libserver/cfg_rcl.h | 15 ++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c index f774ac126..ebbc29d61 100644 --- a/src/libserver/cfg_rcl.c +++ b/src/libserver/cfg_rcl.c @@ -2668,7 +2668,6 @@ rspamd_rcl_parse_struct_keypair (rspamd_mempool_t *pool, struct rspamd_rcl_struct_parser *pd = ud; struct rspamd_cryptobox_keypair **target, *kp; - target = (struct rspamd_cryptobox_keypair **)(((gchar *)pd->user_struct) + pd->offset); if (obj->type == UCL_OBJECT) { @@ -2698,6 +2697,49 @@ rspamd_rcl_parse_struct_keypair (rspamd_mempool_t *pool, return TRUE; } +gboolean +rspamd_rcl_parse_struct_pubkey (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; + struct rspamd_cryptobox_pubkey **target, *pk; + gsize len; + const gchar *str; + + target = (struct rspamd_cryptobox_pubkey **)(((gchar *)pd->user_struct) + + pd->offset); + if (obj->type == UCL_STRING) { + str = ucl_object_tolstring (obj, &len); + pk = rspamd_pubkey_from_base32 (str, len, RSPAMD_KEYPAIR_KEX, + RSPAMD_CRYPTOBOX_MODE_25519); + + if (pk != NULL) { + *target = pk; + } + else { + g_set_error (err, + CFG_RCL_ERROR, + EINVAL, + "cannot load the pubkey specified: %s", + ucl_object_key (obj)); + return FALSE; + } + } + else { + g_set_error (err, + CFG_RCL_ERROR, + EINVAL, + "no sane pubkey found in the element: %s", + ucl_object_key (obj)); + return FALSE; + } + + return TRUE; +} + static void rspamd_rcl_insert_string_list_item (gpointer *target, rspamd_mempool_t *pool, const gchar *src, gboolean is_hash) diff --git a/src/libserver/cfg_rcl.h b/src/libserver/cfg_rcl.h index ee0a1b526..1a27b056f 100644 --- a/src/libserver/cfg_rcl.h +++ b/src/libserver/cfg_rcl.h @@ -277,6 +277,21 @@ gboolean rspamd_rcl_parse_struct_keypair (rspamd_mempool_t *pool, struct rspamd_rcl_section *section, GError **err); +/** + * Parse a pubkey 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_pubkey (rspamd_mempool_t *pool, + const ucl_object_t *obj, + gpointer ud, + struct rspamd_rcl_section *section, + GError **err); + /** * Parse a inet addr field of a structure * @param cfg config pointer -- 2.39.5