diff options
author | Florian Dold <florian@dold.me> | 2021-08-23 22:28:36 +0200 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2021-08-23 22:28:46 +0200 |
commit | 828e65b0eba66b7c999d9867396797a239449a6d (patch) | |
tree | 2dcb55dfb5c9854c196fc21d0d5282928de12ff6 /packages/taler-wallet-core/src/operations/exchanges.ts | |
parent | 67e511d719cbc3e7f2b391a8d6914406caa2fb24 (diff) | |
download | wallet-core-828e65b0eba66b7c999d9867396797a239449a6d.tar.xz |
fix un-offered denom situation, test case almost works
Diffstat (limited to 'packages/taler-wallet-core/src/operations/exchanges.ts')
-rw-r--r-- | packages/taler-wallet-core/src/operations/exchanges.ts | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/packages/taler-wallet-core/src/operations/exchanges.ts b/packages/taler-wallet-core/src/operations/exchanges.ts index 0670c8a61..23459de92 100644 --- a/packages/taler-wallet-core/src/operations/exchanges.ts +++ b/packages/taler-wallet-core/src/operations/exchanges.ts @@ -153,6 +153,9 @@ async function downloadExchangeWithTermsOfService( return { tosText, tosEtag }; } +/** + * Get exchange details from the database. + */ export async function getExchangeDetails( tx: GetReadOnlyAccess<{ exchanges: typeof WalletStoresV1.exchanges; @@ -320,6 +323,7 @@ interface ExchangeKeysDownloadResult { reserveClosingDelay: Duration; expiry: Timestamp; recoup: Recoup[]; + listIssueDate: Timestamp; } /** @@ -392,6 +396,7 @@ async function downloadKeysInfo( minDuration: durationFromSpec({ hours: 1 }), }), recoup: exchangeKeysJson.recoup ?? [], + listIssueDate: exchangeKeysJson.list_issue_date, }; } @@ -508,9 +513,9 @@ async function updateExchangeFromUrlImpl( r.lastError = undefined; r.retryInfo = initRetryInfo(); r.lastUpdate = getTimestampNow(); - (r.nextUpdate = keysInfo.expiry), - // New denominations might be available. - (r.nextRefreshCheck = getTimestampNow()); + r.nextUpdate = keysInfo.expiry; + // New denominations might be available. + r.nextRefreshCheck = getTimestampNow(); r.detailsPointer = { currency: details.currency, masterPublicKey: details.masterPublicKey, @@ -521,17 +526,47 @@ async function updateExchangeFromUrlImpl( await tx.exchangeDetails.put(details); logger.trace("updating denominations in database"); + const currentDenomSet = new Set<string>( + keysInfo.currentDenominations.map((x) => x.denomPubHash), + ); for (const currentDenom of keysInfo.currentDenominations) { const oldDenom = await tx.denominations.get([ baseUrl, currentDenom.denomPubHash, ]); if (oldDenom) { - // FIXME: Do consistency check + // FIXME: Do consistency check, report to auditor if necessary. } else { await tx.denominations.put(currentDenom); } } + + // Update list issue date for all denominations, + // and mark non-offered denominations as such. + await tx.denominations.indexes.byExchangeBaseUrl + .iter(r.baseUrl) + .forEachAsync(async (x) => { + if (!currentDenomSet.has(x.denomPubHash)) { + // FIXME: Here, an auditor report should be created, unless + // the denomination is really legally expired. + if (x.isOffered) { + x.isOffered = false; + logger.info( + `setting denomination ${x.denomPubHash} to offered=false`, + ); + } + } else { + x.listIssueDate = keysInfo.listIssueDate; + if (!x.isOffered) { + x.isOffered = true; + logger.info( + `setting denomination ${x.denomPubHash} to offered=true`, + ); + } + } + await tx.denominations.put(x); + }); + logger.trace("done updating denominations in database"); // Handle recoup |