Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 59d2c652e6 | |||
| 1c0c5f61c6 | |||
| 97d3b10e2f | |||
| d50695067e | |||
| 5bfd60176f | |||
| 9dd63f83da | |||
| 045f368c27 | |||
| a1e9ef00a1 | |||
| 11215b96ae | |||
| 1535338e0b | |||
| f6be2dd12e |
+11
-1
@@ -4,6 +4,7 @@ import (
|
|||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"runtime/debug"
|
||||||
"s-ui/cmd/migration"
|
"s-ui/cmd/migration"
|
||||||
"s-ui/config"
|
"s-ui/config"
|
||||||
)
|
)
|
||||||
@@ -52,7 +53,16 @@ func ParseCmd() {
|
|||||||
|
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
if showVersion {
|
if showVersion {
|
||||||
fmt.Println(config.GetVersion())
|
fmt.Println("S-UI Panel\t", config.GetVersion())
|
||||||
|
info, ok := debug.ReadBuildInfo()
|
||||||
|
if ok {
|
||||||
|
for _, dep := range info.Deps {
|
||||||
|
if dep.Path == "github.com/sagernet/sing-box" {
|
||||||
|
fmt.Println("Sing-Box\t", dep.Version)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
1.2.1
|
1.2.2
|
||||||
@@ -67,7 +67,6 @@ func InitDB(dbPath string) error {
|
|||||||
db.Migrator().CreateTable(&model.Outbound{})
|
db.Migrator().CreateTable(&model.Outbound{})
|
||||||
defaultOutbound := []model.Outbound{
|
defaultOutbound := []model.Outbound{
|
||||||
{Type: "direct", Tag: "direct", Options: json.RawMessage(`{}`)},
|
{Type: "direct", Tag: "direct", Options: json.RawMessage(`{}`)},
|
||||||
{Type: "dns", Tag: "dns-out", Options: json.RawMessage(`{}`)},
|
|
||||||
}
|
}
|
||||||
db.Create(&defaultOutbound)
|
db.Create(&defaultOutbound)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
Submodule frontend updated: cb5b0e119b...ca7894f87a
@@ -7,8 +7,8 @@ require (
|
|||||||
github.com/gin-gonic/gin v1.10.0
|
github.com/gin-gonic/gin v1.10.0
|
||||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7
|
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7
|
||||||
github.com/robfig/cron/v3 v3.0.1
|
github.com/robfig/cron/v3 v3.0.1
|
||||||
github.com/sagernet/sing v0.6.0
|
github.com/sagernet/sing v0.6.1
|
||||||
github.com/sagernet/sing-box v1.11.1
|
github.com/sagernet/sing-box v1.11.3
|
||||||
github.com/sagernet/sing-dns v0.4.0
|
github.com/sagernet/sing-dns v0.4.0
|
||||||
golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6
|
golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6
|
||||||
gorm.io/driver/sqlite v1.5.7
|
gorm.io/driver/sqlite v1.5.7
|
||||||
@@ -29,7 +29,7 @@ require (
|
|||||||
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
|
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
|
||||||
github.com/gin-contrib/sessions v1.0.2
|
github.com/gin-contrib/sessions v1.0.2
|
||||||
github.com/gin-contrib/sse v1.0.0 // indirect
|
github.com/gin-contrib/sse v1.0.0 // indirect
|
||||||
github.com/go-chi/chi/v5 v5.1.0 // indirect
|
github.com/go-chi/chi/v5 v5.2.1 // indirect
|
||||||
github.com/go-chi/render v1.0.3 // indirect
|
github.com/go-chi/render v1.0.3 // indirect
|
||||||
github.com/go-ole/go-ole v1.3.0 // indirect
|
github.com/go-ole/go-ole v1.3.0 // indirect
|
||||||
github.com/go-playground/locales v0.14.1 // indirect
|
github.com/go-playground/locales v0.14.1 // indirect
|
||||||
@@ -64,9 +64,9 @@ require (
|
|||||||
github.com/mattn/go-sqlite3 v1.14.24 // indirect
|
github.com/mattn/go-sqlite3 v1.14.24 // indirect
|
||||||
github.com/mdlayher/netlink v1.7.2 // indirect
|
github.com/mdlayher/netlink v1.7.2 // indirect
|
||||||
github.com/mdlayher/socket v0.4.1 // indirect
|
github.com/mdlayher/socket v0.4.1 // indirect
|
||||||
github.com/metacubex/tfo-go v0.0.0-20241006021335-daedaf0ca7aa // indirect
|
github.com/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422 // indirect
|
||||||
github.com/mholt/acmez v1.2.0 // indirect
|
github.com/mholt/acmez v1.2.0 // indirect
|
||||||
github.com/miekg/dns v1.1.62 // indirect
|
github.com/miekg/dns v1.1.63 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/onsi/ginkgo/v2 v2.10.0 // indirect
|
github.com/onsi/ginkgo/v2 v2.10.0 // indirect
|
||||||
@@ -82,15 +82,15 @@ require (
|
|||||||
github.com/sagernet/gvisor v0.0.0-20241123041152-536d05261cff // indirect
|
github.com/sagernet/gvisor v0.0.0-20241123041152-536d05261cff // indirect
|
||||||
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect
|
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect
|
||||||
github.com/sagernet/nftables v0.3.0-beta.4 // indirect
|
github.com/sagernet/nftables v0.3.0-beta.4 // indirect
|
||||||
github.com/sagernet/quic-go v0.48.2-beta.1 // indirect
|
github.com/sagernet/quic-go v0.49.0-beta.1 // indirect
|
||||||
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 // indirect
|
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 // indirect
|
||||||
github.com/sagernet/sing-mux v0.3.0-alpha.1 // indirect
|
github.com/sagernet/sing-mux v0.3.1 // indirect
|
||||||
github.com/sagernet/sing-quic v0.4.0-beta.4 // indirect
|
github.com/sagernet/sing-quic v0.4.0 // indirect
|
||||||
github.com/sagernet/sing-shadowsocks v0.2.7 // indirect
|
github.com/sagernet/sing-shadowsocks v0.2.7 // indirect
|
||||||
github.com/sagernet/sing-shadowsocks2 v0.2.0 // indirect
|
github.com/sagernet/sing-shadowsocks2 v0.2.0 // indirect
|
||||||
github.com/sagernet/sing-shadowtls v0.2.0-alpha.2 // indirect
|
github.com/sagernet/sing-shadowtls v0.2.0 // indirect
|
||||||
github.com/sagernet/sing-tun v0.6.0-beta.8 // indirect
|
github.com/sagernet/sing-tun v0.6.1 // indirect
|
||||||
github.com/sagernet/sing-vmess v0.2.0-beta.2 // indirect
|
github.com/sagernet/sing-vmess v0.2.0 // indirect
|
||||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 // indirect
|
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 // indirect
|
||||||
github.com/sagernet/utls v1.6.7 // indirect
|
github.com/sagernet/utls v1.6.7 // indirect
|
||||||
github.com/sagernet/wireguard-go v0.0.1-beta.5 // indirect
|
github.com/sagernet/wireguard-go v0.0.1-beta.5 // indirect
|
||||||
@@ -112,7 +112,7 @@ require (
|
|||||||
golang.org/x/mod v0.20.0 // indirect
|
golang.org/x/mod v0.20.0 // indirect
|
||||||
golang.org/x/net v0.34.0 // indirect
|
golang.org/x/net v0.34.0 // indirect
|
||||||
golang.org/x/sync v0.10.0 // indirect
|
golang.org/x/sync v0.10.0 // indirect
|
||||||
golang.org/x/sys v0.29.0 // indirect
|
golang.org/x/sys v0.30.0 // indirect
|
||||||
golang.org/x/text v0.21.0 // indirect
|
golang.org/x/text v0.21.0 // indirect
|
||||||
golang.org/x/time v0.7.0 // indirect
|
golang.org/x/time v0.7.0 // indirect
|
||||||
golang.org/x/tools v0.24.0 // indirect
|
golang.org/x/tools v0.24.0 // indirect
|
||||||
|
|||||||
@@ -33,8 +33,8 @@ github.com/gin-contrib/sse v1.0.0 h1:y3bT1mUWUxDpW4JLQg/HnTqV4rozuW4tC9eFKTxYI9E
|
|||||||
github.com/gin-contrib/sse v1.0.0/go.mod h1:zNuFdwarAygJBht0NTKiSi3jRf6RbqeILZ9Sp6Slhe0=
|
github.com/gin-contrib/sse v1.0.0/go.mod h1:zNuFdwarAygJBht0NTKiSi3jRf6RbqeILZ9Sp6Slhe0=
|
||||||
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
|
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
|
||||||
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
|
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
|
||||||
github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw=
|
github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8=
|
||||||
github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
|
github.com/go-chi/chi/v5 v5.2.1/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
|
||||||
github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4=
|
github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4=
|
||||||
github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0=
|
github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0=
|
||||||
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
|
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
|
||||||
@@ -117,12 +117,12 @@ github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/
|
|||||||
github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw=
|
github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw=
|
||||||
github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
|
github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
|
||||||
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
|
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
|
||||||
github.com/metacubex/tfo-go v0.0.0-20241006021335-daedaf0ca7aa h1:9mcjV+RGZVC3reJBNDjjNPyS8PmFG97zq56X7WNaFO4=
|
github.com/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422 h1:zGeQt3UyNydIVrMRB97AA5WsYEau/TyCnRtTf1yUmJY=
|
||||||
github.com/metacubex/tfo-go v0.0.0-20241006021335-daedaf0ca7aa/go.mod h1:4tLB5c8U0CxpkFM+AJJB77jEaVDbLH5XQvy42vAGsWw=
|
github.com/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw=
|
||||||
github.com/mholt/acmez v1.2.0 h1:1hhLxSgY5FvH5HCnGUuwbKY2VQVo8IU7rxXKSnZ7F30=
|
github.com/mholt/acmez v1.2.0 h1:1hhLxSgY5FvH5HCnGUuwbKY2VQVo8IU7rxXKSnZ7F30=
|
||||||
github.com/mholt/acmez v1.2.0/go.mod h1:VT9YwH1xgNX1kmYY89gY8xPJC84BFAisjo8Egigt4kE=
|
github.com/mholt/acmez v1.2.0/go.mod h1:VT9YwH1xgNX1kmYY89gY8xPJC84BFAisjo8Egigt4kE=
|
||||||
github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
|
github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
|
||||||
github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
|
github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
@@ -164,31 +164,31 @@ github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZN
|
|||||||
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM=
|
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM=
|
||||||
github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I=
|
github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I=
|
||||||
github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8=
|
github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8=
|
||||||
github.com/sagernet/quic-go v0.48.2-beta.1 h1:W0plrLWa1XtOWDTdX3CJwxmQuxkya12nN5BRGZ87kEg=
|
github.com/sagernet/quic-go v0.49.0-beta.1 h1:3LdoCzVVfYRibZns1tYWSIoB65fpTmrwy+yfK8DQ8Jk=
|
||||||
github.com/sagernet/quic-go v0.48.2-beta.1/go.mod h1:1WgdDIVD1Gybp40JTWketeSfKA/+or9YMLaG5VeTk4k=
|
github.com/sagernet/quic-go v0.49.0-beta.1/go.mod h1:uesWD1Ihrldq1M3XtjuEvIUqi8WHNsRs71b3Lt1+p/U=
|
||||||
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 h1:5Th31OC6yj8byLGkEnIYp6grlXfo1QYUfiYFGjewIdc=
|
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 h1:5Th31OC6yj8byLGkEnIYp6grlXfo1QYUfiYFGjewIdc=
|
||||||
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4WkQ1PwNnrVMM6KyuFR20pU8jYBD+A4EhJovEXU=
|
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4WkQ1PwNnrVMM6KyuFR20pU8jYBD+A4EhJovEXU=
|
||||||
github.com/sagernet/sing v0.2.18/go.mod h1:OL6k2F0vHmEzXz2KW19qQzu172FDgSbUSODylighuVo=
|
github.com/sagernet/sing v0.2.18/go.mod h1:OL6k2F0vHmEzXz2KW19qQzu172FDgSbUSODylighuVo=
|
||||||
github.com/sagernet/sing v0.6.0 h1:jT55zAXrG7H3x+s/FlrC15xQy3LcmuZ2GGA9+8IJdt0=
|
github.com/sagernet/sing v0.6.1 h1:mJ6e7Ir2wtCoGLbdnnXWBsNJu5YHtbXmv66inoE0zFA=
|
||||||
github.com/sagernet/sing v0.6.0/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
|
github.com/sagernet/sing v0.6.1/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
|
||||||
github.com/sagernet/sing-box v1.11.1 h1:bs+LNhD/ikNPEtVGS69myDGkbhPArtzNMjAd8aSWO0M=
|
github.com/sagernet/sing-box v1.11.3 h1:/yJLvru+wYf/XwniSuB1OZAPaaxs1tgXwlToo+0aeFc=
|
||||||
github.com/sagernet/sing-box v1.11.1/go.mod h1:DmL1WKyrfaAEu5z88CtUeQBfELaEdUyQzLS5nzmRg8o=
|
github.com/sagernet/sing-box v1.11.3/go.mod h1:jFQqIlqNbX0DyqJ/yo+k62niRqcjhwRLJdmH+ozxyMY=
|
||||||
github.com/sagernet/sing-dns v0.4.0 h1:+mNoOuR3nljjouCH+qMg4zHI1+R9T2ReblGFkZPEndc=
|
github.com/sagernet/sing-dns v0.4.0 h1:+mNoOuR3nljjouCH+qMg4zHI1+R9T2ReblGFkZPEndc=
|
||||||
github.com/sagernet/sing-dns v0.4.0/go.mod h1:dweQs54ng2YGzoJfz+F9dGuDNdP5pJ3PLeggnK5VWc8=
|
github.com/sagernet/sing-dns v0.4.0/go.mod h1:dweQs54ng2YGzoJfz+F9dGuDNdP5pJ3PLeggnK5VWc8=
|
||||||
github.com/sagernet/sing-mux v0.3.0-alpha.1 h1:IgNX5bJBpL41gGbp05pdDOvh/b5eUQ6cv9240+Ngipg=
|
github.com/sagernet/sing-mux v0.3.1 h1:kvCc8HyGAskDHDQ0yQvoTi/7J4cZPB/VJMsAM3MmdQI=
|
||||||
github.com/sagernet/sing-mux v0.3.0-alpha.1/go.mod h1:FTcImmdfW38Lz7b+HQ+mxxOth1lz4ao8uEnz+MwIJQE=
|
github.com/sagernet/sing-mux v0.3.1/go.mod h1:Mkdz8LnDstthz0HWuA/5foncnDIdcNN5KZ6AdJX+x78=
|
||||||
github.com/sagernet/sing-quic v0.4.0-beta.4 h1:kKiMLGaxvVLDCSvCMYo4PtWd1xU6FTL7xvUAQfXO09g=
|
github.com/sagernet/sing-quic v0.4.0 h1:E4geazHk/UrJTXMlT+CBCKmn8V86RhtNeczWtfeoEFc=
|
||||||
github.com/sagernet/sing-quic v0.4.0-beta.4/go.mod h1:1UNObFodd8CnS3aCT53x9cigjPSCl3P//8dfBMCwBDM=
|
github.com/sagernet/sing-quic v0.4.0/go.mod h1:c+CytOEyeN20KCTFIP8YQUkNDVFLSzjrEPqP7Hlnxys=
|
||||||
github.com/sagernet/sing-shadowsocks v0.2.7 h1:zaopR1tbHEw5Nk6FAkM05wCslV6ahVegEZaKMv9ipx8=
|
github.com/sagernet/sing-shadowsocks v0.2.7 h1:zaopR1tbHEw5Nk6FAkM05wCslV6ahVegEZaKMv9ipx8=
|
||||||
github.com/sagernet/sing-shadowsocks v0.2.7/go.mod h1:0rIKJZBR65Qi0zwdKezt4s57y/Tl1ofkaq6NlkzVuyE=
|
github.com/sagernet/sing-shadowsocks v0.2.7/go.mod h1:0rIKJZBR65Qi0zwdKezt4s57y/Tl1ofkaq6NlkzVuyE=
|
||||||
github.com/sagernet/sing-shadowsocks2 v0.2.0 h1:wpZNs6wKnR7mh1wV9OHwOyUr21VkS3wKFHi+8XwgADg=
|
github.com/sagernet/sing-shadowsocks2 v0.2.0 h1:wpZNs6wKnR7mh1wV9OHwOyUr21VkS3wKFHi+8XwgADg=
|
||||||
github.com/sagernet/sing-shadowsocks2 v0.2.0/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ=
|
github.com/sagernet/sing-shadowsocks2 v0.2.0/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ=
|
||||||
github.com/sagernet/sing-shadowtls v0.2.0-alpha.2 h1:RPrpgAdkP5td0vLfS5ldvYosFjSsZtRPxiyLV6jyKg0=
|
github.com/sagernet/sing-shadowtls v0.2.0 h1:cLKe4OAOFwuhmAIuPLj//CIL7Q9js+pIDardhJ+/osk=
|
||||||
github.com/sagernet/sing-shadowtls v0.2.0-alpha.2/go.mod h1:0j5XlzKxaWRIEjc1uiSKmVoWb0k+L9QgZVb876+thZA=
|
github.com/sagernet/sing-shadowtls v0.2.0/go.mod h1:agU+Fw5X+xnWVyRHyFthoZCX3MfWKCFPm4JUf+1oaxo=
|
||||||
github.com/sagernet/sing-tun v0.6.0-beta.8 h1:GFNt/w8r1v30zC/hfCytk8C9+N/f1DfvosFXJkyJlrw=
|
github.com/sagernet/sing-tun v0.6.1 h1:4l0+gnEKcGjlWfUVTD+W0BRApqIny/lU2ZliurE+VMo=
|
||||||
github.com/sagernet/sing-tun v0.6.0-beta.8/go.mod h1:fisFCbC4Vfb6HqQNcwPJi2CDK2bf0Xapyz3j3t4cnHE=
|
github.com/sagernet/sing-tun v0.6.1/go.mod h1:fisFCbC4Vfb6HqQNcwPJi2CDK2bf0Xapyz3j3t4cnHE=
|
||||||
github.com/sagernet/sing-vmess v0.2.0-beta.2 h1:obAkAL35X7ql4RnGzDg4dBYIRpGXRKqcN4LyLZpZGSs=
|
github.com/sagernet/sing-vmess v0.2.0 h1:pCMGUXN2k7RpikQV65/rtXtDHzb190foTfF9IGTMZrI=
|
||||||
github.com/sagernet/sing-vmess v0.2.0-beta.2/go.mod h1:HGhf9XUdeE2iOWrX0hQNFgXPbKyGlzpeYFyX0c/pykk=
|
github.com/sagernet/sing-vmess v0.2.0/go.mod h1:jDAZ0A0St1zVRkyvhAPRySOFfhC+4SQtO5VYyeFotgA=
|
||||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ=
|
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ=
|
||||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7/go.mod h1:FP9X2xjT/Az1EsG/orYYoC+5MojWnuI7hrffz8fGwwo=
|
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7/go.mod h1:FP9X2xjT/Az1EsG/orYYoC+5MojWnuI7hrffz8fGwwo=
|
||||||
github.com/sagernet/utls v1.6.7 h1:Ep3+aJ8FUGGta+II2IEVNUc3EDhaRCZINWkj/LloIA8=
|
github.com/sagernet/utls v1.6.7 h1:Ep3+aJ8FUGGta+II2IEVNUc3EDhaRCZINWkj/LloIA8=
|
||||||
@@ -260,8 +260,8 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
|
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
|
||||||
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
|
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
|
||||||
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
|
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
|
||||||
|
|||||||
+45
-49
@@ -2,6 +2,7 @@ package service
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"s-ui/database"
|
"s-ui/database"
|
||||||
"s-ui/database/model"
|
"s-ui/database/model"
|
||||||
@@ -224,11 +225,46 @@ func (s *InboundService) GetAllConfig(db *gorm.DB) ([]json.RawMessage, error) {
|
|||||||
return inboundsJson, nil
|
return inboundsJson, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *InboundService) addUsers(db *gorm.DB, inboundJson []byte, inboundId uint, inboundType string) ([]byte, error) {
|
func (s *InboundService) hasUser(inboundType string) bool {
|
||||||
switch inboundType {
|
switch inboundType {
|
||||||
case "mixed", "socks", "http", "shadowsocks", "vmess", "trojan", "naive", "hysteria", "shadowtls", "tuic", "hysteria2", "vless":
|
case "mixed", "socks", "http", "shadowsocks", "vmess", "trojan", "naive", "hysteria", "shadowtls", "tuic", "hysteria2", "vless":
|
||||||
break
|
return true
|
||||||
default:
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *InboundService) fetchUsers(db *gorm.DB, inboundType string, condition string, inbound map[string]interface{}) ([]json.RawMessage, error) {
|
||||||
|
if inboundType == "shadowtls" {
|
||||||
|
version, _ := inbound["version"].(float64)
|
||||||
|
if int(version) < 3 {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if inboundType == "shadowsocks" {
|
||||||
|
method, _ := inbound["method"].(string)
|
||||||
|
if method == "2022-blake3-aes-128-gcm" {
|
||||||
|
inboundType = "shadowsocks16"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var users []string
|
||||||
|
err := db.Raw(`SELECT json_extract(clients.config, ?) FROM clients WHERE enable = true AND ?`,
|
||||||
|
"$."+inboundType, condition).Scan(&users).Error
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var usersJson []json.RawMessage
|
||||||
|
for _, user := range users {
|
||||||
|
if inboundType == "vless" && inbound["tls"] == nil {
|
||||||
|
user = strings.Replace(user, "xtls-rprx-vision", "", -1)
|
||||||
|
}
|
||||||
|
usersJson = append(usersJson, json.RawMessage(user))
|
||||||
|
}
|
||||||
|
return usersJson, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *InboundService) addUsers(db *gorm.DB, inboundJson []byte, inboundId uint, inboundType string) ([]byte, error) {
|
||||||
|
if !s.hasUser(inboundType) {
|
||||||
return inboundJson, nil
|
return inboundJson, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,30 +274,11 @@ func (s *InboundService) addUsers(db *gorm.DB, inboundJson []byte, inboundId uin
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if inboundType == "shadowtls" {
|
condition := fmt.Sprintf("%d IN (SELECT json_each.value FROM json_each(clients.inbounds))", inboundId)
|
||||||
version, _ := inbound["version"].(float64)
|
usersJson, err := s.fetchUsers(db, inboundType, condition, inbound)
|
||||||
if int(version) < 3 {
|
|
||||||
return inboundJson, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if inboundType == "shadowsocks" {
|
|
||||||
method, _ := inbound["method"].(string)
|
|
||||||
if method == "2022-blake3-aes-128-gcm" {
|
|
||||||
inboundType = "shadowsocks16"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var users []string
|
|
||||||
err = db.Raw(`SELECT json_extract(clients.config, ?)
|
|
||||||
FROM clients, json_each(clients.inbounds) as je
|
|
||||||
WHERE clients.enable = true AND je.value = ?;`,
|
|
||||||
"$."+inboundType, inboundId).Scan(&users).Error
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var usersJson []json.RawMessage
|
|
||||||
for _, user := range users {
|
|
||||||
usersJson = append(usersJson, json.RawMessage(user))
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(usersJson) > 0 || inboundType != "shadowsocks" {
|
if len(usersJson) > 0 || inboundType != "shadowsocks" {
|
||||||
inbound["users"] = usersJson
|
inbound["users"] = usersJson
|
||||||
@@ -275,10 +292,8 @@ func (s *InboundService) initUsers(db *gorm.DB, inboundJson []byte, clientIds st
|
|||||||
if len(ClientIds) == 0 {
|
if len(ClientIds) == 0 {
|
||||||
return inboundJson, nil
|
return inboundJson, nil
|
||||||
}
|
}
|
||||||
switch inboundType {
|
|
||||||
case "mixed", "socks", "http", "shadowsocks", "vmess", "trojan", "naive", "hysteria", "shadowtls", "tuic", "hysteria2", "vless":
|
if !s.hasUser(inboundType) {
|
||||||
break
|
|
||||||
default:
|
|
||||||
return inboundJson, nil
|
return inboundJson, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,30 +303,11 @@ func (s *InboundService) initUsers(db *gorm.DB, inboundJson []byte, clientIds st
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if inboundType == "shadowtls" {
|
condition := fmt.Sprintf("id IN (%s)", strings.Join(ClientIds, ","))
|
||||||
version, _ := inbound["version"].(float64)
|
usersJson, err := s.fetchUsers(db, inboundType, condition, inbound)
|
||||||
if int(version) < 3 {
|
|
||||||
return inboundJson, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if inboundType == "shadowsocks" {
|
|
||||||
method, _ := inbound["method"].(string)
|
|
||||||
if method == "2022-blake3-aes-128-gcm" {
|
|
||||||
inboundType = "shadowsocks16"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var users []string
|
|
||||||
err = db.Raw(`SELECT json_extract(clients.config, ?)
|
|
||||||
FROM clients
|
|
||||||
WHERE enable = true AND id in ?`,
|
|
||||||
"$."+inboundType, ClientIds).Scan(&users).Error
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var usersJson []json.RawMessage
|
|
||||||
for _, user := range users {
|
|
||||||
usersJson = append(usersJson, json.RawMessage(user))
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(usersJson) > 0 || inboundType != "shadowsocks" {
|
if len(usersJson) > 0 || inboundType != "shadowsocks" {
|
||||||
inbound["users"] = usersJson
|
inbound["users"] = usersJson
|
||||||
|
|||||||
+17
-23
@@ -19,24 +19,18 @@ import (
|
|||||||
|
|
||||||
type WarpService struct{}
|
type WarpService struct{}
|
||||||
|
|
||||||
func (s *WarpService) getWarpInfo(ep *model.Endpoint) ([]byte, error) {
|
func (s *WarpService) getWarpInfo(deviceId string, accessToken string) ([]byte, error) {
|
||||||
var warpData map[string]string
|
url := fmt.Sprintf("https://api.cloudflareclient.com/v0a2158/reg/%s", deviceId)
|
||||||
err := json.Unmarshal(ep.Ext, &warpData)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
url := fmt.Sprintf("https://api.cloudflareclient.com/v0a2158/reg/%s", warpData["device_id"])
|
|
||||||
|
|
||||||
req, err := http.NewRequest("GET", url, nil)
|
req, err := http.NewRequest("GET", url, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
req.Header.Set("Authorization", "Bearer "+warpData["access_token"])
|
req.Header.Set("Authorization", "Bearer "+accessToken)
|
||||||
|
|
||||||
client := &http.Client{}
|
client := &http.Client{}
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
if err != nil {
|
if err != nil || resp.StatusCode != 200 {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
@@ -69,7 +63,7 @@ func (s *WarpService) RegisterWarp(ep *model.Endpoint) error {
|
|||||||
|
|
||||||
client := &http.Client{}
|
client := &http.Client{}
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
if err != nil {
|
if err != nil || resp.StatusCode != 200 {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
@@ -94,18 +88,7 @@ func (s *WarpService) RegisterWarp(ep *model.Endpoint) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
warpData := map[string]string{
|
warpInfo, err := s.getWarpInfo(deviceId, token)
|
||||||
"access_token": token,
|
|
||||||
"device_id": deviceId,
|
|
||||||
"license_key": license,
|
|
||||||
}
|
|
||||||
|
|
||||||
ep.Ext, err = json.MarshalIndent(warpData, "", " ")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
warpInfo, err := s.getWarpInfo(ep)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -142,6 +125,17 @@ func (s *WarpService) RegisterWarp(ep *model.Endpoint) error {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
warpData := map[string]interface{}{
|
||||||
|
"access_token": token,
|
||||||
|
"device_id": deviceId,
|
||||||
|
"license_key": license,
|
||||||
|
}
|
||||||
|
|
||||||
|
ep.Ext, err = json.MarshalIndent(warpData, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
var epOptions map[string]interface{}
|
var epOptions map[string]interface{}
|
||||||
err = json.Unmarshal(ep.Options, &epOptions)
|
err = json.Unmarshal(ep.Options, &epOptions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
+8
-2
@@ -126,9 +126,10 @@ func (j *JsonService) getOutbounds(clientConfig json.RawMessage, inbounds []*mod
|
|||||||
protocol, _ := outbound["type"].(string)
|
protocol, _ := outbound["type"].(string)
|
||||||
config, _ := configs[protocol].(map[string]interface{})
|
config, _ := configs[protocol].(map[string]interface{})
|
||||||
for key, value := range config {
|
for key, value := range config {
|
||||||
if key != "alterId" && key != "name" {
|
if key == "name" || key == "alterId" || (key == "flow" && inData.TlsId == 0) {
|
||||||
outbound[key] = value
|
continue
|
||||||
}
|
}
|
||||||
|
outbound[key] = value
|
||||||
}
|
}
|
||||||
|
|
||||||
var addrs []map[string]interface{}
|
var addrs []map[string]interface{}
|
||||||
@@ -211,12 +212,17 @@ func (j *JsonService) addDefaultOutbounds(outbounds *[]map[string]interface{}, o
|
|||||||
|
|
||||||
func (j *JsonService) addOthers(jsonConfig *map[string]interface{}) error {
|
func (j *JsonService) addOthers(jsonConfig *map[string]interface{}) error {
|
||||||
rules := []interface{}{
|
rules := []interface{}{
|
||||||
|
map[string]interface{}{
|
||||||
|
"action": "sniff",
|
||||||
|
},
|
||||||
map[string]interface{}{
|
map[string]interface{}{
|
||||||
"clash_mode": "Direct",
|
"clash_mode": "Direct",
|
||||||
|
"action": "route",
|
||||||
"outbound": "direct",
|
"outbound": "direct",
|
||||||
},
|
},
|
||||||
map[string]interface{}{
|
map[string]interface{}{
|
||||||
"clash_mode": "Global",
|
"clash_mode": "Global",
|
||||||
|
"action": "route",
|
||||||
"outbound": "proxy",
|
"outbound": "proxy",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -352,7 +352,7 @@ func vlessLink(
|
|||||||
params["flow"] = flow
|
params["flow"] = flow
|
||||||
}
|
}
|
||||||
if utls, ok := tls["utls"].(map[string]interface{}); ok {
|
if utls, ok := tls["utls"].(map[string]interface{}); ok {
|
||||||
params["fingerprint"], _ = utls["fingerprint"].(string)
|
params["fp"], _ = utls["fingerprint"].(string)
|
||||||
}
|
}
|
||||||
if sni, ok := tls["server_name"].(string); ok {
|
if sni, ok := tls["server_name"].(string); ok {
|
||||||
params["sni"] = sni
|
params["sni"] = sni
|
||||||
@@ -400,7 +400,7 @@ func trojanLink(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if utls, ok := tls["utls"].(map[string]interface{}); ok {
|
if utls, ok := tls["utls"].(map[string]interface{}); ok {
|
||||||
params["fingerprint"], _ = utls["fingerprint"].(string)
|
params["fp"], _ = utls["fingerprint"].(string)
|
||||||
}
|
}
|
||||||
if sni, ok := tls["server_name"].(string); ok {
|
if sni, ok := tls["server_name"].(string); ok {
|
||||||
params["sni"] = sni
|
params["sni"] = sni
|
||||||
@@ -522,7 +522,7 @@ func getTransportParams(t interface{}) map[string]string {
|
|||||||
}
|
}
|
||||||
if headers, ok := trasport["headers"].(map[string]interface{}); ok {
|
if headers, ok := trasport["headers"].(map[string]interface{}); ok {
|
||||||
if host, ok := headers["Host"].(string); ok {
|
if host, ok := headers["Host"].(string); ok {
|
||||||
params["peer"] = host
|
params["host"] = host
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case "grpc":
|
case "grpc":
|
||||||
@@ -531,7 +531,7 @@ func getTransportParams(t interface{}) map[string]string {
|
|||||||
}
|
}
|
||||||
case "httpupgrade":
|
case "httpupgrade":
|
||||||
if host, ok := trasport["host"].(string); ok {
|
if host, ok := trasport["host"].(string); ok {
|
||||||
params["peer"] = host
|
params["host"] = host
|
||||||
}
|
}
|
||||||
if path, ok := trasport["path"].(string); ok {
|
if path, ok := trasport["path"].(string); ok {
|
||||||
params["path"] = path
|
params["path"] = path
|
||||||
|
|||||||
@@ -139,6 +139,12 @@ func shadowTlsOut(out *map[string]interface{}, inbound map[string]interface{}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func hysteriaOut(out *map[string]interface{}, inbound map[string]interface{}) {
|
func hysteriaOut(out *map[string]interface{}, inbound map[string]interface{}) {
|
||||||
|
delete(*out, "down_mbps")
|
||||||
|
delete(*out, "up_mbps")
|
||||||
|
delete(*out, "obfs")
|
||||||
|
delete(*out, "recv_window_conn")
|
||||||
|
delete(*out, "disable_mtu_discovery")
|
||||||
|
|
||||||
if upMbps, ok := inbound["down_mbps"]; ok {
|
if upMbps, ok := inbound["down_mbps"]; ok {
|
||||||
(*out)["up_mbps"] = upMbps
|
(*out)["up_mbps"] = upMbps
|
||||||
}
|
}
|
||||||
@@ -157,6 +163,10 @@ func hysteriaOut(out *map[string]interface{}, inbound map[string]interface{}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func hysteria2Out(out *map[string]interface{}, inbound map[string]interface{}) {
|
func hysteria2Out(out *map[string]interface{}, inbound map[string]interface{}) {
|
||||||
|
delete(*out, "down_mbps")
|
||||||
|
delete(*out, "up_mbps")
|
||||||
|
delete(*out, "obfs")
|
||||||
|
|
||||||
if upMbps, ok := inbound["down_mbps"]; ok {
|
if upMbps, ok := inbound["down_mbps"]; ok {
|
||||||
(*out)["up_mbps"] = upMbps
|
(*out)["up_mbps"] = upMbps
|
||||||
}
|
}
|
||||||
@@ -169,6 +179,8 @@ func hysteria2Out(out *map[string]interface{}, inbound map[string]interface{}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func tuicOut(out *map[string]interface{}, inbound map[string]interface{}) {
|
func tuicOut(out *map[string]interface{}, inbound map[string]interface{}) {
|
||||||
|
delete(*out, "zero_rtt_handshake")
|
||||||
|
delete(*out, "heartbeat")
|
||||||
if congestionControl, ok := inbound["congestion_control"].(string); ok {
|
if congestionControl, ok := inbound["congestion_control"].(string); ok {
|
||||||
(*out)["congestion_control"] = congestionControl
|
(*out)["congestion_control"] = congestionControl
|
||||||
} else {
|
} else {
|
||||||
@@ -183,18 +195,21 @@ func tuicOut(out *map[string]interface{}, inbound map[string]interface{}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func vlessOut(out *map[string]interface{}, inbound map[string]interface{}) {
|
func vlessOut(out *map[string]interface{}, inbound map[string]interface{}) {
|
||||||
|
delete(*out, "transport")
|
||||||
if transport, ok := inbound["transport"]; ok {
|
if transport, ok := inbound["transport"]; ok {
|
||||||
(*out)["transport"] = transport
|
(*out)["transport"] = transport
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func trojanOut(out *map[string]interface{}, inbound map[string]interface{}) {
|
func trojanOut(out *map[string]interface{}, inbound map[string]interface{}) {
|
||||||
|
delete(*out, "transport")
|
||||||
if transport, ok := inbound["transport"]; ok {
|
if transport, ok := inbound["transport"]; ok {
|
||||||
(*out)["transport"] = transport
|
(*out)["transport"] = transport
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func vmessOut(out *map[string]interface{}, inbound map[string]interface{}) {
|
func vmessOut(out *map[string]interface{}, inbound map[string]interface{}) {
|
||||||
|
delete(*out, "transport")
|
||||||
if transport, ok := inbound["transport"]; ok {
|
if transport, ok := inbound["transport"]; ok {
|
||||||
(*out)["transport"] = transport
|
(*out)["transport"] = transport
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user