diff options
| author | Andre Heinecke <[email protected]> | 2018-06-07 09:42:47 +0000 | 
|---|---|---|
| committer | Andre Heinecke <[email protected]> | 2018-06-07 09:42:47 +0000 | 
| commit | 906ea48df3e178bea3e2c744ddd834b23fe553fb (patch) | |
| tree | 4b7134a20794c5a1b09f4674c8a8f94f5128b539 /src | |
| parent | json: Add op_config to query gpgconf (diff) | |
| download | gpgme-906ea48df3e178bea3e2c744ddd834b23fe553fb.tar.gz gpgme-906ea48df3e178bea3e2c744ddd834b23fe553fb.zip  | |
json: Add direct way to query a config option
* src/gpgme-json.c (op_config_opt, hlp_config_opt): New operation.
(process_request, hlp_help): Add it.
--
This is more conveniant API for most query operations where
a single option is required.
An example would be:
{
    "op": "config_opt",
    "component": "gpg",
    "option": "default-key"
}
Which results in:
{
   "option":       {
           "name": "default-key",
           "description":  "use NAME as default secret key",
           "argname":      "NAME",
           "flags":        0,
           "level":        0,
           "type": 1,
           "alt_type":     1,
           "value":        [{
                           "string":       "F462B6B1",
                           "is_none":      false
                   }]
   }
}
Diffstat (limited to 'src')
| -rw-r--r-- | src/gpgme-json.c | 121 | 
1 files changed, 109 insertions, 12 deletions
diff --git a/src/gpgme-json.c b/src/gpgme-json.c index de62dcc5..1199ca23 100644 --- a/src/gpgme-json.c +++ b/src/gpgme-json.c @@ -2460,6 +2460,102 @@ leave:  } +static const char hlp_config_opt[] = +  "op:       \"config_opt\"\n" +  "component: The component of the option.\n" +  "option:    The name of the option.\n" +  "\n" +  "Response on success:\n" +  "\n" +  "option: Information about the option.\n" +  " String values:\n" +  "  name: The name of the option\n" +  "  description: Localized description of the opt.\n" +  "  argname: Thhe argument name e.g. --verbose\n" +  "  default_description\n" +  "  no_arg_description\n" +  " Number values:\n" +  "  flags: Flags for this option.\n" +  "  level: the level of the description. See gpgme_conf_level_t.\n" +  "  type: The type of the option. See gpgme_conf_type_t.\n" +  "  alt_type: Alternate type of the option. See gpgme_conf_type_t\n" +  " Arg type values: (see desc. below)\n" +  "  default_value: Array of the default value.\n" +  "  no_arg_value: Array of the value if it is not set.\n" +  "  value: Array for the current value if the option is set.\n" +  "\n" +  "If the response is empty the option was not found\n" +  ""; +static gpg_error_t +op_config_opt (cjson_t request, cjson_t result) +{ +  gpg_error_t err; +  gpgme_ctx_t ctx = NULL; +  gpgme_conf_comp_t conf = NULL; +  gpgme_conf_comp_t comp = NULL; +  cjson_t j_tmp; +  char *comp_name = NULL; +  char *opt_name = NULL; + +  ctx = get_context (GPGME_PROTOCOL_GPGCONF); + +  j_tmp = cJSON_GetObjectItem (request, "component"); +  if (!j_tmp || !cjson_is_string (j_tmp)) +    { +      err = gpg_error (GPG_ERR_INV_VALUE); +      goto leave; +    } +  comp_name = j_tmp->valuestring; + + +  j_tmp = cJSON_GetObjectItem (request, "option"); +  if (!j_tmp || !cjson_is_string (j_tmp)) +    { +      err = gpg_error (GPG_ERR_INV_VALUE); +      goto leave; +    } +  opt_name = j_tmp->valuestring; + +  /* Load the config */ +  err = gpgme_op_conf_load (ctx, &conf); +  if (err) +    { +      goto leave; +    } + +  comp = conf; +  for (comp = conf; comp; comp = comp->next) +    { +      gpgme_conf_opt_t opt = NULL; +      int found = 0; +      if (!comp->name || strcmp (comp->name, comp_name)) +        { +          /* Skip components if a single one is specified */ +          continue; +        } +      for (opt = comp->options; opt; opt = opt->next) +        { +          if (!opt->name || strcmp (opt->name, opt_name)) +            { +              /* Skip components if a single one is specified */ +              continue; +            } +          xjson_AddItemToObject (result, "option", conf_opt_to_json (opt)); +          found = 1; +          break; +        } +      if (found) +        break; +    } + +leave: +  gpgme_conf_release (conf); +  release_context (ctx); + +  return err; +} + +  static const char hlp_config[] =    "op:     \"config\"\n"    "\n" @@ -2688,18 +2784,19 @@ process_request (const char *request)      gpg_error_t (*handler)(cjson_t request, cjson_t result);      const char * const helpstr;    } optbl[] = { -    { "config",  op_config,  hlp_config }, -    { "encrypt", op_encrypt, hlp_encrypt }, -    { "export",  op_export,  hlp_export }, -    { "decrypt", op_decrypt, hlp_decrypt }, -    { "delete",  op_delete,  hlp_delete }, -    { "keylist", op_keylist, hlp_keylist }, -    { "import",  op_import,  hlp_import }, -    { "sign",    op_sign,    hlp_sign }, -    { "verify",  op_verify,  hlp_verify }, -    { "version", op_version, hlp_version }, -    { "getmore", op_getmore, hlp_getmore }, -    { "help",    op_help,    hlp_help }, +    { "config",     op_config,     hlp_config }, +    { "config_opt", op_config_opt, hlp_config_opt }, +    { "encrypt",    op_encrypt,    hlp_encrypt }, +    { "export",     op_export,     hlp_export }, +    { "decrypt",    op_decrypt,    hlp_decrypt }, +    { "delete",     op_delete,     hlp_delete }, +    { "keylist",    op_keylist,    hlp_keylist }, +    { "import",     op_import,     hlp_import }, +    { "sign",       op_sign,       hlp_sign }, +    { "verify",     op_verify,     hlp_verify }, +    { "version",    op_version,    hlp_version }, +    { "getmore",    op_getmore,    hlp_getmore }, +    { "help",       op_help,       hlp_help },      { NULL }    };    size_t erroff;  | 
