commit e7a47757f46628336616f02317370c768b5fa9af
parent 62f1fc682a5b6b48e3e651cd5a08337f5cdd7cb2
Author: Sebastian <sebasjm@taler-systems.com>
Date: Tue, 10 Mar 2026 08:38:34 -0300
fix #11218
Diffstat:
3 files changed, 65 insertions(+), 10 deletions(-)
diff --git a/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx
@@ -100,6 +100,15 @@ export function CreatePage({ onConfirm, onBack, forceId }: Props): VNode {
const [notification, safeFunctionHandler] = useLocalNotificationBetter();
const mfa = useChallengeHandler();
+ let phoneRegex: RegExp | undefined = undefined;
+ if (config.phone_regex) {
+ try {
+ phoneRegex = new RegExp(config.phone_regex);
+ } catch (e) {
+ console.log("invalid phone regex", e);
+ }
+ }
+
const errors = undefinedIfEmpty<FormErrors<Entity>>({
id: !value.id
? i18n.str`Required`
@@ -114,10 +123,14 @@ export function CreatePage({ onConfirm, onBack, forceId }: Props): VNode {
: undefined,
phone_number: !value.phone_number
? undefined
- : !value.phone_number.startsWith("+")
- ? i18n.str`Should start with +`
- : !PHONE_JUST_NUMBERS_REGEX.test(value.phone_number)
- ? i18n.str`A phone number consists of numbers only`
+ : !phoneRegex
+ ? !value.phone_number.startsWith("+")
+ ? i18n.str`Should start with +`
+ : !PHONE_JUST_NUMBERS_REGEX.test(value.phone_number)
+ ? i18n.str`A phone number consists of numbers only`
+ : undefined
+ : !phoneRegex.test(value.phone_number)
+ ? i18n.str`Invalid phone number`
: undefined,
default_pay_delay: !value.default_pay_delay
? i18n.str`Required`
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx
@@ -25,6 +25,7 @@ import {
HttpStatusCode,
TalerMerchantApi,
TalerMerchantInstanceHttpClient,
+ TanChannel,
} from "@gnu-taler/taler-util";
import {
ButtonBetterBulma,
@@ -47,6 +48,10 @@ import { undefinedIfEmpty } from "../../../utils/table.js";
import { CopyButton } from "../../../components/modal/index.js";
import { Tooltip } from "../../../components/Tooltip.js";
import { maybeTryFirstMFA } from "../accounts/create/CreatePage.js";
+import {
+ EMAIL_REGEX,
+ PHONE_JUST_NUMBERS_REGEX,
+} from "../../../utils/constants.js";
const TALER_SCREEN_ID = 75;
@@ -90,17 +95,53 @@ export function UpdatePage({
const { i18n } = useTranslationContext();
+ const serverRequiresEmail =
+ config.mandatory_tan_channels?.indexOf(TanChannel.EMAIL) !== -1;
+ const serverRequiresSms =
+ config.mandatory_tan_channels?.indexOf(TanChannel.SMS) !== -1;
+
+ let phoneRegex: RegExp | undefined = undefined;
+ if (config.phone_regex) {
+ try {
+ phoneRegex = new RegExp(config.phone_regex);
+ } catch (e) {
+ console.log("invalid phone regex", e);
+ }
+ }
+
const errors = undefinedIfEmpty<FormErrors<Entity>>({
name: !value.name ? i18n.str`Required` : undefined,
+ email: !value.email
+ ? undefined
+ : !EMAIL_REGEX.test(value.email)
+ ? i18n.str`Doesn't have the pattern of an email`
+ : undefined,
+ phone_number: !value.phone_number
+ ? undefined
+ : !phoneRegex
+ ? !value.phone_number.startsWith("+")
+ ? i18n.str`Should start with +`
+ : !PHONE_JUST_NUMBERS_REGEX.test(value.phone_number)
+ ? i18n.str`A phone number consists of numbers only`
+ : undefined
+ : !phoneRegex.test(value.phone_number)
+ ? i18n.str`Invalid phone number`
+ : undefined,
default_pay_delay: !value.default_pay_delay
? i18n.str`Required`
- : undefined,
+ : value.default_pay_delay.d_us === "forever"
+ ? i18n.str`Invalid value`
+ : undefined,
default_refund_delay: !value.default_refund_delay
? i18n.str`Required`
- : undefined,
+ : value.default_refund_delay.d_us === "forever"
+ ? i18n.str`Invalid value`
+ : undefined,
default_wire_transfer_delay: !value.default_wire_transfer_delay
? i18n.str`Required`
- : undefined,
+ : value.default_wire_transfer_delay.d_us === "forever"
+ ? i18n.str`Invalid value`
+ : undefined,
address: undefinedIfEmpty({
address_lines:
value.address?.address_lines && value.address?.address_lines.length > 7
@@ -142,11 +183,11 @@ export function UpdatePage({
d: TalerMerchantApi.InstanceReconfigurationMessage,
challengeIds: string[],
) => {
- const resp = await doUpdate(token, d, { challengeIds })
+ const resp = await doUpdate(token, d, { challengeIds });
if (resp.type === "fail" && resp.case === HttpStatusCode.Accepted) {
await maybeTryFirstMFA(lib.instance, mfa, resp.body);
}
- return resp
+ return resp;
},
hasErrors || !state.token ? undefined : [state.token, result, []],
);
diff --git a/packages/merchant-backoffice-ui/src/paths/newAccount/index.tsx b/packages/merchant-backoffice-ui/src/paths/newAccount/index.tsx
@@ -108,12 +108,13 @@ export function NewAccount({ onCancel, onCreated }: Props): VNode {
config.mandatory_tan_channels?.indexOf(TanChannel.SMS) !== -1;
let phoneRegex: RegExp | undefined = undefined;
- if (config.phone_regex)
+ if (config.phone_regex) {
try {
phoneRegex = new RegExp(config.phone_regex);
} catch (e) {
console.log("invalid phone regex", e);
}
+ }
const errors = undefinedIfEmpty<FormErrors<Account>>({
id: !value.id