From b1c141a515da765b621fe630d28c0f0bbc06d00b Mon Sep 17 00:00:00 2001 From: MHSanaei Date: Sun, 31 May 2026 19:00:26 +0200 Subject: [PATCH] fix(settings): sync generated schemas - entity.go: tighten SessionMaxAge validate tag gte=0 -> gte=1 to match the panel UI (min 60) and the hand-written setting.ts schema - GeneralTab.tsx: add max bounds to sessionMaxAge (525600) and pageSize (1000), raise pageSize min to 1 - regenerate zod.ts/types.ts, picking up pending drift: panelProxy field, client group field, InboundFallback.dest, and dropping the stale hysteria2 protocol enum value --- frontend/src/generated/types.ts | 5 +++++ frontend/src/generated/zod.ts | 11 ++++++++--- frontend/src/pages/settings/GeneralTab.tsx | 4 ++-- frontend/src/schemas/setting.ts | 2 +- web/entity/entity.go | 2 +- 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/frontend/src/generated/types.ts b/frontend/src/generated/types.ts index 304bb6ac..71e7eef7 100644 --- a/frontend/src/generated/types.ts +++ b/frontend/src/generated/types.ts @@ -27,6 +27,7 @@ export interface AllSetting { ldapUserFilter: string; ldapVlessField: string; pageSize: number; + panelProxy: string; remarkModel: string; restartXrayOnClientDisable: boolean; sessionMaxAge: number; @@ -113,6 +114,7 @@ export interface AllSettingView { ldapUserFilter: string; ldapVlessField: string; pageSize: number; + panelProxy: string; remarkModel: string; restartXrayOnClientDisable: boolean; sessionMaxAge: number; @@ -183,6 +185,7 @@ export interface Client { enable: boolean; expiryTime: number; flow?: string; + group?: string; id?: string; limitIp: number; password?: string; @@ -210,6 +213,7 @@ export interface ClientRecord { enable: boolean; expiryTime: number; flow: string; + group: string; id: number; limitIp: number; password: string; @@ -295,6 +299,7 @@ export interface InboundClientIps { export interface InboundFallback { alpn: string; childId: number; + dest: string; id: number; masterId: number; name: string; diff --git a/frontend/src/generated/zod.ts b/frontend/src/generated/zod.ts index 18b5a90f..9b91016a 100644 --- a/frontend/src/generated/zod.ts +++ b/frontend/src/generated/zod.ts @@ -29,9 +29,10 @@ export const AllSettingSchema = z.object({ ldapUserFilter: z.string(), ldapVlessField: z.string(), pageSize: z.number().int().min(1).max(1000), + panelProxy: z.string(), remarkModel: z.string(), restartXrayOnClientDisable: z.boolean(), - sessionMaxAge: z.number().int().min(0).max(525600), + sessionMaxAge: z.number().int().min(1).max(525600), subAnnounce: z.string(), subCertFile: z.string(), subClashEnable: z.boolean(), @@ -116,9 +117,10 @@ export const AllSettingViewSchema = z.object({ ldapUserFilter: z.string(), ldapVlessField: z.string(), pageSize: z.number().int().min(1).max(1000), + panelProxy: z.string(), remarkModel: z.string(), restartXrayOnClientDisable: z.boolean(), - sessionMaxAge: z.number().int().min(0).max(525600), + sessionMaxAge: z.number().int().min(1).max(525600), subAnnounce: z.string(), subCertFile: z.string(), subClashEnable: z.boolean(), @@ -188,6 +190,7 @@ export const ClientSchema = z.object({ enable: z.boolean(), expiryTime: z.number().int(), flow: z.string().optional(), + group: z.string().optional(), id: z.string().optional(), limitIp: z.number().int(), password: z.string().optional(), @@ -217,6 +220,7 @@ export const ClientRecordSchema = z.object({ enable: z.boolean(), expiryTime: z.number().int(), flow: z.string(), + group: z.string(), id: z.number().int(), limitIp: z.number().int(), password: z.string(), @@ -288,7 +292,7 @@ export const InboundSchema = z.object({ listen: z.string(), nodeId: z.number().int().nullable().optional(), port: z.number().int().min(1).max(65535), - protocol: z.enum(['vmess', 'vless', 'trojan', 'shadowsocks', 'wireguard', 'hysteria', 'hysteria2', 'http', 'mixed', 'tunnel']), + protocol: z.enum(['vmess', 'vless', 'trojan', 'shadowsocks', 'wireguard', 'hysteria', 'http', 'mixed', 'tunnel']), remark: z.string(), settings: z.unknown(), sniffing: z.unknown(), @@ -310,6 +314,7 @@ export type InboundClientIps = z.infer; export const InboundFallbackSchema = z.object({ alpn: z.string(), childId: z.number().int(), + dest: z.string(), id: z.number().int(), masterId: z.number().int(), name: z.string(), diff --git a/frontend/src/pages/settings/GeneralTab.tsx b/frontend/src/pages/settings/GeneralTab.tsx index 5c163cd8..4b07c496 100644 --- a/frontend/src/pages/settings/GeneralTab.tsx +++ b/frontend/src/pages/settings/GeneralTab.tsx @@ -155,7 +155,7 @@ export default function GeneralTab({ allSetting, updateSetting }: GeneralTabProp - updateSetting({ sessionMaxAge: Number(v) || 0 })} /> @@ -180,7 +180,7 @@ export default function GeneralTab({ allSetting, updateSetting }: GeneralTabProp - updateSetting({ pageSize: Number(v) || 0 })} /> diff --git a/frontend/src/schemas/setting.ts b/frontend/src/schemas/setting.ts index a8852f18..e9f5276e 100644 --- a/frontend/src/schemas/setting.ts +++ b/frontend/src/schemas/setting.ts @@ -11,7 +11,7 @@ export const AllSettingSchema = z.object({ webCertFile: z.string().optional(), webKeyFile: z.string().optional(), webBasePath: absolutePath.optional(), - sessionMaxAge: z.number().int().min(1).optional(), + sessionMaxAge: z.number().int().min(1).max(525600).optional(), trustedProxyCIDRs: z.string().optional(), panelProxy: z.string().optional(), pageSize: z.number().int().min(1).max(1000).optional(), diff --git a/web/entity/entity.go b/web/entity/entity.go index 77967fe0..8555b33a 100644 --- a/web/entity/entity.go +++ b/web/entity/entity.go @@ -27,7 +27,7 @@ type AllSetting struct { WebCertFile string `json:"webCertFile" form:"webCertFile"` // Path to SSL certificate file for web server WebKeyFile string `json:"webKeyFile" form:"webKeyFile"` // Path to SSL private key file for web server WebBasePath string `json:"webBasePath" form:"webBasePath"` // Base path for web panel URLs - SessionMaxAge int `json:"sessionMaxAge" form:"sessionMaxAge" validate:"gte=0,lte=525600"` // Session maximum age in minutes (cap at one year) + SessionMaxAge int `json:"sessionMaxAge" form:"sessionMaxAge" validate:"gte=1,lte=525600"` // Session maximum age in minutes (cap at one year) TrustedProxyCIDRs string `json:"trustedProxyCIDRs" form:"trustedProxyCIDRs"` // Trusted reverse proxy IPs/CIDRs for forwarded headers PanelProxy string `json:"panelProxy" form:"panelProxy"` // Proxy URL for the panel's own outbound requests (GitHub/Telegram)