taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 913e57f6327511bc01256bbdf8ab8ca953d28ad0
parent 153db5d657912f2124c89cb56ad3bbf0414f1137
Author: Florian Dold <florian@dold.me>
Date:   Wed,  5 Mar 2025 00:46:40 +0100

wallet-core: do not warn about unverified signatures on lost/future/expired denominations

Diffstat:
Mpackages/taler-wallet-core/src/denominations.ts | 54+++++++++++++++++++++++++++++++++---------------------
1 file changed, 33 insertions(+), 21 deletions(-)

diff --git a/packages/taler-wallet-core/src/denominations.ts b/packages/taler-wallet-core/src/denominations.ts @@ -470,35 +470,29 @@ export function isWithdrawableDenom( d: DenominationRecord, denomselAllowLate?: boolean, ): boolean { + if (d.isLost) { + logger.trace( + `Skipping lost denomination ${d.denomPubHash} of ${d.exchangeBaseUrl}`, + ); + return false; + } const now = AbsoluteTime.now(); const start = AbsoluteTime.fromProtocolTimestamp( timestampProtocolFromDb(d.stampStart), ); const started = AbsoluteTime.cmp(now, start) >= 0; - switch (d.verificationStatus) { - case DenominationVerificationStatus.Unverified: - // If this happens, either we delayed signature validation - // for denominations very far into the future (good) or forgot - // to validate (bad). - if (started) { - logger.error( - `Skipping unverified denomination ${d.denomPubHash} of ${d.exchangeBaseUrl}`, - ); - } - return false; - case DenominationVerificationStatus.VerifiedBad: - return false; - case DenominationVerificationStatus.VerifiedGood: - break; - default: - assertUnreachable(d.verificationStatus); + if (!started) { + // Withdrawal only starts in the future. + return false; } const withdrawExpire = AbsoluteTime.fromProtocolTimestamp( timestampProtocolFromDb(d.stampExpireWithdraw), ); let lastPossibleWithdraw: AbsoluteTime; if (denomselAllowLate) { - lastPossibleWithdraw = start; + // Required by some tests. + // FIXME: Check which ones! + lastPossibleWithdraw = withdrawExpire; } else { lastPossibleWithdraw = AbsoluteTime.subtractDuraction( withdrawExpire, @@ -506,8 +500,24 @@ export function isWithdrawableDenom( ); } const remaining = Duration.getRemaining(lastPossibleWithdraw, now); - const stillOkay = remaining.d_ms !== 0; - return started && stillOkay && !d.isRevoked && d.isOffered && !d.isLost; + const withdrawalStillOkay = remaining.d_ms !== 0; + if (!withdrawalStillOkay) { + return false; + } + switch (d.verificationStatus) { + case DenominationVerificationStatus.Unverified: + logger.error( + `Skipping unverified denomination ${d.denomPubHash} of ${d.exchangeBaseUrl}`, + ); + return false; + case DenominationVerificationStatus.VerifiedBad: + return false; + case DenominationVerificationStatus.VerifiedGood: + break; + default: + assertUnreachable(d.verificationStatus); + } + return !d.isRevoked && d.isOffered; } /** @@ -540,7 +550,9 @@ export function isCandidateWithdrawableDenom( ); let lastPossibleWithdraw: AbsoluteTime; if (denomselAllowLate) { - lastPossibleWithdraw = start; + // Required by some tests. + // FIXME: Check which ones! + lastPossibleWithdraw = withdrawExpire; } else { lastPossibleWithdraw = AbsoluteTime.subtractDuraction( withdrawExpire,