exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

commit 12ecd39b11add96108abc759c7f192d827997cb8
parent 3db03d0e5d8e91e0122843d4e55c02e0f4764d03
Author: Christian Grothoff <christian@grothoff.org>
Date:   Fri,  9 Oct 2026 22:08:49 +0200

check for emergency even for expired denominations

Diffstat:
Msrc/auditor/taler-helper-auditor-coins.c | 86++++++++++++++++++++++++++++++++++++++++++-------------------------------------
1 file changed, 46 insertions(+), 40 deletions(-)

diff --git a/src/auditor/taler-helper-auditor-coins.c b/src/auditor/taler-helper-auditor-coins.c @@ -852,6 +852,52 @@ sync_denomination (void *cls, /* add day grace period to deal with clocks not being perfectly synchronized */ expire_deposit_grace = GNUNET_TIME_absolute_add (expire_deposit.abs_time, DEPOSIT_GRACE_PERIOD); + /* Check for emergencies first: this must happen regardless of whether the + denomination has expired in the meantime, as a denomination that was + over-issued or over-spent still signals a key compromise (and rows are + routinely first analyzed after the deposit expiration). */ + { + long long cnt; + + cnt = TALER_EXCHANGEDB_get_count_known_coins (TALER_ARL_edb, + &denom_h); + if (0 > cnt) + { + /* Failed to obtain count? Bad database */ + qs = (enum GNUNET_DB_QueryStatus) cnt; + GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); + cc->qs = qs; + return GNUNET_SYSERR; + } + if (ds->dcd.num_issued < (uint64_t) cnt) + { + /* more coins deposited than issued! very bad */ + qs = report_emergency_by_count (issue, + ds->dcd.num_issued, + cnt, + &ds->dcd.denom_risk); + if (qs < 0) + { + GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); + cc->qs = qs; + return GNUNET_SYSERR; + } + } + if (ds->report_emergency) + { + /* Value of coins deposited exceed value of coins + issued! Also very bad! */ + qs = report_emergency_by_amount (issue, + &ds->dcd.denom_risk, + &ds->dcd.denom_loss); + if (qs < 0) + { + GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); + cc->qs = qs; + return GNUNET_SYSERR; + } + } + } if (GNUNET_TIME_absolute_cmp (now, >, expire_deposit_grace)) @@ -911,51 +957,11 @@ sync_denomination (void *cls, { /* Not expired, just store current denomination summary to auditor database for next iteration */ - long long cnt; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Final balance for denomination `%s' is %s (%llu)\n", GNUNET_h2s (denom_hash), TALER_amount2s (&ds->dcd.denom_balance), (unsigned long long) ds->dcd.num_issued); - cnt = TALER_EXCHANGEDB_get_count_known_coins (TALER_ARL_edb, - &denom_h); - if (0 > cnt) - { - /* Failed to obtain count? Bad database */ - qs = (enum GNUNET_DB_QueryStatus) cnt; - GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); - cc->qs = qs; - return GNUNET_SYSERR; - } - if (ds->dcd.num_issued < (uint64_t) cnt) - { - /* more coins deposited than issued! very bad */ - qs = report_emergency_by_count (issue, - ds->dcd.num_issued, - cnt, - &ds->dcd.denom_risk); - if (qs < 0) - { - GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); - cc->qs = qs; - return GNUNET_SYSERR; - } - } - if (ds->report_emergency) - { - /* Value of coins deposited exceed value of coins - issued! Also very bad! */ - qs = report_emergency_by_amount (issue, - &ds->dcd.denom_risk, - &ds->dcd.denom_loss); - if (qs < 0) - { - GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); - cc->qs = qs; - return GNUNET_SYSERR; - } - } if (ds->in_db) qs = TALER_AUDITORDB_update_denomination_balance (TALER_ARL_adb, &denom_h,