more work on coin/denomination audit
This commit is contained in:
parent
78bfa7d077
commit
8ea9b0dad7
@ -41,6 +41,7 @@
|
||||
#include <gnunet/gnunet_util_lib.h>
|
||||
#include "taler_auditordb_plugin.h"
|
||||
#include "taler_exchangedb_plugin.h"
|
||||
#include "taler_json_lib.h"
|
||||
#include "taler_signatures.h"
|
||||
|
||||
|
||||
@ -526,7 +527,8 @@ handle_reserve_in (void *cls,
|
||||
|
||||
|
||||
/**
|
||||
* Function called with details about withdraw operations.
|
||||
* Function called with details about withdraw operations. Verifies
|
||||
* the signature and updates the reserve's balance.
|
||||
*
|
||||
* @param cls our `struct ReserveContext`
|
||||
* @param rowid unique serial ID for the refresh session in our DB
|
||||
@ -956,21 +958,6 @@ struct DenominationSummary
|
||||
*/
|
||||
struct TALER_Amount denom_balance;
|
||||
|
||||
/**
|
||||
* Total amount of deposit fees made.
|
||||
*/
|
||||
struct TALER_Amount deposit_fee_balance;
|
||||
|
||||
/**
|
||||
* Total amount of melt fees made.
|
||||
*/
|
||||
struct TALER_Amount melt_fee_balance;
|
||||
|
||||
/**
|
||||
* Total amount of refund fees made.
|
||||
*/
|
||||
struct TALER_Amount refund_fee_balance;
|
||||
|
||||
/**
|
||||
* Up to which point have we processed reserves_out?
|
||||
*/
|
||||
@ -1074,9 +1061,6 @@ init_denomination (const struct GNUNET_HashCode *denom_hash,
|
||||
asession,
|
||||
denom_hash,
|
||||
&ds->denom_balance,
|
||||
&ds->deposit_fee_balance,
|
||||
&ds->melt_fee_balance,
|
||||
&ds->refund_fee_balance,
|
||||
&ds->last_reserve_out_serial_id,
|
||||
&ds->last_deposit_serial_id,
|
||||
&ds->last_melt_serial_id,
|
||||
@ -1094,15 +1078,6 @@ init_denomination (const struct GNUNET_HashCode *denom_hash,
|
||||
GNUNET_assert (GNUNET_OK ==
|
||||
TALER_amount_get_zero (currency,
|
||||
&ds->denom_balance));
|
||||
GNUNET_assert (GNUNET_OK ==
|
||||
TALER_amount_get_zero (currency,
|
||||
&ds->deposit_fee_balance));
|
||||
GNUNET_assert (GNUNET_OK ==
|
||||
TALER_amount_get_zero (currency,
|
||||
&ds->melt_fee_balance));
|
||||
GNUNET_assert (GNUNET_OK ==
|
||||
TALER_amount_get_zero (currency,
|
||||
&ds->refund_fee_balance));
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
@ -1171,9 +1146,6 @@ sync_denomination (void *cls,
|
||||
asession,
|
||||
denom_hash,
|
||||
&ds->denom_balance,
|
||||
&ds->deposit_fee_balance,
|
||||
&ds->melt_fee_balance,
|
||||
&ds->refund_fee_balance,
|
||||
ds->last_reserve_out_serial_id,
|
||||
ds->last_deposit_serial_id,
|
||||
ds->last_melt_serial_id,
|
||||
@ -1183,9 +1155,6 @@ sync_denomination (void *cls,
|
||||
asession,
|
||||
denom_hash,
|
||||
&ds->denom_balance,
|
||||
&ds->deposit_fee_balance,
|
||||
&ds->melt_fee_balance,
|
||||
&ds->refund_fee_balance,
|
||||
ds->last_reserve_out_serial_id,
|
||||
ds->last_deposit_serial_id,
|
||||
ds->last_melt_serial_id,
|
||||
@ -1232,13 +1201,129 @@ free_coin (void *cls,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check coin's transaction history for plausibility. Does NOT check
|
||||
* the signatures (those are checked independently), but does check
|
||||
* that the amounts add up to a plausible overall picture.
|
||||
*
|
||||
* FIXME: is it wise to do this here? Maybe better to do this during
|
||||
* processing of payments to the merchants...
|
||||
*
|
||||
* @param coin_pub public key of the coin (for reporting)
|
||||
* @param dki denomination information about the coin
|
||||
* @param tl_head head of transaction history to verify
|
||||
*/
|
||||
static void
|
||||
check_transaction_history (const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
||||
const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki,
|
||||
const struct TALER_EXCHANGEDB_TransactionList *tl_head)
|
||||
{
|
||||
struct TALER_Amount expenditures;
|
||||
struct TALER_Amount refunds;
|
||||
struct TALER_Amount fees;
|
||||
struct TALER_Amount final_expenditures;
|
||||
|
||||
GNUNET_assert (NULL != tl_head);
|
||||
TALER_amount_get_zero (currency,
|
||||
&expenditures);
|
||||
TALER_amount_get_zero (currency,
|
||||
&refunds);
|
||||
TALER_amount_get_zero (currency,
|
||||
&fees);
|
||||
for (const struct TALER_EXCHANGEDB_TransactionList *tl = tl_head;NULL != tl;tl = tl->next)
|
||||
{
|
||||
const struct TALER_Amount *amount_with_fee;
|
||||
const struct TALER_Amount *fee;
|
||||
const struct TALER_AmountNBO *fee_dki;
|
||||
struct TALER_Amount *add_to;
|
||||
struct TALER_Amount tmp;
|
||||
|
||||
add_to = NULL;
|
||||
switch (tl->type) {
|
||||
case TALER_EXCHANGEDB_TT_DEPOSIT:
|
||||
amount_with_fee = &tl->details.deposit->amount_with_fee;
|
||||
fee = &tl->details.deposit->deposit_fee;
|
||||
fee_dki = &dki->properties.fee_deposit;
|
||||
add_to = &expenditures;
|
||||
break;
|
||||
case TALER_EXCHANGEDB_TT_REFRESH_MELT:
|
||||
amount_with_fee = &tl->details.melt->amount_with_fee;
|
||||
fee = &tl->details.melt->melt_fee;
|
||||
fee_dki = &dki->properties.fee_refresh;
|
||||
add_to = &expenditures;
|
||||
break;
|
||||
case TALER_EXCHANGEDB_TT_REFUND:
|
||||
amount_with_fee = &tl->details.refund->refund_amount;
|
||||
fee = &tl->details.refund->refund_fee;
|
||||
fee_dki = &dki->properties.fee_refund;
|
||||
add_to = &refunds;
|
||||
// FIXME: where do we check that the refund(s)
|
||||
// of the coin match the deposit(s) of the coin (by merchant, timestamp, etc.)?
|
||||
break;
|
||||
}
|
||||
GNUNET_assert (NULL != add_to); /* check switch was exhaustive */
|
||||
if (GNUNET_OK !=
|
||||
TALER_amount_add (add_to,
|
||||
add_to,
|
||||
amount_with_fee))
|
||||
{
|
||||
/* overflow in history already!? inconceivable! Bad DB! */
|
||||
GNUNET_break (0);
|
||||
// FIXME: report!
|
||||
return;
|
||||
}
|
||||
TALER_amount_ntoh (&tmp,
|
||||
fee_dki);
|
||||
if (0 !=
|
||||
TALER_amount_cmp (&tmp,
|
||||
fee))
|
||||
{
|
||||
/* Disagreement in fee structure within DB! */
|
||||
GNUNET_break (0);
|
||||
// FIXME: report!
|
||||
return;
|
||||
}
|
||||
if (GNUNET_OK !=
|
||||
TALER_amount_add (&fees,
|
||||
&fees,
|
||||
fee))
|
||||
{
|
||||
/* overflow in fee total? inconceivable! Bad DB! */
|
||||
GNUNET_break (0);
|
||||
// FIXME: report!
|
||||
return;
|
||||
}
|
||||
} /* for 'tl' */
|
||||
|
||||
/* Finally, calculate total balance change, i.e. expenditures minus refunds */
|
||||
if (GNUNET_OK !=
|
||||
TALER_amount_subtract (&final_expenditures,
|
||||
&expenditures,
|
||||
&refunds))
|
||||
{
|
||||
/* refunds above expenditures? inconceivable! Bad DB! */
|
||||
GNUNET_break (0);
|
||||
// FIXME: report!
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Obtain information about the coin from the cache or the database.
|
||||
*
|
||||
* If we obtain this information for the first time, also check that
|
||||
* the coin's transaction history is internally consistent.
|
||||
*
|
||||
* @param cc caching information
|
||||
* @param coin_pub public key of the coin to get information about
|
||||
* @return NULL on error
|
||||
*/
|
||||
// FIXME: move this to _outgoing_ transaction checking,
|
||||
// replace HERE by something that just gets the denomination hash!
|
||||
// (avoids confusion on checking coin's transaction history AND
|
||||
// makes this part WAY more efficient!)
|
||||
static struct CoinSummary *
|
||||
get_coin_summary (struct CoinContext *cc,
|
||||
const struct TALER_CoinSpendPublicKeyP *coin_pub)
|
||||
@ -1247,7 +1332,9 @@ get_coin_summary (struct CoinContext *cc,
|
||||
struct GNUNET_HashCode chash;
|
||||
struct TALER_EXCHANGEDB_TransactionList *tl;
|
||||
const struct TALER_CoinPublicInfo *coin;
|
||||
const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki;
|
||||
|
||||
/* Check cache */
|
||||
GNUNET_CRYPTO_hash (coin_pub,
|
||||
sizeof (*coin_pub),
|
||||
&chash);
|
||||
@ -1255,6 +1342,8 @@ get_coin_summary (struct CoinContext *cc,
|
||||
&chash);
|
||||
if (NULL != cs)
|
||||
return cs; /* cache hit */
|
||||
|
||||
/* Get transaction history of @a coin_pub from DB */
|
||||
tl = edb->get_coin_transactions (edb->cls,
|
||||
esession,
|
||||
coin_pub);
|
||||
@ -1263,6 +1352,8 @@ get_coin_summary (struct CoinContext *cc,
|
||||
GNUNET_break (0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Obtain general denomination information about the coin */
|
||||
coin = NULL;
|
||||
switch (tl->type)
|
||||
{
|
||||
@ -1279,7 +1370,7 @@ get_coin_summary (struct CoinContext *cc,
|
||||
GNUNET_assert (NULL != coin); /* hard check that switch worked */
|
||||
if (GNUNET_OK !=
|
||||
get_denomination_info (&coin->denom_pub,
|
||||
&cs->dki,
|
||||
&dki,
|
||||
NULL))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
@ -1288,6 +1379,11 @@ get_coin_summary (struct CoinContext *cc,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* verify that the transaction history we are given is reasonable */
|
||||
check_transaction_history (coin_pub,
|
||||
dki,
|
||||
tl);
|
||||
|
||||
/* allocate coin slot in ring buffer */
|
||||
if (MAX_COIN_SUMMARIES >= cc->summaries_off)
|
||||
cc->summaries_off = 0;
|
||||
@ -1301,6 +1397,7 @@ get_coin_summary (struct CoinContext *cc,
|
||||
cs->coin_pub = *coin_pub;
|
||||
cs->coin_hash = chash;
|
||||
cs->tl = tl;
|
||||
cs->dki = dki;
|
||||
GNUNET_assert (GNUNET_YES ==
|
||||
GNUNET_CONTAINER_multihashmap_put (cc->coins,
|
||||
&cs->coin_hash,
|
||||
@ -1312,6 +1409,11 @@ get_coin_summary (struct CoinContext *cc,
|
||||
|
||||
/**
|
||||
* Function called with details about all withdraw operations.
|
||||
* Updates the denomination balance and the overall balance as
|
||||
* we now have additional coins that have been issued.
|
||||
*
|
||||
* Note that the signature was already checked in
|
||||
* #handle_reserve_out(), so we do not check it again here.
|
||||
*
|
||||
* @param cls our `struct CoinContext`
|
||||
* @param rowid unique serial ID for the refresh session in our DB
|
||||
@ -1339,6 +1441,7 @@ withdraw_cb (void *cls,
|
||||
struct DenominationSummary *ds;
|
||||
struct GNUNET_HashCode dh;
|
||||
const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki;
|
||||
struct TALER_Amount value;
|
||||
|
||||
if (GNUNET_OK !=
|
||||
get_denomination_info (denom_pub,
|
||||
@ -1350,16 +1453,35 @@ withdraw_cb (void *cls,
|
||||
}
|
||||
ds = get_denomination_summary (cc,
|
||||
&dh);
|
||||
// FIXME: use ds, dki, etc.
|
||||
// FIXME: update 'cc'
|
||||
|
||||
TALER_amount_ntoh (&value,
|
||||
&dki->properties.value);
|
||||
if (GNUNET_OK !=
|
||||
TALER_amount_add (&ds->denom_balance,
|
||||
&ds->denom_balance,
|
||||
&value))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
if (GNUNET_OK !=
|
||||
TALER_amount_add (&cc->denom_balance,
|
||||
&cc->denom_balance,
|
||||
&value))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Function called with details about coins that were melted,
|
||||
* with the goal of auditing the refresh's execution.
|
||||
* Function called with details about coins that were melted, with the
|
||||
* goal of auditing the refresh's execution. Verifies the signature
|
||||
* and updates our information about coins outstanding (the old coin's
|
||||
* denomination has less, the fresh coins increased outstanding
|
||||
* balances). As a side-effect, #get_coin_summary will report
|
||||
* inconsistencies in the melted coin's balance.
|
||||
*
|
||||
* @param cls closure
|
||||
* @param rowid unique serial ID for the refresh session in our DB
|
||||
@ -1385,6 +1507,8 @@ refresh_session_cb (void *cls,
|
||||
struct TALER_RefreshMeltCoinAffirmationPS rmc;
|
||||
struct CoinSummary *cs;
|
||||
const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki;
|
||||
struct DenominationSummary *dso;
|
||||
struct TALER_Amount amount_without_fee;
|
||||
|
||||
cs = get_coin_summary (cc,
|
||||
coin_pub);
|
||||
@ -1394,6 +1518,8 @@ refresh_session_cb (void *cls,
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
dki = cs->dki;
|
||||
|
||||
/* verify melt signature */
|
||||
rmc.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_COIN_MELT);
|
||||
rmc.purpose.size = htonl (sizeof (rmc));
|
||||
rmc.session_hash = *session_hash;
|
||||
@ -1413,8 +1539,149 @@ refresh_session_cb (void *cls,
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
// TODO: update risk, denomination outstanding amounts, etc.
|
||||
{
|
||||
struct TALER_DenominationPublicKey new_dp[num_newcoins];
|
||||
const struct TALER_EXCHANGEDB_DenominationKeyInformationP *new_dki[num_newcoins];
|
||||
struct TALER_Amount refresh_cost;
|
||||
|
||||
GNUNET_assert (GNUNET_OK ==
|
||||
TALER_amount_get_zero (amount_with_fee->currency,
|
||||
&refresh_cost));
|
||||
|
||||
/* Update outstanding amounts for all new coin's denominations, and check
|
||||
that the resulting amounts are consistent with the value being refreshed. */
|
||||
for (unsigned int i=0;i<num_newcoins;i++)
|
||||
{
|
||||
/* lookup new coin denomination key */
|
||||
if (GNUNET_OK !=
|
||||
edb->get_refresh_order (edb->cls,
|
||||
esession,
|
||||
session_hash,
|
||||
i,
|
||||
&new_dp[i]))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
if (GNUNET_OK !=
|
||||
get_denomination_info (&new_dp[i],
|
||||
&new_dki[i],
|
||||
NULL))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
|
||||
/* update cost of refresh */
|
||||
{
|
||||
struct TALER_Amount fee;
|
||||
struct TALER_Amount value;
|
||||
|
||||
TALER_amount_ntoh (&fee,
|
||||
&new_dki[i]->properties.fee_withdraw);
|
||||
TALER_amount_ntoh (&value,
|
||||
&new_dki[i]->properties.value);
|
||||
if ( (GNUNET_OK !=
|
||||
TALER_amount_add (&refresh_cost,
|
||||
&refresh_cost,
|
||||
&fee)) ||
|
||||
(GNUNET_OK !=
|
||||
TALER_amount_add (&refresh_cost,
|
||||
&refresh_cost,
|
||||
&value)) )
|
||||
{
|
||||
GNUNET_break (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* compute contribution of old coin */
|
||||
{
|
||||
struct TALER_Amount melt_fee;
|
||||
|
||||
TALER_amount_ntoh (&melt_fee,
|
||||
&dki->properties.fee_refresh);
|
||||
if (GNUNET_OK !=
|
||||
TALER_amount_subtract (&amount_without_fee,
|
||||
amount_with_fee,
|
||||
&melt_fee))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
}
|
||||
|
||||
/* check old coin covers complete expenses */
|
||||
if (1 == TALER_amount_cmp (&refresh_cost,
|
||||
&amount_without_fee))
|
||||
{
|
||||
/* refresh_cost > amount_without_fee */
|
||||
report_row_inconsistency ("melt",
|
||||
rowid,
|
||||
"refresh costs exceed value of melt");
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
/* update outstanding denomination amounts */
|
||||
for (unsigned int i=0;i<num_newcoins;i++)
|
||||
{
|
||||
struct DenominationSummary *dsi;
|
||||
struct TALER_Amount value;
|
||||
|
||||
dsi = get_denomination_summary (cc,
|
||||
&new_dki[i]->properties.denom_hash);
|
||||
TALER_amount_ntoh (&value,
|
||||
&new_dki[i]->properties.value);
|
||||
if (GNUNET_OK !=
|
||||
TALER_amount_add (&dsi->denom_balance,
|
||||
&dsi->denom_balance,
|
||||
&value))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
if (GNUNET_OK !=
|
||||
TALER_amount_add (&cc->denom_balance,
|
||||
&cc->denom_balance,
|
||||
&value))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* update old coin's denomination balance */
|
||||
dso = get_denomination_summary (cc,
|
||||
&dki->properties.denom_hash);
|
||||
if (GNUNET_OK !=
|
||||
TALER_amount_subtract (&dso->denom_balance,
|
||||
&dso->denom_balance,
|
||||
amount_with_fee))
|
||||
{
|
||||
// FIXME: trigger EMERGENCY PROTOCOL HERE! Exchange has been compromised!
|
||||
GNUNET_break (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
|
||||
/* update global up melt fees */
|
||||
{
|
||||
struct TALER_Amount rfee;
|
||||
|
||||
TALER_amount_ntoh (&rfee,
|
||||
&dki->properties.fee_refresh);
|
||||
if (GNUNET_OK !=
|
||||
TALER_amount_add (&cc->melt_fee_balance,
|
||||
&cc->melt_fee_balance,
|
||||
&rfee))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
}
|
||||
|
||||
/* We're good! */
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
@ -1423,6 +1690,9 @@ refresh_session_cb (void *cls,
|
||||
* Function called with details about deposits that have been made,
|
||||
* with the goal of auditing the deposit's execution.
|
||||
*
|
||||
* As a side-effect, #get_coin_summary will report
|
||||
* inconsistencies in the deposited coin's balance.
|
||||
*
|
||||
* @param cls closure
|
||||
* @param rowid unique serial ID for the deposit in our DB
|
||||
* @param timestamp when did the deposit happen
|
||||
@ -1456,6 +1726,7 @@ deposit_cb (void *cls,
|
||||
struct CoinContext *cc = cls;
|
||||
struct CoinSummary *cs;
|
||||
const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki;
|
||||
struct DenominationSummary *ds;
|
||||
struct TALER_DepositRequestPS dr;
|
||||
|
||||
cs = get_coin_summary (cc,
|
||||
@ -1467,6 +1738,7 @@ deposit_cb (void *cls,
|
||||
}
|
||||
dki = cs->dki;
|
||||
|
||||
/* Verify deposit signature */
|
||||
dr.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_COIN_DEPOSIT);
|
||||
dr.purpose.size = htonl (sizeof (dr));
|
||||
dr.h_proposal_data = *h_proposal_data;
|
||||
@ -1496,14 +1768,47 @@ deposit_cb (void *cls,
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
// TODO: update expected amounts in 'cc'
|
||||
/* update old coin's denomination balance */
|
||||
ds = get_denomination_summary (cc,
|
||||
&dki->properties.denom_hash);
|
||||
if (GNUNET_OK !=
|
||||
TALER_amount_subtract (&ds->denom_balance,
|
||||
&ds->denom_balance,
|
||||
amount_with_fee))
|
||||
{
|
||||
// FIXME: trigger EMERGENCY PROTOCOL HERE! Exchange has been compromised!
|
||||
GNUNET_break (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
|
||||
/* update global up melt fees */
|
||||
{
|
||||
struct TALER_Amount dfee;
|
||||
|
||||
TALER_amount_ntoh (&dfee,
|
||||
&dki->properties.fee_deposit);
|
||||
if (GNUNET_OK !=
|
||||
TALER_amount_add (&cc->deposit_fee_balance,
|
||||
&cc->deposit_fee_balance,
|
||||
&dfee))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
}
|
||||
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Function called with details about coins that were refunding,
|
||||
* with the goal of auditing the refund's execution.
|
||||
* with the goal of auditing the refund's execution. Adds the
|
||||
* refunded amount back to the outstanding balance of the respective
|
||||
* denomination.
|
||||
*
|
||||
* As a side-effect, #get_coin_summary will report
|
||||
* inconsistencies in the refunded coin's balance.
|
||||
*
|
||||
* @param cls closure
|
||||
* @param rowid unique serial ID for the refund in our DB
|
||||
@ -1528,6 +1833,7 @@ refund_cb (void *cls,
|
||||
struct CoinContext *cc = cls;
|
||||
struct CoinSummary *cs;
|
||||
const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki;
|
||||
struct TALER_RefundRequestPS rr;
|
||||
|
||||
cs = get_coin_summary (cc,
|
||||
coin_pub);
|
||||
@ -1538,7 +1844,29 @@ refund_cb (void *cls,
|
||||
}
|
||||
dki = cs->dki;
|
||||
|
||||
// TODO: verify signature
|
||||
/* verify refund signature */
|
||||
rr.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_REFUND);
|
||||
rr.purpose.size = htonl (sizeof (rr));
|
||||
rr.h_proposal_data = *h_proposal_data;
|
||||
rr.coin_pub = *coin_pub;
|
||||
rr.merchant = *merchant_pub;
|
||||
rr.rtransaction_id = GNUNET_htonll (rtransaction_id);
|
||||
TALER_amount_hton (&rr.refund_amount,
|
||||
amount_with_fee);
|
||||
rr.refund_fee = dki->properties.fee_refund;
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MERCHANT_REFUND,
|
||||
&rr.purpose,
|
||||
&merchant_sig->eddsa_sig,
|
||||
&merchant_pub->eddsa_pub))
|
||||
{
|
||||
report_row_inconsistency ("deposit",
|
||||
rowid,
|
||||
"invalid signature for coin deposit");
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
// TODO: update denomination key balance!
|
||||
|
||||
// TODO: update expected amounts in 'cc'
|
||||
return GNUNET_OK;
|
||||
@ -1559,6 +1887,7 @@ analyze_coins (void *cls)
|
||||
int rret;
|
||||
|
||||
/* setup 'cc' */
|
||||
// FIXME: FIX misnomer "denomination_summary", as this is no longer exactly about denominations!
|
||||
dret = adb->get_denomination_summary (adb->cls,
|
||||
asession,
|
||||
&master_pub,
|
||||
@ -1674,6 +2003,8 @@ analyze_coins (void *cls)
|
||||
&master_pub,
|
||||
&cc.risk);
|
||||
// FIXME: handle error in 'rret'!
|
||||
|
||||
// FIXME: FIX misnomer "denomination_summary", as this is no longer about denominations!
|
||||
if (GNUNET_YES == dret)
|
||||
dret = adb->update_denomination_summary (adb->cls,
|
||||
asession,
|
||||
|
@ -330,15 +330,6 @@ postgres_create_tables (void *cls)
|
||||
",denom_balance_val INT8 NOT NULL"
|
||||
",denom_balance_frac INT4 NOT NULL"
|
||||
",denom_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
|
||||
",deposit_fee_balance_val INT8 NOT NULL"
|
||||
",deposit_fee_balance_frac INT4 NOT NULL"
|
||||
",deposit_fee_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
|
||||
",melt_fee_balance_val INT8 NOT NULL"
|
||||
",melt_fee_balance_frac INT4 NOT NULL"
|
||||
",melt_fee_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
|
||||
",refund_fee_balance_val INT8 NOT NULL"
|
||||
",refund_fee_balance_frac INT4 NOT NULL"
|
||||
",refund_fee_balance_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
|
||||
",last_reserve_out_serial_id INT8 NOT NULL"
|
||||
",last_deposit_serial_id INT8 NOT NULL"
|
||||
",last_melt_serial_id INT8 NOT NULL"
|
||||
@ -703,21 +694,12 @@ postgres_prepare (PGconn *db_conn)
|
||||
",denom_balance_val"
|
||||
",denom_balance_frac"
|
||||
",denom_balance_curr"
|
||||
",deposit_fee_balance_val"
|
||||
",deposit_fee_balance_frac"
|
||||
",deposit_fee_balance_curr"
|
||||
",melt_fee_balance_val"
|
||||
",melt_fee_balance_frac"
|
||||
",melt_fee_balance_curr"
|
||||
",refund_fee_balance_val"
|
||||
",refund_fee_balance_frac"
|
||||
",refund_fee_balance_curr"
|
||||
",last_reserve_out_serial_id"
|
||||
",last_deposit_serial_id"
|
||||
",last_melt_serial_id"
|
||||
",last_refund_serial_id"
|
||||
") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17);",
|
||||
17, NULL);
|
||||
") VALUES ($1,$2,$3,$4,$5,$6,$7,$8);",
|
||||
11, NULL);
|
||||
|
||||
/* Used in #postgres_update_denomination_balance() */
|
||||
PREPARE ("denomination_pending_update",
|
||||
@ -725,21 +707,12 @@ postgres_prepare (PGconn *db_conn)
|
||||
" denom_balance_val=$1"
|
||||
",denom_balance_frac=$2"
|
||||
",denom_balance_curr=$3"
|
||||
",deposit_fee_balance_val=$4"
|
||||
",deposit_fee_balance_frac=$5"
|
||||
",deposit_fee_balance_curr=$6"
|
||||
",melt_fee_balance_val=$7"
|
||||
",melt_fee_balance_frac=$8"
|
||||
",melt_fee_balance_curr=$9"
|
||||
",refund_fee_balance_val=$10"
|
||||
",refund_fee_balance_frac=$11"
|
||||
",refund_fee_balance_curr=$12"
|
||||
",last_reserve_out_serial_id=$13"
|
||||
",last_deposit_serial_id=$14"
|
||||
",last_melt_serial_id=$15"
|
||||
",last_refund_serial_id=$16"
|
||||
" WHERE denom_pub_hash=$17",
|
||||
18, NULL);
|
||||
",last_reserve_out_serial_id=$4"
|
||||
",last_deposit_serial_id=$5"
|
||||
",last_melt_serial_id=$6"
|
||||
",last_refund_serial_id=$7"
|
||||
" WHERE denom_pub_hash=$8",
|
||||
8, NULL);
|
||||
|
||||
/* Used in #postgres_get_denomination_balance() */
|
||||
PREPARE ("denomination_pending_select",
|
||||
@ -747,15 +720,6 @@ postgres_prepare (PGconn *db_conn)
|
||||
" denom_balance_val"
|
||||
",denom_balance_frac"
|
||||
",denom_balance_curr"
|
||||
",deposit_fee_balance_val"
|
||||
",deposit_fee_balance_frac"
|
||||
",deposit_fee_balance_curr"
|
||||
",melt_fee_balance_val"
|
||||
",melt_fee_balance_frac"
|
||||
",melt_fee_balance_curr"
|
||||
",refund_fee_balance_val"
|
||||
",refund_fee_balance_frac"
|
||||
",refund_fee_balance_curr"
|
||||
",last_reserve_out_serial_id"
|
||||
",last_deposit_serial_id"
|
||||
",last_melt_serial_id"
|
||||
@ -1895,9 +1859,6 @@ postgres_get_reserve_summary (void *cls,
|
||||
* @param session connection to use
|
||||
* @param denom_pub_hash hash of the denomination public key
|
||||
* @param denom_balance value of coins outstanding with this denomination key
|
||||
* @param deposit_fee_balance total deposit fees collected for this DK
|
||||
* @param melt_fee_balance total melt fees collected for this DK
|
||||
* @param refund_fee_balance total refund fees collected for this DK
|
||||
* @param last_reserve_out_serial_id up to which point did we consider
|
||||
* withdrawals for the above information
|
||||
* @param last_deposit_serial_id up to which point did we consider
|
||||
@ -1913,9 +1874,6 @@ postgres_insert_denomination_balance (void *cls,
|
||||
struct TALER_AUDITORDB_Session *session,
|
||||
const struct GNUNET_HashCode *denom_pub_hash,
|
||||
const struct TALER_Amount *denom_balance,
|
||||
const struct TALER_Amount *deposit_fee_balance,
|
||||
const struct TALER_Amount *melt_fee_balance,
|
||||
const struct TALER_Amount *refund_fee_balance,
|
||||
uint64_t last_reserve_out_serial_id,
|
||||
uint64_t last_deposit_serial_id,
|
||||
uint64_t last_melt_serial_id,
|
||||
@ -1926,9 +1884,6 @@ postgres_insert_denomination_balance (void *cls,
|
||||
struct GNUNET_PQ_QueryParam params[] = {
|
||||
GNUNET_PQ_query_param_auto_from_type (denom_pub_hash),
|
||||
TALER_PQ_query_param_amount (denom_balance),
|
||||
TALER_PQ_query_param_amount (deposit_fee_balance),
|
||||
TALER_PQ_query_param_amount (melt_fee_balance),
|
||||
TALER_PQ_query_param_amount (refund_fee_balance),
|
||||
GNUNET_PQ_query_param_uint64 (&last_reserve_out_serial_id),
|
||||
GNUNET_PQ_query_param_uint64 (&last_deposit_serial_id),
|
||||
GNUNET_PQ_query_param_uint64 (&last_melt_serial_id),
|
||||
@ -1936,18 +1891,6 @@ postgres_insert_denomination_balance (void *cls,
|
||||
GNUNET_PQ_query_param_end
|
||||
};
|
||||
|
||||
GNUNET_assert (GNUNET_YES ==
|
||||
TALER_amount_cmp_currency (denom_balance,
|
||||
deposit_fee_balance));
|
||||
|
||||
GNUNET_assert (GNUNET_YES ==
|
||||
TALER_amount_cmp_currency (denom_balance,
|
||||
melt_fee_balance));
|
||||
|
||||
GNUNET_assert (GNUNET_YES ==
|
||||
TALER_amount_cmp_currency (denom_balance,
|
||||
refund_fee_balance));
|
||||
|
||||
result = GNUNET_PQ_exec_prepared (session->conn,
|
||||
"denomination_pending_insert",
|
||||
params);
|
||||
@ -1973,9 +1916,6 @@ postgres_insert_denomination_balance (void *cls,
|
||||
* @param session connection to use
|
||||
* @param denom_pub_hash hash of the denomination public key
|
||||
* @param denom_balance value of coins outstanding with this denomination key
|
||||
* @param deposit_fee_balance total deposit fees collected for this DK
|
||||
* @param melt_fee_balance total melt fees collected for this DK
|
||||
* @param refund_fee_balance total refund fees collected for this DK
|
||||
* @param last_reserve_out_serial_id up to which point did we consider
|
||||
* withdrawals for the above information
|
||||
* @param last_deposit_serial_id up to which point did we consider
|
||||
@ -1991,9 +1931,6 @@ postgres_update_denomination_balance (void *cls,
|
||||
struct TALER_AUDITORDB_Session *session,
|
||||
const struct GNUNET_HashCode *denom_pub_hash,
|
||||
const struct TALER_Amount *denom_balance,
|
||||
const struct TALER_Amount *deposit_fee_balance,
|
||||
const struct TALER_Amount *melt_fee_balance,
|
||||
const struct TALER_Amount *refund_fee_balance,
|
||||
uint64_t last_reserve_out_serial_id,
|
||||
uint64_t last_deposit_serial_id,
|
||||
uint64_t last_melt_serial_id,
|
||||
@ -2003,9 +1940,6 @@ postgres_update_denomination_balance (void *cls,
|
||||
int ret;
|
||||
struct GNUNET_PQ_QueryParam params[] = {
|
||||
TALER_PQ_query_param_amount (denom_balance),
|
||||
TALER_PQ_query_param_amount (deposit_fee_balance),
|
||||
TALER_PQ_query_param_amount (melt_fee_balance),
|
||||
TALER_PQ_query_param_amount (refund_fee_balance),
|
||||
GNUNET_PQ_query_param_uint64 (&last_reserve_out_serial_id),
|
||||
GNUNET_PQ_query_param_uint64 (&last_deposit_serial_id),
|
||||
GNUNET_PQ_query_param_uint64 (&last_melt_serial_id),
|
||||
@ -2038,9 +1972,6 @@ postgres_update_denomination_balance (void *cls,
|
||||
* @param session connection to use
|
||||
* @param denom_pub_hash hash of the denomination public key
|
||||
* @param[out] denom_balance value of coins outstanding with this denomination key
|
||||
* @param[out] deposit_fee_balance total deposit fees collected for this DK
|
||||
* @param[out] melt_fee_balance total melt fees collected for this DK
|
||||
* @param[out] refund_fee_balance total refund fees collected for this DK
|
||||
* @param[out] last_reserve_out_serial_id up to which point did we consider
|
||||
* withdrawals for the above information
|
||||
* @param[out] last_deposit_serial_id up to which point did we consider
|
||||
@ -2056,9 +1987,6 @@ postgres_get_denomination_balance (void *cls,
|
||||
struct TALER_AUDITORDB_Session *session,
|
||||
const struct GNUNET_HashCode *denom_pub_hash,
|
||||
struct TALER_Amount *denom_balance,
|
||||
struct TALER_Amount *deposit_fee_balance,
|
||||
struct TALER_Amount *melt_fee_balance,
|
||||
struct TALER_Amount *refund_fee_balance,
|
||||
uint64_t *last_reserve_out_serial_id,
|
||||
uint64_t *last_deposit_serial_id,
|
||||
uint64_t *last_melt_serial_id,
|
||||
@ -2093,10 +2021,6 @@ postgres_get_denomination_balance (void *cls,
|
||||
|
||||
struct GNUNET_PQ_ResultSpec rs[] = {
|
||||
TALER_PQ_result_spec_amount ("denom_balance", denom_balance),
|
||||
TALER_PQ_result_spec_amount ("deposit_fee_balance", deposit_fee_balance),
|
||||
TALER_PQ_result_spec_amount ("melt_fee_balance", melt_fee_balance),
|
||||
TALER_PQ_result_spec_amount ("refund_fee_balance", refund_fee_balance),
|
||||
|
||||
GNUNET_PQ_result_spec_uint64 ("last_reserve_out_serial_id", last_reserve_out_serial_id),
|
||||
GNUNET_PQ_result_spec_uint64 ("last_deposit_serial_id", last_deposit_serial_id),
|
||||
GNUNET_PQ_result_spec_uint64 ("last_melt_serial_id", last_melt_serial_id),
|
||||
|
@ -523,9 +523,6 @@ struct TALER_AUDITORDB_Plugin
|
||||
* @param session connection to use
|
||||
* @param denom_pub_hash hash of the denomination public key
|
||||
* @param denom_balance value of coins outstanding (or issued?) with this denomination key
|
||||
* @param deposit_fee_balance total deposit fees collected for this DK
|
||||
* @param melt_fee_balance total melt fees collected for this DK
|
||||
* @param refund_fee_balance total refund fees collected for this DK
|
||||
* @param last_reserve_out_serial_id up to which point did we consider
|
||||
* withdrawals for the above information
|
||||
* @param last_deposit_serial_id up to which point did we consider
|
||||
@ -541,9 +538,6 @@ struct TALER_AUDITORDB_Plugin
|
||||
struct TALER_AUDITORDB_Session *session,
|
||||
const struct GNUNET_HashCode *denom_pub_hash,
|
||||
const struct TALER_Amount *denom_balance,
|
||||
const struct TALER_Amount *deposit_fee_balance,
|
||||
const struct TALER_Amount *melt_fee_balance,
|
||||
const struct TALER_Amount *refund_fee_balance,
|
||||
uint64_t last_reserve_out_serial_id,
|
||||
uint64_t last_deposit_serial_id,
|
||||
uint64_t last_melt_serial_id,
|
||||
@ -558,9 +552,6 @@ struct TALER_AUDITORDB_Plugin
|
||||
* @param session connection to use
|
||||
* @param denom_pub_hash hash of the denomination public key
|
||||
* @param denom_balance value of coins outstanding (or issued?) with this denomination key
|
||||
* @param deposit_fee_balance total deposit fees collected for this DK
|
||||
* @param melt_fee_balance total melt fees collected for this DK
|
||||
* @param refund_fee_balance total refund fees collected for this DK
|
||||
* @param last_reserve_out_serial_id up to which point did we consider
|
||||
* withdrawals for the above information
|
||||
* @param last_deposit_serial_id up to which point did we consider
|
||||
@ -576,9 +567,6 @@ struct TALER_AUDITORDB_Plugin
|
||||
struct TALER_AUDITORDB_Session *session,
|
||||
const struct GNUNET_HashCode *denom_pub_hash,
|
||||
const struct TALER_Amount *denom_balance,
|
||||
const struct TALER_Amount *deposit_fee_balance,
|
||||
const struct TALER_Amount *melt_fee_balance,
|
||||
const struct TALER_Amount *refund_fee_balance,
|
||||
uint64_t last_reserve_out_serial_id,
|
||||
uint64_t last_deposit_serial_id,
|
||||
uint64_t last_melt_serial_id,
|
||||
@ -592,9 +580,6 @@ struct TALER_AUDITORDB_Plugin
|
||||
* @param session connection to use
|
||||
* @param denom_pub_hash hash of the denomination public key
|
||||
* @param[out] denom_balance value of coins outstanding (or issued?) with this denomination key
|
||||
* @param[out] deposit_fee_balance total deposit fees collected for this DK
|
||||
* @param[out] melt_fee_balance total melt fees collected for this DK
|
||||
* @param[out] refund_fee_balance total refund fees collected for this DK
|
||||
* @param[out] last_reserve_out_serial_id up to which point did we consider
|
||||
* withdrawals for the above information
|
||||
* @param[out] last_deposit_serial_id up to which point did we consider
|
||||
@ -610,9 +595,6 @@ struct TALER_AUDITORDB_Plugin
|
||||
struct TALER_AUDITORDB_Session *session,
|
||||
const struct GNUNET_HashCode *denom_pub_hash,
|
||||
struct TALER_Amount *denom_balance,
|
||||
struct TALER_Amount *deposit_fee_balance,
|
||||
struct TALER_Amount *melt_fee_balance,
|
||||
struct TALER_Amount *refund_fee_balance,
|
||||
uint64_t *last_reserve_out_serial_id,
|
||||
uint64_t *last_deposit_serial_id,
|
||||
uint64_t *last_melt_serial_id,
|
||||
|
Loading…
Reference in New Issue
Block a user