Browse Source

Add configuration routine to parse keypairs.

tags/0.9.0
Vsevolod Stakhov 9 years ago
parent
commit
ebc0a487e1
2 changed files with 80 additions and 0 deletions
  1. 65
    0
      src/libserver/cfg_rcl.c
  2. 15
    0
      src/libserver/cfg_rcl.h

+ 65
- 0
src/libserver/cfg_rcl.c View 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,

+ 15
- 0
src/libserver/cfg_rcl.h View 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
*/

Loading…
Cancel
Save