diff options
Diffstat (limited to '')
| -rw-r--r-- | src/gpgme-json.c | 86 | 
1 files changed, 86 insertions, 0 deletions
| diff --git a/src/gpgme-json.c b/src/gpgme-json.c index 3c0fbe98..774c9156 100644 --- a/src/gpgme-json.c +++ b/src/gpgme-json.c @@ -780,7 +780,42 @@ add_signatures_object (cjson_t result, const char *name,    return err;  } +static const char * +protocol_to_string (gpgme_protocol_t proto) +{ +  switch (proto) +    { +    case GPGME_PROTOCOL_OpenPGP: return "OpenPGP"; +    case GPGME_PROTOCOL_CMS:     return "CMS"; +    case GPGME_PROTOCOL_GPGCONF: return "gpgconf"; +    case GPGME_PROTOCOL_ASSUAN:  return "assuan"; +    case GPGME_PROTOCOL_G13:     return "g13"; +    case GPGME_PROTOCOL_UISERVER:return "uiserver"; +    case GPGME_PROTOCOL_SPAWN:   return "spawn"; +    default: +                                 return "unknown"; +    } +} +static gpg_error_t +add_ei_to_object (cjson_t result, gpgme_engine_info_t info) +{ +  if (!cJSON_AddStringToObject (result, "protocol", +                                protocol_to_string (info->protocol))) +    return gpg_error_from_syserror (); +  if (!cJSON_AddStringToObject (result, "fname", info->file_name)) +    return gpg_error_from_syserror (); +  if (!cJSON_AddStringToObject (result, "version", info->version)) +    return gpg_error_from_syserror (); +  if (!cJSON_AddStringToObject (result, "req_version", info->req_version)) +    return gpg_error_from_syserror (); +  if (!cJSON_AddStringToObject (result, "homedir", +                                info->home_dir ? +                                info->home_dir : +                                "default")) +    return gpg_error_from_syserror (); +  return 0; +}  /*   * Implementation of the commands. @@ -1504,8 +1539,57 @@ op_verify (cjson_t request, cjson_t result)    gpgme_data_release (signature);    return err;  } + +static const char hlp_version[] = +  "op:     \"version\"\n" +  "\n" +  "Response on success:\n" +  "gpgme:  The GPGME Version.\n" +  "info:   dump of engine info. containing:\n" +  "        protocol: The protocol.\n" +  "        fname:    The file name.\n" +  "        version:  The version.\n" +  "        req_ver:  The required version.\n" +  "        homedir:  The homedir of the engine or \"default\".\n"; +static gpg_error_t +op_version (cjson_t request, cjson_t result) +{ +  gpg_error_t err = 0; +  gpgme_engine_info_t ei = NULL; +  cjson_t infos = xjson_CreateArray (); +  if (!cJSON_AddStringToObject (result, "gpgme", gpgme_check_version (NULL))) +    { +      cJSON_Delete (infos); +      return gpg_error_from_syserror (); +    } + +  if ((err = gpgme_get_engine_info (&ei))) +    { +      cJSON_Delete (infos); +      return err; +    } + +  for (; ei; ei = ei->next) +    { +      cjson_t obj = xjson_CreateObject (); +      if ((err = add_ei_to_object (obj, ei))) +        { +          cJSON_Delete (infos); +          return err; +        } +      cJSON_AddItemToArray (infos, obj); +    } +  if (!cJSON_AddItemToObject (result, "info", infos)) +    { +      err = gpg_error_from_syserror (); +      cJSON_Delete (infos); +      return err; +    } + +  return 0; +}  static const char hlp_getmore[] =    "op:     \"getmore\"\n" @@ -1644,6 +1728,8 @@ process_request (const char *request)      { "encrypt", op_encrypt, hlp_encrypt },      { "decrypt", op_decrypt, hlp_decrypt },      { "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 } | 
