commit 56c2704ee6ce60cf03568e1d8f25b3051647456c
parent 25df8c94a431bed94b2325ff8cd4e52176774588
Author: Florian Dold <florian@dold.me>
Date: Mon, 15 Dec 2025 11:50:14 +0100
implement missing dev experiment
Diffstat:
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 */