setting.ts 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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 SubProfileModeSchema = z.enum(['none', 'builtin', 'custom']);
  6. export type SubProfileMode = z.infer<typeof SubProfileModeSchema>;
  7. export const AllSettingSchema = z
  8. .object({
  9. webListen: z.string().optional(),
  10. webDomain: z.string().optional(),
  11. webPort: port.optional(),
  12. webCertFile: z.string().optional(),
  13. webKeyFile: z.string().optional(),
  14. webBasePath: absolutePath.optional(),
  15. sessionMaxAge: z.number().int().min(1).max(525600).optional(),
  16. trustedProxyCIDRs: z.string().optional(),
  17. realityScanCandidates: z.string().optional(),
  18. ipLimitAllowlist: z.string().optional(),
  19. panelOutbound: z.string().optional(),
  20. pageSize: z.number().int().min(0).max(1000).optional(),
  21. expireDiff: nonNegativeInt.optional(),
  22. trafficDiff: nonNegativeInt.max(100).optional(),
  23. remarkTemplate: z.string().optional(),
  24. subShowIdentityOnAllLinks: z.boolean().optional(),
  25. subInfoNodeEnable: z.boolean().optional(),
  26. subCalendarExpireInclusive: z.boolean().optional(),
  27. subExpiredTemplate: z.string().optional(),
  28. subTrafficDepletedTemplate: z.string().optional(),
  29. datepicker: z.enum(['gregorian', 'jalalian']).optional(),
  30. tgBotEnable: z.boolean().optional(),
  31. tgBotToken: z.string().optional(),
  32. tgBotProxy: z.string().optional(),
  33. tgBotAPIServer: z.string().optional(),
  34. tgBotChatId: z.string().optional(),
  35. tgRunTime: z.string().optional(),
  36. tgBotBackup: z.boolean().optional(),
  37. tgCpu: z.number().int().min(0).max(100).optional(),
  38. outboundDownThreshold: z.number().int().min(1).max(100).optional(),
  39. tgLang: z.string().optional(),
  40. twoFactorEnable: z.boolean().optional(),
  41. twoFactorToken: z.string().optional(),
  42. xrayTemplateConfig: z.string().optional(),
  43. happLinkEnable: z.boolean().optional(),
  44. subEnable: z.boolean().optional(),
  45. subJsonEnable: z.boolean().optional(),
  46. subJsonAutoDetect: z.boolean().optional(),
  47. subJsonAlwaysArray: z.boolean().optional(),
  48. subJsonUserAgentRegex: z.string().max(2048).optional(),
  49. subClashAutoDetect: z.boolean().optional(),
  50. subClashUserAgentRegex: z.string().max(2048).optional(),
  51. subTitle: z.string().optional(),
  52. subSupportUrl: z.string().optional(),
  53. subProfileMode: SubProfileModeSchema.optional(),
  54. subProfileUrl: z.string().optional(),
  55. subAnnounce: z.string().optional(),
  56. subEnableRouting: z.boolean().optional(),
  57. subRoutingRules: z.string().optional(),
  58. subIncyEnableRouting: z.boolean().optional(),
  59. subIncyRoutingRules: z.string().optional(),
  60. subListen: z.string().optional(),
  61. subPort: port.optional(),
  62. subPath: absolutePath.optional(),
  63. subJsonPath: absolutePath.optional(),
  64. subClashEnable: z.boolean().optional(),
  65. subClashPath: absolutePath.optional(),
  66. subDomain: z.string().optional(),
  67. externalTrafficInformEnable: z.boolean().optional(),
  68. externalTrafficInformURI: z.string().optional(),
  69. restartXrayOnClientDisable: z.boolean().optional(),
  70. subCertFile: z.string().optional(),
  71. subKeyFile: z.string().optional(),
  72. subUpdates: z.number().int().min(0).max(525600).optional(),
  73. subEncrypt: z.boolean().optional(),
  74. subURI: z.string().optional(),
  75. subJsonURI: z.string().optional(),
  76. subClashURI: z.string().optional(),
  77. subClashEnableRouting: z.boolean().optional(),
  78. subClashRules: z.string().optional(),
  79. subJsonMux: z.string().optional(),
  80. subJsonRules: z.string().optional(),
  81. subJsonRoutingRules: z.string().optional(),
  82. subJsonDns: z.string().optional(),
  83. subJsonFinalMask: z.string().optional(),
  84. subJsonObservatory: z.string().optional(),
  85. subHideSettings: z.boolean().optional(),
  86. subHappAutoDetect: z.boolean().optional(),
  87. subHappProviderId: z.string().optional(),
  88. subHappNewUrl: z.string().optional(),
  89. subHappFallbackUrl: z.string().optional(),
  90. subHappSubInfoColor: z.string().optional(),
  91. subHappSubInfoText: z.string().optional(),
  92. subHappSubInfoButtonText: z.string().optional(),
  93. subHappSubInfoButtonLink: z.string().optional(),
  94. subHappSubExpire: z.boolean().optional(),
  95. subHappSubExpireButtonLink: z.string().optional(),
  96. subHappNotificationExpire: z.boolean().optional(),
  97. subHappNoLimit: z.boolean().optional(),
  98. subHappAlwaysHwid: z.boolean().optional(),
  99. subHappTunMode: z.string().optional(),
  100. subHappTunType: z.string().optional(),
  101. subHappExcludeRoutes: z.string().optional(),
  102. subHappExcludeApns: z.boolean().optional(),
  103. subHappColorProfile: z.string().optional(),
  104. subHappPingType: z.string().optional(),
  105. subHappAutoConnect: z.boolean().optional(),
  106. subHappAutoConnectType: z.string().optional(),
  107. subHappPerAppMode: z.string().optional(),
  108. subHappPerAppList: z.string().optional(),
  109. timeLocation: z.string().optional(),
  110. ldapEnable: z.boolean().optional(),
  111. ldapHost: z.string().optional(),
  112. ldapPort: port.optional(),
  113. ldapUseTLS: z.boolean().optional(),
  114. ldapInsecureSkipVerify: z.boolean().optional(),
  115. ldapBindDN: z.string().optional(),
  116. ldapPassword: z.string().optional(),
  117. ldapBaseDN: z.string().optional(),
  118. ldapUserFilter: z.string().optional(),
  119. ldapUserAttr: z.string().optional(),
  120. ldapVlessField: z.string().optional(),
  121. ldapSyncCron: z.string().optional(),
  122. ldapFlagField: z.string().optional(),
  123. ldapTruthyValues: z.string().optional(),
  124. ldapInvertFlag: z.boolean().optional(),
  125. ldapInboundTags: z.string().optional(),
  126. ldapAutoCreate: z.boolean().optional(),
  127. ldapAutoDelete: z.boolean().optional(),
  128. ldapDefaultTotalGB: nonNegativeInt.optional(),
  129. ldapDefaultExpiryDays: nonNegativeInt.optional(),
  130. ldapDefaultLimitIP: nonNegativeInt.optional(),
  131. hasTgBotToken: z.boolean().optional(),
  132. hasTwoFactorToken: z.boolean().optional(),
  133. hasLdapPassword: z.boolean().optional(),
  134. hasApiToken: z.boolean().optional(),
  135. hasWarpSecret: z.boolean().optional(),
  136. hasNordSecret: z.boolean().optional(),
  137. hasSmtpPassword: z.boolean().optional(),
  138. hasDiscordBotToken: z.boolean().optional(),
  139. discordBotEnable: z.boolean().optional(),
  140. discordBotToken: z.string().optional(),
  141. discordChannelId: z.string().optional(),
  142. discordAdminIds: z.string().optional(),
  143. discordRunTime: z.string().optional(),
  144. discordBotBackup: z.boolean().optional(),
  145. discordCpu: z.number().int().min(0).max(100).optional(),
  146. discordMemory: z.number().int().min(0).max(100).optional(),
  147. discordLang: z.string().optional(),
  148. discordEnabledEvents: z.string().optional(),
  149. })
  150. .loose();
  151. export type AllSettingInput = z.infer<typeof AllSettingSchema>;
  152. // Existing installations can contain regex values saved before the backend
  153. // enforced its 2,048-character limit. Accept those values when reading so the
  154. // settings page can display and let users correct them, while keeping the
  155. // stricter schema above for outgoing updates.
  156. export const AllSettingResponseSchema = AllSettingSchema.extend({
  157. subJsonUserAgentRegex: z.string().optional(),
  158. subClashUserAgentRegex: z.string().optional(),
  159. });
  160. export const FactoryDefaultsSchema = z.record(z.string(), z.string());
  161. export type FactoryDefaults = z.infer<typeof FactoryDefaultsSchema>;