aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2024-05-02 14:29:30 +0200
committerFlorian Dold <florian@dold.me>2024-05-02 14:29:34 +0200
commit8e1ccefedd48f0076a53a14ecc2e2d5d094b90a9 (patch)
tree63e586e3ca631d8e6a831401d4ba95718d1f9406 /packages/taler-wallet-core
parent6bcd1c4537d83d6b83113483f3c872ab40e74074 (diff)
downloadwallet-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.ts3
-rw-r--r--packages/taler-wallet-core/src/exchanges.ts23
-rw-r--r--packages/taler-wallet-core/src/versions.ts2
-rw-r--r--packages/taler-wallet-core/src/wallet-api-types.ts10
-rw-r--r--packages/taler-wallet-core/src/wallet.ts8
-rw-r--r--packages/taler-wallet-core/src/withdraw.ts17
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}`,
);