Merge branch 'master' of ssh://taler.net/var/git/exchange

This commit is contained in:
Marcello Stanisci 2016-06-09 23:35:35 +02:00
commit 9f23e213cf
18 changed files with 525 additions and 502 deletions

View File

@ -1,3 +1,7 @@
Thu Jun 9 19:17:02 CEST 2016
Rename /deposit/wtid to /track/transaction and
/wire/deposits to /track/transfer. -CG
Wed Jun 8 11:32:41 CEST 2016 Wed Jun 8 11:32:41 CEST 2016
Export libtalerfakebank API so we can use it in testcases for the Export libtalerfakebank API so we can use it in testcases for the
merchant as well. -CG merchant as well. -CG

View File

@ -18,13 +18,13 @@ libtalerexchange_la_SOURCES = \
exchange_api_handle.c exchange_api_handle.h \ exchange_api_handle.c exchange_api_handle.h \
exchange_api_admin.c \ exchange_api_admin.c \
exchange_api_deposit.c \ exchange_api_deposit.c \
exchange_api_deposit_wtid.c \
exchange_api_refresh.c \ exchange_api_refresh.c \
exchange_api_refresh_link.c \ exchange_api_refresh_link.c \
exchange_api_refund.c \ exchange_api_refund.c \
exchange_api_reserve.c \ exchange_api_reserve.c \
exchange_api_wire.c \ exchange_api_track_transaction.c \
exchange_api_wire_deposits.c exchange_api_track_transfer.c \
exchange_api_wire.c
libtalerexchange_la_LIBADD = \ libtalerexchange_la_LIBADD = \
$(top_builddir)/src/json/libtalerjson.la \ $(top_builddir)/src/json/libtalerjson.la \

View File

