From 1de7accd7cfea4aa834fbcf80ff05e0f072971b4 Mon Sep 17 00:00:00 2001 From: mhsanaei Date: Tue, 16 Sep 2025 13:41:05 +0200 Subject: [PATCH] vnext removed --- sub/subJsonService.go | 59 ++++++++-------------------- sub/subService.go | 8 ---- web/assets/js/model/outbound.js | 68 +++++++++++++++++---------------- web/html/form/outbound.html | 2 +- web/html/xray.html | 4 +- web/web.go | 19 ++++----- 6 files changed, 63 insertions(+), 97 deletions(-) diff --git a/sub/subJsonService.go b/sub/subJsonService.go index def8b855..d3eceb55 100644 --- a/sub/subJsonService.go +++ b/sub/subJsonService.go @@ -292,34 +292,25 @@ func (s *SubJsonService) realityData(rData map[string]any) map[string]any { func (s *SubJsonService) genVnext(inbound *model.Inbound, streamSettings json_util.RawMessage, client model.Client, encryption string) json_util.RawMessage { outbound := Outbound{} - usersData := make([]UserVnext, 1) - - usersData[0].ID = client.ID - usersData[0].Level = 8 - if inbound.Protocol == model.VMESS { - usersData[0].Security = client.Security - } - if inbound.Protocol == model.VLESS { - usersData[0].Flow = client.Flow - usersData[0].Encryption = encryption - } - - vnextData := make([]VnextSetting, 1) - vnextData[0] = VnextSetting{ - Address: inbound.Listen, - Port: inbound.Port, - Users: usersData, - } - outbound.Protocol = string(inbound.Protocol) outbound.Tag = "proxy" if s.mux != "" { outbound.Mux = json_util.RawMessage(s.mux) } outbound.StreamSettings = streamSettings - outbound.Settings = OutboundSettings{ - Vnext: vnextData, + // Emit flattened settings inside Settings to match new Xray format + settings := make(map[string]any) + settings["address"] = inbound.Listen + settings["port"] = inbound.Port + settings["id"] = client.ID + if inbound.Protocol == model.VLESS { + settings["flow"] = client.Flow + settings["encryption"] = encryption } + if inbound.Protocol == model.VMESS { + settings["security"] = client.Security + } + outbound.Settings = settings result, _ := json.MarshalIndent(outbound, "", " ") return result @@ -356,8 +347,8 @@ func (s *SubJsonService) genServer(inbound *model.Inbound, streamSettings json_u outbound.Mux = json_util.RawMessage(s.mux) } outbound.StreamSettings = streamSettings - outbound.Settings = OutboundSettings{ - Servers: serverData, + outbound.Settings = map[string]any{ + "servers": serverData, } result, _ := json.MarshalIndent(outbound, "", " ") @@ -369,28 +360,10 @@ type Outbound struct { Tag string `json:"tag"` StreamSettings json_util.RawMessage `json:"streamSettings"` Mux json_util.RawMessage `json:"mux,omitempty"` - ProxySettings map[string]any `json:"proxySettings,omitempty"` - Settings OutboundSettings `json:"settings,omitempty"` + Settings map[string]any `json:"settings,omitempty"` } -type OutboundSettings struct { - Vnext []VnextSetting `json:"vnext,omitempty"` - Servers []ServerSetting `json:"servers,omitempty"` -} - -type VnextSetting struct { - Address string `json:"address"` - Port int `json:"port"` - Users []UserVnext `json:"users"` -} - -type UserVnext struct { - Encryption string `json:"encryption,omitempty"` - Flow string `json:"flow,omitempty"` - ID string `json:"id"` - Security string `json:"security,omitempty"` - Level int `json:"level"` -} +// Legacy vnext-related structs removed for flattened schema type ServerSetting struct { Password string `json:"password"` diff --git a/sub/subService.go b/sub/subService.go index ffad23a2..9f2d93f5 100644 --- a/sub/subService.go +++ b/sub/subService.go @@ -5,7 +5,6 @@ import ( "fmt" "net" "net/url" - "strconv" "strings" "time" @@ -1139,10 +1138,3 @@ func getHostFromXFH(s string) (string, error) { } return s, nil } - -func parseInt64(s string) (int64, error) { - // handle potential quotes - s = strings.Trim(s, "\"'") - n, err := strconv.ParseInt(s, 10, 64) - return n, err -} diff --git a/web/assets/js/model/outbound.js b/web/assets/js/model/outbound.js index 2d5660fb..3e481dff 100644 --- a/web/assets/js/model/outbound.js +++ b/web/assets/js/model/outbound.js @@ -219,7 +219,7 @@ class KcpStreamSettings extends CommonClass { class WsStreamSettings extends CommonClass { constructor( - path = '/', + path = '/', host = '', heartbeatPeriod = 0, @@ -647,10 +647,6 @@ class Outbound extends CommonClass { ].includes(this.protocol); } - hasVnext() { - return [Protocols.VMess, Protocols.VLESS].includes(this.protocol); - } - hasServers() { return [Protocols.Trojan, Protocols.Shadowsocks, Protocols.Socks, Protocols.HTTP].includes(this.protocol); } @@ -690,13 +686,22 @@ class Outbound extends CommonClass { if (this.stream?.sockopt) stream = { sockopt: this.stream.sockopt.toJson() }; } + // For VMess/VLESS, emit settings as a flat object + let settingsOut = this.settings instanceof CommonClass ? this.settings.toJson() : this.settings; + // Remove undefined/null keys + if (settingsOut && typeof settingsOut === 'object') { + Object.keys(settingsOut).forEach(k => { + if (settingsOut[k] === undefined || settingsOut[k] === null) delete settingsOut[k]; + }); + } return { - tag: this.tag == '' ? undefined : this.tag, protocol: this.protocol, - settings: this.settings instanceof CommonClass ? this.settings.toJson() : this.settings, - streamSettings: stream, - sendThrough: this.sendThrough != "" ? this.sendThrough : undefined, - mux: this.mux?.enabled ? this.mux : undefined, + settings: settingsOut, + // Only include tag, streamSettings, sendThrough, mux if present and not empty + ...(this.tag ? { tag: this.tag } : {}), + ...(stream ? { streamSettings: stream } : {}), + ...(this.sendThrough ? { sendThrough: this.sendThrough } : {}), + ...(this.mux?.enabled ? { mux: this.mux } : {}), }; } @@ -908,7 +913,7 @@ Outbound.FreedomSettings = class extends CommonClass { toJson() { return { domainStrategy: ObjectUtil.isEmpty(this.domainStrategy) ? undefined : this.domainStrategy, - redirect: ObjectUtil.isEmpty(this.redirect) ? undefined: this.redirect, + redirect: ObjectUtil.isEmpty(this.redirect) ? undefined : this.redirect, fragment: Object.keys(this.fragment).length === 0 ? undefined : this.fragment, noises: this.noises.length === 0 ? undefined : Outbound.FreedomSettings.Noise.toJsonArray(this.noises), }; @@ -1026,22 +1031,21 @@ Outbound.VmessSettings = class extends CommonClass { } static fromJson(json = {}) { - if (ObjectUtil.isArrEmpty(json.vnext)) return new Outbound.VmessSettings(); + if (ObjectUtil.isEmpty(json.address) || ObjectUtil.isEmpty(json.port)) return new Outbound.VmessSettings(); return new Outbound.VmessSettings( - json.vnext[0].address, - json.vnext[0].port, - json.vnext[0].users[0].id, - json.vnext[0].users[0].security, + json.address, + json.port, + json.id, + json.security, ); } toJson() { return { - vnext: [{ - address: this.address, - port: this.port, - users: [{ id: this.id, security: this.security }], - }], + address: this.address, + port: this.port, + id: this.id, + security: this.security, }; } }; @@ -1056,23 +1060,23 @@ Outbound.VLESSSettings = class extends CommonClass { } static fromJson(json = {}) { - if (ObjectUtil.isArrEmpty(json.vnext)) return new Outbound.VLESSSettings(); + if (ObjectUtil.isEmpty(json.address) || ObjectUtil.isEmpty(json.port)) return new Outbound.VLESSSettings(); return new Outbound.VLESSSettings( - json.vnext[0].address, - json.vnext[0].port, - json.vnext[0].users[0].id, - json.vnext[0].users[0].flow, - json.vnext[0].users[0].encryption, + json.address, + json.port, + json.id, + json.flow, + json.encryption ); } toJson() { return { - vnext: [{ - address: this.address, - port: this.port, - users: [{ id: this.id, flow: this.flow, encryption: this.encryption }], - }], + address: this.address, + port: this.port, + id: this.id, + flow: this.flow, + encryption: this.encryption, }; } }; diff --git a/web/html/form/outbound.html b/web/html/form/outbound.html index d2149b6d..aa6aa323 100644 --- a/web/html/form/outbound.html +++ b/web/html/form/outbound.html @@ -210,7 +210,7 @@ - +