From 51d91b719b5213d2cb49482f980a4e08ff88893a Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Thu, 7 Mar 2024 19:36:25 +0100 Subject: taler-util: make exchange pub optional in taler://withdraw-exchange URI --- packages/taler-util/src/taleruri.test.ts | 71 ++++++++++++++++++++++++++------ packages/taler-util/src/taleruri.ts | 10 ++--- 2 files changed, 64 insertions(+), 17 deletions(-) (limited to 'packages/taler-util/src') diff --git a/packages/taler-util/src/taleruri.test.ts b/packages/taler-util/src/taleruri.test.ts index ab7a27af6..dbd175fe5 100644 --- a/packages/taler-util/src/taleruri.test.ts +++ b/packages/taler-util/src/taleruri.test.ts @@ -421,19 +421,66 @@ test("taler dev exp URI (stringify)", (t) => { */ test("taler withdraw exchange URI (parse)", (t) => { - const r1 = parseWithdrawExchangeUri( - "taler://withdraw-exchange/exchange.demo.taler.net/someroot/GJKG23V4ZBHEH45YRK7TWQE8ZTY7JWTY5094TQJSRZN5DSDBX8E0?a=KUDOS%3A2", - ); - if (!r1) { - t.fail(); - return; + { + const r1 = parseWithdrawExchangeUri( + "taler://withdraw-exchange/exchange.demo.taler.net/someroot/GJKG23V4ZBHEH45YRK7TWQE8ZTY7JWTY5094TQJSRZN5DSDBX8E0?a=KUDOS%3A2", + ); + if (!r1) { + t.fail(); + return; + } + t.deepEqual( + r1.exchangePub, + "GJKG23V4ZBHEH45YRK7TWQE8ZTY7JWTY5094TQJSRZN5DSDBX8E0", + ); + t.deepEqual( + r1.exchangeBaseUrl, + "https://exchange.demo.taler.net/someroot/", + ); + t.deepEqual(r1.amount, "KUDOS:2"); + } + { + const r2 = parseWithdrawExchangeUri( + "taler://withdraw-exchange/exchange.demo.taler.net/someroot/", + ); + if (!r2) { + t.fail(); + return; + } + t.deepEqual(r2.exchangePub, undefined); + t.deepEqual(r2.amount, undefined); + t.deepEqual( + r2.exchangeBaseUrl, + "https://exchange.demo.taler.net/someroot/", + ); + } + + { + const r3 = parseWithdrawExchangeUri( + "taler://withdraw-exchange/exchange.demo.taler.net/", + ); + if (!r3) { + t.fail(); + return; + } + t.deepEqual(r3.exchangePub, undefined); + t.deepEqual(r3.amount, undefined); + t.deepEqual(r3.exchangeBaseUrl, "https://exchange.demo.taler.net/"); + } + + { + // No trailing slash, no path component + const r4 = parseWithdrawExchangeUri( + "taler://withdraw-exchange/exchange.demo.taler.net", + ); + if (!r4) { + t.fail(); + return; + } + t.deepEqual(r4.exchangePub, undefined); + t.deepEqual(r4.amount, undefined); + t.deepEqual(r4.exchangeBaseUrl, "https://exchange.demo.taler.net/"); } - t.deepEqual( - r1.exchangePub, - "GJKG23V4ZBHEH45YRK7TWQE8ZTY7JWTY5094TQJSRZN5DSDBX8E0", - ); - t.deepEqual(r1.exchangeBaseUrl, "https://exchange.demo.taler.net/someroot/"); - t.deepEqual(r1.amount, "KUDOS:2"); }); test("taler withdraw exchange URI (stringify)", (t) => { diff --git a/packages/taler-util/src/taleruri.ts b/packages/taler-util/src/taleruri.ts index 9717a7d71..4a8647d21 100644 --- a/packages/taler-util/src/taleruri.ts +++ b/packages/taler-util/src/taleruri.ts @@ -122,7 +122,7 @@ export interface BackupRestoreUri { export interface WithdrawExchangeUri { type: TalerUriAction.WithdrawExchange; exchangeBaseUrl: string; - exchangePub: string; + exchangePub?: string; amount?: AmountString; } @@ -401,11 +401,11 @@ export function parseWithdrawExchangeUri( } const c = pi?.rest.split("?"); const parts = c[0].split("/"); - if (parts.length < 2) { + if (parts.length < 1) { return undefined; } const host = parts[0].toLowerCase(); - const exchangePub = parts[parts.length - 1]; + const exchangePub = parts.length > 1 ? parts[parts.length - 1] : undefined; const pathSegments = parts.slice(1, parts.length - 1); const hostAndSegments = [host, ...pathSegments].join("/"); const exchangeBaseUrl = canonicalizeBaseUrl( @@ -417,7 +417,7 @@ export function parseWithdrawExchangeUri( return { type: TalerUriAction.WithdrawExchange, exchangeBaseUrl, - exchangePub, + exchangePub: exchangePub != "" ? exchangePub : undefined, amount, }; } @@ -545,7 +545,7 @@ export function stringifyWithdrawExchange({ const { proto, path, query } = getUrlInfo(exchangeBaseUrl, { a: amount, }); - return `${proto}://withdraw-exchange/${path}${exchangePub}${query}`; + return `${proto}://withdraw-exchange/${path}${exchangePub ?? ""}${query}`; } export function stringifyDevExperimentUri({ -- cgit v1.2.3