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