From e9a2d26c07304cae085030cd2fec87778c6af476 Mon Sep 17 00:00:00 2001 From: Fangliding Date: Mon, 2 Feb 2026 01:26:01 +0800 Subject: [PATCH] Exp: Make eveything listable --- infra/conf/api.go | 7 +- infra/conf/dns.go | 85 ++++++++--------- infra/conf/dns_proxy.go | 13 +-- infra/conf/freedom.go | 19 ++-- infra/conf/http.go | 29 +++--- infra/conf/observatory.go | 13 ++- infra/conf/reverse.go | 5 +- infra/conf/router.go | 7 +- infra/conf/router_strategy.go | 7 +- infra/conf/shadowsocks.go | 31 +++--- infra/conf/socks.go | 31 +++--- infra/conf/transport_internet.go | 157 ++++++++++++++++--------------- infra/conf/trojan.go | 19 ++-- infra/conf/version.go | 3 +- infra/conf/vless.go | 41 ++++---- infra/conf/vmess.go | 27 +++--- infra/conf/wireguard.go | 27 +++--- infra/conf/xray.go | 29 +++--- 18 files changed, 282 insertions(+), 268 deletions(-) diff --git a/infra/conf/api.go b/infra/conf/api.go index dca34910..1448aee5 100644 --- a/infra/conf/api.go +++ b/infra/conf/api.go @@ -11,12 +11,13 @@ import ( statsservice "github.com/xtls/xray-core/app/stats/command" "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/serial" + "github.com/xtls/xray-core/infra/conf/cfgcommon/types" ) type APIConfig struct { - Tag string `json:"tag"` - Listen string `json:"listen"` - Services []string `json:"services"` + Tag string `json:"tag"` + Listen string `json:"listen"` + Services types.Listable[string] `json:"services"` } func (c *APIConfig) Build() (*commander.Config, error) { diff --git a/infra/conf/dns.go b/infra/conf/dns.go index a65f0ee8..5e754e0d 100644 --- a/infra/conf/dns.go +++ b/infra/conf/dns.go @@ -13,24 +13,25 @@ import ( "github.com/xtls/xray-core/app/router" "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/net" + "github.com/xtls/xray-core/infra/conf/cfgcommon/types" ) type NameServerConfig struct { - Address *Address `json:"address"` - ClientIP *Address `json:"clientIp"` - Port uint16 `json:"port"` - SkipFallback bool `json:"skipFallback"` - Domains []string `json:"domains"` - ExpectedIPs StringList `json:"expectedIPs"` - ExpectIPs StringList `json:"expectIPs"` - QueryStrategy string `json:"queryStrategy"` - Tag string `json:"tag"` - TimeoutMs uint64 `json:"timeoutMs"` - DisableCache *bool `json:"disableCache"` - ServeStale *bool `json:"serveStale"` - ServeExpiredTTL *uint32 `json:"serveExpiredTTL"` - FinalQuery bool `json:"finalQuery"` - UnexpectedIPs StringList `json:"unexpectedIPs"` + Address *Address `json:"address"` + ClientIP *Address `json:"clientIp"` + Port uint16 `json:"port"` + SkipFallback bool `json:"skipFallback"` + Domains types.Listable[string] `json:"domains"` + ExpectedIPs StringList `json:"expectedIPs"` + ExpectIPs StringList `json:"expectIPs"` + QueryStrategy string `json:"queryStrategy"` + Tag string `json:"tag"` + TimeoutMs uint64 `json:"timeoutMs"` + DisableCache *bool `json:"disableCache"` + ServeStale *bool `json:"serveStale"` + ServeExpiredTTL *uint32 `json:"serveExpiredTTL"` + FinalQuery bool `json:"finalQuery"` + UnexpectedIPs StringList `json:"unexpectedIPs"` } // UnmarshalJSON implements encoding/json.Unmarshaler.UnmarshalJSON @@ -42,21 +43,21 @@ func (c *NameServerConfig) UnmarshalJSON(data []byte) error { } var advanced struct { - Address *Address `json:"address"` - ClientIP *Address `json:"clientIp"` - Port uint16 `json:"port"` - SkipFallback bool `json:"skipFallback"` - Domains []string `json:"domains"` - ExpectedIPs StringList `json:"expectedIPs"` - ExpectIPs StringList `json:"expectIPs"` - QueryStrategy string `json:"queryStrategy"` - Tag string `json:"tag"` - TimeoutMs uint64 `json:"timeoutMs"` - DisableCache *bool `json:"disableCache"` - ServeStale *bool `json:"serveStale"` - ServeExpiredTTL *uint32 `json:"serveExpiredTTL"` - FinalQuery bool `json:"finalQuery"` - UnexpectedIPs StringList `json:"unexpectedIPs"` + Address *Address `json:"address"` + ClientIP *Address `json:"clientIp"` + Port uint16 `json:"port"` + SkipFallback bool `json:"skipFallback"` + Domains types.Listable[string] `json:"domains"` + ExpectedIPs StringList `json:"expectedIPs"` + ExpectIPs StringList `json:"expectIPs"` + QueryStrategy string `json:"queryStrategy"` + Tag string `json:"tag"` + TimeoutMs uint64 `json:"timeoutMs"` + DisableCache *bool `json:"disableCache"` + ServeStale *bool `json:"serveStale"` + ServeExpiredTTL *uint32 `json:"serveExpiredTTL"` + FinalQuery bool `json:"finalQuery"` + UnexpectedIPs StringList `json:"unexpectedIPs"` } if err := json.Unmarshal(data, &advanced); err == nil { c.Address = advanced.Address @@ -196,18 +197,18 @@ var typeMap = map[router.Domain_Type]dns.DomainMatchingType{ // DNSConfig is a JSON serializable object for dns.Config. type DNSConfig struct { - Servers []*NameServerConfig `json:"servers"` - Hosts *HostsWrapper `json:"hosts"` - ClientIP *Address `json:"clientIp"` - Tag string `json:"tag"` - QueryStrategy string `json:"queryStrategy"` - DisableCache bool `json:"disableCache"` - ServeStale bool `json:"serveStale"` - ServeExpiredTTL uint32 `json:"serveExpiredTTL"` - DisableFallback bool `json:"disableFallback"` - DisableFallbackIfMatch bool `json:"disableFallbackIfMatch"` - EnableParallelQuery bool `json:"enableParallelQuery"` - UseSystemHosts bool `json:"useSystemHosts"` + Servers types.Listable[*NameServerConfig] `json:"servers"` + Hosts *HostsWrapper `json:"hosts"` + ClientIP *Address `json:"clientIp"` + Tag string `json:"tag"` + QueryStrategy string `json:"queryStrategy"` + DisableCache bool `json:"disableCache"` + ServeStale bool `json:"serveStale"` + ServeExpiredTTL uint32 `json:"serveExpiredTTL"` + DisableFallback bool `json:"disableFallback"` + DisableFallbackIfMatch bool `json:"disableFallbackIfMatch"` + EnableParallelQuery bool `json:"enableParallelQuery"` + UseSystemHosts bool `json:"useSystemHosts"` } type HostAddress struct { diff --git a/infra/conf/dns_proxy.go b/infra/conf/dns_proxy.go index b223e502..9f60ef42 100644 --- a/infra/conf/dns_proxy.go +++ b/infra/conf/dns_proxy.go @@ -3,17 +3,18 @@ package conf import ( "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/net" + "github.com/xtls/xray-core/infra/conf/cfgcommon/types" "github.com/xtls/xray-core/proxy/dns" "google.golang.org/protobuf/proto" ) type DNSOutboundConfig struct { - Network Network `json:"network"` - Address *Address `json:"address"` - Port uint16 `json:"port"` - UserLevel uint32 `json:"userLevel"` - NonIPQuery string `json:"nonIPQuery"` - BlockTypes []int32 `json:"blockTypes"` + Network Network `json:"network"` + Address *Address `json:"address"` + Port uint16 `json:"port"` + UserLevel uint32 `json:"userLevel"` + NonIPQuery string `json:"nonIPQuery"` + BlockTypes types.Listable[int32] `json:"blockTypes"` } func (c *DNSOutboundConfig) Build() (proto.Message, error) { diff --git a/infra/conf/freedom.go b/infra/conf/freedom.go index 65930a2e..367107e9 100644 --- a/infra/conf/freedom.go +++ b/infra/conf/freedom.go @@ -9,20 +9,21 @@ import ( "github.com/xtls/xray-core/common/errors" v2net "github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/common/protocol" + "github.com/xtls/xray-core/infra/conf/cfgcommon/types" "github.com/xtls/xray-core/proxy/freedom" - "google.golang.org/protobuf/proto" "github.com/xtls/xray-core/transport/internet" + "google.golang.org/protobuf/proto" ) type FreedomConfig struct { - TargetStrategy string `json:"targetStrategy"` - DomainStrategy string `json:"domainStrategy"` - Redirect string `json:"redirect"` - UserLevel uint32 `json:"userLevel"` - Fragment *Fragment `json:"fragment"` - Noise *Noise `json:"noise"` - Noises []*Noise `json:"noises"` - ProxyProtocol uint32 `json:"proxyProtocol"` + TargetStrategy string `json:"targetStrategy"` + DomainStrategy string `json:"domainStrategy"` + Redirect string `json:"redirect"` + UserLevel uint32 `json:"userLevel"` + Fragment *Fragment `json:"fragment"` + Noise *Noise `json:"noise"` + Noises types.Listable[*Noise] `json:"noises"` + ProxyProtocol uint32 `json:"proxyProtocol"` } type Fragment struct { diff --git a/infra/conf/http.go b/infra/conf/http.go index 7da8f3f5..4b014eca 100644 --- a/infra/conf/http.go +++ b/infra/conf/http.go @@ -6,6 +6,7 @@ import ( "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/protocol" "github.com/xtls/xray-core/common/serial" + "github.com/xtls/xray-core/infra/conf/cfgcommon/types" "github.com/xtls/xray-core/proxy/http" "google.golang.org/protobuf/proto" ) @@ -23,9 +24,9 @@ func (v *HTTPAccount) Build() *http.Account { } type HTTPServerConfig struct { - Accounts []*HTTPAccount `json:"accounts"` - Transparent bool `json:"allowTransparent"` - UserLevel uint32 `json:"userLevel"` + Accounts types.Listable[*HTTPAccount] `json:"accounts"` + Transparent bool `json:"allowTransparent"` + UserLevel uint32 `json:"userLevel"` } func (c *HTTPServerConfig) Build() (proto.Message, error) { @@ -45,20 +46,20 @@ func (c *HTTPServerConfig) Build() (proto.Message, error) { } type HTTPRemoteConfig struct { - Address *Address `json:"address"` - Port uint16 `json:"port"` - Users []json.RawMessage `json:"users"` + Address *Address `json:"address"` + Port uint16 `json:"port"` + Users types.Listable[json.RawMessage] `json:"users"` } type HTTPClientConfig struct { - Address *Address `json:"address"` - Port uint16 `json:"port"` - Level uint32 `json:"level"` - Email string `json:"email"` - Username string `json:"user"` - Password string `json:"pass"` - Servers []*HTTPRemoteConfig `json:"servers"` - Headers map[string]string `json:"headers"` + Address *Address `json:"address"` + Port uint16 `json:"port"` + Level uint32 `json:"level"` + Email string `json:"email"` + Username string `json:"user"` + Password string `json:"pass"` + Servers types.Listable[*HTTPRemoteConfig] `json:"servers"` + Headers map[string]string `json:"headers"` } func (v *HTTPClientConfig) Build() (proto.Message, error) { diff --git a/infra/conf/observatory.go b/infra/conf/observatory.go index 654acdbd..18bef04f 100644 --- a/infra/conf/observatory.go +++ b/infra/conf/observatory.go @@ -1,19 +1,18 @@ package conf import ( - "google.golang.org/protobuf/proto" - "github.com/xtls/xray-core/app/observatory" "github.com/xtls/xray-core/app/observatory/burst" "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/infra/conf/cfgcommon/types" + "google.golang.org/protobuf/proto" ) type ObservatoryConfig struct { - SubjectSelector []string `json:"subjectSelector"` - ProbeURL string `json:"probeURL"` - ProbeInterval types.Duration `json:"probeInterval"` - EnableConcurrency bool `json:"enableConcurrency"` + SubjectSelector types.Listable[string] `json:"subjectSelector"` + ProbeURL string `json:"probeURL"` + ProbeInterval types.Duration `json:"probeInterval"` + EnableConcurrency bool `json:"enableConcurrency"` } func (o *ObservatoryConfig) Build() (proto.Message, error) { @@ -21,7 +20,7 @@ func (o *ObservatoryConfig) Build() (proto.Message, error) { } type BurstObservatoryConfig struct { - SubjectSelector []string `json:"subjectSelector"` + SubjectSelector types.Listable[string] `json:"subjectSelector"` // health check settings HealthCheck *healthCheckSettings `json:"pingConfig,omitempty"` } diff --git a/infra/conf/reverse.go b/infra/conf/reverse.go index f44c9992..5296f5df 100644 --- a/infra/conf/reverse.go +++ b/infra/conf/reverse.go @@ -2,6 +2,7 @@ package conf import ( "github.com/xtls/xray-core/app/reverse" + "github.com/xtls/xray-core/infra/conf/cfgcommon/types" "google.golang.org/protobuf/proto" ) @@ -30,8 +31,8 @@ func (c *PortalConfig) Build() (*reverse.PortalConfig, error) { } type ReverseConfig struct { - Bridges []BridgeConfig `json:"bridges"` - Portals []PortalConfig `json:"portals"` + Bridges types.Listable[BridgeConfig] `json:"bridges"` + Portals types.Listable[PortalConfig] `json:"portals"` } func (c *ReverseConfig) Build() (proto.Message, error) { diff --git a/infra/conf/router.go b/infra/conf/router.go index 1e1f6b80..cc9f326c 100644 --- a/infra/conf/router.go +++ b/infra/conf/router.go @@ -14,6 +14,7 @@ import ( "github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/common/platform/filesystem" "github.com/xtls/xray-core/common/serial" + "github.com/xtls/xray-core/infra/conf/cfgcommon/types" "google.golang.org/protobuf/proto" ) @@ -74,9 +75,9 @@ func (r *BalancingRule) Build() (*router.BalancingRule, error) { } type RouterConfig struct { - RuleList []json.RawMessage `json:"rules"` - DomainStrategy *string `json:"domainStrategy"` - Balancers []*BalancingRule `json:"balancers"` + RuleList types.Listable[json.RawMessage] `json:"rules"` + DomainStrategy *string `json:"domainStrategy"` + Balancers types.Listable[*BalancingRule] `json:"balancers"` } func (c *RouterConfig) getDomainStrategy() router.Config_DomainStrategy { diff --git a/infra/conf/router_strategy.go b/infra/conf/router_strategy.go index 1e0ff665..f6b95933 100644 --- a/infra/conf/router_strategy.go +++ b/infra/conf/router_strategy.go @@ -3,11 +3,10 @@ package conf import ( "strings" - "google.golang.org/protobuf/proto" - "github.com/xtls/xray-core/app/observatory/burst" "github.com/xtls/xray-core/app/router" "github.com/xtls/xray-core/infra/conf/cfgcommon/types" + "google.golang.org/protobuf/proto" ) const ( @@ -35,9 +34,9 @@ func (v *strategyEmptyConfig) Build() (proto.Message, error) { type strategyLeastLoadConfig struct { // weight settings - Costs []*router.StrategyWeight `json:"costs,omitempty"` + Costs types.Listable[*router.StrategyWeight] `json:"costs,omitempty"` // ping rtt baselines - Baselines []types.Duration `json:"baselines,omitempty"` + Baselines types.Listable[types.Duration] `json:"baselines,omitempty"` // expected nodes count to select Expected int32 `json:"expected,omitempty"` // max acceptable rtt, filter away high delay nodes. default 0 diff --git a/infra/conf/shadowsocks.go b/infra/conf/shadowsocks.go index 490c2997..a31747ad 100644 --- a/infra/conf/shadowsocks.go +++ b/infra/conf/shadowsocks.go @@ -8,6 +8,7 @@ import ( "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/protocol" "github.com/xtls/xray-core/common/serial" + "github.com/xtls/xray-core/infra/conf/cfgcommon/types" "github.com/xtls/xray-core/proxy/shadowsocks" "github.com/xtls/xray-core/proxy/shadowsocks_2022" "google.golang.org/protobuf/proto" @@ -40,12 +41,12 @@ type ShadowsocksUserConfig struct { } type ShadowsocksServerConfig struct { - Cipher string `json:"method"` - Password string `json:"password"` - Level byte `json:"level"` - Email string `json:"email"` - Users []*ShadowsocksUserConfig `json:"clients"` - NetworkList *NetworkList `json:"network"` + Cipher string `json:"method"` + Password string `json:"password"` + Level byte `json:"level"` + Email string `json:"email"` + Users types.Listable[*ShadowsocksUserConfig] `json:"clients"` + NetworkList *NetworkList `json:"network"` } func (v *ShadowsocksServerConfig) Build() (proto.Message, error) { @@ -170,15 +171,15 @@ type ShadowsocksServerTarget struct { } type ShadowsocksClientConfig struct { - Address *Address `json:"address"` - Port uint16 `json:"port"` - Level byte `json:"level"` - Email string `json:"email"` - Cipher string `json:"method"` - Password string `json:"password"` - UoT bool `json:"uot"` - UoTVersion int `json:"uotVersion"` - Servers []*ShadowsocksServerTarget `json:"servers"` + Address *Address `json:"address"` + Port uint16 `json:"port"` + Level byte `json:"level"` + Email string `json:"email"` + Cipher string `json:"method"` + Password string `json:"password"` + UoT bool `json:"uot"` + UoTVersion int `json:"uotVersion"` + Servers types.Listable[*ShadowsocksServerTarget] `json:"servers"` } func (v *ShadowsocksClientConfig) Build() (proto.Message, error) { diff --git a/infra/conf/socks.go b/infra/conf/socks.go index d0d68d81..7c197e5c 100644 --- a/infra/conf/socks.go +++ b/infra/conf/socks.go @@ -6,6 +6,7 @@ import ( "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/protocol" "github.com/xtls/xray-core/common/serial" + "github.com/xtls/xray-core/infra/conf/cfgcommon/types" "github.com/xtls/xray-core/proxy/socks" "google.golang.org/protobuf/proto" ) @@ -28,11 +29,11 @@ const ( ) type SocksServerConfig struct { - AuthMethod string `json:"auth"` - Accounts []*SocksAccount `json:"accounts"` - UDP bool `json:"udp"` - Host *Address `json:"ip"` - UserLevel uint32 `json:"userLevel"` + AuthMethod string `json:"auth"` + Accounts types.Listable[*SocksAccount] `json:"accounts"` + UDP bool `json:"udp"` + Host *Address `json:"ip"` + UserLevel uint32 `json:"userLevel"` } func (v *SocksServerConfig) Build() (proto.Message, error) { @@ -64,19 +65,19 @@ func (v *SocksServerConfig) Build() (proto.Message, error) { } type SocksRemoteConfig struct { - Address *Address `json:"address"` - Port uint16 `json:"port"` - Users []json.RawMessage `json:"users"` + Address *Address `json:"address"` + Port uint16 `json:"port"` + Users types.Listable[json.RawMessage] `json:"users"` } type SocksClientConfig struct { - Address *Address `json:"address"` - Port uint16 `json:"port"` - Level uint32 `json:"level"` - Email string `json:"email"` - Username string `json:"user"` - Password string `json:"pass"` - Servers []*SocksRemoteConfig `json:"servers"` + Address *Address `json:"address"` + Port uint16 `json:"port"` + Level uint32 `json:"level"` + Email string `json:"email"` + Username string `json:"user"` + Password string `json:"pass"` + Servers types.Listable[*SocksRemoteConfig] `json:"servers"` } func (v *SocksClientConfig) Build() (proto.Message, error) { diff --git a/infra/conf/transport_internet.go b/infra/conf/transport_internet.go index a451a310..58b34a27 100644 --- a/infra/conf/transport_internet.go +++ b/infra/conf/transport_internet.go @@ -15,6 +15,7 @@ import ( "github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/common/platform/filesystem" "github.com/xtls/xray-core/common/serial" + "github.com/xtls/xray-core/infra/conf/cfgcommon/types" "github.com/xtls/xray-core/transport/internet" "github.com/xtls/xray-core/transport/internet/finalmask/salamander" "github.com/xtls/xray-core/transport/internet/httpupgrade" @@ -516,14 +517,14 @@ func readFileOrString(f string, s []string) ([]byte, error) { } type TLSCertConfig struct { - CertFile string `json:"certificateFile"` - CertStr []string `json:"certificate"` - KeyFile string `json:"keyFile"` - KeyStr []string `json:"key"` - Usage string `json:"usage"` - OcspStapling uint64 `json:"ocspStapling"` - OneTimeLoading bool `json:"oneTimeLoading"` - BuildChain bool `json:"buildChain"` + CertFile string `json:"certificateFile"` + CertStr types.Listable[string] `json:"certificate"` + KeyFile string `json:"keyFile"` + KeyStr types.Listable[string] `json:"key"` + Usage string `json:"usage"` + OcspStapling uint64 `json:"ocspStapling"` + OneTimeLoading bool `json:"oneTimeLoading"` + BuildChain bool `json:"buildChain"` } // Build implements Buildable. @@ -568,26 +569,26 @@ func (c *TLSCertConfig) Build() (*tls.Certificate, error) { } type TLSConfig struct { - AllowInsecure bool `json:"allowInsecure"` - Certs []*TLSCertConfig `json:"certificates"` - ServerName string `json:"serverName"` - ALPN *StringList `json:"alpn"` - EnableSessionResumption bool `json:"enableSessionResumption"` - DisableSystemRoot bool `json:"disableSystemRoot"` - MinVersion string `json:"minVersion"` - MaxVersion string `json:"maxVersion"` - CipherSuites string `json:"cipherSuites"` - Fingerprint string `json:"fingerprint"` - RejectUnknownSNI bool `json:"rejectUnknownSni"` - CurvePreferences *StringList `json:"curvePreferences"` - MasterKeyLog string `json:"masterKeyLog"` - PinnedPeerCertSha256 string `json:"pinnedPeerCertSha256"` - VerifyPeerCertByName string `json:"verifyPeerCertByName"` - VerifyPeerCertInNames []string `json:"verifyPeerCertInNames"` - ECHServerKeys string `json:"echServerKeys"` - ECHConfigList string `json:"echConfigList"` - ECHForceQuery string `json:"echForceQuery"` - ECHSocketSettings *SocketConfig `json:"echSockopt"` + AllowInsecure bool `json:"allowInsecure"` + Certs types.Listable[*TLSCertConfig] `json:"certificates"` + ServerName string `json:"serverName"` + ALPN *StringList `json:"alpn"` + EnableSessionResumption bool `json:"enableSessionResumption"` + DisableSystemRoot bool `json:"disableSystemRoot"` + MinVersion string `json:"minVersion"` + MaxVersion string `json:"maxVersion"` + CipherSuites string `json:"cipherSuites"` + Fingerprint string `json:"fingerprint"` + RejectUnknownSNI bool `json:"rejectUnknownSni"` + CurvePreferences *StringList `json:"curvePreferences"` + MasterKeyLog string `json:"masterKeyLog"` + PinnedPeerCertSha256 string `json:"pinnedPeerCertSha256"` + VerifyPeerCertByName string `json:"verifyPeerCertByName"` + VerifyPeerCertInNames types.Listable[string] `json:"verifyPeerCertInNames"` + ECHServerKeys string `json:"echServerKeys"` + ECHConfigList string `json:"echConfigList"` + ECHForceQuery string `json:"echForceQuery"` + ECHSocketSettings *SocketConfig `json:"echSockopt"` } // Build implements Buildable. @@ -693,19 +694,19 @@ type LimitFallback struct { } type REALITYConfig struct { - MasterKeyLog string `json:"masterKeyLog"` - Show bool `json:"show"` - Target json.RawMessage `json:"target"` - Dest json.RawMessage `json:"dest"` - Type string `json:"type"` - Xver uint64 `json:"xver"` - ServerNames []string `json:"serverNames"` - PrivateKey string `json:"privateKey"` - MinClientVer string `json:"minClientVer"` - MaxClientVer string `json:"maxClientVer"` - MaxTimeDiff uint64 `json:"maxTimeDiff"` - ShortIds []string `json:"shortIds"` - Mldsa65Seed string `json:"mldsa65Seed"` + MasterKeyLog string `json:"masterKeyLog"` + Show bool `json:"show"` + Target json.RawMessage `json:"target"` + Dest json.RawMessage `json:"dest"` + Type string `json:"type"` + Xver uint64 `json:"xver"` + ServerNames types.Listable[string] `json:"serverNames"` + PrivateKey string `json:"privateKey"` + MinClientVer string `json:"minClientVer"` + MaxClientVer string `json:"maxClientVer"` + MaxTimeDiff uint64 `json:"maxTimeDiff"` + ShortIds types.Listable[string] `json:"shortIds"` + Mldsa65Seed string `json:"mldsa65Seed"` LimitFallbackUpload LimitFallback `json:"limitFallbackUpload"` LimitFallbackDownload LimitFallback `json:"limitFallbackDownload"` @@ -966,26 +967,26 @@ func (h *HappyEyeballsConfig) UnmarshalJSON(data []byte) error { } type SocketConfig struct { - Mark int32 `json:"mark"` - TFO interface{} `json:"tcpFastOpen"` - TProxy string `json:"tproxy"` - AcceptProxyProtocol bool `json:"acceptProxyProtocol"` - DomainStrategy string `json:"domainStrategy"` - DialerProxy string `json:"dialerProxy"` - TCPKeepAliveInterval int32 `json:"tcpKeepAliveInterval"` - TCPKeepAliveIdle int32 `json:"tcpKeepAliveIdle"` - TCPCongestion string `json:"tcpCongestion"` - TCPWindowClamp int32 `json:"tcpWindowClamp"` - TCPMaxSeg int32 `json:"tcpMaxSeg"` - Penetrate bool `json:"penetrate"` - TCPUserTimeout int32 `json:"tcpUserTimeout"` - V6only bool `json:"v6only"` - Interface string `json:"interface"` - TcpMptcp bool `json:"tcpMptcp"` - CustomSockopt []*CustomSockoptConfig `json:"customSockopt"` - AddressPortStrategy string `json:"addressPortStrategy"` - HappyEyeballsSettings *HappyEyeballsConfig `json:"happyEyeballs"` - TrustedXForwardedFor []string `json:"trustedXForwardedFor"` + Mark int32 `json:"mark"` + TFO interface{} `json:"tcpFastOpen"` + TProxy string `json:"tproxy"` + AcceptProxyProtocol bool `json:"acceptProxyProtocol"` + DomainStrategy string `json:"domainStrategy"` + DialerProxy string `json:"dialerProxy"` + TCPKeepAliveInterval int32 `json:"tcpKeepAliveInterval"` + TCPKeepAliveIdle int32 `json:"tcpKeepAliveIdle"` + TCPCongestion string `json:"tcpCongestion"` + TCPWindowClamp int32 `json:"tcpWindowClamp"` + TCPMaxSeg int32 `json:"tcpMaxSeg"` + Penetrate bool `json:"penetrate"` + TCPUserTimeout int32 `json:"tcpUserTimeout"` + V6only bool `json:"v6only"` + Interface string `json:"interface"` + TcpMptcp bool `json:"tcpMptcp"` + CustomSockopt types.Listable[*CustomSockoptConfig] `json:"customSockopt"` + AddressPortStrategy string `json:"addressPortStrategy"` + HappyEyeballsSettings *HappyEyeballsConfig `json:"happyEyeballs"` + TrustedXForwardedFor types.Listable[string] `json:"trustedXForwardedFor"` } // Build implements Buildable. @@ -1152,23 +1153,23 @@ func (c *FinalMask) Build(tcpmaskLoader bool) (proto.Message, error) { } type StreamConfig struct { - Address *Address `json:"address"` - Port uint16 `json:"port"` - Network *TransportProtocol `json:"network"` - Security string `json:"security"` - Udpmasks []*FinalMask `json:"udpmasks"` - TLSSettings *TLSConfig `json:"tlsSettings"` - REALITYSettings *REALITYConfig `json:"realitySettings"` - RAWSettings *TCPConfig `json:"rawSettings"` - TCPSettings *TCPConfig `json:"tcpSettings"` - XHTTPSettings *SplitHTTPConfig `json:"xhttpSettings"` - SplitHTTPSettings *SplitHTTPConfig `json:"splithttpSettings"` - KCPSettings *KCPConfig `json:"kcpSettings"` - GRPCSettings *GRPCConfig `json:"grpcSettings"` - WSSettings *WebSocketConfig `json:"wsSettings"` - HTTPUPGRADESettings *HttpUpgradeConfig `json:"httpupgradeSettings"` - HysteriaSettings *HysteriaConfig `json:"hysteriaSettings"` - SocketSettings *SocketConfig `json:"sockopt"` + Address *Address `json:"address"` + Port uint16 `json:"port"` + Network *TransportProtocol `json:"network"` + Security string `json:"security"` + Udpmasks types.Listable[*FinalMask] `json:"udpmasks"` + TLSSettings *TLSConfig `json:"tlsSettings"` + REALITYSettings *REALITYConfig `json:"realitySettings"` + RAWSettings *TCPConfig `json:"rawSettings"` + TCPSettings *TCPConfig `json:"tcpSettings"` + XHTTPSettings *SplitHTTPConfig `json:"xhttpSettings"` + SplitHTTPSettings *SplitHTTPConfig `json:"splithttpSettings"` + KCPSettings *KCPConfig `json:"kcpSettings"` + GRPCSettings *GRPCConfig `json:"grpcSettings"` + WSSettings *WebSocketConfig `json:"wsSettings"` + HTTPUPGRADESettings *HttpUpgradeConfig `json:"httpupgradeSettings"` + HysteriaSettings *HysteriaConfig `json:"hysteriaSettings"` + SocketSettings *SocketConfig `json:"sockopt"` } // Build implements Buildable. diff --git a/infra/conf/trojan.go b/infra/conf/trojan.go index b78b6ffc..196b1105 100644 --- a/infra/conf/trojan.go +++ b/infra/conf/trojan.go @@ -12,6 +12,7 @@ import ( "github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/common/protocol" "github.com/xtls/xray-core/common/serial" + "github.com/xtls/xray-core/infra/conf/cfgcommon/types" "github.com/xtls/xray-core/proxy/trojan" "google.golang.org/protobuf/proto" ) @@ -28,13 +29,13 @@ type TrojanServerTarget struct { // TrojanClientConfig is configuration of trojan servers type TrojanClientConfig struct { - Address *Address `json:"address"` - Port uint16 `json:"port"` - Level byte `json:"level"` - Email string `json:"email"` - Password string `json:"password"` - Flow string `json:"flow"` - Servers []*TrojanServerTarget `json:"servers"` + Address *Address `json:"address"` + Port uint16 `json:"port"` + Level byte `json:"level"` + Email string `json:"email"` + Password string `json:"password"` + Flow string `json:"flow"` + Servers types.Listable[*TrojanServerTarget] `json:"servers"` } // Build implements Buildable @@ -111,8 +112,8 @@ type TrojanUserConfig struct { // TrojanServerConfig is Inbound configuration type TrojanServerConfig struct { - Clients []*TrojanUserConfig `json:"clients"` - Fallbacks []*TrojanInboundFallback `json:"fallbacks"` + Clients types.Listable[*TrojanUserConfig] `json:"clients"` + Fallbacks types.Listable[*TrojanInboundFallback] `json:"fallbacks"` } // Build implements Buildable diff --git a/infra/conf/version.go b/infra/conf/version.go index 5fedeb08..3cbe9215 100644 --- a/infra/conf/version.go +++ b/infra/conf/version.go @@ -1,9 +1,10 @@ package conf import ( + "strconv" + "github.com/xtls/xray-core/app/version" "github.com/xtls/xray-core/core" - "strconv" ) type VersionConfig struct { diff --git a/infra/conf/vless.go b/infra/conf/vless.go index d34906b0..c007dd31 100644 --- a/infra/conf/vless.go +++ b/infra/conf/vless.go @@ -14,6 +14,7 @@ import ( "github.com/xtls/xray-core/common/protocol" "github.com/xtls/xray-core/common/serial" "github.com/xtls/xray-core/common/uuid" + "github.com/xtls/xray-core/infra/conf/cfgcommon/types" "github.com/xtls/xray-core/proxy/vless" "github.com/xtls/xray-core/proxy/vless/inbound" "github.com/xtls/xray-core/proxy/vless/outbound" @@ -30,11 +31,11 @@ type VLessInboundFallback struct { } type VLessInboundConfig struct { - Clients []json.RawMessage `json:"clients"` - Decryption string `json:"decryption"` - Fallbacks []*VLessInboundFallback `json:"fallbacks"` - Flow string `json:"flow"` - Testseed []uint32 `json:"testseed"` + Clients types.Listable[json.RawMessage] `json:"clients"` + Decryption string `json:"decryption"` + Fallbacks types.Listable[*VLessInboundFallback] `json:"fallbacks"` + Flow string `json:"flow"` + Testseed types.Listable[uint32] `json:"testseed"` } // Build implements Buildable @@ -201,24 +202,24 @@ func (c *VLessInboundConfig) Build() (proto.Message, error) { } type VLessOutboundVnext struct { - Address *Address `json:"address"` - Port uint16 `json:"port"` - Users []json.RawMessage `json:"users"` + Address *Address `json:"address"` + Port uint16 `json:"port"` + Users types.Listable[json.RawMessage] `json:"users"` } type VLessOutboundConfig struct { - Address *Address `json:"address"` - Port uint16 `json:"port"` - Level uint32 `json:"level"` - Email string `json:"email"` - Id string `json:"id"` - Flow string `json:"flow"` - Seed string `json:"seed"` - Encryption string `json:"encryption"` - Reverse *vless.Reverse `json:"reverse"` - Testpre uint32 `json:"testpre"` - Testseed []uint32 `json:"testseed"` - Vnext []*VLessOutboundVnext `json:"vnext"` + Address *Address `json:"address"` + Port uint16 `json:"port"` + Level uint32 `json:"level"` + Email string `json:"email"` + Id string `json:"id"` + Flow string `json:"flow"` + Seed string `json:"seed"` + Encryption string `json:"encryption"` + Reverse *vless.Reverse `json:"reverse"` + Testpre uint32 `json:"testpre"` + Testseed types.Listable[uint32] `json:"testseed"` + Vnext types.Listable[*VLessOutboundVnext] `json:"vnext"` } // Build implements Buildable diff --git a/infra/conf/vmess.go b/infra/conf/vmess.go index cb8ff9c9..8d20a2e4 100644 --- a/infra/conf/vmess.go +++ b/infra/conf/vmess.go @@ -8,6 +8,7 @@ import ( "github.com/xtls/xray-core/common/protocol" "github.com/xtls/xray-core/common/serial" "github.com/xtls/xray-core/common/uuid" + "github.com/xtls/xray-core/infra/conf/cfgcommon/types" "github.com/xtls/xray-core/proxy/vmess" "github.com/xtls/xray-core/proxy/vmess/inbound" "github.com/xtls/xray-core/proxy/vmess/outbound" @@ -58,8 +59,8 @@ func (c *VMessDefaultConfig) Build() *inbound.DefaultConfig { } type VMessInboundConfig struct { - Users []json.RawMessage `json:"clients"` - Defaults *VMessDefaultConfig `json:"default"` + Users types.Listable[json.RawMessage] `json:"clients"` + Defaults *VMessDefaultConfig `json:"default"` } // Build implements Buildable @@ -97,20 +98,20 @@ func (c *VMessInboundConfig) Build() (proto.Message, error) { } type VMessOutboundTarget struct { - Address *Address `json:"address"` - Port uint16 `json:"port"` - Users []json.RawMessage `json:"users"` + Address *Address `json:"address"` + Port uint16 `json:"port"` + Users types.Listable[json.RawMessage] `json:"users"` } type VMessOutboundConfig struct { - Address *Address `json:"address"` - Port uint16 `json:"port"` - Level uint32 `json:"level"` - Email string `json:"email"` - ID string `json:"id"` - Security string `json:"security"` - Experiments string `json:"experiments"` - Receivers []*VMessOutboundTarget `json:"vnext"` + Address *Address `json:"address"` + Port uint16 `json:"port"` + Level uint32 `json:"level"` + Email string `json:"email"` + ID string `json:"id"` + Security string `json:"security"` + Experiments string `json:"experiments"` + Receivers types.Listable[*VMessOutboundTarget] `json:"vnext"` } // Build implements Buildable diff --git a/infra/conf/wireguard.go b/infra/conf/wireguard.go index 34ce7215..8a23c838 100644 --- a/infra/conf/wireguard.go +++ b/infra/conf/wireguard.go @@ -6,16 +6,17 @@ import ( "strings" "github.com/xtls/xray-core/common/errors" + "github.com/xtls/xray-core/infra/conf/cfgcommon/types" "github.com/xtls/xray-core/proxy/wireguard" "google.golang.org/protobuf/proto" ) type WireGuardPeerConfig struct { - PublicKey string `json:"publicKey"` - PreSharedKey string `json:"preSharedKey"` - Endpoint string `json:"endpoint"` - KeepAlive uint32 `json:"keepAlive"` - AllowedIPs []string `json:"allowedIPs,omitempty"` + PublicKey string `json:"publicKey"` + PreSharedKey string `json:"preSharedKey"` + Endpoint string `json:"endpoint"` + KeepAlive uint32 `json:"keepAlive"` + AllowedIPs types.Listable[string] `json:"allowedIPs,omitempty"` } func (c *WireGuardPeerConfig) Build() (proto.Message, error) { @@ -51,14 +52,14 @@ func (c *WireGuardPeerConfig) Build() (proto.Message, error) { type WireGuardConfig struct { IsClient bool `json:""` - NoKernelTun bool `json:"noKernelTun"` - SecretKey string `json:"secretKey"` - Address []string `json:"address"` - Peers []*WireGuardPeerConfig `json:"peers"` - MTU int32 `json:"mtu"` - NumWorkers int32 `json:"workers"` - Reserved []byte `json:"reserved"` - DomainStrategy string `json:"domainStrategy"` + NoKernelTun bool `json:"noKernelTun"` + SecretKey string `json:"secretKey"` + Address types.Listable[string] `json:"address"` + Peers types.Listable[*WireGuardPeerConfig] `json:"peers"` + MTU int32 `json:"mtu"` + NumWorkers int32 `json:"workers"` + Reserved []byte `json:"reserved"` + DomainStrategy string `json:"domainStrategy"` } func (c *WireGuardConfig) Build() (proto.Message, error) { diff --git a/infra/conf/xray.go b/infra/conf/xray.go index 9e5c1394..e01dcf63 100644 --- a/infra/conf/xray.go +++ b/infra/conf/xray.go @@ -13,6 +13,7 @@ import ( "github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/common/serial" core "github.com/xtls/xray-core/core" + "github.com/xtls/xray-core/infra/conf/cfgcommon/types" "github.com/xtls/xray-core/transport/internet" ) @@ -338,20 +339,20 @@ type Config struct { // left for returning error Transport map[string]json.RawMessage `json:"transport"` - LogConfig *LogConfig `json:"log"` - RouterConfig *RouterConfig `json:"routing"` - DNSConfig *DNSConfig `json:"dns"` - InboundConfigs []InboundDetourConfig `json:"inbounds"` - OutboundConfigs []OutboundDetourConfig `json:"outbounds"` - Policy *PolicyConfig `json:"policy"` - API *APIConfig `json:"api"` - Metrics *MetricsConfig `json:"metrics"` - Stats *StatsConfig `json:"stats"` - Reverse *ReverseConfig `json:"reverse"` - FakeDNS *FakeDNSConfig `json:"fakeDns"` - Observatory *ObservatoryConfig `json:"observatory"` - BurstObservatory *BurstObservatoryConfig `json:"burstObservatory"` - Version *VersionConfig `json:"version"` + LogConfig *LogConfig `json:"log"` + RouterConfig *RouterConfig `json:"routing"` + DNSConfig *DNSConfig `json:"dns"` + InboundConfigs types.Listable[InboundDetourConfig] `json:"inbounds"` + OutboundConfigs types.Listable[OutboundDetourConfig] `json:"outbounds"` + Policy *PolicyConfig `json:"policy"` + API *APIConfig `json:"api"` + Metrics *MetricsConfig `json:"metrics"` + Stats *StatsConfig `json:"stats"` + Reverse *ReverseConfig `json:"reverse"` + FakeDNS *FakeDNSConfig `json:"fakeDns"` + Observatory *ObservatoryConfig `json:"observatory"` + BurstObservatory *BurstObservatoryConfig `json:"burstObservatory"` + Version *VersionConfig `json:"version"` } func (c *Config) findInboundTag(tag string) int {