From 71c87d483230167f20426d286dae1d3f2ed24b99 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Thu, 23 May 2024 18:08:03 +0200 Subject: fakebank: allow wallet to select withdrawal amount --- src/bank-lib/fakebank.h | 2 +- src/bank-lib/fakebank_bank_accounts_withdrawals.c | 5 ++- src/bank-lib/fakebank_bank_get_withdrawals.c | 5 ++- .../fakebank_bank_post_accounts_withdrawals.c | 23 ++++++++--- .../fakebank_bank_post_withdrawals_confirm.c | 11 +++++- .../fakebank_bank_post_withdrawals_id_op.c | 11 +++++- src/bank-lib/fakebank_stop.c | 1 + .../fakebank_tbi_get_withdrawal_operation.c | 5 ++- .../fakebank_tbi_post_withdrawal_operation.c | 46 +++++++++++++++++++++- 9 files changed, 93 insertions(+), 16 deletions(-) diff --git a/src/bank-lib/fakebank.h b/src/bank-lib/fakebank.h index a9d61d8b1..98c1bb020 100644 --- a/src/bank-lib/fakebank.h +++ b/src/bank-lib/fakebank.h @@ -161,7 +161,7 @@ struct WithdrawalOperation /** * Amount transferred. */ - struct TALER_Amount amount; + struct TALER_Amount *amount; /** * Public key of the reserve, wire transfer subject. diff --git a/src/bank-lib/fakebank_bank_accounts_withdrawals.c b/src/bank-lib/fakebank_bank_accounts_withdrawals.c index bb435d975..d956a591f 100644 --- a/src/bank-lib/fakebank_bank_accounts_withdrawals.c +++ b/src/bank-lib/fakebank_bank_accounts_withdrawals.c @@ -96,6 +96,7 @@ TALER_FAKEBANK_bank_account_withdrawals_ ( &wo->reserve_pub) : GNUNET_JSON_pack_string ("selected_reserve_pub", NULL)), - TALER_JSON_pack_amount ("amount", - &wo->amount)); + GNUNET_JSON_pack_allow_null ( + TALER_JSON_pack_amount ("amount", + wo->amount))); } diff --git a/src/bank-lib/fakebank_bank_get_withdrawals.c b/src/bank-lib/fakebank_bank_get_withdrawals.c index 7f65e8660..f1e385194 100644 --- a/src/bank-lib/fakebank_bank_get_withdrawals.c +++ b/src/bank-lib/fakebank_bank_get_withdrawals.c @@ -82,6 +82,7 @@ TALER_FAKEBANK_bank_get_withdrawals_ ( &wo->reserve_pub) : GNUNET_JSON_pack_string ("selected_reserve_pub", NULL)), - TALER_JSON_pack_amount ("amount", - &wo->amount)); + GNUNET_JSON_pack_allow_null ( + TALER_JSON_pack_amount ("amount", + wo->amount))); } diff --git a/src/bank-lib/fakebank_bank_post_accounts_withdrawals.c b/src/bank-lib/fakebank_bank_post_accounts_withdrawals.c index 7fbb93352..7d77f7626 100644 --- a/src/bank-lib/fakebank_bank_post_accounts_withdrawals.c +++ b/src/bank-lib/fakebank_bank_post_accounts_withdrawals.c @@ -67,7 +67,11 @@ do_post_account_withdrawals ( } wo = GNUNET_new (struct WithdrawalOperation); wo->debit_account = acc; - wo->amount = *amount; + if (NULL != amount) + { + wo->amount = GNUNET_new (struct TALER_Amount); + *wo->amount = *amount; + } if (NULL == h->wops) { h->wops = GNUNET_CONTAINER_multishortmap_create (32, @@ -83,6 +87,8 @@ do_post_account_withdrawals ( &wo->wopid, wo, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)) + + break; } { @@ -169,11 +175,15 @@ TALER_FAKEBANK_bank_post_account_withdrawals_ ( { struct TALER_Amount amount; + bool amount_missing; + struct TALER_Amount *amount_ptr; enum GNUNET_GenericReturnValue ret; struct GNUNET_JSON_Specification spec[] = { - TALER_JSON_spec_amount ("amount", - h->currency, - &amount), + GNUNET_JSON_spec_mark_optional ( + TALER_JSON_spec_amount ("amount", + h->currency, + &amount), + &amount_missing), GNUNET_JSON_spec_end () }; @@ -186,10 +196,13 @@ TALER_FAKEBANK_bank_post_account_withdrawals_ ( json_decref (json); return (GNUNET_NO == ret) ? MHD_YES : MHD_NO; } + + amount_ptr = amount_missing ? NULL : &amount; + res = do_post_account_withdrawals (h, connection, account_name, - &amount); + amount_ptr); } json_decref (json); return res; diff --git a/src/bank-lib/fakebank_bank_post_withdrawals_confirm.c b/src/bank-lib/fakebank_bank_post_withdrawals_confirm.c index 2fa67c970..b6fcc3152 100644 --- a/src/bank-lib/fakebank_bank_post_withdrawals_confirm.c +++ b/src/bank-lib/fakebank_bank_post_withdrawals_confirm.c @@ -55,6 +55,15 @@ TALER_FAKEBANK_bank_withdrawals_confirm_ ( TALER_EC_BANK_TRANSACTION_NOT_FOUND, withdrawal_id); } + if (NULL == wo->amount) + { + GNUNET_assert (0 == + pthread_mutex_unlock (&h->big_lock)); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_BAD_REQUEST, + TALER_EC_BANK_POST_WITHDRAWAL_OPERATION_REQUIRED, + NULL); + } if (NULL == wo->exchange_account) { GNUNET_assert (0 == @@ -80,7 +89,7 @@ TALER_FAKEBANK_bank_withdrawals_confirm_ ( h, wo->debit_account->account_name, wo->exchange_account->account_name, - &wo->amount, + wo->amount, &wo->reserve_pub, &wo->row_id, &wo->timestamp)) diff --git a/src/bank-lib/fakebank_bank_post_withdrawals_id_op.c b/src/bank-lib/fakebank_bank_post_withdrawals_id_op.c index fe5cc982d..2adc07df0 100644 --- a/src/bank-lib/fakebank_bank_post_withdrawals_id_op.c +++ b/src/bank-lib/fakebank_bank_post_withdrawals_id_op.c @@ -91,6 +91,15 @@ bank_withdrawals_confirm ( TALER_EC_BANK_POST_WITHDRAWAL_OPERATION_REQUIRED, NULL); } + if (NULL == wo->amount) + { + GNUNET_assert (0 == + pthread_mutex_unlock (&h->big_lock)); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_BAD_REQUEST, + TALER_EC_BANK_POST_WITHDRAWAL_OPERATION_REQUIRED, + NULL); + } if (wo->aborted) { GNUNET_assert (0 == @@ -107,7 +116,7 @@ bank_withdrawals_confirm ( h, wo->debit_account->account_name, wo->exchange_account->account_name, - &wo->amount, + wo->amount, &wo->reserve_pub, &wo->row_id, &wo->timestamp)) diff --git a/src/bank-lib/fakebank_stop.c b/src/bank-lib/fakebank_stop.c index e31d47523..ff6b084f4 100644 --- a/src/bank-lib/fakebank_stop.c +++ b/src/bank-lib/fakebank_stop.c @@ -77,6 +77,7 @@ free_withdraw_op (void *cls, (void) cls; (void) key; + GNUNET_free (wo->amount); GNUNET_free (wo); return GNUNET_OK; } diff --git a/src/bank-lib/fakebank_tbi_get_withdrawal_operation.c b/src/bank-lib/fakebank_tbi_get_withdrawal_operation.c index 4749bda77..fd6f3b7c4 100644 --- a/src/bank-lib/fakebank_tbi_get_withdrawal_operation.c +++ b/src/bank-lib/fakebank_tbi_get_withdrawal_operation.c @@ -123,8 +123,9 @@ TALER_FAKEBANK_tbi_get_withdrawal_operation_ ( GNUNET_JSON_pack_allow_null ( GNUNET_JSON_pack_string ("suggested_exchange", h->exchange_url)), - TALER_JSON_pack_amount ("amount", - &wc->wo->amount), + GNUNET_JSON_pack_allow_null ( + TALER_JSON_pack_amount ("amount", + wc->wo->amount)), GNUNET_JSON_pack_array_steal ("wire_types", wt)); } diff --git a/src/bank-lib/fakebank_tbi_post_withdrawal_operation.c b/src/bank-lib/fakebank_tbi_post_withdrawal_operation.c index 38b92e494..7c011b415 100644 --- a/src/bank-lib/fakebank_tbi_post_withdrawal_operation.c +++ b/src/bank-lib/fakebank_tbi_post_withdrawal_operation.c @@ -48,7 +48,8 @@ do_post_withdrawal ( struct MHD_Connection *connection, const char *wopid, const struct TALER_ReservePublicKeyP *reserve_pub, - const char *exchange_payto_uri) + const char *exchange_payto_uri, + const struct TALER_Amount *amount) { struct WithdrawalOperation *wo; char *credit_name; @@ -134,6 +135,35 @@ do_post_withdrawal ( TALER_EC_BANK_WITHDRAWAL_OPERATION_RESERVE_SELECTION_CONFLICT, "exchange account changed"); } + if ( (NULL != wo->amount) && (NULL != amount) && (0 != TALER_amount_cmp (wo-> + amount, + amount)) ) + { + GNUNET_assert (0 == + pthread_mutex_unlock (&h->big_lock)); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_CONFLICT, + TALER_EC_BANK_WITHDRAWAL_OPERATION_RESERVE_SELECTION_CONFLICT, + "amount changed"); + } + if (NULL == wo->amount) + { + if (NULL == amount) + { + GNUNET_assert (0 == + pthread_mutex_unlock (&h->big_lock)); + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_BAD_REQUEST, + TALER_EC_BANK_POST_WITHDRAWAL_OPERATION_REQUIRED, + "amount missing"); + } + else + { + wo->amount = GNUNET_new (struct TALER_Amount); + *wo->amount = *amount; + } + } + GNUNET_assert (NULL != wo->amount); wo->exchange_account = credit_account; wo->reserve_pub = *reserve_pub; wo->selection_done = true; @@ -203,11 +233,19 @@ TALER_FAKEBANK_tbi_post_withdrawal ( struct TALER_ReservePublicKeyP reserve_pub; const char *exchange_payto_url; enum GNUNET_GenericReturnValue ret; + struct TALER_Amount amount; + bool amount_missing; + struct TALER_Amount *amount_ptr; struct GNUNET_JSON_Specification spec[] = { GNUNET_JSON_spec_fixed_auto ("reserve_pub", &reserve_pub), GNUNET_JSON_spec_string ("selected_exchange", &exchange_payto_url), + GNUNET_JSON_spec_mark_optional ( + TALER_JSON_spec_amount ("amount", + h->currency, + &amount), + &amount_missing), GNUNET_JSON_spec_end () }; @@ -220,11 +258,15 @@ TALER_FAKEBANK_tbi_post_withdrawal ( json_decref (json); return (GNUNET_NO == ret) ? MHD_YES : MHD_NO; } + + amount_ptr = amount_missing ? NULL : &amount; + res = do_post_withdrawal (h, connection, wopid, &reserve_pub, - exchange_payto_url); + exchange_payto_url, + amount_ptr); } json_decref (json); return res; -- cgit v1.2.3