diff options
author | Florian Dold <florian@dold.me> | 2024-05-02 14:29:30 +0200 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2024-05-02 14:29:34 +0200 |
commit | 8e1ccefedd48f0076a53a14ecc2e2d5d094b90a9 (patch) | |
tree | 63e586e3ca631d8e6a831401d4ba95718d1f9406 /packages/taler-wallet-core | |
parent | 6bcd1c4537d83d6b83113483f3c872ab40e74074 (diff) | |
download | wallet-core-8e1ccefedd48f0076a53a14ecc2e2d5d094b90a9.tar.xz |
wallet-core: require canonicalized base URLs in requests
Diffstat (limited to 'packages/taler-wallet-core')
-rw-r--r-- | packages/taler-wallet-core/src/backup/index.ts | 3 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/exchanges.ts | 23 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/versions.ts | 2 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/wallet-api-types.ts | 10 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/wallet.ts | 8 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/withdraw.ts | 17 |
6 files changed, 36 insertions, 27 deletions
diff --git a/packages/taler-wallet-core/src/backup/index.ts b/packages/taler-wallet-core/src/backup/index.ts index 16b5488e7..15904b470 100644 --- a/packages/taler-wallet-core/src/backup/index.ts +++ b/packages/taler-wallet-core/src/backup/index.ts @@ -46,7 +46,6 @@ import { buildCodecForUnion, bytesToString, canonicalJson, - canonicalizeBaseUrl, checkDbInvariant, checkLogicInvariant, codecForBoolean, @@ -570,7 +569,7 @@ export async function addBackupProvider( ): Promise<AddBackupProviderResponse> { logger.info(`adding backup provider ${j2s(req)}`); await provideBackupState(wex); - const canonUrl = canonicalizeBaseUrl(req.backupProviderBaseUrl); + const canonUrl = req.backupProviderBaseUrl; await wex.db.runReadWriteTx( { storeNames: ["backupProviders"] }, async (tx) => { diff --git a/packages/taler-wallet-core/src/exchanges.ts b/packages/taler-wallet-core/src/exchanges.ts index d5ca7abbf..9072a4e6e 100644 --- a/packages/taler-wallet-core/src/exchanges.ts +++ b/packages/taler-wallet-core/src/exchanges.ts @@ -78,7 +78,6 @@ import { WireFeesJson, WireInfo, assertUnreachable, - canonicalizeBaseUrl, checkDbInvariant, codecForExchangeKeysJson, durationMul, @@ -914,10 +913,8 @@ async function startUpdateExchangeEntry( exchangeBaseUrl: string, options: { forceUpdate?: boolean } = {}, ): Promise<void> { - const canonBaseUrl = canonicalizeBaseUrl(exchangeBaseUrl); - logger.info( - `starting update of exchange entry ${canonBaseUrl}, forced=${ + `starting update of exchange entry ${exchangeBaseUrl}, forced=${ options.forceUpdate ?? false }`, ); @@ -940,7 +937,7 @@ async function startUpdateExchangeEntry( await wex.db.runReadWriteTx( { storeNames: ["exchanges", "operationRetries"] }, async (tx) => { - const r = await tx.exchanges.get(canonBaseUrl); + const r = await tx.exchanges.get(exchangeBaseUrl); if (!r) { throw Error("exchange not found"); } @@ -988,7 +985,7 @@ async function startUpdateExchangeEntry( ); wex.ws.notify({ type: NotificationType.ExchangeStateTransition, - exchangeBaseUrl: canonBaseUrl, + exchangeBaseUrl, newExchangeState: newExchangeState, oldExchangeState: oldExchangeState, }); @@ -1160,10 +1157,8 @@ export async function fetchFreshExchange( expectedMasterPub?: string; } = {}, ): Promise<ReadyExchangeSummary> { - const canonUrl = canonicalizeBaseUrl(baseUrl); - if (!options.forceUpdate) { - const cachedResp = wex.ws.exchangeCache.get(canonUrl); + const cachedResp = wex.ws.exchangeCache.get(baseUrl); if (cachedResp) { return cachedResp; } @@ -1173,12 +1168,12 @@ export async function fetchFreshExchange( await wex.taskScheduler.ensureRunning(); - await startUpdateExchangeEntry(wex, canonUrl, { + await startUpdateExchangeEntry(wex, baseUrl, { forceUpdate: options.forceUpdate, }); - const resp = await waitReadyExchange(wex, canonUrl, options); - wex.ws.exchangeCache.put(canonUrl, resp); + const resp = await waitReadyExchange(wex, baseUrl, options); + wex.ws.exchangeCache.put(baseUrl, resp); return resp; } @@ -1292,7 +1287,6 @@ export async function updateExchangeFromUrlHandler( exchangeBaseUrl: string, ): Promise<TaskRunResult> { logger.trace(`updating exchange info for ${exchangeBaseUrl}`); - exchangeBaseUrl = canonicalizeBaseUrl(exchangeBaseUrl); const oldExchangeRec = await wex.db.runReadOnlyTx( { storeNames: ["exchanges"] }, @@ -2233,7 +2227,6 @@ export async function markExchangeUsed( tx: WalletDbReadWriteTransaction<["exchanges"]>, exchangeBaseUrl: string, ): Promise<{ notif: WalletNotification | undefined }> { - exchangeBaseUrl = canonicalizeBaseUrl(exchangeBaseUrl); logger.info(`marking exchange ${exchangeBaseUrl} as used`); const exch = await tx.exchanges.get(exchangeBaseUrl); if (!exch) { @@ -2529,7 +2522,7 @@ export async function deleteExchange( req: DeleteExchangeRequest, ): Promise<void> { let inUse: boolean = false; - const exchangeBaseUrl = canonicalizeBaseUrl(req.exchangeBaseUrl); + const exchangeBaseUrl = req.exchangeBaseUrl; await wex.db.runReadWriteTx( { storeNames: [ diff --git a/packages/taler-wallet-core/src/versions.ts b/packages/taler-wallet-core/src/versions.ts index ad58a66ec..d33a23cdd 100644 --- a/packages/taler-wallet-core/src/versions.ts +++ b/packages/taler-wallet-core/src/versions.ts @@ -52,7 +52,7 @@ export const WALLET_BANK_CONVERSION_API_PROTOCOL_VERSION = "2:0:0"; /** * Libtool version of the wallet-core API. */ -export const WALLET_CORE_API_PROTOCOL_VERSION = "4:0:0"; +export const WALLET_CORE_API_PROTOCOL_VERSION = "5:0:0"; /** * Libtool rules: diff --git a/packages/taler-wallet-core/src/wallet-api-types.ts b/packages/taler-wallet-core/src/wallet-api-types.ts index f83db6039..ed882708c 100644 --- a/packages/taler-wallet-core/src/wallet-api-types.ts +++ b/packages/taler-wallet-core/src/wallet-api-types.ts @@ -38,6 +38,8 @@ import { ApplyDevExperimentRequest, BackupRecovery, BalancesResponse, + CanonicalizeBaseUrlRequest, + CanonicalizeBaseUrlResponse, CheckPeerPullCreditRequest, CheckPeerPullCreditResponse, CheckPeerPushDebitRequest, @@ -258,6 +260,7 @@ export enum WalletApiOperation { RemoveGlobalCurrencyAuditor = "removeGlobalCurrencyAuditor", ListAssociatedRefreshes = "listAssociatedRefreshes", Shutdown = "shutdown", + CanonicalizeBaseUrl = "canonicalizeBaseUrl", TestingWaitTransactionsFinal = "testingWaitTransactionsFinal", TestingWaitRefreshesFinal = "testingWaitRefreshesFinal", TestingWaitTransactionState = "testingWaitTransactionState", @@ -958,6 +961,12 @@ export type ValidateIbanOp = { response: ValidateIbanResponse; }; +export type CanonicalizeBaseUrlOp = { + op: WalletApiOperation.CanonicalizeBaseUrl; + request: CanonicalizeBaseUrlRequest; + response: CanonicalizeBaseUrlResponse; +}; + // group: Database Management /** @@ -1319,6 +1328,7 @@ export type WalletOperations = { [WalletApiOperation.Shutdown]: ShutdownOp; [WalletApiOperation.PrepareBankIntegratedWithdrawal]: PrepareBankIntegratedWithdrawalOp; [WalletApiOperation.ConfirmWithdrawal]: ConfirmWithdrawalOp; + [WalletApiOperation.CanonicalizeBaseUrl]: CanonicalizeBaseUrlOp; }; export type WalletCoreRequestType< diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts index fc612b189..ea47ffad7 100644 --- a/packages/taler-wallet-core/src/wallet.ts +++ b/packages/taler-wallet-core/src/wallet.ts @@ -70,6 +70,7 @@ import { WalletCoreVersion, WalletNotification, WalletRunConfig, + canonicalizeBaseUrl, checkDbInvariant, codecForAbortTransaction, codecForAcceptBankIntegratedWithdrawalRequest, @@ -82,6 +83,7 @@ import { codecForAddKnownBankAccounts, codecForAny, codecForApplyDevExperiment, + codecForCanonicalizeBaseUrlRequest, codecForCheckPeerPullPaymentRequest, codecForCheckPeerPushDebitRequest, codecForConfirmPayRequest, @@ -1477,6 +1479,12 @@ async function dispatchRequestInternal( const req = codecForGetExchangeResourcesRequest().decode(payload); return await getExchangeResources(wex, req.exchangeBaseUrl); } + case WalletApiOperation.CanonicalizeBaseUrl: { + const req = codecForCanonicalizeBaseUrlRequest().decode(payload); + return { + url: canonicalizeBaseUrl(req.url), + }; + } case WalletApiOperation.TestingInfiniteTransactionLoop: { const myDelayMs = (payload as any).delayMs ?? 5; const shouldFetch = !!(payload as any).shouldFetch; diff --git a/packages/taler-wallet-core/src/withdraw.ts b/packages/taler-wallet-core/src/withdraw.ts index 106bd93a4..fd23fef5b 100644 --- a/packages/taler-wallet-core/src/withdraw.ts +++ b/packages/taler-wallet-core/src/withdraw.ts @@ -78,7 +78,6 @@ import { WithdrawalType, addPaytoQueryParams, assertUnreachable, - canonicalizeBaseUrl, checkDbInvariant, checkLogicInvariant, codeForBankWithdrawalOperationPostResponse, @@ -2568,7 +2567,7 @@ export async function internalPrepareCreateWithdrawalGroup( args.reserveKeyPair ?? (await wex.cryptoApi.createEddsaKeypair({})); const now = AbsoluteTime.toPreciseTimestamp(AbsoluteTime.now()); const secretSeed = encodeCrock(getRandomBytes(32)); - const canonExchange = canonicalizeBaseUrl(args.exchangeBaseUrl); + const exchangeBaseUrl = args.exchangeBaseUrl; const amount = args.amount; const currency = Amounts.currencyOf(amount); @@ -2595,10 +2594,10 @@ export async function internalPrepareCreateWithdrawalGroup( withdrawalGroupId = encodeCrock(getRandomBytes(32)); } - await updateWithdrawalDenoms(wex, canonExchange); + await updateWithdrawalDenoms(wex, exchangeBaseUrl); const denoms = await getCandidateWithdrawalDenoms( wex, - canonExchange, + exchangeBaseUrl, currency, ); @@ -2623,7 +2622,7 @@ export async function internalPrepareCreateWithdrawalGroup( const withdrawalGroup: WithdrawalGroupRecord = { denomSelUid, denomsSel: initialDenomSel, - exchangeBaseUrl: canonExchange, + exchangeBaseUrl: exchangeBaseUrl, instructedAmount: Amounts.stringify(amount), timestampStart: timestampPreciseToDb(now), rawWithdrawalAmount: initialDenomSel.totalWithdrawCost, @@ -2639,7 +2638,7 @@ export async function internalPrepareCreateWithdrawalGroup( wgInfo: args.wgInfo, }; - await fetchFreshExchange(wex, canonExchange); + await fetchFreshExchange(wex, exchangeBaseUrl); const transactionId = constructTransactionIdentifier({ tag: TransactionType.Withdrawal, withdrawalGroupId: withdrawalGroup.withdrawalGroupId, @@ -2649,7 +2648,7 @@ export async function internalPrepareCreateWithdrawalGroup( withdrawalGroup, transactionId, creationInfo: { - canonExchange, + canonExchange: exchangeBaseUrl, amount, }, }; @@ -2822,7 +2821,7 @@ export async function prepareBankIntegratedWithdrawal( }; } - const selectedExchange = canonicalizeBaseUrl(req.selectedExchange); + const selectedExchange = req.selectedExchange; const exchange = await fetchFreshExchange(wex, selectedExchange); const withdrawInfo = await getBankWithdrawalInfo( @@ -2934,7 +2933,7 @@ export async function acceptWithdrawalFromUri( restrictAge?: number; }, ): Promise<AcceptWithdrawalResponse> { - const selectedExchange = canonicalizeBaseUrl(req.selectedExchange); + const selectedExchange = req.selectedExchange; logger.info( `accepting withdrawal via ${req.talerWithdrawUri}, canonicalized selected exchange ${selectedExchange}`, ); |