exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

commit 6996910aeee8fad4f0d249590b46570d514d2eb3
parent 01373461c56e6561ed066c9d4b492cd9091929c1
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sun,  1 Sep 2024 17:10:22 +0200

modify libtalerexchange to support batch-deposit 451 reply

Diffstat:
Msrc/include/taler_exchange_service.h | 63++++++++++++++++++++++++++++++++++-----------------------------
Msrc/lib/Makefile.am | 2+-
Msrc/lib/exchange_api_batch_deposit.c | 26+++++++++++++++++++++++++-
Msrc/testing/Makefile.am | 2+-
Msrc/testing/testing_api_cmd_batch_deposit.c | 27+++++++++++++++++++++++++--
5 files changed, 86 insertions(+), 34 deletions(-)

diff --git a/src/include/taler_exchange_service.h b/src/include/taler_exchange_service.h @@ -36,7 +36,35 @@ * Version of the Taler Exchange API, in hex. * Thus 0.8.4-1 = 0x00080401. */ -#define TALER_EXCHANGE_API_VERSION 0x00100001 +#define TALER_EXCHANGE_API_VERSION 0x00100002 + +/** + * Information returned when a client needs to pass + * a KYC check before the transaction may succeed. + */ +struct TALER_EXCHANGE_KycNeededRedirect +{ + + /** + * Hash of the payto-URI of the account to KYC; + */ + struct TALER_PaytoHashP h_payto; + + /** + * Public key needed to access the KYC state of + * this account. All zeros if a wire transfer + * is required first to establish the key. + */ + union TALER_AccountPublicKeyP account_pub; + + /** + * Legitimization requirement that the merchant should use + * to check for its KYC status, 0 if not known. + */ + uint64_t requirement_row; + +}; + /* ********************* /keys *********************** */ @@ -1235,6 +1263,11 @@ struct TALER_EXCHANGE_BatchDepositResult } conflict; + /** + * Details if the status is #MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS. + */ + struct TALER_EXCHANGE_KycNeededRedirect unavailable_for_legal_reasons; + } details; }; @@ -2510,34 +2543,6 @@ TALER_EXCHANGE_reserves_history_cancel ( /** - * Information returned when a client needs to pass - * a KYC check before the transaction may succeed. - */ -struct TALER_EXCHANGE_KycNeededRedirect -{ - - /** - * Hash of the payto-URI of the account to KYC; - */ - struct TALER_PaytoHashP h_payto; - - /** - * Public key needed to access the KYC state of - * this account. All zeros if a wire transfer - * is required first to establish the key. - */ - union TALER_AccountPublicKeyP account_pub; - - /** - * Legitimization requirement that the merchant should use - * to check for its KYC status, 0 if not known. - */ - uint64_t requirement_row; - -}; - - -/** * Information input into the withdraw process per coin. */ struct TALER_EXCHANGE_WithdrawCoinInput diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am @@ -18,7 +18,7 @@ lib_LTLIBRARIES = \ libtalerexchange.la libtalerexchange_la_LDFLAGS = \ - -version-info 10:0:0 \ + -version-info 11:0:1 \ -no-undefined libtalerexchange_la_SOURCES = \ exchange_api_add_aml_decision.c \ diff --git a/src/lib/exchange_api_batch_deposit.c b/src/lib/exchange_api_batch_deposit.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2014-2023 Taler Systems SA + Copyright (C) 2014-2024 Taler Systems SA 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 @@ -464,6 +464,30 @@ handle_deposit_finished (void *cls, dr->hr.ec = TALER_JSON_get_error_code (j); dr->hr.hint = TALER_JSON_get_error_hint (j); break; + case MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS: + { + struct GNUNET_JSON_Specification spec[] = { + GNUNET_JSON_spec_fixed_auto ( + "h_payto", + &dr->details.unavailable_for_legal_reasons.h_payto), + GNUNET_JSON_spec_uint64 ( + "requirement_row", + &dr->details.unavailable_for_legal_reasons.requirement_row), + GNUNET_JSON_spec_end () + }; + + if (GNUNET_OK != + GNUNET_JSON_parse (j, + spec, + NULL, NULL)) + { + GNUNET_break_op (0); + dr->hr.http_status = 0; + dr->hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED; + break; + } + } + break; case MHD_HTTP_INTERNAL_SERVER_ERROR: dr->hr.ec = TALER_JSON_get_error_code (j); dr->hr.hint = TALER_JSON_get_error_hint (j); diff --git a/src/testing/Makefile.am b/src/testing/Makefile.am @@ -37,7 +37,7 @@ libtalertwistertesting_la_LDFLAGS = \ endif libtalertesting_la_LDFLAGS = \ - -version-info 1:0:0 \ + -version-info 2:0:1 \ -no-undefined libtalertesting_la_SOURCES = \ testing_api_cmd_age_withdraw.c \ diff --git a/src/testing/testing_api_cmd_batch_deposit.c b/src/testing/testing_api_cmd_batch_deposit.c @@ -39,7 +39,7 @@ * How long do we wait AT MOST when retrying? */ #define MAX_BACKOFF GNUNET_TIME_relative_multiply ( \ - GNUNET_TIME_UNIT_MILLISECONDS, 100) + GNUNET_TIME_UNIT_MILLISECONDS, 100) /** @@ -172,6 +172,18 @@ struct BatchDepositState struct TALER_ExchangeSignatureP exchange_sig; /** + * Set to the KYC requirement payto hash *if* the exchange replied with a + * request for KYC. + */ + struct TALER_PaytoHashP h_payto; + + /** + * Set to the KYC requirement row *if* the exchange replied with + * a request for KYC. + */ + uint64_t requirement_row; + + /** * Reference to previous deposit operation. * Only present if we're supposed to replay the previous deposit. */ @@ -218,12 +230,21 @@ batch_deposit_cb (void *cls, ds->expected_response_code); return; } - if (MHD_HTTP_OK == dr->hr.http_status) + switch (dr->hr.http_status) { + case MHD_HTTP_OK: ds->deposit_succeeded = GNUNET_YES; ds->exchange_timestamp = dr->details.ok.deposit_timestamp; ds->exchange_pub = *dr->details.ok.exchange_pub; ds->exchange_sig = *dr->details.ok.exchange_sig; + break; + case MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS: + /* nothing to check */ + ds->requirement_row + = dr->details.unavailable_for_legal_reasons.requirement_row; + ds->h_payto + = dr->details.unavailable_for_legal_reasons.h_payto; + break; } TALER_TESTING_interpreter_next (ds->is); } @@ -548,6 +569,8 @@ batch_deposit_traits (void *cls, &ds->wire_deadline), TALER_TESTING_make_trait_refund_deadline (index, &ds->refund_deadline), + TALER_TESTING_make_trait_legi_requirement_row (&ds->requirement_row), + TALER_TESTING_make_trait_h_payto (&ds->h_payto), TALER_TESTING_trait_end () };