setting.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import { z } from 'zod';
  2. const port = z.number().int().min(1).max(65535);
  3. const nonNegativeInt = z.number().int().min(0);
  4. const absolutePath = z.string().regex(/^\//, 'pages.settings.validation.pathLeadingSlash');
  5. export const AllSettingSchema = z
  6. .object({
  7. webListen: z.string().optional(),
  8. webDomain: z.string().optional(),
  9. webPort: port.optional(),
  10. webCertFile: z.string().optional(),
  11. webKeyFile: z.string().optional(),
  12. webBasePath: absolutePath.optional(),
  13. sessionMaxAge: z.number().int().min(1).max(525600).optional(),
  14. trustedProxyCIDRs: z.string().optional(),
  15. ipLimitAllowlist: z.string().optional(),
  16. panelOutbound: z.string().optional(),
  17. pageSize: z.number().int().min(0).max(1000).optional(),
  18. expireDiff: nonNegativeInt.optional(),
  19. trafficDiff: nonNegativeInt.max(100).optional(),
  20. remarkTemplate: z.string().optional(),
  21. subShowIdentityOnAllLinks: z.boolean().optional(),
  22. datepicker: z.enum(['gregorian', 'jalalian']).optional(),
  23. tgBotEnable: z.boolean().optional(),
  24. tgBotToken: z.string().optional(),
  25. tgBotProxy: z.string().optional(),
  26. tgBotAPIServer: z.string().optional(),
  27. tgBotChatId: z.string().optional(),
  28. tgRunTime: z.string().optional(),
  29. tgBotBackup: z.boolean().optional(),
  30. tgCpu: z.number().int().min(0).max(100).optional(),
  31. outboundDownThreshold: z.number().int().min(1).max(100).optional(),
  32. tgLang: z.string().optional(),
  33. twoFactorEnable: z.boolean().optional(),
  34. twoFactorToken: z.string().optional(),
  35. xrayTemplateConfig: z.string().optional(),
  36. subEnable: z.boolean().optional(),
  37. subJsonEnable: z.boolean().optional(),
  38. subJsonAutoDetect: z.boolean().optional(),
  39. subJsonAlwaysArray: z.boolean().optional(),
  40. subJsonUserAgentRegex: z.string().max(2048).optional(),
  41. subClashAutoDetect: z.boolean().optional(),
  42. subClashUserAgentRegex: z.string().max(2048).optional(),
  43. subTitle: z.string().optional(),
  44. subSupportUrl: z.string().optional(),
  45. subProfileUrl: z.string().optional(),
  46. subAnnounce: z.string().optional(),
  47. subEnableRouting: z.boolean().optional(),
  48. subRoutingRules: z.string().optional(),
  49. subIncyEnableRouting: z.boolean().optional(),
  50. subIncyRoutingRules: z.string().optional(),
  51. subListen: z.string().optional(),
  52. subPort: port.optional(),
  53. subPath: absolutePath.optional(),
  54. subJsonPath: absolutePath.optional(),
  55. subClashEnable: z.boolean().optional(),
  56. subClashPath: absolutePath.optional(),
  57. subDomain: z.string().optional(),
  58. externalTrafficInformEnable: z.boolean().optional(),
  59. externalTrafficInformURI: z.string().optional(),
  60. restartXrayOnClientDisable: z.boolean().optional(),
  61. subCertFile: z.string().optional(),
  62. subKeyFile: z.string().optional(),
  63. subUpdates: z.number().int().min(0).max(525600).optional(),
  64. subEncrypt: z.boolean().optional(),
  65. subURI: z.string().optional(),
  66. subJsonURI: z.string().optional(),
  67. subClashURI: z.string().optional(),
  68. subClashEnableRouting: z.boolean().optional(),
  69. subClashRules: z.string().optional(),
  70. subJsonMux: z.string().optional(),
  71. subJsonRules: z.string().optional(),
  72. subJsonFinalMask: z.string().optional(),
  73. subJsonObservatory: z.string().optional(),
  74. subHideSettings: z.boolean().optional(),
  75. timeLocation: z.string().optional(),
  76. ldapEnable: z.boolean().optional(),
  77. ldapHost: z.string().optional(),
  78. ldapPort: port.optional(),
  79. ldapUseTLS: z.boolean().optional(),
  80. ldapInsecureSkipVerify: z.boolean().optional(),
  81. ldapBindDN: z.string().optional(),
  82. ldapPassword: z.string().optional(),
  83. ldapBaseDN: z.string().optional(),
  84. ldapUserFilter: z.string().optional(),
  85. ldapUserAttr: z.string().optional(),
  86. ldapVlessField: z.string().optional(),
  87. ldapSyncCron: z.string().optional(),
  88. ldapFlagField: z.string().optional(),
  89. ldapTruthyValues: z.string().optional(),
  90. ldapInvertFlag: z.boolean().optional(),
  91. ldapInboundTags: z.string().optional(),
  92. ldapAutoCreate: z.boolean().optional(),
  93. ldapAutoDelete: z.boolean().optional(),
  94. ldapDefaultTotalGB: nonNegativeInt.optional(),
  95. ldapDefaultExpiryDays: nonNegativeInt.optional(),
  96. ldapDefaultLimitIP: nonNegativeInt.optional(),
  97. hasTgBotToken: z.boolean().optional(),
  98. hasTwoFactorToken: z.boolean().optional(),
  99. hasLdapPassword: z.boolean().optional(),
  100. hasApiToken: z.boolean().optional(),
  101. hasWarpSecret: z.boolean().optional(),
  102. hasNordSecret: z.boolean().optional(),
  103. hasSmtpPassword: z.boolean().optional(),
  104. })
  105. .loose();
  106. export type AllSettingInput = z.infer<typeof AllSettingSchema>;
  107. // Existing installations can contain regex values saved before the backend
  108. // enforced its 2,048-character limit. Accept those values when reading so the
  109. // settings page can display and let users correct them, while keeping the
  110. // stricter schema above for outgoing updates.
  111. export const AllSettingResponseSchema = AllSettingSchema.extend({
  112. subJsonUserAgentRegex: z.string().optional(),
  113. subClashUserAgentRegex: z.string().optional(),
  114. });
  115. export const FactoryDefaultsSchema = z.record(z.string(), z.string());
  116. export type FactoryDefaults = z.infer<typeof FactoryDefaultsSchema>;