aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/operations
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2022-10-14 22:10:03 +0200
committerFlorian Dold <florian@dold.me>2022-10-14 22:10:10 +0200
commita57fcb144d8de40fe50b825d34a27e415ef3fec3 (patch)
tree1883a8eefb9f7914d661a854c0098154cb5cd215 /packages/taler-wallet-core/src/operations
parentf1cba79c656875af0c6a09fd8e03b2c94fb2ac44 (diff)
downloadwallet-core-a57fcb144d8de40fe50b825d34a27e415ef3fec3.tar.xz
wallet-core: pull out ToS into separate object store
Diffstat (limited to 'packages/taler-wallet-core/src/operations')
-rw-r--r--packages/taler-wallet-core/src/operations/backup/export.ts5
-rw-r--r--packages/taler-wallet-core/src/operations/backup/import.ts20
-rw-r--r--packages/taler-wallet-core/src/operations/exchanges.ts45
-rw-r--r--packages/taler-wallet-core/src/operations/withdraw.ts29
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),
});