diff --git a/src/include/taler_exchange_service.h b/src/include/taler_exchange_service.h index 307a76de8..320123041 100644 --- a/src/include/taler_exchange_service.h +++ b/src/include/taler_exchange_service.h @@ -1682,27 +1682,57 @@ TALER_EXCHANGE_transfers_get_cancel ( struct TALER_EXCHANGE_DepositGetHandle; +/** + * Data returned for a successful GET /deposits/ request. Note that + * most fields are only set if the status is #MHD_HTTP_OK. Only + * the @e execution_time is available if the status is #MHD_HTTP_ACCEPTED. + */ +struct TALER_EXCHANGE_DepositData +{ + + /** + * exchange key used to sign, NULL if exchange did not + * yet execute the transaction + */ + const struct TALER_ExchangePublicKeyP *exchange_pub; + + /** + * signature from the exchange over the deposit data, NULL if exchange did not + * yet execute the transaction + */ + const struct TALER_ExchangeSignatureP *exchange_sig; + + /** + * wire transfer identifier used by the exchange, NULL if exchange did not + * yet execute the transaction + */ + const struct TALER_WireTransferIdentifierRawP *wtid; + + /** + * actual or planned execution time for the wire transfer + */ + struct GNUNET_TIME_Absolute execution_time; + + /** + * contribution to the total amount by this coin, NULL if exchange did not + * yet execute the transaction + */ + const struct TALER_Amount *coin_contribution; +}; + + /** * Function called with detailed wire transfer data. * * @param cls closure * @param hr HTTP response data - * @param exchange_pub exchange key used to sign @a json, or NULL - * @param wtid wire transfer identifier used by the exchange, NULL if exchange did not - * yet execute the transaction - * @param execution_time actual or planned execution time for the wire transfer - * @param coin_contribution contribution to the total amount by this coin (can be NULL) - * // FIXME: also return the exchange signature - * // FIXME: combine all of the above (except cls,hr) into a 'struct'! => DepositData + * @param dd details about the deposit (NULL on errors) */ typedef void (*TALER_EXCHANGE_DepositGetCallback)( void *cls, const struct TALER_EXCHANGE_HttpResponse *hr, - const struct TALER_ExchangePublicKeyP *exchange_pub, - const struct TALER_WireTransferIdentifierRawP *wtid, - struct GNUNET_TIME_Absolute execution_time, - const struct TALER_Amount *coin_contribution); + const struct TALER_EXCHANGE_DepositData *dd); /** diff --git a/src/lib/exchange_api_deposits_get.c b/src/lib/exchange_api_deposits_get.c index aecd88240..6a2ad5c3d 100644 --- a/src/lib/exchange_api_deposits_get.c +++ b/src/lib/exchange_api_deposits_get.c @@ -33,7 +33,7 @@ /** - * @brief A Deposit Wtid Handle + * @brief A Deposit Get Handle */ struct TALER_EXCHANGE_DepositGetHandle { @@ -84,31 +84,19 @@ struct TALER_EXCHANGE_DepositGetHandle * * @param dwh deposit wtid handle * @param json json reply with the signature - * @param[out] exchange_pub set to the exchange's public key + * @param exchange_pub the exchange's public key + * @param exchange_sig the exchange's signature * @return #GNUNET_OK if the signature is valid, #GNUNET_SYSERR if not */ static int verify_deposit_wtid_signature_ok ( const struct TALER_EXCHANGE_DepositGetHandle *dwh, const json_t *json, - struct TALER_ExchangePublicKeyP *exchange_pub) + const struct TALER_ExchangePublicKeyP *exchange_pub, + const struct TALER_ExchangeSignatureP *exchange_sig) { - struct TALER_ExchangeSignatureP exchange_sig; const struct TALER_EXCHANGE_Keys *key_state; - struct GNUNET_JSON_Specification spec[] = { - 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; - } key_state = TALER_EXCHANGE_get_keys (dwh->exchange); if (GNUNET_OK != TALER_EXCHANGE_test_signing_key (key_state, @@ -120,7 +108,7 @@ verify_deposit_wtid_signature_ok ( if (GNUNET_OK != GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE, &dwh->depconf, - &exchange_sig.eddsa_signature, + &exchange_sig->eddsa_signature, &exchange_pub->eddsa_pub)) { GNUNET_break_op (0); @@ -144,12 +132,6 @@ handle_deposit_wtid_finished (void *cls, const void *response) { struct TALER_EXCHANGE_DepositGetHandle *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; - struct TALER_Amount coin_contribution_s; - struct TALER_ExchangePublicKeyP exchange_pub; - struct TALER_ExchangePublicKeyP *ep = NULL; const json_t *j = response; struct TALER_EXCHANGE_HttpResponse hr = { .reply = j, @@ -164,10 +146,16 @@ handle_deposit_wtid_finished (void *cls, break; case MHD_HTTP_OK: { + struct GNUNET_TIME_Absolute execution_time; + struct TALER_Amount coin_contribution; + struct TALER_ExchangePublicKeyP exchange_pub; + struct TALER_ExchangeSignatureP exchange_sig; struct GNUNET_JSON_Specification spec[] = { GNUNET_JSON_spec_fixed_auto ("wtid", &dwh->depconf.wtid), GNUNET_JSON_spec_absolute_time ("execution_time", &execution_time), - TALER_JSON_spec_amount ("coin_contribution", &coin_contribution_s), + TALER_JSON_spec_amount ("coin_contribution", &coin_contribution), + GNUNET_JSON_spec_fixed_auto ("exchange_sig", &exchange_sig), + GNUNET_JSON_spec_fixed_auto ("exchange_pub", &exchange_pub), GNUNET_JSON_spec_end () }; @@ -181,15 +169,14 @@ handle_deposit_wtid_finished (void *cls, hr.ec = TALER_EC_DEPOSITS_INVALID_BODY_BY_EXCHANGE; break; } - wtid = &dwh->depconf.wtid; dwh->depconf.execution_time = GNUNET_TIME_absolute_hton (execution_time); TALER_amount_hton (&dwh->depconf.coin_contribution, - &coin_contribution_s); - coin_contribution = &coin_contribution_s; + &coin_contribution); if (GNUNET_OK != verify_deposit_wtid_signature_ok (dwh, j, - &exchange_pub)) + &exchange_pub, + &exchange_sig)) { GNUNET_break_op (0); hr.http_status = 0; @@ -197,13 +184,26 @@ handle_deposit_wtid_finished (void *cls, } else { - ep = &exchange_pub; + struct TALER_EXCHANGE_DepositData dd = { + .exchange_pub = &exchange_pub, + .exchange_sig = &exchange_sig, + .wtid = &dwh->depconf.wtid, + .execution_time = execution_time, + .coin_contribution = &coin_contribution + }; + + dwh->cb (dwh->cb_cls, + &hr, + &dd); + TALER_EXCHANGE_deposits_get_cancel (dwh); + return; } } break; case MHD_HTTP_ACCEPTED: { /* Transaction known, but not executed yet */ + struct GNUNET_TIME_Absolute execution_time; struct GNUNET_JSON_Specification spec[] = { GNUNET_JSON_spec_absolute_time ("execution_time", &execution_time), GNUNET_JSON_spec_end () @@ -219,6 +219,18 @@ handle_deposit_wtid_finished (void *cls, hr.ec = TALER_EC_DEPOSITS_INVALID_BODY_BY_EXCHANGE; break; } + else + { + struct TALER_EXCHANGE_DepositData dd = { + .execution_time = execution_time + }; + + dwh->cb (dwh->cb_cls, + &hr, + &dd); + TALER_EXCHANGE_deposits_get_cancel (dwh); + return; + } } break; case MHD_HTTP_BAD_REQUEST: @@ -259,10 +271,7 @@ handle_deposit_wtid_finished (void *cls, } dwh->cb (dwh->cb_cls, &hr, - ep, - wtid, - execution_time, - coin_contribution); + NULL); TALER_EXCHANGE_deposits_get_cancel (dwh); } diff --git a/src/testing/testing_api_cmd_deposits_get.c b/src/testing/testing_api_cmd_deposits_get.c index fd02e75bb..6f0140116 100644 --- a/src/testing/testing_api_cmd_deposits_get.c +++ b/src/testing/testing_api_cmd_deposits_get.c @@ -81,29 +81,17 @@ struct TrackTransactionState * * @param cls closure. * @param hr HTTP response details - * @param exchange_pub public key of the exchange - * @param wtid wire transfer identifier, NULL if exchange did not - * execute the transaction yet. - * @param execution_time actual or planned execution time for the - * wire transfer. - * @param coin_contribution contribution to the total amount of - * the deposited coin (can be NULL). + * @param dd data about the wire transfer associated with the deposit */ static void deposit_wtid_cb (void *cls, const struct TALER_EXCHANGE_HttpResponse *hr, - const struct TALER_ExchangePublicKeyP *exchange_pub, - const struct TALER_WireTransferIdentifierRawP *wtid, - struct GNUNET_TIME_Absolute execution_time, - const struct TALER_Amount *coin_contribution) + const struct TALER_EXCHANGE_DepositData *dd) { struct TrackTransactionState *tts = cls; struct TALER_TESTING_Interpreter *is = tts->is; struct TALER_TESTING_Command *cmd = &is->commands[is->ip]; - (void) coin_contribution; - (void) exchange_pub; - (void) execution_time; tts->tth = NULL; if (tts->expected_response_code != hr->http_status) { @@ -123,7 +111,8 @@ deposit_wtid_cb (void *cls, switch (hr->http_status) { case MHD_HTTP_OK: - tts->wtid = *wtid; + GNUNET_assert (NULL != dd->wtid); + tts->wtid = *dd->wtid; if (NULL != tts->bank_transfer_reference) { const struct TALER_TESTING_Command *bank_transfer_cmd; @@ -151,7 +140,7 @@ deposit_wtid_cb (void *cls, } /* Compare that expected and gotten subjects match. */ - if (0 != GNUNET_memcmp (wtid, + if (0 != GNUNET_memcmp (dd->wtid, wtid_want)) { GNUNET_break (0);