]> source.dussan.org Git - rspamd.git/commitdiff
Add configuration routine to parse keypairs.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 29 Jan 2015 18:30:13 +0000 (18:30 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 29 Jan 2015 18:30:13 +0000 (18:30 +0000)
src/libserver/cfg_rcl.c
src/libserver/cfg_rcl.h

index e53dfba6a0f8bc9e306db3bf35323cafe53407b6..b16c24846b9f0da735e94b653703c9e7f116a520 100644 (file)
@@ -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,
index 97f092ec3f76a53c2791261e7e7d296ca3047841..ca856a38d76b2dc97a48877f3dad6e599e8f09aa 100644 (file)
@@ -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
  */