diff options
author | Florian Dold <florian@dold.me> | 2024-03-27 15:56:42 +0100 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2024-03-27 15:56:42 +0100 |
commit | dac6a052b508cfd208cbf4aa7cb5efc44d85c82a (patch) | |
tree | 0eb87ee044eb11490e056adb9db9fe026d7d7167 | |
parent | 838cedcdd0de4835fbd8c302bb2350e7a4bdce6a (diff) |
wallet-core: fix taler://withdraw-exchange pub key check
-rw-r--r-- | packages/taler-wallet-core/src/db.ts | 2 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/observable-wrappers.ts | 16 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/query.ts | 12 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/shepherd.ts | 5 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/wallet.ts | 10 |
5 files changed, 32 insertions, 13 deletions
diff --git a/packages/taler-wallet-core/src/db.ts b/packages/taler-wallet-core/src/db.ts index 1d5ff4e7a..aad3b2d7b 100644 --- a/packages/taler-wallet-core/src/db.ts +++ b/packages/taler-wallet-core/src/db.ts @@ -2999,7 +2999,7 @@ export async function applyFixups( db: DbAccess<typeof WalletStoresV1>, ): Promise<void> { logger.trace("applying fixups"); - await db.runAllStoresReadWriteTx(async (tx) => { + await db.runAllStoresReadWriteTx({}, async (tx) => { for (const fixupInstruction of walletDbFixups) { logger.trace(`checking fixup ${fixupInstruction.name}`); const fixupRecord = await tx.fixups.get(fixupInstruction.name); diff --git a/packages/taler-wallet-core/src/observable-wrappers.ts b/packages/taler-wallet-core/src/observable-wrappers.ts index 5a8be9cf6..b36f41611 100644 --- a/packages/taler-wallet-core/src/observable-wrappers.ts +++ b/packages/taler-wallet-core/src/observable-wrappers.ts @@ -25,7 +25,7 @@ import { IDBDatabase } from "@gnu-taler/idb-bridge"; import { ObservabilityContext, ObservabilityEventType, - RetryLoopOpts + RetryLoopOpts, } from "@gnu-taler/taler-util"; import { TaskIdStr } from "./common.js"; import { TalerCryptoInterface } from "./index.js"; @@ -44,7 +44,7 @@ export class ObservableTaskScheduler implements TaskScheduler { constructor( private impl: TaskScheduler, private oc: ObservabilityContext, - ) { } + ) {} private taskDepCache = new Set<string>(); @@ -122,12 +122,15 @@ export class ObservableDbAccess<StoreMap> implements DbAccess<StoreMap> { constructor( private impl: DbAccess<StoreMap>, private oc: ObservabilityContext, - ) { } + ) {} idbHandle(): IDBDatabase { return this.impl.idbHandle(); } async runAllStoresReadWriteTx<T>( + options: { + label?: string; + }, txf: ( tx: DbReadWriteTransaction<StoreMap, StoreNames<StoreMap>[]>, ) => Promise<T>, @@ -139,7 +142,7 @@ export class ObservableDbAccess<StoreMap> implements DbAccess<StoreMap> { location, }); try { - const ret = await this.impl.runAllStoresReadWriteTx(txf); + const ret = await this.impl.runAllStoresReadWriteTx(options, txf); this.oc.observe({ type: ObservabilityEventType.DbQueryFinishSuccess, name: "<unknown>", @@ -157,6 +160,9 @@ export class ObservableDbAccess<StoreMap> implements DbAccess<StoreMap> { } async runAllStoresReadOnlyTx<T>( + options: { + label?: string; + }, txf: ( tx: DbReadOnlyTransaction<StoreMap, StoreNames<StoreMap>[]>, ) => Promise<T>, @@ -168,7 +174,7 @@ export class ObservableDbAccess<StoreMap> implements DbAccess<StoreMap> { location, }); try { - const ret = await this.impl.runAllStoresReadOnlyTx(txf); + const ret = await this.impl.runAllStoresReadOnlyTx(options, txf); this.oc.observe({ type: ObservabilityEventType.DbQueryFinishSuccess, name: "<unknown>", diff --git a/packages/taler-wallet-core/src/query.ts b/packages/taler-wallet-core/src/query.ts index d128805d2..cffad84df 100644 --- a/packages/taler-wallet-core/src/query.ts +++ b/packages/taler-wallet-core/src/query.ts @@ -767,11 +767,17 @@ function makeWriteContext( export interface DbAccess<StoreMap> { idbHandle(): IDBDatabase; runAllStoresReadWriteTx<T>( + options: { + label?: string; + }, txf: ( tx: DbReadWriteTransaction<StoreMap, Array<StoreNames<StoreMap>>>, ) => Promise<T>, ): Promise<T>; runAllStoresReadOnlyTx<T>( + options: { + label?: string; + }, txf: ( tx: DbReadOnlyTransaction<StoreMap, Array<StoreNames<StoreMap>>>, ) => Promise<T>, @@ -802,6 +808,9 @@ export class DbAccessImpl<StoreMap> implements DbAccess<StoreMap> { } runAllStoresReadWriteTx<T>( + options: { + label?: string; + }, txf: ( tx: DbReadWriteTransaction<StoreMap, Array<StoreNames<StoreMap>>>, ) => Promise<T>, @@ -820,6 +829,9 @@ export class DbAccessImpl<StoreMap> implements DbAccess<StoreMap> { } runAllStoresReadOnlyTx<T>( + options: { + label?: string; + }, txf: ( tx: DbReadOnlyTransaction<StoreMap, Array<StoreNames<StoreMap>>>, ) => Promise<T>, diff --git a/packages/taler-wallet-core/src/shepherd.ts b/packages/taler-wallet-core/src/shepherd.ts index a54049d7c..f04bcd2c2 100644 --- a/packages/taler-wallet-core/src/shepherd.ts +++ b/packages/taler-wallet-core/src/shepherd.ts @@ -286,6 +286,7 @@ export class TaskSchedulerImpl implements TaskScheduler { async resetTaskRetries(taskId: TaskIdStr): Promise<void> { const maybeNotification = await this.ws.db.runAllStoresReadWriteTx( + {}, async (tx) => { await tx.operationRetries.delete(taskId); return taskToRetryNotification(this.ws, tx, taskId, undefined); @@ -434,7 +435,7 @@ async function storePendingTaskError( e: TalerErrorDetail, ): Promise<OperationRetryRecord> { logger.info(`storing pending task error for ${pendingTaskId}`); - const res = await ws.db.runAllStoresReadWriteTx(async (tx) => { + const res = await ws.db.runAllStoresReadWriteTx({}, async (tx) => { let retryRecord = await tx.operationRetries.get(pendingTaskId); if (!retryRecord) { retryRecord = { @@ -474,7 +475,7 @@ async function storePendingTaskPending( ws: InternalWalletState, pendingTaskId: string, ): Promise<OperationRetryRecord> { - const res = await ws.db.runAllStoresReadWriteTx(async (tx) => { + const res = await ws.db.runAllStoresReadWriteTx({}, async (tx) => { let retryRecord = await tx.operationRetries.get(pendingTaskId); let hadError = false; if (!retryRecord) { diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts index e973f11e4..c203f6648 100644 --- a/packages/taler-wallet-core/src/wallet.ts +++ b/packages/taler-wallet-core/src/wallet.ts @@ -559,7 +559,7 @@ async function createStoredBackup( const backup = await exportDb(wex.ws.idb); const backupsDb = await openStoredBackupsDatabase(wex.ws.idb); const name = `backup-${new Date().getTime()}`; - await backupsDb.runAllStoresReadWriteTx(async (tx) => { + await backupsDb.runAllStoresReadWriteTx({}, async (tx) => { await tx.backupMeta.add({ name, }); @@ -577,7 +577,7 @@ async function listStoredBackups( storedBackups: [], }; const backupsDb = await openStoredBackupsDatabase(wex.ws.idb); - await backupsDb.runAllStoresReadWriteTx(async (tx) => { + await backupsDb.runAllStoresReadWriteTx({}, async (tx) => { await tx.backupMeta.iter().forEach((x) => { storedBackups.storedBackups.push({ name: x.name, @@ -592,7 +592,7 @@ async function deleteStoredBackup( req: DeleteStoredBackupRequest, ): Promise<void> { const backupsDb = await openStoredBackupsDatabase(wex.ws.idb); - await backupsDb.runAllStoresReadWriteTx(async (tx) => { + await backupsDb.runAllStoresReadWriteTx({}, async (tx) => { await tx.backupData.delete(req.name); await tx.backupMeta.delete(req.name); }); @@ -605,7 +605,7 @@ async function recoverStoredBackup( logger.info(`Recovering stored backup ${req.name}`); const { name } = req; const backupsDb = await openStoredBackupsDatabase(wex.ws.idb); - const bd = await backupsDb.runAllStoresReadWriteTx(async (tx) => { + const bd = await backupsDb.runAllStoresReadWriteTx({}, async (tx) => { const backupMeta = tx.backupMeta.get(name); if (!backupMeta) { throw Error("backup not found"); @@ -631,7 +631,7 @@ async function handlePrepareWithdrawExchange( } const exchangeBaseUrl = parsedUri.exchangeBaseUrl; const exchange = await fetchFreshExchange(wex, exchangeBaseUrl); - if (exchange.masterPub != parsedUri.exchangePub) { + if (parsedUri.exchangePub && exchange.masterPub != parsedUri.exchangePub) { throw Error("mismatch of exchange master public key (URI vs actual)"); } if (parsedUri.amount) { |