diff options
Diffstat (limited to 'packages/taler-wallet-core/src/operations')
4 files changed, 64 insertions, 35 deletions
diff --git a/packages/taler-wallet-core/src/operations/backup/export.ts b/packages/taler-wallet-core/src/operations/backup/export.ts index 3ba0d85e6..30e61e382 100644 --- a/packages/taler-wallet-core/src/operations/backup/export.ts +++ b/packages/taler-wallet-core/src/operations/backup/export.ts @@ -298,7 +298,6 @@ export async function exportBackup( currency: dp.currency, master_public_key: dp.masterPublicKey, update_clock: dp.updateClock, - protocol_version_range: dp.protocolVersionRange, }); }); @@ -358,8 +357,8 @@ export async function exportBackup( purseTimeout: x.purseTimeout, startDate: x.startDate, })), - tos_accepted_etag: ex.termsOfServiceAcceptedEtag, - tos_accepted_timestamp: ex.termsOfServiceAcceptedTimestamp, + tos_accepted_etag: ex.tosAccepted?.etag, + tos_accepted_timestamp: ex.tosAccepted?.timestamp, denominations: backupDenominationsByExchange[ex.exchangeBaseUrl] ?? [], }); diff --git a/packages/taler-wallet-core/src/operations/backup/import.ts b/packages/taler-wallet-core/src/operations/backup/import.ts index 59fd3c398..599b02dea 100644 --- a/packages/taler-wallet-core/src/operations/backup/import.ts +++ b/packages/taler-wallet-core/src/operations/backup/import.ts @@ -351,7 +351,6 @@ export async function importBackup( currency: backupExchange.currency, masterPublicKey: backupExchange.master_public_key, updateClock: backupExchange.update_clock, - protocolVersionRange: backupExchange.protocol_version_range, }, permanent: true, lastUpdate: undefined, @@ -388,14 +387,18 @@ export async function importBackup( wadFee: Amounts.parseOrThrow(fee.wad_fee), }); } + let tosAccepted = undefined; + if ( + backupExchangeDetails.tos_accepted_etag && + backupExchangeDetails.tos_accepted_timestamp + ) { + tosAccepted = { + etag: backupExchangeDetails.tos_accepted_etag, + timestamp: backupExchangeDetails.tos_accepted_timestamp, + }; + } await tx.exchangeDetails.put({ exchangeBaseUrl: backupExchangeDetails.base_url, - termsOfServiceAcceptedEtag: backupExchangeDetails.tos_accepted_etag, - termsOfServiceText: undefined, - termsOfServiceLastEtag: undefined, - termsOfServiceContentType: undefined, - termsOfServiceAcceptedTimestamp: - backupExchangeDetails.tos_accepted_timestamp, wireInfo, currency: backupExchangeDetails.currency, auditors: backupExchangeDetails.auditors.map((x) => ({ @@ -406,6 +409,8 @@ export async function importBackup( masterPublicKey: backupExchangeDetails.master_public_key, protocolVersionRange: backupExchangeDetails.protocol_version, reserveClosingDelay: backupExchangeDetails.reserve_closing_delay, + tosCurrentEtag: backupExchangeDetails.tos_accepted_etag || "", + tosAccepted, globalFees: backupExchangeDetails.global_fees.map((x) => ({ accountFee: Amounts.parseOrThrow(x.accountFee), historyFee: Amounts.parseOrThrow(x.historyFee), @@ -419,7 +424,6 @@ export async function importBackup( purseTimeout: x.purseTimeout, startDate: x.startDate, })), - signingKeys: backupExchangeDetails.signing_keys.map((x) => ({ key: x.key, master_sig: x.master_sig, diff --git a/packages/taler-wallet-core/src/operations/exchanges.ts b/packages/taler-wallet-core/src/operations/exchanges.ts index d3905b74b..6569cb394 100644 --- a/packages/taler-wallet-core/src/operations/exchanges.ts +++ b/packages/taler-wallet-core/src/operations/exchanges.ts @@ -174,24 +174,40 @@ export async function getExchangeDetails( getExchangeDetails.makeContext = (db: DbAccess<typeof WalletStoresV1>) => db.mktx((x) => [x.exchanges, x.exchangeDetails]); +/** + * Update the database based on the download of the terms of service. + */ export async function updateExchangeTermsOfService( ws: InternalWalletState, exchangeBaseUrl: string, tos: ExchangeTosDownloadResult, ): Promise<void> { await ws.db - .mktx((x) => [x.exchanges, x.exchangeDetails]) + .mktx((x) => [x.exchanges, x.exchangeTos, x.exchangeDetails]) .runReadWrite(async (tx) => { const d = await getExchangeDetails(tx, exchangeBaseUrl); + let tosRecord = await tx.exchangeTos.get([exchangeBaseUrl, tos.tosEtag]); + if (!tosRecord) { + tosRecord = { + etag: tos.tosEtag, + exchangeBaseUrl, + termsOfServiceContentType: tos.tosContentType, + termsOfServiceText: tos.tosText, + }; + await tx.exchangeTos.put(tosRecord); + } if (d) { - d.termsOfServiceText = tos.tosText; - d.termsOfServiceContentType = tos.tosContentType; - d.termsOfServiceLastEtag = tos.tosEtag; + d.tosCurrentEtag = tos.tosEtag; await tx.exchangeDetails.put(d); } }); } +/** + * Mark a ToS version as accepted by the user. + * + * @param etag version of the ToS to accept, or current ToS version of not given + */ export async function acceptExchangeTermsOfService( ws: InternalWalletState, exchangeBaseUrl: string, @@ -202,7 +218,10 @@ export async function acceptExchangeTermsOfService( .runReadWrite(async (tx) => { const d = await getExchangeDetails(tx, exchangeBaseUrl); if (d) { - d.termsOfServiceAcceptedEtag = etag; + d.tosAccepted = { + etag: etag || d.tosCurrentEtag, + timestamp: TalerProtocolTimestamp.now(), + }; await tx.exchangeDetails.put(d); } }); @@ -611,7 +630,8 @@ export async function updateExchangeFromUrlHandler( ["text/plain"], ); const tosHasBeenAccepted = - exchangeDetails?.termsOfServiceAcceptedEtag === tosDownload.tosEtag; + exchangeDetails?.tosAccepted && + exchangeDetails.tosAccepted.etag === tosDownload.tosEtag; let recoupGroupId: string | undefined; @@ -647,13 +667,13 @@ export async function updateExchangeFromUrlHandler( globalFees, exchangeBaseUrl: r.baseUrl, wireInfo, - termsOfServiceText: tosDownload.tosText, - termsOfServiceAcceptedEtag: tosHasBeenAccepted - ? tosDownload.tosEtag + tosCurrentEtag: tosDownload.tosContentType, + tosAccepted: tosHasBeenAccepted + ? { + etag: tosDownload.tosEtag, + timestamp: TalerProtocolTimestamp.now(), + } : undefined, - termsOfServiceContentType: tosDownload.tosContentType, - termsOfServiceLastEtag: tosDownload.tosEtag, - termsOfServiceAcceptedTimestamp: TalerProtocolTimestamp.now(), }; // FIXME: only update if pointer got updated r.lastUpdate = TalerProtocolTimestamp.now(); @@ -665,7 +685,6 @@ export async function updateExchangeFromUrlHandler( masterPublicKey: details.masterPublicKey, // FIXME: only change if pointer really changed updateClock: TalerProtocolTimestamp.now(), - protocolVersionRange: keysInfo.protocolVersion, }; await tx.exchanges.put(r); await tx.exchangeDetails.put(details); diff --git a/packages/taler-wallet-core/src/operations/withdraw.ts b/packages/taler-wallet-core/src/operations/withdraw.ts index 145a2d9c7..700c4620c 100644 --- a/packages/taler-wallet-core/src/operations/withdraw.ts +++ b/packages/taler-wallet-core/src/operations/withdraw.ts @@ -69,6 +69,7 @@ import { CoinStatus, DenominationRecord, DenominationVerificationStatus, + ExchangeTosRecord, PlanchetRecord, PlanchetStatus, WalletStoresV1, @@ -1278,12 +1279,8 @@ export async function getExchangeWithdrawalInfo( } let tosAccepted = false; - - if (exchangeDetails.termsOfServiceLastEtag) { - if ( - exchangeDetails.termsOfServiceAcceptedEtag === - exchangeDetails.termsOfServiceLastEtag - ) { + if (exchangeDetails.tosAccepted?.timestamp) { + if (exchangeDetails.tosAccepted.etag === exchangeDetails.tosCurrentEtag) { tosAccepted = true; } } @@ -1357,7 +1354,12 @@ export async function getWithdrawalDetailsForUri( const exchanges: ExchangeListItem[] = []; await ws.db - .mktx((x) => [x.exchanges, x.exchangeDetails, x.denominations]) + .mktx((x) => [ + x.exchanges, + x.exchangeDetails, + x.exchangeTos, + x.denominations, + ]) .runReadOnly(async (tx) => { const exchangeRecords = await tx.exchanges.iter().toArray(); for (const r of exchangeRecords) { @@ -1366,14 +1368,19 @@ export async function getWithdrawalDetailsForUri( .iter(r.baseUrl) .toArray(); if (details && denominations) { + const tosRecord = await tx.exchangeTos.get([ + details.exchangeBaseUrl, + details.tosCurrentEtag, + ]); exchanges.push({ exchangeBaseUrl: details.exchangeBaseUrl, currency: details.currency, + // FIXME: We probably don't want to include the full ToS here! tos: { - acceptedVersion: details.termsOfServiceAcceptedEtag, - currentVersion: details.termsOfServiceLastEtag, - contentType: details.termsOfServiceContentType, - content: details.termsOfServiceText, + acceptedVersion: details.tosAccepted?.etag, + currentVersion: details.tosCurrentEtag, + contentType: tosRecord?.termsOfServiceContentType ?? "", + content: tosRecord?.termsOfServiceText ?? "", }, paytoUris: details.wireInfo.accounts.map((x) => x.payto_uri), }); |