aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2024-05-23 18:08:03 +0200
committerFlorian Dold <florian@dold.me>2024-05-23 18:08:03 +0200
commit71c87d483230167f20426d286dae1d3f2ed24b99 (patch)
tree9bd75a6b28a50b0a9ae9a512f2152fc09d283ba1
parentb7204f04d94a324b62e1fac16c74dfb2508a6c24 (diff)
downloadexchange-71c87d483230167f20426d286dae1d3f2ed24b99.tar.xz
fakebank: allow wallet to select withdrawal amount
-rw-r--r--src/bank-lib/fakebank.h2
-rw-r--r--src/bank-lib/fakebank_bank_accounts_withdrawals.c5
-rw-r--r--src/bank-lib/fakebank_bank_get_withdrawals.c5
-rw-r--r--src/bank-lib/fakebank_bank_post_accounts_withdrawals.c23
-rw-r--r--src/bank-lib/fakebank_bank_post_withdrawals_confirm.c11
-rw-r--r--src/bank-lib/fakebank_bank_post_withdrawals_id_op.c11
-rw-r--r--src/bank-lib/fakebank_stop.c1
-rw-r--r--src/bank-lib/fakebank_tbi_get_withdrawal_operation.c5
-rw-r--r--src/bank-lib/fakebank_tbi_post_withdrawal_operation.c46
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;