Ask to withdraw on a expired reserve.
This commit is contained in:
parent
e746e0bbbc
commit
5019bd6914
@ -333,7 +333,7 @@ parse_reserve_history (struct TALER_EXCHANGE_Handle *exchange,
|
|||||||
struct TALER_ReserveCloseConfirmationPS rcc;
|
struct TALER_ReserveCloseConfirmationPS rcc;
|
||||||
struct GNUNET_TIME_Absolute timestamp;
|
struct GNUNET_TIME_Absolute timestamp;
|
||||||
struct GNUNET_JSON_Specification closing_spec[] = {
|
struct GNUNET_JSON_Specification closing_spec[] = {
|
||||||
GNUNET_JSON_spec_json ("receiver_account_details",
|
GNUNET_JSON_spec_string ("receiver_account_details",
|
||||||
&rhistory[off].details.close_details.receiver_account_details),
|
&rhistory[off].details.close_details.receiver_account_details),
|
||||||
GNUNET_JSON_spec_fixed_auto ("wtid",
|
GNUNET_JSON_spec_fixed_auto ("wtid",
|
||||||
&rhistory[off].details.close_details.wtid),
|
&rhistory[off].details.close_details.wtid),
|
||||||
@ -360,13 +360,9 @@ parse_reserve_history (struct TALER_EXCHANGE_Handle *exchange,
|
|||||||
}
|
}
|
||||||
TALER_amount_hton (&rcc.closing_amount,
|
TALER_amount_hton (&rcc.closing_amount,
|
||||||
&amount);
|
&amount);
|
||||||
if (GNUNET_OK !=
|
GNUNET_CRYPTO_hash (rhistory[off].details.close_details.receiver_account_details,
|
||||||
TALER_JSON_wire_signature_hash (rhistory[off].details.close_details.receiver_account_details,
|
strlen (rhistory[off].details.close_details.receiver_account_details) + 1,
|
||||||
&rcc.h_wire))
|
&rcc.h_wire);
|
||||||
{
|
|
||||||
GNUNET_break (0);
|
|
||||||
return GNUNET_SYSERR;
|
|
||||||
}
|
|
||||||
rcc.wtid = rhistory[off].details.close_details.wtid;
|
rcc.wtid = rhistory[off].details.close_details.wtid;
|
||||||
rcc.purpose.size = htonl (sizeof (rcc));
|
rcc.purpose.size = htonl (sizeof (rcc));
|
||||||
rcc.purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_RESERVE_CLOSED);
|
rcc.purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_RESERVE_CLOSED);
|
||||||
@ -377,7 +373,7 @@ parse_reserve_history (struct TALER_EXCHANGE_Handle *exchange,
|
|||||||
key_state = TALER_EXCHANGE_get_keys (exchange);
|
key_state = TALER_EXCHANGE_get_keys (exchange);
|
||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
TALER_EXCHANGE_test_signing_key (key_state,
|
TALER_EXCHANGE_test_signing_key (key_state,
|
||||||
&rhistory[off].details.payback_details.exchange_pub))
|
&rhistory[off].details.close_details.exchange_pub))
|
||||||
{
|
{
|
||||||
GNUNET_break_op (0);
|
GNUNET_break_op (0);
|
||||||
return GNUNET_SYSERR;
|
return GNUNET_SYSERR;
|
||||||
@ -385,8 +381,8 @@ parse_reserve_history (struct TALER_EXCHANGE_Handle *exchange,
|
|||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_EXCHANGE_RESERVE_CLOSED,
|
GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_EXCHANGE_RESERVE_CLOSED,
|
||||||
&rcc.purpose,
|
&rcc.purpose,
|
||||||
&rhistory[off].details.payback_details.exchange_sig.eddsa_signature,
|
&rhistory[off].details.close_details.exchange_sig.eddsa_signature,
|
||||||
&rhistory[off].details.payback_details.exchange_pub.eddsa_pub))
|
&rhistory[off].details.close_details.exchange_pub.eddsa_pub))
|
||||||
{
|
{
|
||||||
GNUNET_break_op (0);
|
GNUNET_break_op (0);
|
||||||
return GNUNET_SYSERR;
|
return GNUNET_SYSERR;
|
||||||
@ -447,8 +443,7 @@ free_rhistory (struct TALER_EXCHANGE_ReserveHistory *rhistory,
|
|||||||
case TALER_EXCHANGE_RTT_PAYBACK:
|
case TALER_EXCHANGE_RTT_PAYBACK:
|
||||||
break;
|
break;
|
||||||
case TALER_EXCHANGE_RTT_CLOSE:
|
case TALER_EXCHANGE_RTT_CLOSE:
|
||||||
if (NULL != rhistory[i].details.close_details.receiver_account_details)
|
// should we free "receiver_account_details" ?
|
||||||
json_decref (rhistory[i].details.close_details.receiver_account_details);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
@INLINE@ test_exchange_api.conf
|
||||||
|
|
||||||
|
[exchangedb]
|
||||||
|
IDLE_RESERVE_EXPIRATION_TIME = 0 s
|
@ -42,6 +42,8 @@
|
|||||||
*/
|
*/
|
||||||
#define CONFIG_FILE "test_exchange_api.conf"
|
#define CONFIG_FILE "test_exchange_api.conf"
|
||||||
|
|
||||||
|
#define CONFIG_FILE_EXPIRE_RESERVE_NOW "test_exchange_api_expire_reserve_now.conf"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is the configuration file is set to include wire format 'ebics'?
|
* Is the configuration file is set to include wire format 'ebics'?
|
||||||
* Requires that EBICS /history function is implemented, which it
|
* Requires that EBICS /history function is implemented, which it
|
||||||
@ -638,6 +640,47 @@ run (void *cls,
|
|||||||
"EUR:3.99",
|
"EUR:3.99",
|
||||||
MHD_HTTP_OK),
|
MHD_HTTP_OK),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* These commands should close the reserve because
|
||||||
|
* the aggregator is given a config file that ovverrides
|
||||||
|
* the reserve expiration time (making it now-ish)
|
||||||
|
*/
|
||||||
|
CMD_TRANSFER_TO_EXCHANGE
|
||||||
|
("short-lived-reserve",
|
||||||
|
"EUR:5.01"),
|
||||||
|
|
||||||
|
TALER_TESTING_cmd_exec_wirewatch
|
||||||
|
("short-lived-aggregation",
|
||||||
|
CONFIG_FILE_EXPIRE_RESERVE_NOW),
|
||||||
|
|
||||||
|
TALER_TESTING_cmd_exec_aggregator
|
||||||
|
("close-reserves",
|
||||||
|
CONFIG_FILE_EXPIRE_RESERVE_NOW),
|
||||||
|
|
||||||
|
TALER_TESTING_cmd_withdraw_amount
|
||||||
|
("expired-withdraw",
|
||||||
|
is->exchange,
|
||||||
|
"short-lived-reserve",
|
||||||
|
"EUR:1",
|
||||||
|
MHD_HTTP_FORBIDDEN),
|
||||||
|
|
||||||
|
/* Should also test a "insufficient funds" error
|
||||||
|
* after payback happened. */
|
||||||
|
|
||||||
|
TALER_TESTING_cmd_check_bank_transfer
|
||||||
|
("check_bank_short-lived_transfer",
|
||||||
|
exchange_url,
|
||||||
|
"EUR:5.01",
|
||||||
|
42,
|
||||||
|
2),
|
||||||
|
|
||||||
|
TALER_TESTING_cmd_check_bank_transfer
|
||||||
|
("check_bank_short-lived_reimburse",
|
||||||
|
exchange_url,
|
||||||
|
"EUR:5",
|
||||||
|
2,
|
||||||
|
42),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fill reserve with EUR:2.02, as withdraw fee is 1 ct per
|
* Fill reserve with EUR:2.02, as withdraw fee is 1 ct per
|
||||||
* config, then withdraw two coin, partially spend one, and
|
* config, then withdraw two coin, partially spend one, and
|
||||||
|
@ -1133,6 +1133,7 @@ expired_reserve_cb (void *cls,
|
|||||||
&wtid,
|
&wtid,
|
||||||
left,
|
left,
|
||||||
closing_fee);
|
closing_fee);
|
||||||
|
|
||||||
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
||||||
"Closing reserve %s over %s (%d, %d)\n",
|
"Closing reserve %s over %s (%d, %d)\n",
|
||||||
TALER_B2S (reserve_pub),
|
TALER_B2S (reserve_pub),
|
||||||
|
@ -835,6 +835,7 @@ TEH_RESPONSE_compile_reserve_history (const struct TALER_EXCHANGEDB_ReserveHisto
|
|||||||
break;
|
break;
|
||||||
case TALER_EXCHANGEDB_RO_EXCHANGE_TO_BANK:
|
case TALER_EXCHANGEDB_RO_EXCHANGE_TO_BANK:
|
||||||
{
|
{
|
||||||
|
|
||||||
struct TALER_ReserveCloseConfirmationPS rcc;
|
struct TALER_ReserveCloseConfirmationPS rcc;
|
||||||
struct TALER_ExchangePublicKeyP pub;
|
struct TALER_ExchangePublicKeyP pub;
|
||||||
struct TALER_ExchangeSignatureP sig;
|
struct TALER_ExchangeSignatureP sig;
|
||||||
@ -880,7 +881,7 @@ TEH_RESPONSE_compile_reserve_history (const struct TALER_EXCHANGEDB_ReserveHisto
|
|||||||
}
|
}
|
||||||
GNUNET_assert (0 ==
|
GNUNET_assert (0 ==
|
||||||
json_array_append_new (json_history,
|
json_array_append_new (json_history,
|
||||||
json_pack ("{s:s, s:O, s:o, s:o, s:o, s:o, s:o, s:o}",
|
json_pack ("{s:s, s:s, s:o, s:o, s:o, s:o, s:o, s:o}",
|
||||||
"type", "CLOSING",
|
"type", "CLOSING",
|
||||||
"receiver_account_details", pos->details.closing->receiver_account_details,
|
"receiver_account_details", pos->details.closing->receiver_account_details,
|
||||||
"wtid", GNUNET_JSON_from_data_auto (&pos->details.closing->wtid),
|
"wtid", GNUNET_JSON_from_data_auto (&pos->details.closing->wtid),
|
||||||
@ -893,6 +894,7 @@ TEH_RESPONSE_compile_reserve_history (const struct TALER_EXCHANGEDB_ReserveHisto
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 == (1 & ret))
|
if (0 == (1 & ret))
|
||||||
{
|
{
|
||||||
GNUNET_break (0);
|
GNUNET_break (0);
|
||||||
|
@ -912,7 +912,7 @@ struct TALER_EXCHANGE_ReserveHistory
|
|||||||
/**
|
/**
|
||||||
* Receiver account information for the outgoing wire transfer.
|
* Receiver account information for the outgoing wire transfer.
|
||||||
*/
|
*/
|
||||||
json_t *receiver_account_details;
|
const char *receiver_account_details;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wire transfer details for the outgoing wire transfer.
|
* Wire transfer details for the outgoing wire transfer.
|
||||||
|
Loading…
Reference in New Issue
Block a user