diff options
Diffstat (limited to 'src/exchange-lib')
| -rw-r--r-- | src/exchange-lib/Makefile.am | 6 | ||||
| -rw-r--r-- | src/exchange-lib/exchange_api_track_transaction.c (renamed from src/exchange-lib/exchange_api_deposit_wtid.c) | 34 | ||||
| -rw-r--r-- | src/exchange-lib/exchange_api_track_transfer.c | 333 | ||||
| -rw-r--r-- | src/exchange-lib/exchange_api_wire_deposits.c | 313 | ||||
| -rw-r--r-- | src/exchange-lib/test_exchange_api.c | 24 | 
5 files changed, 365 insertions, 345 deletions
diff --git a/src/exchange-lib/Makefile.am b/src/exchange-lib/Makefile.am index 3cab9d45..78d52b7c 100644 --- a/src/exchange-lib/Makefile.am +++ b/src/exchange-lib/Makefile.am @@ -18,13 +18,13 @@ libtalerexchange_la_SOURCES = \    exchange_api_handle.c exchange_api_handle.h \    exchange_api_admin.c \    exchange_api_deposit.c \ -  exchange_api_deposit_wtid.c \    exchange_api_refresh.c \    exchange_api_refresh_link.c \    exchange_api_refund.c \    exchange_api_reserve.c \ -  exchange_api_wire.c \ -  exchange_api_wire_deposits.c +  exchange_api_track_transaction.c \ +  exchange_api_track_transfer.c \ +  exchange_api_wire.c  libtalerexchange_la_LIBADD = \    $(top_builddir)/src/json/libtalerjson.la \ diff --git a/src/exchange-lib/exchange_api_deposit_wtid.c b/src/exchange-lib/exchange_api_track_transaction.c index 66b91413..e9c38e48 100644 --- a/src/exchange-lib/exchange_api_deposit_wtid.c +++ b/src/exchange-lib/exchange_api_track_transaction.c @@ -15,8 +15,8 @@    <http://www.gnu.org/licenses/>  */  /** - * @file exchange-lib/exchange_api_deposit_wtid.c - * @brief Implementation of the /deposit/wtid request of the exchange's HTTP API + * @file exchange-lib/exchange_api_track_transaction.c + * @brief Implementation of the /track/transaction request of the exchange's HTTP API   * @author Christian Grothoff   */  #include "platform.h" @@ -36,7 +36,7 @@  /**   * @brief A Deposit Wtid Handle   */ -struct TALER_EXCHANGE_DepositWtidHandle +struct TALER_EXCHANGE_TrackTransactionHandle  {    /** @@ -62,7 +62,7 @@ struct TALER_EXCHANGE_DepositWtidHandle    /**     * Function to call with the result.     */ -  TALER_EXCHANGE_DepositWtidCallback cb; +  TALER_EXCHANGE_TrackTransactionCallback cb;    /**     * Closure for @a cb. @@ -88,7 +88,7 @@ struct TALER_EXCHANGE_DepositWtidHandle   * @return #GNUNET_OK if the signature is valid, #GNUNET_SYSERR if not   */  static int -verify_deposit_wtid_signature_ok (const struct TALER_EXCHANGE_DepositWtidHandle *dwh, +verify_deposit_wtid_signature_ok (const struct TALER_EXCHANGE_TrackTransactionHandle *dwh,                                    const json_t *json,                                    struct TALER_ExchangePublicKeyP *exchange_pub)  { @@ -131,9 +131,9 @@ verify_deposit_wtid_signature_ok (const struct TALER_EXCHANGE_DepositWtidHandle  /**   * Function called when we're done processing the - * HTTP /deposit/wtid request. + * HTTP /track/transaction request.   * - * @param cls the `struct TALER_EXCHANGE_DepositWtidHandle` + * @param cls the `struct TALER_EXCHANGE_TrackTransactionHandle`   * @param response_code HTTP response code, 0 on error   * @param json parsed JSON result, NULL on error   */ @@ -142,7 +142,7 @@ handle_deposit_wtid_finished (void *cls,                                long response_code,                                const json_t *json)  { -  struct TALER_EXCHANGE_DepositWtidHandle *dwh = cls; +  struct TALER_EXCHANGE_TrackTransactionHandle *dwh = cls;    const struct TALER_WireTransferIdentifierRawP *wtid = NULL;    struct GNUNET_TIME_Absolute execution_time = GNUNET_TIME_UNIT_FOREVER_ABS;    const struct TALER_Amount *coin_contribution = NULL; @@ -244,7 +244,7 @@ handle_deposit_wtid_finished (void *cls,             wtid,             execution_time,             coin_contribution); -  TALER_EXCHANGE_deposit_wtid_cancel (dwh); +  TALER_EXCHANGE_track_transaction_cancel (dwh);  } @@ -261,19 +261,19 @@ handle_deposit_wtid_finished (void *cls,   * @param cb_cls closure for @a cb   * @return handle to abort request   */ -struct TALER_EXCHANGE_DepositWtidHandle * -TALER_EXCHANGE_deposit_wtid (struct TALER_EXCHANGE_Handle *exchange, +struct TALER_EXCHANGE_TrackTransactionHandle * +TALER_EXCHANGE_track_transaction (struct TALER_EXCHANGE_Handle *exchange,                               const struct TALER_MerchantPrivateKeyP *merchant_priv,                               const struct GNUNET_HashCode *h_wire,                               const struct GNUNET_HashCode *h_contract,                               const struct TALER_CoinSpendPublicKeyP *coin_pub,                               uint64_t transaction_id, -                             TALER_EXCHANGE_DepositWtidCallback cb, +                             TALER_EXCHANGE_TrackTransactionCallback cb,                               void *cb_cls)  {    struct TALER_DepositTrackPS dtp;    struct TALER_MerchantSignatureP merchant_sig; -  struct TALER_EXCHANGE_DepositWtidHandle *dwh; +  struct TALER_EXCHANGE_TrackTransactionHandle *dwh;    struct GNUNET_CURL_Context *ctx;    json_t *deposit_wtid_obj;    CURL *eh; @@ -284,7 +284,7 @@ TALER_EXCHANGE_deposit_wtid (struct TALER_EXCHANGE_Handle *exchange,      GNUNET_break (0);      return NULL;    } -  dtp.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_DEPOSIT_WTID); +  dtp.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION);    dtp.purpose.size = htonl (sizeof (dtp));    dtp.h_contract = *h_contract;    dtp.h_wire = *h_wire; @@ -307,11 +307,11 @@ TALER_EXCHANGE_deposit_wtid (struct TALER_EXCHANGE_Handle *exchange,                                  "merchant_pub", GNUNET_JSON_from_data_auto (&dtp.merchant),                                  "merchant_sig", GNUNET_JSON_from_data_auto (&merchant_sig)); -  dwh = GNUNET_new (struct TALER_EXCHANGE_DepositWtidHandle); +  dwh = GNUNET_new (struct TALER_EXCHANGE_TrackTransactionHandle);    dwh->exchange = exchange;    dwh->cb = cb;    dwh->cb_cls = cb_cls; -  dwh->url = MAH_path_to_url (exchange, "/deposit/wtid"); +  dwh->url = MAH_path_to_url (exchange, "/track/transaction");    dwh->depconf.purpose.size = htonl (sizeof (struct TALER_ConfirmWirePS));    dwh->depconf.purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE);    dwh->depconf.h_wire = *h_wire; @@ -353,7 +353,7 @@ TALER_EXCHANGE_deposit_wtid (struct TALER_EXCHANGE_Handle *exchange,   * @param dwh the wire deposits request handle   */  void -TALER_EXCHANGE_deposit_wtid_cancel (struct TALER_EXCHANGE_DepositWtidHandle *dwh) +TALER_EXCHANGE_track_transaction_cancel (struct TALER_EXCHANGE_TrackTransactionHandle *dwh)  {    if (NULL != dwh->job)    { diff --git a/src/exchange-lib/exchange_api_track_transfer.c b/src/exchange-lib/exchange_api_track_transfer.c new file mode 100644 index 00000000..417d065f --- /dev/null +++ b/src/exchange-lib/exchange_api_track_transfer.c @@ -0,0 +1,333 @@ +/* +  This file is part of TALER +  Copyright (C) 2014, 2015, 2016 GNUnet e.V. + +  TALER is free software; you can redistribute it and/or modify it under the +  terms of the GNU General Public License as published by the Free Software +  Foundation; either version 3, or (at your option) any later version. + +  TALER is distributed in the hope that it will be useful, but WITHOUT ANY +  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +  A PARTICULAR PURPOSE.  See the GNU General Public License for more details. + +  You should have received a copy of the GNU General Public License along with +  TALER; see the file COPYING.  If not, If not, see +  <http://www.gnu.org/licenses/> +*/ +/** + * @file exchange-lib/exchange_api_track_transfer.c + * @brief Implementation of the /track/transfer request of the exchange's HTTP API + * @author Christian Grothoff + */ +#include "platform.h" +#include <curl/curl.h> +#include <jansson.h> +#include <microhttpd.h> /* just for HTTP status codes */ +#include <gnunet/gnunet_util_lib.h> +#include <gnunet/gnunet_curl_lib.h> +#include "taler_exchange_service.h" +#include "exchange_api_common.h" +#include "taler_json_lib.h" +#include "exchange_api_handle.h" +#include "taler_signatures.h" + + +/** + * @brief A /track/transfer Handle + */ +struct TALER_EXCHANGE_TrackTransferHandle +{ + +  /** +   * The connection to exchange this request handle will use +   */ +  struct TALER_EXCHANGE_Handle *exchange; + +  /** +   * The url for this request. +   */ +  char *url; + +  /** +   * Handle for the request. +   */ +  struct GNUNET_CURL_Job *job; + +  /** +   * Function to call with the result. +   */ +  TALER_EXCHANGE_TrackTransferCallback cb; + +  /** +   * Closure for @a cb. +   */ +  void *cb_cls; + +}; + + +/** + * We got a #MHD_HTTP_OK response for the /track/transfer request. + * Check that the response is well-formed and if it is, call the + * callback.  If not, return an error code. + * + * This code is very similar to + * merchant_api_track_transfer.c::check_track_transfer_response_ok. + * Any changes should likely be reflected there as well. + * + * @param wdh handle to the operation + * @param json response we got + * @return #GNUNET_OK if we are done and all is well, + *         #GNUNET_SYSERR if the response was bogus + */ +static int +check_track_transfer_response_ok (struct TALER_EXCHANGE_TrackTransferHandle *wdh, +                                  const json_t *json) +{ +  json_t *details_j; +  struct GNUNET_HashCode h_wire; +  struct TALER_Amount total_amount; +  struct TALER_MerchantPublicKeyP merchant_pub; +  unsigned int num_details; +  struct TALER_ExchangePublicKeyP exchange_pub; +  struct TALER_ExchangeSignatureP exchange_sig; +  struct GNUNET_JSON_Specification spec[] = { +    TALER_JSON_spec_amount ("total", &total_amount), +    GNUNET_JSON_spec_fixed_auto ("merchant_pub", &merchant_pub), +    GNUNET_JSON_spec_fixed_auto ("H_wire", &h_wire), +    GNUNET_JSON_spec_json ("deposits", &details_j), +    GNUNET_JSON_spec_fixed_auto ("exchange_sig", &exchange_sig), +    GNUNET_JSON_spec_fixed_auto ("exchange_pub", &exchange_pub), +    GNUNET_JSON_spec_end() +  }; + +  if (GNUNET_OK != +      GNUNET_JSON_parse (json, +                         spec, +                         NULL, NULL)) +  { +    GNUNET_break_op (0); +    return GNUNET_SYSERR; +  } +  num_details = json_array_size (details_j); +  { +    struct TALER_TrackTransferDetails details[num_details]; +    unsigned int i; +    struct GNUNET_HashContext *hash_context; +    struct TALER_WireDepositDetailP dd; +    struct TALER_WireDepositDataPS wdp; + +    hash_context = GNUNET_CRYPTO_hash_context_start (); +    for (i=0;i<num_details;i++) +    { +      struct TALER_TrackTransferDetails *detail = &details[i]; +      struct json_t *detail_j = json_array_get (details_j, i); +      struct GNUNET_JSON_Specification spec_detail[] = { +        GNUNET_JSON_spec_fixed_auto ("H_contract", &detail->h_contract), +        GNUNET_JSON_spec_uint64 ("transaction_id", &detail->transaction_id), +        GNUNET_JSON_spec_fixed_auto ("coin_pub", &detail->coin_pub), +        TALER_JSON_spec_amount ("deposit_value", &detail->coin_value), +        TALER_JSON_spec_amount ("deposit_fee", &detail->coin_fee), +        GNUNET_JSON_spec_end() +      }; + +      if (GNUNET_OK != +          GNUNET_JSON_parse (detail_j, +                             spec_detail, +                             NULL, NULL)) +      { +        GNUNET_break_op (0); +        GNUNET_CRYPTO_hash_context_abort (hash_context); +        return GNUNET_SYSERR; +      } +      /* build up big hash for signature checking later */ +      dd.h_contract = detail->h_contract; +      dd.transaction_id = GNUNET_htonll (detail->transaction_id); +      dd.coin_pub = detail->coin_pub; +      TALER_amount_hton (&dd.deposit_value, +                         &detail->coin_value); +      TALER_amount_hton (&dd.deposit_fee, +                         &detail->coin_fee); +      GNUNET_CRYPTO_hash_context_read (hash_context, +                                       &dd, +                                       sizeof (struct TALER_WireDepositDetailP)); +    } +    /* Check signature */ +    wdp.purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE_DEPOSIT); +    wdp.purpose.size = htonl (sizeof (struct TALER_WireDepositDataPS)); +    TALER_amount_hton (&wdp.total, +                       &total_amount); +    wdp.merchant_pub = merchant_pub; +    wdp.h_wire = h_wire; +    GNUNET_CRYPTO_hash_context_finish (hash_context, +                                       &wdp.h_details); +    if (GNUNET_OK != +        TALER_EXCHANGE_test_signing_key (TALER_EXCHANGE_get_keys (wdh->exchange), +                                         &exchange_pub)) +    { +      GNUNET_break_op (0); +      return GNUNET_SYSERR; +    } +    if (GNUNET_OK != +        TALER_EXCHANGE_test_signing_key (TALER_EXCHANGE_get_keys (wdh->exchange), +                                         &exchange_pub)) +    { +      GNUNET_break_op (0); +      return GNUNET_SYSERR; +    } +    wdh->cb (wdh->cb_cls, +             MHD_HTTP_OK, +             &exchange_pub, +             json, +             &h_wire, +             &total_amount, +             num_details, +             details); +  } +  TALER_EXCHANGE_track_transfer_cancel (wdh); +  return GNUNET_OK; +} + + +/** + * Function called when we're done processing the + * HTTP /track/transfer request. + * + * @param cls the `struct TALER_EXCHANGE_TrackTransferHandle` + * @param response_code HTTP response code, 0 on error + * @param json parsed JSON result, NULL on error + */ +static void +handle_track_transfer_finished (void *cls, +                                long response_code, +                                const json_t *json) +{ +  struct TALER_EXCHANGE_TrackTransferHandle *wdh = cls; + +  wdh->job = NULL; +  switch (response_code) +  { +  case 0: +    break; +  case MHD_HTTP_OK: +    if (GNUNET_OK == +        check_track_transfer_response_ok (wdh, +                                          json)) +      return; +    GNUNET_break_op (0); +    response_code = 0; +    break; +  case MHD_HTTP_BAD_REQUEST: +    /* This should never happen, either us or the exchange is buggy +       (or API version conflict); just pass JSON reply to the application */ +    break; +  case MHD_HTTP_UNAUTHORIZED: +    /* Nothing really to verify, exchange says one of the signatures is +       invalid; as we checked them, this should never happen, we +       should pass the JSON reply to the application */ +    break; +  case MHD_HTTP_NOT_FOUND: +    /* Exchange does not know about transaction; +       we should pass the reply to the application */ +    break; +  case MHD_HTTP_INTERNAL_SERVER_ERROR: +    /* Server had an internal issue; we should retry, but this API +       leaves this to the application */ +    break; +  default: +    /* unexpected response code */ +    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, +                "Unexpected response code %u\n", +                (unsigned int) response_code); +    GNUNET_break (0); +    response_code = 0; +    break; +  } +  wdh->cb (wdh->cb_cls, +           response_code, +           NULL, +           json, +           NULL, NULL, 0, NULL); +  TALER_EXCHANGE_track_transfer_cancel (wdh); +} + + +/** + * Query the exchange about which transactions were combined + * to create a wire transfer. + * + * @param exchange exchange to query + * @param wtid raw wire transfer identifier to get information about + * @param cb callback to call + * @param cb_cls closure for @a cb + * @return handle to cancel operation + */ +struct TALER_EXCHANGE_TrackTransferHandle * +TALER_EXCHANGE_track_transfer (struct TALER_EXCHANGE_Handle *exchange, +                               const struct TALER_WireTransferIdentifierRawP *wtid, +                               TALER_EXCHANGE_TrackTransferCallback cb, +                               void *cb_cls) +{ +  struct TALER_EXCHANGE_TrackTransferHandle *wdh; +  struct GNUNET_CURL_Context *ctx; +  char *buf; +  char *path; +  CURL *eh; + +  if (GNUNET_YES != +      MAH_handle_is_ready (exchange)) +  { +    GNUNET_break (0); +    return NULL; +  } + +  wdh = GNUNET_new (struct TALER_EXCHANGE_TrackTransferHandle); +  wdh->exchange = exchange; +  wdh->cb = cb; +  wdh->cb_cls = cb_cls; + +  buf = GNUNET_STRINGS_data_to_string_alloc (wtid, +                                             sizeof (struct TALER_WireTransferIdentifierRawP)); +  GNUNET_asprintf (&path, +                   "/track/transfer?wtid=%s", +                   buf); +  wdh->url = MAH_path_to_url (wdh->exchange, +                              path); +  GNUNET_free (buf); +  GNUNET_free (path); + +  eh = curl_easy_init (); +  GNUNET_assert (CURLE_OK == +                 curl_easy_setopt (eh, +                                   CURLOPT_URL, +                                   wdh->url)); +  ctx = MAH_handle_to_context (exchange); +  wdh->job = GNUNET_CURL_job_add (ctx, +                          eh, +                          GNUNET_YES, +                          &handle_track_transfer_finished, +                          wdh); +  return wdh; +} + + +/** + * Cancel wire deposits request.  This function cannot be used on a request + * handle if a response is already served for it. + * + * @param wdh the wire deposits request handle + */ +void +TALER_EXCHANGE_track_transfer_cancel (struct TALER_EXCHANGE_TrackTransferHandle *wdh) +{ +  if (NULL != wdh->job) +  { +    GNUNET_CURL_job_cancel (wdh->job); +    wdh->job = NULL; +  } +  GNUNET_free (wdh->url); +  GNUNET_free (wdh); +} + + +/* end of exchange_api_wire_deposits.c */ diff --git a/src/exchange-lib/exchange_api_wire_deposits.c b/src/exchange-lib/exchange_api_wire_deposits.c deleted file mode 100644 index 91e2aef7..00000000 --- a/src/exchange-lib/exchange_api_wire_deposits.c +++ /dev/null @@ -1,313 +0,0 @@ -/* -  This file is part of TALER -  Copyright (C) 2014, 2015, 2016 GNUnet e.V. - -  TALER is free software; you can redistribute it and/or modify it under the -  terms of the GNU General Public License as published by the Free Software -  Foundation; either version 3, or (at your option) any later version. - -  TALER is distributed in the hope that it will be useful, but WITHOUT ANY -  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR -  A PARTICULAR PURPOSE.  See the GNU General Public License for more details. - -  You should have received a copy of the GNU General Public License along with -  TALER; see the file COPYING.  If not, If not, see -  <http://www.gnu.org/licenses/> -*/ -/** - * @file exchange-lib/exchange_api_wire_deposits.c - * @brief Implementation of the /wire/deposits request of the exchange's HTTP API - * @author Christian Grothoff - */ -#include "platform.h" -#include <curl/curl.h> -#include <jansson.h> -#include <microhttpd.h> /* just for HTTP status codes */ -#include <gnunet/gnunet_util_lib.h> -#include <gnunet/gnunet_curl_lib.h> -#include "taler_exchange_service.h" -#include "exchange_api_common.h" -#include "taler_json_lib.h" -#include "exchange_api_handle.h" -#include "taler_signatures.h" - - -/** - * @brief A /wire/deposits Handle - */ -struct TALER_EXCHANGE_WireDepositsHandle -{ - -  /** -   * The connection to exchange this request handle will use -   */ -  struct TALER_EXCHANGE_Handle *exchange; - -  /** -   * The url for this request. -   */ -  char *url; - -  /** -   * Handle for the request. -   */ -  struct GNUNET_CURL_Job *job; - -  /** -   * Function to call with the result. -   */ -  TALER_EXCHANGE_WireDepositsCallback cb; - -  /** -   * Closure for @a cb. -   */ -  void *cb_cls; - -}; - - -/** - * Function called when we're done processing the - * HTTP /wire/deposits request. - * - * @param cls the `struct TALER_EXCHANGE_WireDepositsHandle` - * @param response_code HTTP response code, 0 on error - * @param json parsed JSON result, NULL on error - */ -static void -handle_wire_deposits_finished (void *cls, -                               long response_code, -                               const json_t *json) -{ -  struct TALER_EXCHANGE_WireDepositsHandle *wdh = cls; - -  wdh->job = NULL; -  switch (response_code) -  { -  case 0: -    break; -  case MHD_HTTP_OK: -    { -      json_t *details_j; -      struct GNUNET_HashCode h_wire; -      struct TALER_Amount total_amount; -      struct TALER_MerchantPublicKeyP merchant_pub; -      unsigned int num_details; -      struct TALER_ExchangePublicKeyP exchange_pub; -      struct TALER_ExchangeSignatureP exchange_sig; -      struct GNUNET_JSON_Specification spec[] = { -        TALER_JSON_spec_amount ("total", &total_amount), -        GNUNET_JSON_spec_fixed_auto ("merchant_pub", &merchant_pub), -        GNUNET_JSON_spec_fixed_auto ("H_wire", &h_wire), -        GNUNET_JSON_spec_json ("deposits", &details_j), -        GNUNET_JSON_spec_fixed_auto ("exchange_sig", &exchange_sig), -        GNUNET_JSON_spec_fixed_auto ("exchange_pub", &exchange_pub), -        GNUNET_JSON_spec_end() -      }; - -      if (GNUNET_OK != -          GNUNET_JSON_parse (json, -                             spec, -                             NULL, NULL)) -      { -        GNUNET_break_op (0); -        response_code = 0; -        break; -      } -      num_details = json_array_size (details_j); -      { -        struct TALER_WireDepositDetails details[num_details]; -        unsigned int i; -        struct GNUNET_HashContext *hash_context; -        struct TALER_WireDepositDetailP dd; -        struct TALER_WireDepositDataPS wdp; - -        hash_context = GNUNET_CRYPTO_hash_context_start (); -        for (i=0;i<num_details;i++) -        { -          struct TALER_WireDepositDetails *detail = &details[i]; -          struct json_t *detail_j = json_array_get (details_j, i); -          struct GNUNET_JSON_Specification spec_detail[] = { -            GNUNET_JSON_spec_fixed_auto ("H_contract", &detail->h_contract), -            GNUNET_JSON_spec_uint64 ("transaction_id", &detail->transaction_id), -            GNUNET_JSON_spec_fixed_auto ("coin_pub", &detail->coin_pub), -            TALER_JSON_spec_amount ("deposit_value", &detail->coin_value), -            TALER_JSON_spec_amount ("deposit_fee", &detail->coin_fee), -            GNUNET_JSON_spec_end() -          }; - -          if (GNUNET_OK != -              GNUNET_JSON_parse (detail_j, -                                 spec_detail, -                                 NULL, NULL)) -          { -            GNUNET_break_op (0); -            response_code = 0; -            break; -          } -          /* build up big hash for signature checking later */ -          dd.h_contract = detail->h_contract; -          dd.transaction_id = GNUNET_htonll (detail->transaction_id); -          dd.coin_pub = detail->coin_pub; -          TALER_amount_hton (&dd.deposit_value, -                             &detail->coin_value); -          TALER_amount_hton (&dd.deposit_fee, -                             &detail->coin_fee); -          GNUNET_CRYPTO_hash_context_read (hash_context, -                                           &dd, -                                           sizeof (struct TALER_WireDepositDetailP)); -        } -        /* Check signature */ -        wdp.purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE_DEPOSIT); -        wdp.purpose.size = htonl (sizeof (struct TALER_WireDepositDataPS)); -        TALER_amount_hton (&wdp.total, -                           &total_amount); -        wdp.merchant_pub = merchant_pub; -        wdp.h_wire = h_wire; -        GNUNET_CRYPTO_hash_context_finish (hash_context, -                                           &wdp.h_details); -        if ( (0 == response_code /* avoid crypto if things are already wrong */) && -             (GNUNET_OK != -              TALER_EXCHANGE_test_signing_key (TALER_EXCHANGE_get_keys (wdh->exchange), -                                               &exchange_pub)) ) -        { -          GNUNET_break_op (0); -          response_code = 0; -        } -        if ( (0 == response_code /* avoid crypto if things are already wrong */) && -             (GNUNET_OK != -              TALER_EXCHANGE_test_signing_key (TALER_EXCHANGE_get_keys (wdh->exchange), -                                               &exchange_pub)) ) -        { -          GNUNET_break_op (0); -          response_code = 0; -        } -        if (0 == response_code) -          break; -        wdh->cb (wdh->cb_cls, -                 response_code, -                 &exchange_pub, -                 json, -                 &h_wire, -                 &total_amount, -                 num_details, -                 details); -        TALER_EXCHANGE_wire_deposits_cancel (wdh); -        return; -      } -    } -    break; -  case MHD_HTTP_BAD_REQUEST: -    /* This should never happen, either us or the exchange is buggy -       (or API version conflict); just pass JSON reply to the application */ -    break; -  case MHD_HTTP_UNAUTHORIZED: -    /* Nothing really to verify, exchange says one of the signatures is -       invalid; as we checked them, this should never happen, we -       should pass the JSON reply to the application */ -    break; -  case MHD_HTTP_NOT_FOUND: -    /* Exchange does not know about transaction; -       we should pass the reply to the application */ -    break; -  case MHD_HTTP_INTERNAL_SERVER_ERROR: -    /* Server had an internal issue; we should retry, but this API -       leaves this to the application */ -    break; -  default: -    /* unexpected response code */ -    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, -                "Unexpected response code %u\n", -                (unsigned int) response_code); -    GNUNET_break (0); -    response_code = 0; -    break; -  } -  wdh->cb (wdh->cb_cls, -           response_code, -           NULL, -           json, -           NULL, NULL, 0, NULL); -  TALER_EXCHANGE_wire_deposits_cancel (wdh); -} - - -/** - * Query the exchange about which transactions were combined - * to create a wire transfer. - * - * @param exchange exchange to query - * @param wtid raw wire transfer identifier to get information about - * @param cb callback to call - * @param cb_cls closure for @a cb - * @return handle to cancel operation - */ -struct TALER_EXCHANGE_WireDepositsHandle * -TALER_EXCHANGE_wire_deposits (struct TALER_EXCHANGE_Handle *exchange, -                              const struct TALER_WireTransferIdentifierRawP *wtid, -                              TALER_EXCHANGE_WireDepositsCallback cb, -                              void *cb_cls) -{ -  struct TALER_EXCHANGE_WireDepositsHandle *wdh; -  struct GNUNET_CURL_Context *ctx; -  char *buf; -  char *path; -  CURL *eh; - -  if (GNUNET_YES != -      MAH_handle_is_ready (exchange)) -  { -    GNUNET_break (0); -    return NULL; -  } - -  wdh = GNUNET_new (struct TALER_EXCHANGE_WireDepositsHandle); -  wdh->exchange = exchange; -  wdh->cb = cb; -  wdh->cb_cls = cb_cls; - -  buf = GNUNET_STRINGS_data_to_string_alloc (wtid, -                                             sizeof (struct TALER_WireTransferIdentifierRawP)); -  GNUNET_asprintf (&path, -                   "/wire/deposits?wtid=%s", -                   buf); -  wdh->url = MAH_path_to_url (wdh->exchange, -                              path); -  GNUNET_free (buf); -  GNUNET_free (path); - -  eh = curl_easy_init (); -  GNUNET_assert (CURLE_OK == -                 curl_easy_setopt (eh, -                                   CURLOPT_URL, -                                   wdh->url)); -  ctx = MAH_handle_to_context (exchange); -  wdh->job = GNUNET_CURL_job_add (ctx, -                          eh, -                          GNUNET_YES, -                          &handle_wire_deposits_finished, -                          wdh); -  return wdh; -} - - -/** - * Cancel wire deposits request.  This function cannot be used on a request - * handle if a response is already served for it. - * - * @param wdh the wire deposits request handle - */ -void -TALER_EXCHANGE_wire_deposits_cancel (struct TALER_EXCHANGE_WireDepositsHandle *wdh) -{ -  if (NULL != wdh->job) -  { -    GNUNET_CURL_job_cancel (wdh->job); -    wdh->job = NULL; -  } -  GNUNET_free (wdh->url); -  GNUNET_free (wdh); -} - - -/* end of exchange_api_wire_deposits.c */ diff --git a/src/exchange-lib/test_exchange_api.c b/src/exchange-lib/test_exchange_api.c index 34e9da83..acd08703 100644 --- a/src/exchange-lib/test_exchange_api.c +++ b/src/exchange-lib/test_exchange_api.c @@ -122,12 +122,12 @@ enum OpCode    OC_WIRE,    /** -   * Verify exchange's /wire/deposits method. +   * Verify exchange's /track/transfer method.     */    OC_WIRE_DEPOSITS,    /** -   * Verify exchange's /deposit/wtid method. +   * Verify exchange's /track/transaction method.     */    OC_DEPOSIT_WTID, @@ -514,14 +514,14 @@ struct Command      } wire;      /** -     * Information for the /wire/deposits's command. +     * Information for the /track/transfer's command.       */      struct {        /**         * Handle to the wire deposits request.         */ -      struct TALER_EXCHANGE_WireDepositsHandle *wdh; +      struct TALER_EXCHANGE_TrackTransferHandle *wdh;        /**         * Reference to a command providing a WTID. If set, we use the @@ -529,7 +529,7 @@ struct Command         * #OC_DEPOSIT_WTID or an #OC_CHECK_BANK_TRANSFER.  In the         * case of the bank transfer, we check that the total amount         * claimed by the exchange matches the total amount transferred -       * by the bank.  In the case of a /deposit/wtid, we check +       * by the bank.  In the case of a /track/transaction, we check         * that the wire details match.         */        const char *wtid_ref; @@ -552,14 +552,14 @@ struct Command      } wire_deposits;      /** -     * Information for the /deposit/wtid command. +     * Information for the /track/transaction command.       */      struct {        /**         * Handle to the deposit wtid request.         */ -      struct TALER_EXCHANGE_DepositWtidHandle *dwh; +      struct TALER_EXCHANGE_TrackTransactionHandle *dwh;        /**         * Which /deposit operation should we obtain WTID data for? @@ -1409,7 +1409,7 @@ wire_deposits_cb (void *cls,                    const struct GNUNET_HashCode *h_wire,                    const struct TALER_Amount *total_amount,                    unsigned int details_length, -                  const struct TALER_WireDepositDetails *details) +                  const struct TALER_TrackTransferDetails *details)  {    struct InterpreterState *is = cls;    struct Command *cmd = &is->commands[is->ip]; @@ -2164,7 +2164,7 @@ interpreter_run (void *cls)        }      }      cmd->details.wire_deposits.wdh -      = TALER_EXCHANGE_wire_deposits (exchange, +      = TALER_EXCHANGE_track_transfer (exchange,                                        &cmd->details.wire_deposits.wtid,                                        &wire_deposits_cb,                                        is); @@ -2202,7 +2202,7 @@ interpreter_run (void *cls)                         &h_contract);        json_decref (contract);        cmd->details.deposit_wtid.dwh -        = TALER_EXCHANGE_deposit_wtid (exchange, +        = TALER_EXCHANGE_track_transaction (exchange,                                         &ref->details.deposit.merchant_priv,                                         &h_wire,                                         &h_contract, @@ -2522,7 +2522,7 @@ do_shutdown (void *cls)                      "Command %u (%s) did not complete\n",                      i,                      cmd->label); -        TALER_EXCHANGE_wire_deposits_cancel (cmd->details.wire_deposits.wdh); +        TALER_EXCHANGE_track_transfer_cancel (cmd->details.wire_deposits.wdh);          cmd->details.wire_deposits.wdh = NULL;        }        break; @@ -2533,7 +2533,7 @@ do_shutdown (void *cls)                      "Command %u (%s) did not complete\n",                      i,                      cmd->label); -        TALER_EXCHANGE_deposit_wtid_cancel (cmd->details.deposit_wtid.dwh); +        TALER_EXCHANGE_track_transaction_cancel (cmd->details.deposit_wtid.dwh);          cmd->details.deposit_wtid.dwh = NULL;        }        break;  | 
