diff options
Diffstat (limited to 'src/exchange')
| -rw-r--r-- | src/exchange/taler-exchange-httpd_purses_create.c | 7 | ||||
| -rw-r--r-- | src/exchange/taler-exchange-httpd_purses_merge.c | 42 | ||||
| -rw-r--r-- | src/exchange/taler-exchange-httpd_reserves_purse.c | 32 |
3 files changed, 62 insertions, 19 deletions
diff --git a/src/exchange/taler-exchange-httpd_purses_create.c b/src/exchange/taler-exchange-httpd_purses_create.c index 4034978b..a5702ffe 100644 --- a/src/exchange/taler-exchange-httpd_purses_create.c +++ b/src/exchange/taler-exchange-httpd_purses_create.c @@ -55,7 +55,7 @@ struct Coin struct TALER_Amount amount; /** - * Deposit fee applicable for this coin. + * Deposit fee applicable to this coin. */ struct TALER_Amount deposit_fee; @@ -220,8 +220,11 @@ create_transaction (void *cls, { struct PurseCreateContext *pcc = cls; enum GNUNET_DB_QueryStatus qs; + struct TALER_Amount purse_fee; bool in_conflict = true; + TALER_amount_set_zero (pcc->amount.currency, + &purse_fee); /* 1) create purse */ qs = TEH_plugin->insert_purse_request (TEH_plugin->cls, pcc->purse_pub, @@ -229,7 +232,9 @@ create_transaction (void *cls, pcc->purse_expiration, &pcc->h_contract_terms, pcc->min_age, + TALER_WAMF_MODE_MERGE_FULLY_PAID_PURSE, &pcc->amount, + &purse_fee, &pcc->purse_sig, &in_conflict); if (qs < 0) diff --git a/src/exchange/taler-exchange-httpd_purses_merge.c b/src/exchange/taler-exchange-httpd_purses_merge.c index a95f4ce4..c2b11ca3 100644 --- a/src/exchange/taler-exchange-httpd_purses_merge.c +++ b/src/exchange/taler-exchange-httpd_purses_merge.c @@ -497,24 +497,32 @@ TEH_handler_purses_merge ( TALER_EC_EXCHANGE_PURSE_MERGE_INVALID_MERGE_SIGNATURE, NULL); } - if (GNUNET_OK != - TALER_wallet_account_merge_verify ( - pcc.merge_timestamp, - pcc.purse_pub, - pcc.purse_expiration, - &pcc.h_contract_terms, - &pcc.target_amount, - pcc.min_age, - &pcc.reserve_pub, - &pcc.reserve_sig)) { - GNUNET_break_op (0); - GNUNET_free (pcc.provider_url); - return TALER_MHD_reply_with_error ( - connection, - MHD_HTTP_BAD_REQUEST, - TALER_EC_EXCHANGE_PURSE_MERGE_INVALID_RESERVE_SIGNATURE, - NULL); + struct TALER_Amount zero_purse_fee; + + TALER_amount_set_zero (pcc.target_amount.currency, + &zero_purse_fee); + if (GNUNET_OK != + TALER_wallet_account_merge_verify ( + pcc.merge_timestamp, + pcc.purse_pub, + pcc.purse_expiration, + &pcc.h_contract_terms, + &pcc.target_amount, + &zero_purse_fee, + pcc.min_age, + TALER_WAMF_MODE_MERGE_FULLY_PAID_PURSE, + &pcc.reserve_pub, + &pcc.reserve_sig)) + { + GNUNET_break_op (0); + GNUNET_free (pcc.provider_url); + return TALER_MHD_reply_with_error ( + connection, + MHD_HTTP_BAD_REQUEST, + TALER_EC_EXCHANGE_PURSE_MERGE_INVALID_RESERVE_SIGNATURE, + NULL); + } } /* execute transaction */ diff --git a/src/exchange/taler-exchange-httpd_reserves_purse.c b/src/exchange/taler-exchange-httpd_reserves_purse.c index 3991b416..5556f78d 100644 --- a/src/exchange/taler-exchange-httpd_reserves_purse.c +++ b/src/exchange/taler-exchange-httpd_reserves_purse.c @@ -61,6 +61,11 @@ struct ReservePurseContext struct TALER_Amount amount; /** + * Purse fee the client is willing to pay. + */ + struct TALER_Amount purse_fee; + + /** * Total amount already put into the purse. */ struct TALER_Amount deposit_total; @@ -129,6 +134,11 @@ struct ReservePurseContext * Minimum age for deposits into this purse. */ uint32_t min_age; + + /** + * Flags for the operation. + */ + enum TALER_WalletAccountMergeFlags flags; }; @@ -209,6 +219,8 @@ purse_transaction (void *cls, rpc->purse_expiration, &rpc->h_contract_terms, rpc->min_age, + rpc->flags, + &rpc->purse_fee, &rpc->amount, &rpc->purse_sig, &in_conflict); @@ -449,6 +461,7 @@ TEH_handler_reserves_purse ( .reserve_pub = reserve_pub, .exchange_timestamp = GNUNET_TIME_timestamp_get () }; + bool no_purse_fee = true; struct GNUNET_JSON_Specification spec[] = { TALER_JSON_spec_amount ("purse_value", TEH_currency, @@ -456,6 +469,11 @@ TEH_handler_reserves_purse ( GNUNET_JSON_spec_uint32 ("min_age", &rpc.min_age), GNUNET_JSON_spec_mark_optional ( + TALER_JSON_spec_amount ("purse_fee", + TEH_currency, + &rpc.purse_fee), + &no_purse_fee), + GNUNET_JSON_spec_mark_optional ( GNUNET_JSON_spec_varsize ("econtract", &rpc.econtract, &rpc.econtract_size), @@ -538,7 +556,17 @@ TEH_handler_reserves_purse ( TALER_EC_EXCHANGE_GENERIC_GLOBAL_FEES_MISSING, NULL); } - + if (no_purse_fee) + { + rpc.flags = TALER_WAMF_MODE_CREATE_FROM_PURSE_QUOTA; + TALER_amount_set_zero (TEH_currency, + &rpc.purse_fee); + } + else + { + rpc.flags = TALER_WAMF_MODE_CREATE_WITH_PURSE_FEE; + // FIXME: check rpc.purse_fee is at or above gf.fees.purse! + } TEH_METRICS_num_verifications[TEH_MT_SIGNATURE_EDDSA]++; if (GNUNET_OK != TALER_wallet_purse_create_verify (rpc.purse_expiration, @@ -578,7 +606,9 @@ TEH_handler_reserves_purse ( rpc.purse_expiration, &rpc.h_contract_terms, &rpc.amount, + &rpc.purse_fee, rpc.min_age, + rpc.flags, rpc.reserve_pub, &rpc.reserve_sig)) { |
