diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/Makefile.am | 1 | ||||
| -rw-r--r-- | src/lib/exchange_api_management_revoke_denomination_key.c | 145 | 
2 files changed, 132 insertions, 14 deletions
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index f7ba5fd3..bf90c8f7 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -31,6 +31,7 @@ libtalerexchange_la_SOURCES = \    exchange_api_management_auditor_enable.c \    exchange_api_management_wire_disable.c \    exchange_api_management_wire_enable.c \ +  exchange_api_management_revoke_denomination_key.c \    exchange_api_management_revoke_signing_key.c \    exchange_api_melt.c \    exchange_api_recoup.c \ diff --git a/src/lib/exchange_api_management_revoke_denomination_key.c b/src/lib/exchange_api_management_revoke_denomination_key.c index 8a7404e5..fa296203 100644 --- a/src/lib/exchange_api_management_revoke_denomination_key.c +++ b/src/lib/exchange_api_management_revoke_denomination_key.c @@ -24,6 +24,8 @@  #include <gnunet/gnunet_curl_lib.h>  #include "taler_exchange_service.h"  #include "taler_signatures.h" +#include "taler_curl_lib.h" +#include "taler_json_lib.h"  /** @@ -38,6 +40,11 @@ struct TALER_EXCHANGE_ManagementRevokeDenominationKeyHandle    char *url;    /** +   * Minor context that holds body and headers. +   */ +  struct TALER_CURL_PostContext post_ctx; + +  /**     * Handle for the request.     */    struct GNUNET_CURL_Job *job; @@ -60,16 +67,55 @@ struct TALER_EXCHANGE_ManagementRevokeDenominationKeyHandle  /** - * Inform the exchange that a denomination key was revoked. + * Function called when we're done processing the + * HTTP /management/denominations/$H_DENOM_PUB/revoke request.   * - * @param ctx the context - * @param url HTTP base URL for the exchange - * @param h_denom_pub hash of the denomination public key that was revoked - * @param master_sig signature affirming the revocation - * @param cb function to call with the exchange's result - * @param cb_cls closure for @a cb - * @return the request handle; NULL upon error + * @param cls the `struct TALER_EXCHANGE_ManagementRevokeDenominationKeyHandle *` + * @param response_code HTTP response code, 0 on error + * @param response response body, NULL if not in JSON   */ +static void +handle_revoke_denomination_finished (void *cls, +                                     long response_code, +                                     const void *response) +{ +  struct TALER_EXCHANGE_ManagementRevokeDenominationKeyHandle *rh = cls; +  const json_t *json = response; +  struct TALER_EXCHANGE_HttpResponse hr = { +    .http_status = (unsigned int) response_code, +    .reply = json +  }; + +  rh->job = NULL; +  switch (response_code) +  { +  case MHD_HTTP_NO_CONTENT: +    break; +  case MHD_HTTP_FORBIDDEN: +    hr.ec = TALER_JSON_get_error_code (json); +    hr.hint = TALER_JSON_get_error_hint (json); +    break; +  default: +    /* unexpected response code */ +    GNUNET_break_op (0); +    hr.ec = TALER_JSON_get_error_code (json); +    hr.hint = TALER_JSON_get_error_hint (json); +    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, +                "Unexpected response code %u/%d\n", +                (unsigned int) response_code, +                (int) hr.ec); +    break; +  } +  if (NULL != rh->cb) +  { +    rh->cb (rh->cb_cls, +            &hr); +    rh->cb = NULL; +  } +  TALER_EXCHANGE_management_revoke_denomination_key_cancel (rh); +} + +  struct TALER_EXCHANGE_ManagementRevokeDenominationKeyHandle *  TALER_EXCHANGE_management_revoke_denomination_key (    struct GNUNET_CURL_Context *ctx, @@ -77,14 +123,84 @@ TALER_EXCHANGE_management_revoke_denomination_key (    const struct GNUNET_HashCode *h_denom_pub,    const struct TALER_MasterSignatureP *master_sig,    TALER_EXCHANGE_ManagementRevokeDenominationKeyCallback cb, -  void *cb_cls); +  void *cb_cls) +{ +  struct TALER_EXCHANGE_ManagementRevokeDenominationKeyHandle *rh; +  CURL *eh; +  json_t *body; + +  rh = GNUNET_new (struct TALER_EXCHANGE_ManagementRevokeDenominationKeyHandle); +  rh->cb = cb; +  rh->cb_cls = cb_cls; +  rh->ctx = ctx; +  { +    char epub_str[sizeof (*h_denom_pub) * 2]; +    char arg_str[sizeof (epub_str) + 64]; +    char *end; + +    end = GNUNET_STRINGS_data_to_string (h_denom_pub, +                                         sizeof (*h_denom_pub), +                                         epub_str, +                                         sizeof (epub_str)); +    *end = '\0'; +    GNUNET_snprintf (arg_str, +                     sizeof (arg_str), +                     "management/denominations/%s/revoke", +                     epub_str); +    rh->url = TALER_url_join (url, +                              arg_str, +                              NULL); +  } +  if (NULL == rh->url) +  { +    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, +                "Could not construct request URL.\n"); +    GNUNET_free (rh); +    return NULL; +  } +  body = json_pack ("{s:o}", +                    "master_sig", +                    GNUNET_JSON_from_data_auto (master_sig)); +  if (NULL == body) +  { +    GNUNET_break (0); +    GNUNET_free (rh->url); +    GNUNET_free (rh); +    return NULL; +  } +  eh = curl_easy_init (); +  if (GNUNET_OK != +      TALER_curl_easy_post (&rh->post_ctx, +                            eh, +                            body)) +  { +    GNUNET_break (0); +    json_decref (body); +    GNUNET_free (rh->url); +    GNUNET_free (eh); +    return NULL; +  } +  json_decref (body); +  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, +              "Requesting URL '%s'\n", +              rh->url); +  GNUNET_assert (CURLE_OK == curl_easy_setopt (eh, +                                               CURLOPT_URL, +                                               rh->url)); +  rh->job = GNUNET_CURL_job_add2 (ctx, +                                  eh, +                                  rh->post_ctx.headers, +                                  &handle_revoke_denomination_finished, +                                  rh); +  if (NULL == rh->job) +  { +    TALER_EXCHANGE_management_revoke_denomination_key_cancel (rh); +    return NULL; +  } +  return rh; +} -/** - * Cancel #TALER_EXCHANGE_management_revoke_denomination_key() operation. - * - * @param rh handle of the operation to cancel - */  void  TALER_EXCHANGE_management_revoke_denomination_key_cancel (    struct TALER_EXCHANGE_ManagementRevokeDenominationKeyHandle *rh) @@ -94,6 +210,7 @@ TALER_EXCHANGE_management_revoke_denomination_key_cancel (      GNUNET_CURL_job_cancel (rh->job);      rh->job = NULL;    } +  TALER_curl_easy_post_finished (&rh->post_ctx);    GNUNET_free (rh->url);    GNUNET_free (rh);  }  | 
