|
|
@@ -1,17 +1,21 @@
|
|
|
import { z } from 'zod';
|
|
|
|
|
|
+const port = z.number().int().min(1).max(65535);
|
|
|
+const nonNegativeInt = z.number().int().min(0);
|
|
|
+const absolutePath = z.string().regex(/^\//, 'pages.settings.validation.pathLeadingSlash');
|
|
|
+
|
|
|
export const AllSettingSchema = z.object({
|
|
|
webListen: z.string().optional(),
|
|
|
webDomain: z.string().optional(),
|
|
|
- webPort: z.number().optional(),
|
|
|
+ webPort: port.optional(),
|
|
|
webCertFile: z.string().optional(),
|
|
|
webKeyFile: z.string().optional(),
|
|
|
- webBasePath: z.string().optional(),
|
|
|
- sessionMaxAge: z.number().optional(),
|
|
|
+ webBasePath: absolutePath.optional(),
|
|
|
+ sessionMaxAge: z.number().int().min(1).optional(),
|
|
|
trustedProxyCIDRs: z.string().optional(),
|
|
|
- pageSize: z.number().optional(),
|
|
|
- expireDiff: z.number().optional(),
|
|
|
- trafficDiff: z.number().optional(),
|
|
|
+ pageSize: z.number().int().min(1).max(1000).optional(),
|
|
|
+ expireDiff: nonNegativeInt.optional(),
|
|
|
+ trafficDiff: nonNegativeInt.optional(),
|
|
|
remarkModel: z.string().optional(),
|
|
|
datepicker: z.enum(['gregorian', 'jalalian']).optional(),
|
|
|
tgBotEnable: z.boolean().optional(),
|
|
|
@@ -22,7 +26,7 @@ export const AllSettingSchema = z.object({
|
|
|
tgRunTime: z.string().optional(),
|
|
|
tgBotBackup: z.boolean().optional(),
|
|
|
tgBotLoginNotify: z.boolean().optional(),
|
|
|
- tgCpu: z.number().optional(),
|
|
|
+ tgCpu: z.number().int().min(0).max(100).optional(),
|
|
|
tgLang: z.string().optional(),
|
|
|
twoFactorEnable: z.boolean().optional(),
|
|
|
twoFactorToken: z.string().optional(),
|
|
|
@@ -36,18 +40,18 @@ export const AllSettingSchema = z.object({
|
|
|
subEnableRouting: z.boolean().optional(),
|
|
|
subRoutingRules: z.string().optional(),
|
|
|
subListen: z.string().optional(),
|
|
|
- subPort: z.number().optional(),
|
|
|
- subPath: z.string().optional(),
|
|
|
- subJsonPath: z.string().optional(),
|
|
|
+ subPort: port.optional(),
|
|
|
+ subPath: absolutePath.optional(),
|
|
|
+ subJsonPath: absolutePath.optional(),
|
|
|
subClashEnable: z.boolean().optional(),
|
|
|
- subClashPath: z.string().optional(),
|
|
|
+ subClashPath: absolutePath.optional(),
|
|
|
subDomain: z.string().optional(),
|
|
|
externalTrafficInformEnable: z.boolean().optional(),
|
|
|
externalTrafficInformURI: z.string().optional(),
|
|
|
restartXrayOnClientDisable: z.boolean().optional(),
|
|
|
subCertFile: z.string().optional(),
|
|
|
subKeyFile: z.string().optional(),
|
|
|
- subUpdates: z.number().optional(),
|
|
|
+ subUpdates: z.number().int().min(1).max(168).optional(),
|
|
|
subEncrypt: z.boolean().optional(),
|
|
|
subShowInfo: z.boolean().optional(),
|
|
|
subEmailInRemark: z.boolean().optional(),
|
|
|
@@ -61,7 +65,7 @@ export const AllSettingSchema = z.object({
|
|
|
timeLocation: z.string().optional(),
|
|
|
ldapEnable: z.boolean().optional(),
|
|
|
ldapHost: z.string().optional(),
|
|
|
- ldapPort: z.number().optional(),
|
|
|
+ ldapPort: port.optional(),
|
|
|
ldapUseTLS: z.boolean().optional(),
|
|
|
ldapBindDN: z.string().optional(),
|
|
|
ldapPassword: z.string().optional(),
|
|
|
@@ -76,9 +80,9 @@ export const AllSettingSchema = z.object({
|
|
|
ldapInboundTags: z.string().optional(),
|
|
|
ldapAutoCreate: z.boolean().optional(),
|
|
|
ldapAutoDelete: z.boolean().optional(),
|
|
|
- ldapDefaultTotalGB: z.number().optional(),
|
|
|
- ldapDefaultExpiryDays: z.number().optional(),
|
|
|
- ldapDefaultLimitIP: z.number().optional(),
|
|
|
+ ldapDefaultTotalGB: nonNegativeInt.optional(),
|
|
|
+ ldapDefaultExpiryDays: nonNegativeInt.optional(),
|
|
|
+ ldapDefaultLimitIP: nonNegativeInt.optional(),
|
|
|
hasTgBotToken: z.boolean().optional(),
|
|
|
hasTwoFactorToken: z.boolean().optional(),
|
|
|
hasLdapPassword: z.boolean().optional(),
|