@ -15,8 +15,8 @@
<http://www.gnu.org/licenses/> <http://www.gnu.org/licenses/>
*/ */
/** /**
* @file exchange-lib/exchange_api_deposit_wtid.c * @file exchange-lib/exchange_api_track_transaction.c
* @brief Implementation of the /deposit/wtid request of the exchange's HTTP API * @brief Implementation of the /track/transaction request of the exchange's HTTP API
* @author Christian Grothoff * @author Christian Grothoff
*/ */
#include "platform.h" #include "platform.h"
@ -36,7 +36,7 @@
/** /**
* @brief A Deposit Wtid Handle * @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. * Function to call with the result.
*/ */
TALER_EXCHANGE_DepositWtidCallback cb; TALER_EXCHANGE_TrackTransactionCallback cb;
/** /**
* Closure for @a 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 * @return #GNUNET_OK if the signature is valid, #GNUNET_SYSERR if not
*/ */
static int 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, const json_t *json,
struct TALER_ExchangePublicKeyP *exchange_pub) 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 * 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 response_code HTTP response code, 0 on error
* @param json parsed JSON result, NULL on error * @param json parsed JSON result, NULL on error
*/ */
@ -142,7 +142,7 @@ handle_deposit_wtid_finished (void *cls,
long response_code, long response_code,
const json_t *json) const json_t *json)
{ {
struct TALER_EXCHANGE_DepositWtidHandle *dwh = cls; struct TALER_EXCHANGE_TrackTransactionHandle *dwh = cls;
const struct TALER_WireTransferIdentifierRawP *wtid = NULL; const struct TALER_WireTransferIdentifierRawP *wtid = NULL;
struct GNUNET_TIME_Absolute execution_time = GNUNET_TIME_UNIT_FOREVER_ABS; struct GNUNET_TIME_Absolute execution_time = GNUNET_TIME_UNIT_FOREVER_ABS;
const struct TALER_Amount *coin_contribution = NULL; const struct TALER_Amount *coin_contribution = NULL;
@ -244,7 +244,7 @@ handle_deposit_wtid_finished (void *cls,
wtid, wtid,
execution_time, execution_time,
coin_contribution); 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 * @param cb_cls closure for @a cb
* @return handle to abort request * @return handle to abort request
*/ */
struct TALER_EXCHANGE_DepositWtidHandle * struct TALER_EXCHANGE_TrackTransactionHandle *
TALER_EXCHANGE_deposit_wtid (struct TALER_EXCHANGE_Handle *exchange, TALER_EXCHANGE_track_transaction (struct TALER_EXCHANGE_Handle *exchange,
const struct TALER_MerchantPrivateKeyP *merchant_priv, const struct TALER_MerchantPrivateKeyP *merchant_priv,
const struct GNUNET_HashCode *h_wire, const struct GNUNET_HashCode *h_wire,
const struct GNUNET_HashCode *h_contract, const struct GNUNET_HashCode *h_contract,
const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub,
uint64_t transaction_id, uint64_t transaction_id,
TALER_EXCHANGE_DepositWtidCallback cb, TALER_EXCHANGE_TrackTransactionCallback cb,
void *cb_cls) void *cb_cls)
{ {
struct TALER_DepositTrackPS dtp; struct TALER_DepositTrackPS dtp;
struct TALER_MerchantSignatureP merchant_sig; struct TALER_MerchantSignatureP merchant_sig;
struct TALER_EXCHANGE_DepositWtidHandle *dwh; struct TALER_EXCHANGE_TrackTransactionHandle *dwh;
struct GNUNET_CURL_Context *ctx; struct GNUNET_CURL_Context *ctx;
json_t *deposit_wtid_obj; json_t *deposit_wtid_obj;
CURL *eh; CURL *eh;
@ -284,7 +284,7 @@ TALER_EXCHANGE_deposit_wtid (struct TALER_EXCHANGE_Handle *exchange,
GNUNET_break (0); GNUNET_break (0);
return NULL; 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.purpose.size = htonl (sizeof (dtp));
dtp.h_contract = *h_contract; dtp.h_contract = *h_contract;
dtp.h_wire = *h_wire; 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_pub", GNUNET_JSON_from_data_auto (&dtp.merchant),
"merchant_sig", GNUNET_JSON_from_data_auto (&merchant_sig)); "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->exchange = exchange;
dwh->cb = cb; dwh->cb = cb;
dwh->cb_cls = cb_cls; 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.size = htonl (sizeof (struct TALER_ConfirmWirePS));
dwh->depconf.purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE); dwh->depconf.purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE);
dwh->depconf.h_wire = *h_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 * @param dwh the wire deposits request handle
*/ */
void 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) if (NULL != dwh->job)
{ {

View File

@ -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 */

View File

@ -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 */

View File

@ -122,12 +122,12 @@ enum OpCode
OC_WIRE, OC_WIRE,
/** /**
* Verify exchange's /wire/deposits method. * Verify exchange's /track/transfer method.
*/ */
OC_WIRE_DEPOSITS, OC_WIRE_DEPOSITS,
/** /**
* Verify exchange's /deposit/wtid method. * Verify exchange's /track/transaction method.
*/ */
OC_DEPOSIT_WTID, OC_DEPOSIT_WTID,
@ -514,14 +514,14 @@ struct Command
} wire; } wire;
/** /**
* Information for the /wire/deposits's command. * Information for the /track/transfer's command.
*/ */
struct { struct {
/** /**
* Handle to the wire deposits request. * 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 * 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 * #OC_DEPOSIT_WTID or an #OC_CHECK_BANK_TRANSFER. In the
* case of the bank transfer, we check that the total amount * case of the bank transfer, we check that the total amount
* claimed by the exchange matches the total amount transferred * 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. * that the wire details match.
*/ */
const char *wtid_ref; const char *wtid_ref;
@ -552,14 +552,14 @@ struct Command
} wire_deposits; } wire_deposits;
/** /**
* Information for the /deposit/wtid command. * Information for the /track/transaction command.
*/ */
struct { struct {
/** /**
* Handle to the deposit wtid request. * 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? * 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 GNUNET_HashCode *h_wire,
const struct TALER_Amount *total_amount, const struct TALER_Amount *total_amount,
unsigned int details_length, unsigned int details_length,
const struct TALER_WireDepositDetails *details) const struct TALER_TrackTransferDetails *details)
{ {
struct InterpreterState *is = cls; struct InterpreterState *is = cls;
struct Command *cmd = &is->commands[is->ip]; struct Command *cmd = &is->commands[is->ip];
@ -2164,7 +2164,7 @@ interpreter_run (void *cls)
} }
} }
cmd->details.wire_deposits.wdh cmd->details.wire_deposits.wdh
= TALER_EXCHANGE_wire_deposits (exchange, = TALER_EXCHANGE_track_transfer (exchange,
&cmd->details.wire_deposits.wtid, &cmd->details.wire_deposits.wtid,
&wire_deposits_cb, &wire_deposits_cb,
is); is);
@ -2202,7 +2202,7 @@ interpreter_run (void *cls)
&h_contract); &h_contract);
json_decref (contract); json_decref (contract);
cmd->details.deposit_wtid.dwh cmd->details.deposit_wtid.dwh
= TALER_EXCHANGE_deposit_wtid (exchange, = TALER_EXCHANGE_track_transaction (exchange,
&ref->details.deposit.merchant_priv, &ref->details.deposit.merchant_priv,
&h_wire, &h_wire,
&h_contract, &h_contract,
@ -2522,7 +2522,7 @@ do_shutdown (void *cls)
"Command %u (%s) did not complete\n", "Command %u (%s) did not complete\n",
i, i,
cmd->label); 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; cmd->details.wire_deposits.wdh = NULL;
} }
break; break;
@ -2533,7 +2533,7 @@ do_shutdown (void *cls)
"Command %u (%s) did not complete\n", "Command %u (%s) did not complete\n",
i, i,
cmd->label); 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; cmd->details.deposit_wtid.dwh = NULL;
} }
break; break;

View File

@ -259,16 +259,16 @@ handle_mhd_request (void *cls,
"Only POST is allowed", 0, "Only POST is allowed", 0,
&TMH_MHD_handler_send_json_pack_error, MHD_HTTP_METHOD_NOT_ALLOWED }, &TMH_MHD_handler_send_json_pack_error, MHD_HTTP_METHOD_NOT_ALLOWED },
{ "/wire/deposits", MHD_HTTP_METHOD_GET, "application/json", { "/track/transfer", MHD_HTTP_METHOD_GET, "application/json",
NULL, 0, NULL, 0,
&TMH_TRACKING_handler_wire_deposits, MHD_HTTP_OK }, &TMH_TRACKING_handler_track_transfer, MHD_HTTP_OK },
{ "/wire/deposits", NULL, "text/plain", { "/track/transfer", NULL, "text/plain",
"Only GET is allowed", 0, "Only GET is allowed", 0,
&TMH_MHD_handler_send_json_pack_error, MHD_HTTP_METHOD_NOT_ALLOWED }, &TMH_MHD_handler_send_json_pack_error, MHD_HTTP_METHOD_NOT_ALLOWED },
{ "/deposit/wtid", MHD_HTTP_METHOD_POST, "application/json", { "/track/transaction", MHD_HTTP_METHOD_POST, "application/json",
NULL, 0, NULL, 0,
&TMH_TRACKING_handler_deposit_wtid, MHD_HTTP_OK }, &TMH_TRACKING_handler_track_transaction, MHD_HTTP_OK },
{ "/deposit/wtid", NULL, "text/plain", { "/track/transaction", NULL, "text/plain",
"Only POST is allowed", 0, "Only POST is allowed", 0,
&TMH_MHD_handler_send_json_pack_error, MHD_HTTP_METHOD_NOT_ALLOWED }, &TMH_MHD_handler_send_json_pack_error, MHD_HTTP_METHOD_NOT_ALLOWED },

View File

@ -411,7 +411,7 @@ TMH_DB_execute_refund (struct MHD_Connection *connection,
session); session);
TMH_plugin->free_coin_transaction_list (TMH_plugin->cls, TMH_plugin->free_coin_transaction_list (TMH_plugin->cls,
tl); tl);
return TMH_RESPONSE_reply_deposit_unknown (connection); return TMH_RESPONSE_reply_transaction_unknown (connection);
} }
/* handle if conflicting refund found */ /* handle if conflicting refund found */
if (GNUNET_SYSERR == refund_found) if (GNUNET_SYSERR == refund_found)
@ -1762,12 +1762,12 @@ struct WtidTransactionContext
/** /**
* Head of DLL with details for /wire/deposit response. * Head of DLL with details for /wire/deposit response.
*/ */
struct TMH_WireDepositDetail *wdd_head; struct TMH_TrackTransferDetail *wdd_head;
/** /**
* Head of DLL with details for /wire/deposit response. * Head of DLL with details for /wire/deposit response.
*/ */
struct TMH_WireDepositDetail *wdd_tail; struct TMH_TrackTransferDetail *wdd_tail;
/** /**
* JSON array with details about the individual deposits. * JSON array with details about the individual deposits.
@ -1811,7 +1811,7 @@ handle_transaction_data (void *cls,
{ {
struct WtidTransactionContext *ctx = cls; struct WtidTransactionContext *ctx = cls;
struct TALER_Amount delta; struct TALER_Amount delta;
struct TMH_WireDepositDetail *wdd; struct TMH_TrackTransferDetail *wdd;
if (GNUNET_SYSERR == ctx->is_valid) if (GNUNET_SYSERR == ctx->is_valid)
return; return;
@ -1862,7 +1862,7 @@ handle_transaction_data (void *cls,
return; return;
} }
} }
wdd = GNUNET_new (struct TMH_WireDepositDetail); wdd = GNUNET_new (struct TMH_TrackTransferDetail);
wdd->deposit_value = *deposit_value; wdd->deposit_value = *deposit_value;
wdd->deposit_fee = *deposit_fee; wdd->deposit_fee = *deposit_fee;
wdd->h_contract = *h_contract; wdd->h_contract = *h_contract;
@ -1875,7 +1875,7 @@ handle_transaction_data (void *cls,
/** /**
* Execute a "/wire/deposits". Returns the transaction information * Execute a "/track/transfer". Returns the transaction information
* associated with the given wire transfer identifier. * associated with the given wire transfer identifier.
* *
* @param connection the MHD connection to handle * @param connection the MHD connection to handle
@ -1883,13 +1883,13 @@ handle_transaction_data (void *cls,
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_DB_execute_wire_deposits (struct MHD_Connection *connection, TMH_DB_execute_track_transfer (struct MHD_Connection *connection,
const struct TALER_WireTransferIdentifierRawP *wtid) const struct TALER_WireTransferIdentifierRawP *wtid)
{ {
int ret; int ret;
struct WtidTransactionContext ctx; struct WtidTransactionContext ctx;
struct TALER_EXCHANGEDB_Session *session; struct TALER_EXCHANGEDB_Session *session;
struct TMH_WireDepositDetail *wdd; struct TMH_TrackTransferDetail *wdd;
if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls))) if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls)))
{ {
@ -1922,7 +1922,7 @@ TMH_DB_execute_wire_deposits (struct MHD_Connection *connection,
"wtid"); "wtid");
goto cleanup; goto cleanup;
} }
ret = TMH_RESPONSE_reply_wire_deposit_details (connection, ret = TMH_RESPONSE_reply_track_transfer_details (connection,
&ctx.total, &ctx.total,
&ctx.merchant_pub, &ctx.merchant_pub,
&ctx.h_wire, &ctx.h_wire,
@ -2004,7 +2004,7 @@ handle_wtid_data (void *cls,
if (NULL == wtid) if (NULL == wtid)
{ {
ctx->res = TMH_RESPONSE_reply_deposit_pending (ctx->connection, ctx->res = TMH_RESPONSE_reply_transfer_pending (ctx->connection,
execution_time); execution_time);
} }
else else
@ -2019,7 +2019,7 @@ handle_wtid_data (void *cls,
} }
else else
{ {
ctx->res = TMH_RESPONSE_reply_deposit_wtid (ctx->connection, ctx->res = TMH_RESPONSE_reply_track_transaction (ctx->connection,
&ctx->h_contract, &ctx->h_contract,
&ctx->h_wire, &ctx->h_wire,
&ctx->coin_pub, &ctx->coin_pub,
@ -2033,7 +2033,7 @@ handle_wtid_data (void *cls,
/** /**
* Execute a "/deposit/wtid". Returns the transfer information * Execute a "/track/transaction". Returns the transfer information
* associated with the given deposit. * associated with the given deposit.
* *
* @param connection the MHD connection to handle * @param connection the MHD connection to handle
@ -2045,7 +2045,7 @@ handle_wtid_data (void *cls,
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_DB_execute_deposit_wtid (struct MHD_Connection *connection, TMH_DB_execute_track_transaction (struct MHD_Connection *connection,
const struct GNUNET_HashCode *h_contract, const struct GNUNET_HashCode *h_contract,
const struct GNUNET_HashCode *h_wire, const struct GNUNET_HashCode *h_wire,
const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub,
@ -2085,7 +2085,7 @@ TMH_DB_execute_deposit_wtid (struct MHD_Connection *connection,
if (GNUNET_NO == ret) if (GNUNET_NO == ret)
{ {
GNUNET_break (GNUNET_SYSERR == ctx.res); GNUNET_break (GNUNET_SYSERR == ctx.res);
return TMH_RESPONSE_reply_deposit_unknown (connection); return TMH_RESPONSE_reply_transaction_unknown (connection);
} }
if (GNUNET_SYSERR == ctx.res) if (GNUNET_SYSERR == ctx.res)
{ {

View File

@ -205,7 +205,7 @@ TMH_DB_execute_admin_add_incoming (struct MHD_Connection *connection,
/** /**
* Execute a "/wire/deposits". Returns the transaction information * Execute a "/track/transfer". Returns the transaction information
* associated with the given wire transfer identifier. * associated with the given wire transfer identifier.
* *
* @param connection the MHD connection to handle * @param connection the MHD connection to handle
@ -213,12 +213,12 @@ TMH_DB_execute_admin_add_incoming (struct MHD_Connection *connection,
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_DB_execute_wire_deposits (struct MHD_Connection *connection, TMH_DB_execute_track_transfer (struct MHD_Connection *connection,
const struct TALER_WireTransferIdentifierRawP *wtid); const struct TALER_WireTransferIdentifierRawP *wtid);
/** /**
* Execute a "/deposit/wtid". Returns the transfer information * Execute a "/track/transaction". Returns the transfer information
* associated with the given deposit. * associated with the given deposit.
* *
* @param connection the MHD connection to handle * @param connection the MHD connection to handle
@ -230,7 +230,7 @@ TMH_DB_execute_wire_deposits (struct MHD_Connection *connection,
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_DB_execute_deposit_wtid (struct MHD_Connection *connection, TMH_DB_execute_track_transaction (struct MHD_Connection *connection,
const struct GNUNET_HashCode *h_contract, const struct GNUNET_HashCode *h_contract,
const struct GNUNET_HashCode *h_wire, const struct GNUNET_HashCode *h_wire,
const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub,

View File

@ -1146,7 +1146,7 @@ TMH_RESPONSE_reply_refresh_link_success (struct MHD_Connection *connection,
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_RESPONSE_reply_deposit_unknown (struct MHD_Connection *connection) TMH_RESPONSE_reply_transaction_unknown (struct MHD_Connection *connection)
{ {
return TMH_RESPONSE_reply_json_pack (connection, return TMH_RESPONSE_reply_json_pack (connection,
MHD_HTTP_NOT_FOUND, MHD_HTTP_NOT_FOUND,
@ -1164,7 +1164,7 @@ TMH_RESPONSE_reply_deposit_unknown (struct MHD_Connection *connection)
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_RESPONSE_reply_deposit_pending (struct MHD_Connection *connection, TMH_RESPONSE_reply_transfer_pending (struct MHD_Connection *connection,
struct GNUNET_TIME_Absolute planned_exec_time) struct GNUNET_TIME_Absolute planned_exec_time)
{ {
return TMH_RESPONSE_reply_json_pack (connection, return TMH_RESPONSE_reply_json_pack (connection,
@ -1190,7 +1190,7 @@ TMH_RESPONSE_reply_deposit_pending (struct MHD_Connection *connection,
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_RESPONSE_reply_deposit_wtid (struct MHD_Connection *connection, TMH_RESPONSE_reply_track_transaction (struct MHD_Connection *connection,
const struct GNUNET_HashCode *h_contract, const struct GNUNET_HashCode *h_contract,
const struct GNUNET_HashCode *h_wire, const struct GNUNET_HashCode *h_wire,
const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub,
@ -1239,13 +1239,13 @@ TMH_RESPONSE_reply_deposit_wtid (struct MHD_Connection *connection,
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_RESPONSE_reply_wire_deposit_details (struct MHD_Connection *connection, TMH_RESPONSE_reply_track_transfer_details (struct MHD_Connection *connection,
const struct TALER_Amount *total, const struct TALER_Amount *total,
const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_MerchantPublicKeyP *merchant_pub,
const struct GNUNET_HashCode *h_wire, const struct GNUNET_HashCode *h_wire,
const struct TMH_WireDepositDetail *wdd_head) const struct TMH_TrackTransferDetail *wdd_head)
{ {
const struct TMH_WireDepositDetail *wdd_pos; const struct TMH_TrackTransferDetail *wdd_pos;
json_t *deposits; json_t *deposits;
struct TALER_WireDepositDetailP dd; struct TALER_WireDepositDetailP dd;
struct GNUNET_HashContext *hash_context; struct GNUNET_HashContext *hash_context;

View File

@ -294,7 +294,7 @@ TMH_RESPONSE_reply_refund_success (struct MHD_Connection *connection,
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_RESPONSE_reply_deposit_unknown (struct MHD_Connection *connection); TMH_RESPONSE_reply_transaction_unknown (struct MHD_Connection *connection);
/** /**
@ -306,7 +306,7 @@ TMH_RESPONSE_reply_deposit_unknown (struct MHD_Connection *connection);
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_RESPONSE_reply_deposit_pending (struct MHD_Connection *connection, TMH_RESPONSE_reply_transfer_pending (struct MHD_Connection *connection,
struct GNUNET_TIME_Absolute planned_exec_time); struct GNUNET_TIME_Absolute planned_exec_time);
@ -325,7 +325,7 @@ TMH_RESPONSE_reply_deposit_pending (struct MHD_Connection *connection,
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_RESPONSE_reply_deposit_wtid (struct MHD_Connection *connection, TMH_RESPONSE_reply_track_transaction (struct MHD_Connection *connection,
const struct GNUNET_HashCode *h_contract, const struct GNUNET_HashCode *h_contract,
const struct GNUNET_HashCode *h_wire, const struct GNUNET_HashCode *h_wire,
const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub,
@ -338,18 +338,18 @@ TMH_RESPONSE_reply_deposit_wtid (struct MHD_Connection *connection,
/** /**
* Detail for /wire/deposit response. * Detail for /wire/deposit response.
*/ */
struct TMH_WireDepositDetail struct TMH_TrackTransferDetail
{ {
/** /**
* We keep deposit details in a DLL. * We keep deposit details in a DLL.
*/ */
struct TMH_WireDepositDetail *next; struct TMH_TrackTransferDetail *next;
/** /**
* We keep deposit details in a DLL. * We keep deposit details in a DLL.
*/ */
struct TMH_WireDepositDetail *prev; struct TMH_TrackTransferDetail *prev;
/** /**
* Hash of the contract * Hash of the contract
@ -390,11 +390,11 @@ struct TMH_WireDepositDetail
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_RESPONSE_reply_wire_deposit_details (struct MHD_Connection *connection, TMH_RESPONSE_reply_track_transfer_details (struct MHD_Connection *connection,
const struct TALER_Amount *total, const struct TALER_Amount *total,
const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_MerchantPublicKeyP *merchant_pub,
const struct GNUNET_HashCode *h_wire, const struct GNUNET_HashCode *h_wire,
const struct TMH_WireDepositDetail *wdd_head); const struct TMH_TrackTransferDetail *wdd_head);
/** /**

View File

@ -30,7 +30,7 @@
/** /**
* Handle a "/wire/deposits" request. * Handle a "/track/transfer" request.
* *
* @param rh context of the handler * @param rh context of the handler
* @param connection the MHD connection to handle * @param connection the MHD connection to handle
@ -40,11 +40,11 @@
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_TRACKING_handler_wire_deposits (struct TMH_RequestHandler *rh, TMH_TRACKING_handler_track_transfer (struct TMH_RequestHandler *rh,
struct MHD_Connection *connection, struct MHD_Connection *connection,
void **connection_cls, void **connection_cls,
const char *upload_data, const char *upload_data,
size_t *upload_data_size) size_t *upload_data_size)
{ {
struct TALER_WireTransferIdentifierRawP wtid; struct TALER_WireTransferIdentifierRawP wtid;
int res; int res;
@ -57,7 +57,7 @@ TMH_TRACKING_handler_wire_deposits (struct TMH_RequestHandler *rh,
return MHD_NO; /* internal error */ return MHD_NO; /* internal error */
if (GNUNET_NO == res) if (GNUNET_NO == res)
return MHD_YES; /* parse error */ return MHD_YES; /* parse error */
return TMH_DB_execute_wire_deposits (connection, return TMH_DB_execute_track_transfer (connection,
&wtid); &wtid);
} }
@ -74,14 +74,14 @@ TMH_TRACKING_handler_wire_deposits (struct TMH_RequestHandler *rh,
* @return MHD result code * @return MHD result code
*/ */
static int static int
check_and_handle_deposit_wtid_request (struct MHD_Connection *connection, check_and_handle_track_transaction_request (struct MHD_Connection *connection,
const struct TALER_DepositTrackPS *tps, const struct TALER_DepositTrackPS *tps,
struct TALER_MerchantPublicKeyP *merchant_pub, struct TALER_MerchantPublicKeyP *merchant_pub,
struct TALER_MerchantSignatureP *merchant_sig, struct TALER_MerchantSignatureP *merchant_sig,
uint64_t transaction_id) uint64_t transaction_id)
{ {
if (GNUNET_OK != if (GNUNET_OK !=
GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MERCHANT_DEPOSIT_WTID, GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION,
&tps->purpose, &tps->purpose,
&merchant_sig->eddsa_sig, &merchant_sig->eddsa_sig,
&merchant_pub->eddsa_pub)) &merchant_pub->eddsa_pub))
@ -90,7 +90,7 @@ check_and_handle_deposit_wtid_request (struct MHD_Connection *connection,
return TMH_RESPONSE_reply_signature_invalid (connection, return TMH_RESPONSE_reply_signature_invalid (connection,
"merchant_sig"); "merchant_sig");
} }
return TMH_DB_execute_deposit_wtid (connection, return TMH_DB_execute_track_transaction (connection,
&tps->h_contract, &tps->h_contract,
&tps->h_wire, &tps->h_wire,
&tps->coin_pub, &tps->coin_pub,
@ -100,7 +100,7 @@ check_and_handle_deposit_wtid_request (struct MHD_Connection *connection,
/** /**
* Handle a "/deposit/wtid" request. * Handle a "/track/transaction" request.
* *
* @param rh context of the handler * @param rh context of the handler
* @param connection the MHD connection to handle * @param connection the MHD connection to handle
@ -110,11 +110,11 @@ check_and_handle_deposit_wtid_request (struct MHD_Connection *connection,
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_TRACKING_handler_deposit_wtid (struct TMH_RequestHandler *rh, TMH_TRACKING_handler_track_transaction (struct TMH_RequestHandler *rh,
struct MHD_Connection *connection, struct MHD_Connection *connection,
void **connection_cls, void **connection_cls,
const char *upload_data, const char *upload_data,
size_t *upload_data_size) size_t *upload_data_size)
{ {
int res; int res;
json_t *json; json_t *json;
@ -149,13 +149,13 @@ TMH_TRACKING_handler_deposit_wtid (struct TMH_RequestHandler *rh,
return (GNUNET_NO == res) ? MHD_YES : MHD_NO; return (GNUNET_NO == res) ? MHD_YES : MHD_NO;
} }
tps.purpose.size = htonl (sizeof (struct TALER_DepositTrackPS)); tps.purpose.size = htonl (sizeof (struct TALER_DepositTrackPS));
tps.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_DEPOSIT_WTID); tps.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION);
tps.transaction_id = GNUNET_htonll (transaction_id); tps.transaction_id = GNUNET_htonll (transaction_id);
res = check_and_handle_deposit_wtid_request (connection, res = check_and_handle_track_transaction_request (connection,
&tps, &tps,
&tps.merchant, &tps.merchant,
&merchant_sig, &merchant_sig,
transaction_id); transaction_id);
GNUNET_JSON_parse_free (spec); GNUNET_JSON_parse_free (spec);
json_decref (json); json_decref (json);
return res; return res;

View File

@ -27,7 +27,7 @@
/** /**
* Handle a "/wire/deposits" request. * Handle a "/track/transfer" request.
* *
* @param rh context of the handler * @param rh context of the handler
* @param connection the MHD connection to handle * @param connection the MHD connection to handle
@ -37,15 +37,15 @@
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_TRACKING_handler_wire_deposits (struct TMH_RequestHandler *rh, TMH_TRACKING_handler_track_transfer (struct TMH_RequestHandler *rh,
struct MHD_Connection *connection, struct MHD_Connection *connection,
void **connection_cls, void **connection_cls,
const char *upload_data, const char *upload_data,
size_t *upload_data_size); size_t *upload_data_size);
/** /**
* Handle a "/deposit/wtid" request. * Handle a "/track/transaction" request.
* *
* @param rh context of the handler * @param rh context of the handler
* @param connection the MHD connection to handle * @param connection the MHD connection to handle
@ -55,11 +55,11 @@ TMH_TRACKING_handler_wire_deposits (struct TMH_RequestHandler *rh,
* @return MHD result code * @return MHD result code
*/ */
int int
TMH_TRACKING_handler_deposit_wtid (struct TMH_RequestHandler *rh, TMH_TRACKING_handler_track_transaction (struct TMH_RequestHandler *rh,
struct MHD_Connection *connection, struct MHD_Connection *connection,
void **connection_cls, void **connection_cls,
const char *upload_data, const char *upload_data,
size_t *upload_data_size); size_t *upload_data_size);
#endif #endif

View File

@ -3945,7 +3945,7 @@ postgres_wire_lookup_deposit_wtid (void *cls,
const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub,
const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_MerchantPublicKeyP *merchant_pub,
uint64_t transaction_id, uint64_t transaction_id,
TALER_EXCHANGEDB_DepositWtidCallback cb, TALER_EXCHANGEDB_TrackTransactionCallback cb,
void *cb_cls) void *cb_cls)
{ {
PGresult *result; PGresult *result;

View File

@ -354,6 +354,40 @@ struct TALER_CoinPublicInfo
}; };
/**
* Details for one of the /deposit operations that the
* exchange combined into a single wire transfer.
*/
struct TALER_TrackTransferDetails
{
/**
* Hash of the contract.
*/
struct GNUNET_HashCode h_contract;
/**
* Which coin was deposited?
*/
struct TALER_CoinSpendPublicKeyP coin_pub;
/**
* Value of the deposit (including fee).
*/
struct TALER_Amount coin_value;
/**
* Fee charged by the exchange for the deposit.
*/
struct TALER_Amount coin_fee;
/**
* Merchant's transaction identifier.
*/
uint64_t transaction_id;
};
/** /**
* Check if a coin is valid; that is, whether the denomination key exists, * Check if a coin is valid; that is, whether the denomination key exists,
* is not expired, and the signature is correct. * is not expired, and the signature is correct.

View File

@ -1093,46 +1093,12 @@ void
TALER_EXCHANGE_admin_add_incoming_cancel (struct TALER_EXCHANGE_AdminAddIncomingHandle *aai); TALER_EXCHANGE_admin_add_incoming_cancel (struct TALER_EXCHANGE_AdminAddIncomingHandle *aai);
/* ********************* /wire/deposits *********************** */ /* ********************* /track/transfer *********************** */
/** /**
* @brief A /wire/deposits Handle * @brief A /track/transfer Handle
*/ */
struct TALER_EXCHANGE_WireDepositsHandle; struct TALER_EXCHANGE_TrackTransferHandle;
/**
* Details for one of the /deposit operations that the
* exchange combined into a single wire transfer.
*/
struct TALER_WireDepositDetails
{
/**
* Hash of the contract.
*/
struct GNUNET_HashCode h_contract;
/**
* Which coin was deposited?
*/
struct TALER_CoinSpendPublicKeyP coin_pub;
/**
* Value of the deposit (including fee).
*/
struct TALER_Amount coin_value;
/**
* Fee charged by the exchange for the deposit.
*/
struct TALER_Amount coin_fee;
/**
* Merchant's transaction identifier.
*/
uint64_t transaction_id;
};
/** /**
@ -1144,22 +1110,21 @@ struct TALER_WireDepositDetails
* @param sign_key exchange key used to sign @a json, or NULL * @param sign_key exchange key used to sign @a json, or NULL
* @param json original json reply (may include signatures, those have then been * @param json original json reply (may include signatures, those have then been
* validated already) * validated already)
* @param wtid extracted wire transfer identifier, or NULL if the exchange could * @param h_wire hash of the wire transfer address the transfer went to, or NULL on error
* not provide any (set only if @a http_status is #MHD_HTTP_OK)
* @param total_amount total amount of the wire transfer, or NULL if the exchange could * @param total_amount total amount of the wire transfer, or NULL if the exchange could
* not provide any @a wtid (set only if @a http_status is #MHD_HTTP_OK) * not provide any @a wtid (set only if @a http_status is #MHD_HTTP_OK)
* @param details_length length of the @a details array * @param details_length length of the @a details array
* @param details array with details about the combined transactions * @param details array with details about the combined transactions
*/ */
typedef void typedef void
(*TALER_EXCHANGE_WireDepositsCallback)(void *cls, (*TALER_EXCHANGE_TrackTransferCallback)(void *cls,
unsigned int http_status, unsigned int http_status,
const struct TALER_ExchangePublicKeyP *sign_key, const struct TALER_ExchangePublicKeyP *sign_key,
const json_t *json, const json_t *json,
const struct GNUNET_HashCode *h_wire, const struct GNUNET_HashCode *h_wire,
const struct TALER_Amount *total_amount, const struct TALER_Amount *total_amount,
unsigned int details_length, unsigned int details_length,
const struct TALER_WireDepositDetails *details); const struct TALER_TrackTransferDetails *details);
/** /**
@ -1172,11 +1137,11 @@ typedef void
* @param cb_cls closure for @a cb * @param cb_cls closure for @a cb
* @return handle to cancel operation * @return handle to cancel operation
*/ */
struct TALER_EXCHANGE_WireDepositsHandle * struct TALER_EXCHANGE_TrackTransferHandle *
TALER_EXCHANGE_wire_deposits (struct TALER_EXCHANGE_Handle *exchange, TALER_EXCHANGE_track_transfer (struct TALER_EXCHANGE_Handle *exchange,
const struct TALER_WireTransferIdentifierRawP *wtid, const struct TALER_WireTransferIdentifierRawP *wtid,
TALER_EXCHANGE_WireDepositsCallback cb, TALER_EXCHANGE_TrackTransferCallback cb,
void *cb_cls); void *cb_cls);
/** /**
@ -1186,16 +1151,16 @@ TALER_EXCHANGE_wire_deposits (struct TALER_EXCHANGE_Handle *exchange,
* @param wdh the wire deposits request handle * @param wdh the wire deposits request handle
*/ */
void void
TALER_EXCHANGE_wire_deposits_cancel (struct TALER_EXCHANGE_WireDepositsHandle *wdh); TALER_EXCHANGE_track_transfer_cancel (struct TALER_EXCHANGE_TrackTransferHandle *wdh);
/* ********************* /deposit/wtid *********************** */ /* ********************* /track/transaction *********************** */
/** /**
* @brief A /deposit/wtid Handle * @brief A /track/transaction Handle
*/ */
struct TALER_EXCHANGE_DepositWtidHandle; struct TALER_EXCHANGE_TrackTransactionHandle;
/** /**
@ -1212,17 +1177,17 @@ struct TALER_EXCHANGE_DepositWtidHandle;
* @param coin_contribution contribution to the @a total_amount of the deposited coin (may be NULL) * @param coin_contribution contribution to the @a total_amount of the deposited coin (may be NULL)
*/ */
typedef void typedef void
(*TALER_EXCHANGE_DepositWtidCallback)(void *cls, (*TALER_EXCHANGE_TrackTransactionCallback)(void *cls,
unsigned int http_status, unsigned int http_status,
const struct TALER_ExchangePublicKeyP *sign_key, const struct TALER_ExchangePublicKeyP *sign_key,
const json_t *json, const json_t *json,
const struct TALER_WireTransferIdentifierRawP *wtid, const struct TALER_WireTransferIdentifierRawP *wtid,
struct GNUNET_TIME_Absolute execution_time, struct GNUNET_TIME_Absolute execution_time,
const struct TALER_Amount *coin_contribution); const struct TALER_Amount *coin_contribution);
/** /**
* Obtain the wire transfer details for a given deposit. * Obtain the wire transfer details for a given transaction.
* *
* @param exchange the exchange to query * @param exchange the exchange to query
* @param merchant_priv the merchant's private key * @param merchant_priv the merchant's private key
@ -1234,15 +1199,15 @@ typedef void
* @param cb_cls closure for @a cb * @param cb_cls closure for @a cb
* @return handle to abort request * @return handle to abort request
*/ */
struct TALER_EXCHANGE_DepositWtidHandle * struct TALER_EXCHANGE_TrackTransactionHandle *
TALER_EXCHANGE_deposit_wtid (struct TALER_EXCHANGE_Handle *exchange, TALER_EXCHANGE_track_transaction (struct TALER_EXCHANGE_Handle *exchange,
const struct TALER_MerchantPrivateKeyP *merchant_priv, const struct TALER_MerchantPrivateKeyP *merchant_priv,
const struct GNUNET_HashCode *h_wire, const struct GNUNET_HashCode *h_wire,
const struct GNUNET_HashCode *h_contract, const struct GNUNET_HashCode *h_contract,
const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub,
uint64_t transaction_id, uint64_t transaction_id,
TALER_EXCHANGE_DepositWtidCallback cb, TALER_EXCHANGE_TrackTransactionCallback cb,
void *cb_cls); void *cb_cls);
/** /**
@ -1252,7 +1217,7 @@ TALER_EXCHANGE_deposit_wtid (struct TALER_EXCHANGE_Handle *exchange,
* @param dwh the wire deposits request handle * @param dwh the wire deposits request handle
*/ */
void void
TALER_EXCHANGE_deposit_wtid_cancel (struct TALER_EXCHANGE_DepositWtidHandle *dwh); TALER_EXCHANGE_track_transaction_cancel (struct TALER_EXCHANGE_TrackTransactionHandle *dwh);

View File

@ -654,7 +654,7 @@ typedef void
* when we expect it to be done (if @a wtid was NULL) * when we expect it to be done (if @a wtid was NULL)
*/ */
typedef void typedef void
(*TALER_EXCHANGEDB_DepositWtidCallback)(void *cls, (*TALER_EXCHANGEDB_TrackTransactionCallback)(void *cls,
const struct TALER_WireTransferIdentifierRawP *wtid, const struct TALER_WireTransferIdentifierRawP *wtid,
const struct TALER_Amount *coin_contribution, const struct TALER_Amount *coin_contribution,
const struct TALER_Amount *coin_fee, const struct TALER_Amount *coin_fee,
@ -1415,7 +1415,7 @@ struct TALER_EXCHANGEDB_Plugin
const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub,
const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_MerchantPublicKeyP *merchant_pub,
uint64_t transaction_id, uint64_t transaction_id,
TALER_EXCHANGEDB_DepositWtidCallback cb, TALER_EXCHANGEDB_TrackTransactionCallback cb,
void *cb_cls); void *cb_cls);

View File

@ -108,7 +108,7 @@
#define TALER_SIGNATURE_EXCHANGE_KEY_SET 1035 #define TALER_SIGNATURE_EXCHANGE_KEY_SET 1035
/** /**
* Signature where the Exchange confirms the /deposit/wtid response. * Signature where the Exchange confirms the /track/transaction response.
*/ */
#define TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE 1036 #define TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE 1036
@ -152,7 +152,7 @@
* Signature where the merchant confirms that he needs the wire * Signature where the merchant confirms that he needs the wire
* transfer identifier for a deposit operation. * transfer identifier for a deposit operation.
*/ */
#define TALER_SIGNATURE_MERCHANT_DEPOSIT_WTID 1103 #define TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION 1103
/*********************/ /*********************/
@ -932,7 +932,7 @@ struct TALER_MasterWireDetailsPS
struct TALER_DepositTrackPS struct TALER_DepositTrackPS
{ {
/** /**
* Purpose must be #TALER_SIGNATURE_MERCHANT_DEPOSIT_WTID. * Purpose must be #TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION.
*/ */
struct GNUNET_CRYPTO_EccSignaturePurpose purpose; struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
@ -975,7 +975,7 @@ struct TALER_DepositTrackPS
/** /**
* @brief Format internally used for packing the detailed information * @brief Format internally used for packing the detailed information
* to generate the signature for /wire/deposits signatures. * to generate the signature for /track/transfer signatures.
*/ */
struct TALER_WireDepositDetailP struct TALER_WireDepositDetailP
{ {