taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 56c2704ee6ce60cf03568e1d8f25b3051647456c
parent 25df8c94a431bed94b2325ff8cd4e52176774588
Author: Florian Dold <florian@dold.me>
Date:   Mon, 15 Dec 2025 11:50:14 +0100

implement missing dev experiment

Diffstat:
Mpackages/taler-util/src/iban.ts | 48+++++++++++++++++++++++++++++++++++++++++++++++-
Mpackages/taler-wallet-core/src/dev-experiments.ts | 4++++
Mpackages/taler-wallet-core/src/wallet.ts | 23+++++++++++++++++++++++
3 files changed, 74 insertions(+), 1 deletion(-)

diff --git a/packages/taler-util/src/iban.ts b/packages/taler-util/src/iban.ts @@ -15,6 +15,8 @@ */ import { + OperationFail, + OperationOk, OperationResult, opFixedSuccess, opKnownFailure, @@ -116,7 +118,19 @@ function mod97(digits: number[]): number { return modAccum; } -export function convertHUF_BBANtoIBAN(value: string) { +export function convertHUF_BBANtoIBAN( + value: string, +): + | OperationOk<IbanString> + | OperationFail<ParseIbanError.TOO_LONG> + | OperationFail<ParseIbanError.TOO_SHORT> + | OperationFail<ParseIbanError.INVALID_CHARSET> { + if (value.startsWith("HU")) { + const maybeIban = parseIban(value); + if (maybeIban.case === "ok") { + return opFixedSuccess<IbanString>(maybeIban.body); + } + } if (value.length > 24) { return opKnownFailure(ParseIbanError.TOO_LONG); } @@ -132,6 +146,38 @@ export function convertHUF_BBANtoIBAN(value: string) { } /** + * Fake a BBAn conversion from CHF to IBAN. + * Note that this conversion does not exist in practice, + * it's only used for testing. + */ +export function convertCHF_BBANtoIBAN( + value: string, +): + | OperationOk<IbanString> + | OperationFail<ParseIbanError.TOO_LONG> + | OperationFail<ParseIbanError.TOO_SHORT> + | OperationFail<ParseIbanError.INVALID_CHARSET> { + if (value.startsWith("CH")) { + const maybeIban = parseIban(value); + if (maybeIban.case === "ok") { + return opFixedSuccess<IbanString>(maybeIban.body); + } + } + if (value.length > 24) { + return opKnownFailure(ParseIbanError.TOO_LONG); + } + if (value.length < 16) { + return opKnownFailure(ParseIbanError.TOO_SHORT); + } + if (!/[0-9+]/.test(value)) { + return opKnownFailure(ParseIbanError.INVALID_CHARSET); + } + + const bban = value; + return opFixedSuccess<IbanString>(constructIban("CH", bban)); +} + +/** * Check the IBAN is correct and return canonical form * @param ibanString * @returns diff --git a/packages/taler-wallet-core/src/dev-experiments.ts b/packages/taler-wallet-core/src/dev-experiments.ts @@ -369,6 +369,10 @@ export async function applyDevExperiment( wex.ws.devExperimentState.flagConfirmPayNoWait = getValFlag(parsedUri); return; } + case "fake-chf-bban": { + wex.ws.devExperimentState.fakeChfBban = getValFlag(parsedUri); + return; + } case "block-pay-response": { const val = getValFlag(parsedUri); logger.info(`setting dev experiment blockPayResponse=${val}`); diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts @@ -256,6 +256,7 @@ import { codecForUserAttentionsRequest, codecForValidateIbanRequest, codecForWithdrawTestBalance, + convertCHF_BBANtoIBAN, convertHUF_BBANtoIBAN, encodeCrock, getErrorDetailFromException, @@ -1510,6 +1511,7 @@ async function handleGetDepositWireTypes( // Will possibly extended later by other exchanges // with the same wire type. talerBankHostnames, + preferredEntryType, }); } } @@ -1959,6 +1961,20 @@ export async function handleConvertIbanAccountFieldToPayto( }; } } + if (wex.ws.devExperimentState.fakeChfBban && req.currency === "CHF") { + const iban = convertCHF_BBANtoIBAN(strippedInput); + if (iban.type === "ok") { + return { + ok: true, + paytoUri: `payto://iban/${iban.body}`, + type: "iban", + }; + } else { + return { + ok: false, + }; + } + } const parsedIban = parseIban(strippedInput); switch (parsedIban.case) { case "ok": @@ -1989,6 +2005,11 @@ export async function handleConvertIbanPaytoToAccountField( type: "bban", value: bban, }; + } else if (wex.ws.devExperimentState.fakeChfBban && iban.startsWith("CH")) { + return { + type: "bban", + value: iban.slice(4), + }; } return { type: "iban", @@ -2952,6 +2973,8 @@ export interface DevExperimentState { flagDisableDirectDeposits?: boolean; + fakeChfBban?: boolean; + blockPayResponse?: boolean; /** Migration test for confirmPay */