From: Vsevolod Stakhov Date: Thu, 29 Jan 2015 18:30:13 +0000 (+0000) Subject: Add configuration routine to parse keypairs. X-Git-Tag: 0.9.0~812 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=ebc0a487e134164469b34c87848836d601f54eaf;p=rspamd.git Add configuration routine to parse keypairs. --- diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c index e53dfba6a..b16c24846 100644 --- a/src/libserver/cfg_rcl.c +++ b/src/libserver/cfg_rcl.c @@ -1764,6 +1764,71 @@ rspamd_rcl_parse_struct_time (struct rspamd_config *cfg, return TRUE; } +gboolean +rspamd_rcl_parse_struct_keypair (struct rspamd_config *cfg, + const ucl_object_t *obj, + gpointer ud, + struct rspamd_rcl_section *section, + GError **err) +{ + struct rspamd_rcl_struct_parser *pd = ud; + gpointer *target; + gpointer key; + const gchar *val, *sem = NULL, *pk = NULL, *sk = NULL; + gchar keybuf[256]; + const ucl_object_t *elt; + + target = (gpointer *)(((gchar *)pd->user_struct) + pd->offset); + if (obj->type == UCL_STRING) { + /* Pk and Sk are just linked all together */ + val = ucl_object_tostring (obj); + if ((sem = strchr (val, ':')) != NULL) { + sk = val; + pk = sem + 1; + } + else { + /* Try to parse the key as is */ + key = rspamd_http_connection_make_key ((gchar *)val, strlen (val)); + if (key != NULL) { + *target = key; + return TRUE; + } + + return FALSE; + } + } + else if (obj->type == UCL_OBJECT) { + elt = ucl_object_find_key (obj, "pubkey"); + if (elt == NULL || !ucl_object_tostring_safe (elt, &pk)) { + return FALSE; + } + elt = ucl_object_find_key (obj, "privkey"); + if (elt == NULL || !ucl_object_tostring_safe (elt, &sk)) { + return FALSE; + } + } + + if (sk == NULL || pk == NULL) { + return FALSE; + } + + if (!sem) { + rspamd_snprintf (keybuf, sizeof (keybuf), "%s%s", sk, pk); + } + else { + rspamd_snprintf (keybuf, sizeof (keybuf), "%*s%s", sem - sk, sk, pk); + } + + key = rspamd_http_connection_make_key (keybuf, strlen (val)); + if (key != NULL) { + /* XXX: clean buffer after usage */ + *target = key; + return TRUE; + } + + return FALSE; +} + gboolean rspamd_rcl_parse_struct_string_list (struct rspamd_config *cfg, const ucl_object_t *obj, diff --git a/src/libserver/cfg_rcl.h b/src/libserver/cfg_rcl.h index 97f092ec3..ca856a38d 100644 --- a/src/libserver/cfg_rcl.h +++ b/src/libserver/cfg_rcl.h @@ -214,6 +214,21 @@ gboolean rspamd_rcl_parse_struct_boolean (struct rspamd_config *cfg, struct rspamd_rcl_section *section, GError **err); +/** + * Parse a keypair 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_keypair (struct rspamd_config *cfg, + const ucl_object_t *obj, + gpointer ud, + struct rspamd_rcl_section *section, + GError **err); + /** * Utility functions */