aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/exchange/taler-exchange-httpd_deposits_get.c160
1 files changed, 69 insertions, 91 deletions
diff --git a/src/exchange/taler-exchange-httpd_deposits_get.c b/src/exchange/taler-exchange-httpd_deposits_get.c
index a5a29d69a..477473cc7 100644
--- a/src/exchange/taler-exchange-httpd_deposits_get.c
+++ b/src/exchange/taler-exchange-httpd_deposits_get.c
@@ -15,7 +15,7 @@
*/
/**
* @file taler-exchange-httpd_deposits_get.c
- * @brief Handle wire transfer tracking-related requests
+ * @brief Handle wire deposit tracking-related requests
* @author Christian Grothoff
*/
#include "platform.h"
@@ -32,27 +32,6 @@
/**
- * A merchant asked for details about a deposit, but
- * we did not execute the deposit yet. Generate a 202 reply.
- *
- * @param connection connection to the client
- * @param planned_exec_time planned execution time
- * @return MHD result code
- */
-static int
-reply_transfer_pending (struct MHD_Connection *connection,
- struct GNUNET_TIME_Absolute planned_exec_time)
-{
- return TALER_MHD_reply_json_pack (connection,
- MHD_HTTP_ACCEPTED,
- "{s:o}",
- "execution_time",
- GNUNET_JSON_from_time_abs (
- planned_exec_time));
-}
-
-
-/**
* A merchant asked for details about a deposit. Provide
* them. Generates the 200 reply.
*
@@ -67,25 +46,26 @@ reply_transfer_pending (struct MHD_Connection *connection,
* @return MHD result code
*/
static int
-reply_track_transaction (struct MHD_Connection *connection,
- const struct GNUNET_HashCode *h_contract_terms,
- const struct GNUNET_HashCode *h_wire,
- const struct TALER_CoinSpendPublicKeyP *coin_pub,
- const struct TALER_Amount *coin_contribution,
- const struct TALER_WireTransferIdentifierRawP *wtid,
- struct GNUNET_TIME_Absolute exec_time)
+reply_deposit_details (struct MHD_Connection *connection,
+ const struct GNUNET_HashCode *h_contract_terms,
+ const struct GNUNET_HashCode *h_wire,
+ const struct TALER_CoinSpendPublicKeyP *coin_pub,
+ const struct TALER_Amount *coin_contribution,
+ const struct TALER_WireTransferIdentifierRawP *wtid,
+ struct GNUNET_TIME_Absolute exec_time)
{
- struct TALER_ConfirmWirePS cw;
struct TALER_ExchangePublicKeyP pub;
struct TALER_ExchangeSignatureP sig;
+ struct TALER_ConfirmWirePS cw = {
+ .purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE),
+ .purpose.size = htonl (sizeof (cw)),
+ .h_wire = *h_wire,
+ .h_contract_terms = *h_contract_terms,
+ .wtid = *wtid,
+ .coin_pub = *coin_pub,
+ .execution_time = GNUNET_TIME_absolute_hton (exec_time)
+ };
- cw.purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE);
- cw.purpose.size = htonl (sizeof (struct TALER_ConfirmWirePS));
- cw.h_wire = *h_wire;
- cw.h_contract_terms = *h_contract_terms;
- cw.wtid = *wtid;
- cw.coin_pub = *coin_pub;
- cw.execution_time = GNUNET_TIME_absolute_hton (exec_time);
TALER_amount_hton (&cw.coin_contribution,
coin_contribution);
if (GNUNET_OK !=
@@ -170,7 +150,7 @@ struct DepositWtidContext
* Function called with the results of the lookup of the
* wire transfer identifier information.
*
- * @param cls our context for transmission
+ * @param cls our context for transmission, a `struct DepositWtidContext *`
* @param wtid raw wire transfer identifier, NULL
* if the transaction was not yet done
* @param coin_contribution how much did the coin we asked about
@@ -213,14 +193,14 @@ handle_wtid_data (void *cls,
/**
- * Execute a "/track/transaction". Returns the transfer information
+ * Execute a "deposits" GET. Returns the transfer information
* associated with the given deposit.
*
* If it returns a non-error code, the transaction logic MUST
* NOT queue a MHD response. IF it returns an hard error, the
* transaction logic MUST queue a MHD response and set @a mhd_ret. IF
* it returns the soft error code, the function MAY be called again to
- * retry and MUST not queue a MHD response.
+ * retry and MUST NOT queue a MHD response.
*
* @param cls closure of type `struct DepositWtidContext *`
* @param connection MHD request which triggered the transaction
@@ -230,10 +210,10 @@ handle_wtid_data (void *cls,
* @return transaction status
*/
static enum GNUNET_DB_QueryStatus
-track_transaction_transaction (void *cls,
- struct MHD_Connection *connection,
- struct TALER_EXCHANGEDB_Session *session,
- int *mhd_ret)
+deposits_get_transaction (void *cls,
+ struct MHD_Connection *connection,
+ struct TALER_EXCHANGEDB_Session *session,
+ int *mhd_ret)
{
struct DepositWtidContext *ctx = cls;
enum GNUNET_DB_QueryStatus qs;
@@ -271,67 +251,52 @@ track_transaction_transaction (void *cls,
/**
- * Check the merchant signature, and if it is valid,
- * return the wire transfer identifier.
+ * Lookup and return the wire transfer identifier.
*
* @param connection the MHD connection to handle
* @param tps signed request to execute
* @param merchant_pub public key from the merchant
- * @param merchant_sig signature from the merchant (to be checked)
* @return MHD result code
*/
static int
-check_and_handle_track_transaction_request (struct MHD_Connection *connection,
- const struct
- TALER_DepositTrackPS *tps,
- const struct
- TALER_MerchantPublicKeyP *
- merchant_pub,
- const struct
- TALER_MerchantSignatureP *
- merchant_sig)
+handle_track_transaction_request (
+ struct MHD_Connection *connection,
+ const struct TALER_DepositTrackPS *tps,
+ const struct TALER_MerchantPublicKeyP *merchant_pub)
{
- struct DepositWtidContext ctx;
int mhd_ret;
-
- if (GNUNET_OK !=
- GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION,
- &tps->purpose,
- &merchant_sig->eddsa_sig,
- &merchant_pub->eddsa_pub))
- {
- GNUNET_break_op (0);
- return TALER_MHD_reply_with_error (connection,
- MHD_HTTP_FORBIDDEN,
- TALER_EC_TRACK_TRANSACTION_MERCHANT_SIGNATURE_INVALID,
- "merchant_sig");
- }
- ctx.pending = GNUNET_NO;
- ctx.tps = tps;
- ctx.merchant_pub = merchant_pub;
+ struct DepositWtidContext ctx = {
+ .pending = GNUNET_NO,
+ .tps = tps,
+ .merchant_pub = merchant_pub
+ };
if (GNUNET_OK !=
TEH_DB_run_transaction (connection,
- "handle track transaction",
+ "handle deposits GET",
&mhd_ret,
- &track_transaction_transaction,
+ &deposits_get_transaction,
&ctx))
return mhd_ret;
if (GNUNET_YES == ctx.pending)
- return reply_transfer_pending (connection,
- ctx.execution_time);
+ return TALER_MHD_reply_json_pack (connection,
+ MHD_HTTP_ACCEPTED,
+ "{s:o}",
+ "execution_time",
+ GNUNET_JSON_from_time_abs (
+ ctx.execution_time));
if (GNUNET_SYSERR == ctx.pending)
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_TRACK_TRANSACTION_DB_FEE_INCONSISTENT,
"fees are inconsistent");
- return reply_track_transaction (connection,
- &tps->h_contract_terms,
- &tps->h_wire,
- &tps->coin_pub,
- &ctx.coin_delta,
- &ctx.wtid,
- ctx.execution_time);
+ return reply_deposit_details (connection,
+ &tps->h_contract_terms,
+ &tps->h_wire,
+ &tps->coin_pub,
+ &ctx.coin_delta,
+ &ctx.wtid,
+ ctx.execution_time);
}
@@ -351,8 +316,11 @@ TEH_handler_deposits_get (const struct TEH_RequestHandler *rh,
const char *const args[4])
{
int res;
- struct TALER_DepositTrackPS tps;
struct TALER_MerchantSignatureP merchant_sig;
+ struct TALER_DepositTrackPS tps = {
+ .purpose.size = htonl (sizeof (tps)),
+ .purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION)
+ };
if (GNUNET_OK !=
GNUNET_STRINGS_string_to_data (args[0],
@@ -410,12 +378,22 @@ TEH_handler_deposits_get (const struct TEH_RequestHandler *rh,
return MHD_NO; /* internal error */
if (GNUNET_NO == res)
return MHD_YES; /* parse error */
- tps.purpose.size = htonl (sizeof (struct TALER_DepositTrackPS));
- tps.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION);
- return check_and_handle_track_transaction_request (connection,
- &tps,
- &tps.merchant,
- &merchant_sig);
+ if (GNUNET_OK !=
+ GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION,
+ &tps.purpose,
+ &merchant_sig.eddsa_sig,
+ &tps.merchant.eddsa_pub))
+ {
+ GNUNET_break_op (0);
+ return TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_FORBIDDEN,
+ TALER_EC_TRACK_TRANSACTION_MERCHANT_SIGNATURE_INVALID,
+ "merchant_sig");
+ }
+
+ return handle_track_transaction_request (connection,
+ &tps,
+ &tps.merchant);
}