fix issues in tracking API and tracking API test, resolves #4399
This commit is contained in:
parent
910e01d1c1
commit
4553681476
@ -96,12 +96,12 @@ handle_wire_deposits_finished (void *cls,
|
||||
struct TALER_ExchangePublicKeyP exchange_pub;
|
||||
struct TALER_ExchangeSignatureP exchange_sig;
|
||||
struct GNUNET_JSON_Specification spec[] = {
|
||||
GNUNET_JSON_spec_fixed_auto ("H_wire", &h_wire),
|
||||
GNUNET_JSON_spec_fixed_auto ("exchange_pub", &exchange_pub),
|
||||
GNUNET_JSON_spec_fixed_auto ("exchange_sig", &exchange_sig),
|
||||
TALER_JSON_spec_amount ("total", &total_amount),
|
||||
GNUNET_JSON_spec_fixed_auto ("merchant_pub", &merchant_pub),
|
||||
TALER_JSON_spec_amount ("total_amount", &total_amount),
|
||||
GNUNET_JSON_spec_json ("details", &details_j),
|
||||
GNUNET_JSON_spec_fixed_auto ("H_wire", &h_wire),
|
||||
GNUNET_JSON_spec_json ("deposits", &details_j),
|
||||
GNUNET_JSON_spec_fixed_auto ("exchange_sig", &exchange_sig),
|
||||
GNUNET_JSON_spec_fixed_auto ("exchange_pub", &exchange_pub),
|
||||
GNUNET_JSON_spec_end()
|
||||
};
|
||||
|
||||
@ -129,10 +129,10 @@ handle_wire_deposits_finished (void *cls,
|
||||
struct json_t *detail_j = json_array_get (details_j, i);
|
||||
struct GNUNET_JSON_Specification spec_detail[] = {
|
||||
GNUNET_JSON_spec_fixed_auto ("H_contract", &detail->h_contract),
|
||||
TALER_JSON_spec_amount ("deposit_value", &detail->coin_value),
|
||||
TALER_JSON_spec_amount ("deposit_fee", &detail->coin_fee),
|
||||
GNUNET_JSON_spec_uint64 ("transaction_id", &detail->transaction_id),
|
||||
GNUNET_JSON_spec_fixed_auto ("coin_pub", &detail->coin_pub),
|
||||
TALER_JSON_spec_amount ("deposit_value", &detail->coin_value),
|
||||
TALER_JSON_spec_amount ("deposit_fee", &detail->coin_fee),
|
||||
GNUNET_JSON_spec_end()
|
||||
};
|
||||
|
||||
|
@ -514,8 +514,13 @@ struct Command
|
||||
struct TALER_EXCHANGE_WireDepositsHandle *wdh;
|
||||
|
||||
/**
|
||||
* Reference to a /deposit/wtid command. If set, we use the
|
||||
* WTID from that command.
|
||||
* Reference to a command providing a WTID. If set, we use the
|
||||
* WTID from that command. The command can be either an
|
||||
* #OC_DEPOSIT_WTID or an #OC_CHECK_BANK_TRANSFER. In the
|
||||
* case of the bank transfer, we check that the total amount
|
||||
* claimed by the exchange matches the total amount transferred
|
||||
* by the bank. In the case of a /deposit/wtid, we check
|
||||
* that the wire details match.
|
||||
*/
|
||||
const char *wtid_ref;
|
||||
|
||||
@ -524,6 +529,13 @@ struct Command
|
||||
*/
|
||||
struct TALER_WireTransferIdentifierRawP wtid;
|
||||
|
||||
/**
|
||||
* What is the expected total amount? Only used if
|
||||
* @e expected_response_code was #MHD_HTTP_OK.
|
||||
*/
|
||||
const char *total_amount_expected;
|
||||
|
||||
|
||||
/* TODO: may want to add list of deposits we expected
|
||||
to see aggregated here in the future. */
|
||||
|
||||
@ -549,12 +561,6 @@ struct Command
|
||||
*/
|
||||
const char *bank_transfer_ref;
|
||||
|
||||
/**
|
||||
* What is the expected total amount? Only used if
|
||||
* @e expected_response_code was #MHD_HTTP_OK.
|
||||
*/
|
||||
struct TALER_Amount total_amount_expected;
|
||||
|
||||
/**
|
||||
* Wire transfer identifier, set if #MHD_HTTP_OK was the response code.
|
||||
*/
|
||||
@ -1362,6 +1368,7 @@ wire_deposits_cb (void *cls,
|
||||
struct InterpreterState *is = cls;
|
||||
struct Command *cmd = &is->commands[is->ip];
|
||||
const struct Command *ref;
|
||||
struct TALER_Amount expected_amount;
|
||||
|
||||
cmd->details.wire_deposits.wdh = NULL;
|
||||
if (cmd->expected_response_code != http_status)
|
||||
@ -1377,11 +1384,16 @@ wire_deposits_cb (void *cls,
|
||||
switch (http_status)
|
||||
{
|
||||
case MHD_HTTP_OK:
|
||||
ref = find_command (is,
|
||||
cmd->details.wire_deposits.wtid_ref);
|
||||
GNUNET_assert (NULL != ref);
|
||||
if (GNUNET_OK !=
|
||||
TALER_string_to_amount (cmd->details.wire_deposits.total_amount_expected,
|
||||
&expected_amount))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
fail (is);
|
||||
return;
|
||||
}
|
||||
if (0 != TALER_amount_cmp (total_amount,
|
||||
&ref->details.deposit_wtid.total_amount_expected))
|
||||
&expected_amount))
|
||||
{
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Total amount missmatch to command %s\n",
|
||||
@ -1391,28 +1403,65 @@ wire_deposits_cb (void *cls,
|
||||
fail (is);
|
||||
return;
|
||||
}
|
||||
if (NULL != ref->details.deposit_wtid.deposit_ref)
|
||||
ref = find_command (is,
|
||||
cmd->details.wire_deposits.wtid_ref);
|
||||
GNUNET_assert (NULL != ref);
|
||||
switch (ref->oc)
|
||||
{
|
||||
const struct Command *dep;
|
||||
struct GNUNET_HashCode hw;
|
||||
case OC_DEPOSIT_WTID:
|
||||
if (NULL != ref->details.deposit_wtid.deposit_ref)
|
||||
{
|
||||
const struct Command *dep;
|
||||
struct GNUNET_HashCode hw;
|
||||
json_t *wire;
|
||||
|
||||
dep = find_command (is,
|
||||
ref->details.deposit_wtid.deposit_ref);
|
||||
GNUNET_assert (NULL != dep);
|
||||
GNUNET_CRYPTO_hash (dep->details.deposit.wire_details,
|
||||
strlen (dep->details.deposit.wire_details),
|
||||
&hw);
|
||||
if (0 != memcmp (&hw,
|
||||
h_wire,
|
||||
sizeof (struct GNUNET_HashCode)))
|
||||
dep = find_command (is,
|
||||
ref->details.deposit_wtid.deposit_ref);
|
||||
GNUNET_assert (NULL != dep);
|
||||
wire = json_loads (dep->details.deposit.wire_details,
|
||||
JSON_REJECT_DUPLICATES,
|
||||
NULL);
|
||||
TALER_JSON_hash (wire,
|
||||
&hw);
|
||||
json_decref (wire);
|
||||
if (0 != memcmp (&hw,
|
||||
h_wire,
|
||||
sizeof (struct GNUNET_HashCode)))
|
||||
{
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Wire hash missmatch to command %s\n",
|
||||
cmd->label);
|
||||
json_dumpf (json, stderr, 0);
|
||||
fail (is);
|
||||
return;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case OC_CHECK_BANK_TRANSFER:
|
||||
if (GNUNET_OK !=
|
||||
TALER_string_to_amount (ref->details.check_bank_transfer.amount,
|
||||
&expected_amount))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
fail (is);
|
||||
return;
|
||||
}
|
||||
if (0 != TALER_amount_cmp (total_amount,
|
||||
&expected_amount))
|
||||
{
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Wire hash missmatch to command %s\n",
|
||||
"Total amount missmatch to command %s\n",
|
||||
http_status,
|
||||
cmd->label);
|
||||
json_dumpf (json, stderr, 0);
|
||||
fail (is);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
GNUNET_break (0);
|
||||
fail (is);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -2680,6 +2729,18 @@ run (void *cls)
|
||||
.details.deposit_wtid.deposit_ref = "deposit-simple",
|
||||
.details.deposit_wtid.bank_transfer_ref = "check_bank_transfer-499c" },
|
||||
|
||||
{ .oc = OC_WIRE_DEPOSITS,
|
||||
.label = "wire-deposits-sucess-bank",
|
||||
.expected_response_code = MHD_HTTP_OK,
|
||||
.details.wire_deposits.wtid_ref = "check_bank_transfer-99c1",
|
||||
.details.wire_deposits.total_amount_expected = "EUR:0.99" },
|
||||
|
||||
{ .oc = OC_WIRE_DEPOSITS,
|
||||
.label = "wire-deposits-sucess-wtid",
|
||||
.expected_response_code = MHD_HTTP_OK,
|
||||
.details.wire_deposits.wtid_ref = "deposit-wtid-ok",
|
||||
.details.wire_deposits.total_amount_expected = "EUR:4.99" },
|
||||
|
||||
|
||||
/* TODO: trigger aggregation logic and then check the
|
||||
cases where tracking succeeds! */
|
||||
|
@ -1184,14 +1184,14 @@ TMH_RESPONSE_reply_wire_deposit_details (struct MHD_Connection *connection,
|
||||
&dd,
|
||||
sizeof (struct TALER_WireDepositDetailP));
|
||||
json_array_append (deposits,
|
||||
json_pack ("{s:o, s:o, s:o, s:I, s:o}",
|
||||
"deposit_value", TALER_JSON_from_amount (&wdd_pos->deposit_value),
|
||||
"deposit_fee", TALER_JSON_from_amount (&wdd_pos->deposit_fee),
|
||||
json_pack ("{s:o, s:I, s:o, s:o, s:o}",
|
||||
"H_contract", GNUNET_JSON_from_data (&wdd_pos->h_contract,
|
||||
sizeof (struct GNUNET_HashCode)),
|
||||
"transaction_id", (json_int_t) wdd_pos->transaction_id,
|
||||
"coin_pub", GNUNET_JSON_from_data (&wdd_pos->coin_pub,
|
||||
sizeof (struct TALER_CoinSpendPublicKeyP))));
|
||||
sizeof (struct TALER_CoinSpendPublicKeyP)),
|
||||
"deposit_value", TALER_JSON_from_amount (&wdd_pos->deposit_value),
|
||||
"deposit_fee", TALER_JSON_from_amount (&wdd_pos->deposit_fee)));
|
||||
}
|
||||
wdp.purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE_DEPOSIT);
|
||||
wdp.purpose.size = htonl (sizeof (struct TALER_WireDepositDataPS));
|
||||
@ -1206,11 +1206,11 @@ TMH_RESPONSE_reply_wire_deposit_details (struct MHD_Connection *connection,
|
||||
&sig);
|
||||
return TMH_RESPONSE_reply_json_pack (connection,
|
||||
MHD_HTTP_OK,
|
||||
"{s:o, s:o, s:o, s:o}",
|
||||
"{s:o, s:o, s:o, s:o, s:o, s:o}",
|
||||
"total", TALER_JSON_from_amount (total),
|
||||
"merchant_pub", GNUNET_JSON_from_data (merchant_pub,
|
||||
sizeof (struct TALER_MerchantPublicKeyP)),
|
||||
"h_wire", GNUNET_JSON_from_data (h_wire,
|
||||
"H_wire", GNUNET_JSON_from_data (h_wire,
|
||||
sizeof (struct GNUNET_HashCode)),
|
||||
"deposits", deposits,
|
||||
"exchange_sig", GNUNET_JSON_from_data (&sig,
|
||||
|
Loading…
Reference in New Issue
Block a user