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:
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,