diff --git a/.github/update.log b/.github/update.log index bfeabb2c25..f51208a0b8 100644 --- a/.github/update.log +++ b/.github/update.log @@ -666,3 +666,4 @@ Update On Thu May 30 20:33:19 CEST 2024 Update On Fri May 31 20:31:11 CEST 2024 Update On Fri Jun 7 01:07:11 CEST 2024 Update On Fri Jun 7 20:34:28 CEST 2024 +Update On Sat Jun 8 20:29:12 CEST 2024 diff --git a/clash-meta-android/core/src/foss/golang/clash/.github/workflows/build.yml b/clash-meta-android/core/src/foss/golang/clash/.github/workflows/build.yml index 42023755e1..9b8e000a12 100644 --- a/clash-meta-android/core/src/foss/golang/clash/.github/workflows/build.yml +++ b/clash-meta-android/core/src/foss/golang/clash/.github/workflows/build.yml @@ -206,6 +206,10 @@ jobs: sudo apt-get install dpkg if [ "${{matrix.jobs.abi}}" = "1" ]; then ARCH=loongarch64 + elif [ "${{matrix.jobs.goarm}}" = "7" ]; then + ARCH=armhf + elif [ "${{matrix.jobs.goarch}}" = "arm" ]; then + ARCH=armel else ARCH=${{matrix.jobs.goarch}} fi diff --git a/clash-meta-android/core/src/foss/golang/clash/adapter/inbound/listen.go b/clash-meta-android/core/src/foss/golang/clash/adapter/inbound/listen.go index 18dc1bc242..edbccea70a 100644 --- a/clash-meta-android/core/src/foss/golang/clash/adapter/inbound/listen.go +++ b/clash-meta-android/core/src/foss/golang/clash/adapter/inbound/listen.go @@ -3,22 +3,10 @@ package inbound import ( "context" "net" - - "github.com/metacubex/tfo-go" ) -var ( - lc = tfo.ListenConfig{ - DisableTFO: true, - } -) - -func SetTfo(open bool) { - lc.DisableTFO = !open -} - func SetMPTCP(open bool) { - setMultiPathTCP(&lc.ListenConfig, open) + setMultiPathTCP(getListenConfig(), open) } func ListenContext(ctx context.Context, network, address string) (net.Listener, error) { diff --git a/clash-meta-android/core/src/foss/golang/clash/adapter/inbound/listen_unix.go b/clash-meta-android/core/src/foss/golang/clash/adapter/inbound/listen_unix.go new file mode 100644 index 0000000000..bb78adb222 --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/adapter/inbound/listen_unix.go @@ -0,0 +1,23 @@ +//go:build unix + +package inbound + +import ( + "net" + + "github.com/metacubex/tfo-go" +) + +var ( + lc = tfo.ListenConfig{ + DisableTFO: true, + } +) + +func SetTfo(open bool) { + lc.DisableTFO = !open +} + +func getListenConfig() *net.ListenConfig { + return &lc.ListenConfig +} diff --git a/clash-meta-android/core/src/foss/golang/clash/adapter/inbound/listen_windows.go b/clash-meta-android/core/src/foss/golang/clash/adapter/inbound/listen_windows.go new file mode 100644 index 0000000000..a4223e2b58 --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/adapter/inbound/listen_windows.go @@ -0,0 +1,15 @@ +package inbound + +import ( + "net" +) + +var ( + lc = net.ListenConfig{} +) + +func SetTfo(open bool) {} + +func getListenConfig() *net.ListenConfig { + return &lc +} diff --git a/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/hysteria2.go b/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/hysteria2.go index 0ad7c2147a..b8abf39cc2 100644 --- a/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/hysteria2.go +++ b/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/hysteria2.go @@ -21,8 +21,8 @@ import ( "github.com/metacubex/sing-quic/hysteria2" + "github.com/metacubex/randv2" M "github.com/sagernet/sing/common/metadata" - "github.com/zhangyunhao116/fastrand" ) func init() { @@ -165,7 +165,7 @@ func NewHysteria2(option Hysteria2Option) (*Hysteria2, error) { }) if len(serverAddress) > 0 { clientOptions.ServerAddress = func(ctx context.Context) (*net.UDPAddr, error) { - return resolveUDPAddrWithPrefer(ctx, "udp", serverAddress[fastrand.Intn(len(serverAddress))], C.NewDNSPrefer(option.IPVersion)) + return resolveUDPAddrWithPrefer(ctx, "udp", serverAddress[randv2.IntN(len(serverAddress))], C.NewDNSPrefer(option.IPVersion)) } if option.HopInterval == 0 { diff --git a/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/ssh.go b/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/ssh.go index a0efabca4e..8b2776a663 100644 --- a/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/ssh.go +++ b/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/ssh.go @@ -17,7 +17,7 @@ import ( "github.com/metacubex/mihomo/component/proxydialer" C "github.com/metacubex/mihomo/constant" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" "golang.org/x/crypto/ssh" ) @@ -180,10 +180,10 @@ func NewSsh(option SshOption) (*Ssh, error) { } version := "SSH-2.0-OpenSSH_" - if fastrand.Intn(2) == 0 { - version += "7." + strconv.Itoa(fastrand.Intn(10)) + if randv2.IntN(2) == 0 { + version += "7." + strconv.Itoa(randv2.IntN(10)) } else { - version += "8." + strconv.Itoa(fastrand.Intn(9)) + version += "8." + strconv.Itoa(randv2.IntN(9)) } config.ClientVersion = version diff --git a/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/trojan.go b/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/trojan.go index b14761a491..938a885835 100644 --- a/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/trojan.go +++ b/clash-meta-android/core/src/foss/golang/clash/adapter/outbound/trojan.go @@ -3,6 +3,7 @@ package outbound import ( "context" "crypto/tls" + "errors" "fmt" "net" "net/http" @@ -15,6 +16,7 @@ import ( tlsC "github.com/metacubex/mihomo/component/tls" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/transport/gun" + "github.com/metacubex/mihomo/transport/shadowsocks/core" "github.com/metacubex/mihomo/transport/trojan" ) @@ -29,6 +31,8 @@ type Trojan struct { transport *gun.TransportWrap realityConfig *tlsC.RealityConfig + + ssCipher core.Cipher } type TrojanOption struct { @@ -46,9 +50,17 @@ type TrojanOption struct { RealityOpts RealityOptions `proxy:"reality-opts,omitempty"` GrpcOpts GrpcOptions `proxy:"grpc-opts,omitempty"` WSOpts WSOptions `proxy:"ws-opts,omitempty"` + SSOpts TrojanSSOption `proxy:"ss-opts,omitempty"` ClientFingerprint string `proxy:"client-fingerprint,omitempty"` } +// TrojanSSOption from https://github.com/p4gefau1t/trojan-go/blob/v0.10.6/tunnel/shadowsocks/config.go#L5 +type TrojanSSOption struct { + Enabled bool `proxy:"enabled,omitempty"` + Method string `proxy:"method,omitempty"` + Password string `proxy:"password,omitempty"` +} + func (t *Trojan) plainStream(ctx context.Context, c net.Conn) (net.Conn, error) { if t.option.Network == "ws" { host, port, _ := net.SplitHostPort(t.addr) @@ -95,6 +107,10 @@ func (t *Trojan) StreamConnContext(ctx context.Context, c net.Conn, metadata *C. return nil, fmt.Errorf("%s connect error: %w", t.addr, err) } + if t.ssCipher != nil { + c = t.ssCipher.StreamConn(c) + } + if metadata.NetWork == C.UDP { err = t.instance.WriteHeader(c, trojan.CommandUDP, serializesSocksAddr(metadata)) return c, err @@ -112,6 +128,10 @@ func (t *Trojan) DialContext(ctx context.Context, metadata *C.Metadata, opts ... return nil, err } + if t.ssCipher != nil { + c = t.ssCipher.StreamConn(c) + } + if err = t.instance.WriteHeader(c, trojan.CommandTCP, serializesSocksAddr(metadata)); err != nil { c.Close() return nil, err @@ -161,6 +181,11 @@ func (t *Trojan) ListenPacketContext(ctx context.Context, metadata *C.Metadata, defer func(c net.Conn) { safeConnClose(c, err) }(c) + + if t.ssCipher != nil { + c = t.ssCipher.StreamConn(c) + } + err = t.instance.WriteHeader(c, trojan.CommandUDP, serializesSocksAddr(metadata)) if err != nil { return nil, err @@ -193,6 +218,10 @@ func (t *Trojan) ListenPacketWithDialer(ctx context.Context, dialer C.Dialer, me return nil, fmt.Errorf("%s connect error: %w", t.addr, err) } + if t.ssCipher != nil { + c = t.ssCipher.StreamConn(c) + } + err = t.instance.WriteHeader(c, trojan.CommandUDP, serializesSocksAddr(metadata)) if err != nil { return nil, err @@ -257,6 +286,20 @@ func NewTrojan(option TrojanOption) (*Trojan, error) { } tOption.Reality = t.realityConfig + if option.SSOpts.Enabled { + if option.SSOpts.Password == "" { + return nil, errors.New("empty password") + } + if option.SSOpts.Method == "" { + option.SSOpts.Method = "AES-128-GCM" + } + ciph, err := core.PickCipher(option.SSOpts.Method, nil, option.SSOpts.Password) + if err != nil { + return nil, err + } + t.ssCipher = ciph + } + if option.Network == "grpc" { dialFn := func(network, addr string) (net.Conn, error) { var err error diff --git a/clash-meta-android/core/src/foss/golang/clash/common/convert/converter.go b/clash-meta-android/core/src/foss/golang/clash/common/convert/converter.go index 222dd9fa82..19886d25ee 100644 --- a/clash-meta-android/core/src/foss/golang/clash/common/convert/converter.go +++ b/clash-meta-android/core/src/foss/golang/clash/common/convert/converter.go @@ -333,7 +333,7 @@ func ConvertsV2Ray(buf []byte) ([]map[string]any, error) { case "ws", "httpupgrade": headers := make(map[string]any) wsOpts := make(map[string]any) - wsOpts["path"] = []string{"/"} + wsOpts["path"] = "/" if host, ok := values["host"]; ok && host != "" { headers["Host"] = host.(string) } diff --git a/clash-meta-android/core/src/foss/golang/clash/common/convert/util.go b/clash-meta-android/core/src/foss/golang/clash/common/convert/util.go index a715b556f5..ab00637493 100644 --- a/clash-meta-android/core/src/foss/golang/clash/common/convert/util.go +++ b/clash-meta-android/core/src/foss/golang/clash/common/convert/util.go @@ -8,8 +8,8 @@ import ( "github.com/metacubex/mihomo/common/utils" + "github.com/metacubex/randv2" "github.com/metacubex/sing-shadowsocks/shadowimpl" - "github.com/zhangyunhao116/fastrand" ) var hostsSuffix = []string{ @@ -302,11 +302,11 @@ func RandHost() string { prefix += string(buf[6:8]) + "-" prefix += string(buf[len(buf)-8:]) - return prefix + hostsSuffix[fastrand.Intn(hostsLen)] + return prefix + hostsSuffix[randv2.IntN(hostsLen)] } func RandUserAgent() string { - return userAgents[fastrand.Intn(uaLen)] + return userAgents[randv2.IntN(uaLen)] } func SetUserAgent(header http.Header) { diff --git a/clash-meta-android/core/src/foss/golang/clash/common/pool/alloc_test.go b/clash-meta-android/core/src/foss/golang/clash/common/pool/alloc_test.go index 0ac72ee05d..c76ff26a0c 100644 --- a/clash-meta-android/core/src/foss/golang/clash/common/pool/alloc_test.go +++ b/clash-meta-android/core/src/foss/golang/clash/common/pool/alloc_test.go @@ -3,8 +3,8 @@ package pool import ( "testing" + "github.com/metacubex/randv2" "github.com/stretchr/testify/assert" - "github.com/zhangyunhao116/fastrand" ) func TestAllocGet(t *testing.T) { @@ -43,6 +43,6 @@ func TestAllocPutThenGet(t *testing.T) { func BenchmarkMSB(b *testing.B) { for i := 0; i < b.N; i++ { - msb(fastrand.Int()) + msb(randv2.Int()) } } diff --git a/clash-meta-android/core/src/foss/golang/clash/common/utils/uuid.go b/clash-meta-android/core/src/foss/golang/clash/common/utils/uuid.go index f559b471fd..d9a8b78948 100644 --- a/clash-meta-android/core/src/foss/golang/clash/common/utils/uuid.go +++ b/clash-meta-android/core/src/foss/golang/clash/common/utils/uuid.go @@ -2,19 +2,39 @@ package utils import ( "github.com/gofrs/uuid/v5" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) -type fastRandReader struct{} +type unsafeRandReader struct{} -func (r fastRandReader) Read(p []byte) (int, error) { - return fastrand.Read(p) +func (r unsafeRandReader) Read(p []byte) (n int, err error) { + // modify from https://github.com/golang/go/blob/587c3847da81aa7cfc3b3db2677c8586c94df13a/src/runtime/rand.go#L70-L89 + // Inspired by wyrand. + n = len(p) + v := randv2.Uint64() + for len(p) > 0 { + v ^= 0xa0761d6478bd642f + v *= 0xe7037ed1a0b428db + size := 8 + if len(p) < 8 { + size = len(p) + } + for i := 0; i < size; i++ { + p[i] ^= byte(v >> (8 * i)) + } + p = p[size:] + v = v>>32 | v<<32 + } + + return } -var UnsafeUUIDGenerator = uuid.NewGenWithOptions(uuid.WithRandomReader(fastRandReader{})) +var UnsafeRandReader = unsafeRandReader{} + +var UnsafeUUIDGenerator = uuid.NewGenWithOptions(uuid.WithRandomReader(UnsafeRandReader)) func NewUUIDV1() uuid.UUID { - u, _ := UnsafeUUIDGenerator.NewV1() // fastrand.Read wouldn't cause error, so ignore err is safe + u, _ := UnsafeUUIDGenerator.NewV1() // unsafeRandReader wouldn't cause error, so ignore err is safe return u } @@ -23,7 +43,7 @@ func NewUUIDV3(ns uuid.UUID, name string) uuid.UUID { } func NewUUIDV4() uuid.UUID { - u, _ := UnsafeUUIDGenerator.NewV4() // fastrand.Read wouldn't cause error, so ignore err is safe + u, _ := UnsafeUUIDGenerator.NewV4() // unsafeRandReader wouldn't cause error, so ignore err is safe return u } @@ -32,12 +52,12 @@ func NewUUIDV5(ns uuid.UUID, name string) uuid.UUID { } func NewUUIDV6() uuid.UUID { - u, _ := UnsafeUUIDGenerator.NewV6() // fastrand.Read wouldn't cause error, so ignore err is safe + u, _ := UnsafeUUIDGenerator.NewV6() // unsafeRandReader wouldn't cause error, so ignore err is safe return u } func NewUUIDV7() uuid.UUID { - u, _ := UnsafeUUIDGenerator.NewV7() // fastrand.Read wouldn't cause error, so ignore err is safe + u, _ := UnsafeUUIDGenerator.NewV7() // unsafeRandReader wouldn't cause error, so ignore err is safe return u } diff --git a/clash-meta-android/core/src/foss/golang/clash/component/dialer/tfo.go b/clash-meta-android/core/src/foss/golang/clash/component/dialer/tfo.go index 76fe94d021..bc32b38a74 100644 --- a/clash-meta-android/core/src/foss/golang/clash/component/dialer/tfo.go +++ b/clash-meta-android/core/src/foss/golang/clash/component/dialer/tfo.go @@ -5,12 +5,8 @@ import ( "io" "net" "time" - - "github.com/metacubex/tfo-go" ) -var DisableTFO = false - type tfoConn struct { net.Conn closed bool @@ -124,16 +120,3 @@ func (c *tfoConn) ReaderReplaceable() bool { func (c *tfoConn) WriterReplaceable() bool { return c.Conn != nil } - -func dialTFO(ctx context.Context, netDialer net.Dialer, network, address string) (net.Conn, error) { - ctx, cancel := context.WithTimeout(context.Background(), DefaultTCPTimeout) - dialer := tfo.Dialer{Dialer: netDialer, DisableTFO: false} - return &tfoConn{ - dialed: make(chan bool, 1), - cancel: cancel, - ctx: ctx, - dialFn: func(ctx context.Context, earlyData []byte) (net.Conn, error) { - return dialer.DialContext(ctx, network, address, earlyData) - }, - }, nil -} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/dialer/tfo_unix.go b/clash-meta-android/core/src/foss/golang/clash/component/dialer/tfo_unix.go new file mode 100644 index 0000000000..b8908849e8 --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/dialer/tfo_unix.go @@ -0,0 +1,25 @@ +//go:build unix + +package dialer + +import ( + "context" + "net" + + "github.com/metacubex/tfo-go" +) + +const DisableTFO = false + +func dialTFO(ctx context.Context, netDialer net.Dialer, network, address string) (net.Conn, error) { + ctx, cancel := context.WithTimeout(context.Background(), DefaultTCPTimeout) + dialer := tfo.Dialer{Dialer: netDialer, DisableTFO: false} + return &tfoConn{ + dialed: make(chan bool, 1), + cancel: cancel, + ctx: ctx, + dialFn: func(ctx context.Context, earlyData []byte) (net.Conn, error) { + return dialer.DialContext(ctx, network, address, earlyData) + }, + }, nil +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/dialer/tfo_windows.go b/clash-meta-android/core/src/foss/golang/clash/component/dialer/tfo_windows.go index 632661186c..f1dddcf44e 100644 --- a/clash-meta-android/core/src/foss/golang/clash/component/dialer/tfo_windows.go +++ b/clash-meta-android/core/src/foss/golang/clash/component/dialer/tfo_windows.go @@ -1,11 +1,12 @@ package dialer -import "github.com/metacubex/mihomo/constant/features" +import ( + "context" + "net" +) -func init() { - // According to MSDN, this option is available since Windows 10, 1607 - // https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596(v=vs.85).aspx - if features.WindowsMajorVersion < 10 || (features.WindowsMajorVersion == 10 && features.WindowsBuildNumber < 14393) { - DisableTFO = true - } +const DisableTFO = true + +func dialTFO(ctx context.Context, netDialer net.Dialer, network, address string) (net.Conn, error) { + return netDialer.DialContext(ctx, network, address) } diff --git a/clash-meta-android/core/src/foss/golang/clash/component/process/process_linux.go b/clash-meta-android/core/src/foss/golang/clash/component/process/process_linux.go index f817449554..4667104cc2 100644 --- a/clash-meta-android/core/src/foss/golang/clash/component/process/process_linux.go +++ b/clash-meta-android/core/src/foss/golang/clash/component/process/process_linux.go @@ -2,19 +2,23 @@ package process import ( "bytes" + "context" "encoding/binary" "fmt" "net/netip" "os" - "path" "path/filepath" "runtime" "strings" + "sync" "syscall" "unicode" "unsafe" + "github.com/metacubex/mihomo/log" + "github.com/mdlayher/netlink" + tun "github.com/metacubex/sing-tun" "golang.org/x/sys/unix" ) @@ -59,6 +63,19 @@ type inetDiagResponse struct { INode uint32 } +type MyCallback struct{} + +var ( + packageManager tun.PackageManager + once sync.Once +) + +func (cb *MyCallback) OnPackagesUpdated(packageCount int, sharedCount int) {} + +func (cb *MyCallback) NewError(ctx context.Context, err error) { + log.Warnln("%s", err) +} + func findProcessName(network string, ip netip.Addr, srcPort int) (uint32, string, error) { uid, inode, err := resolveSocketByNetlink(network, ip, srcPort) if err != nil { @@ -162,12 +179,7 @@ func resolveProcessNameByProcSearch(inode, uid uint32) (string, error) { } if runtime.GOOS == "android" { if bytes.Equal(buffer[:n], socket) { - cmdline, err := os.ReadFile(path.Join(processPath, "cmdline")) - if err != nil { - return "", err - } - - return splitCmdline(cmdline), nil + return findPackageName(uid), nil } } else { if bytes.Equal(buffer[:n], socket) { @@ -181,17 +193,29 @@ func resolveProcessNameByProcSearch(inode, uid uint32) (string, error) { return "", fmt.Errorf("process of uid(%d),inode(%d) not found", uid, inode) } -func splitCmdline(cmdline []byte) string { - cmdline = bytes.Trim(cmdline, " ") - - idx := bytes.IndexFunc(cmdline, func(r rune) bool { - return unicode.IsControl(r) || unicode.IsSpace(r) || r == ':' +func findPackageName(uid uint32) string { + once.Do(func() { + callback := &MyCallback{} + var err error + packageManager, err = tun.NewPackageManager(callback) + if err != nil { + log.Warnln("%s", err) + } + err = packageManager.Start() + if err != nil { + log.Warnln("%s", err) + return + } }) - if idx == -1 { - return filepath.Base(string(cmdline)) + if sharedPackage, loaded := packageManager.SharedPackageByID(uid % 100000); loaded { + fmt.Println(loaded) + return sharedPackage } - return filepath.Base(string(cmdline[:idx])) + if packageName, loaded := packageManager.PackageByID(uid % 100000); loaded { + return packageName + } + return "" } func isPid(s string) bool { diff --git a/clash-meta-android/core/src/foss/golang/clash/component/resolver/host.go b/clash-meta-android/core/src/foss/golang/clash/component/resolver/host.go index 53fa5924b8..34da8e9f58 100644 --- a/clash-meta-android/core/src/foss/golang/clash/component/resolver/host.go +++ b/clash-meta-android/core/src/foss/golang/clash/component/resolver/host.go @@ -11,7 +11,7 @@ import ( "github.com/metacubex/mihomo/common/utils" "github.com/metacubex/mihomo/component/resolver/hosts" "github.com/metacubex/mihomo/component/trie" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) var ( @@ -125,5 +125,5 @@ func (hv HostValue) RandIP() (netip.Addr, error) { if hv.IsDomain { return netip.Addr{}, errors.New("value type is error") } - return hv.IPs[fastrand.Intn(len(hv.IPs))], nil + return hv.IPs[randv2.IntN(len(hv.IPs))], nil } diff --git a/clash-meta-android/core/src/foss/golang/clash/component/resolver/resolver.go b/clash-meta-android/core/src/foss/golang/clash/component/resolver/resolver.go index f9b56e476b..07c68824c3 100644 --- a/clash-meta-android/core/src/foss/golang/clash/component/resolver/resolver.go +++ b/clash-meta-android/core/src/foss/golang/clash/component/resolver/resolver.go @@ -12,8 +12,8 @@ import ( "github.com/metacubex/mihomo/common/utils" "github.com/metacubex/mihomo/component/trie" + "github.com/metacubex/randv2" "github.com/miekg/dns" - "github.com/zhangyunhao116/fastrand" ) var ( @@ -93,7 +93,7 @@ func ResolveIPv4WithResolver(ctx context.Context, host string, r Resolver) (neti } else if len(ips) == 0 { return netip.Addr{}, fmt.Errorf("%w: %s", ErrIPNotFound, host) } - return ips[fastrand.Intn(len(ips))], nil + return ips[randv2.IntN(len(ips))], nil } // ResolveIPv4 with a host, return ipv4 @@ -149,7 +149,7 @@ func ResolveIPv6WithResolver(ctx context.Context, host string, r Resolver) (neti } else if len(ips) == 0 { return netip.Addr{}, fmt.Errorf("%w: %s", ErrIPNotFound, host) } - return ips[fastrand.Intn(len(ips))], nil + return ips[randv2.IntN(len(ips))], nil } func ResolveIPv6(ctx context.Context, host string) (netip.Addr, error) { @@ -200,9 +200,9 @@ func ResolveIPWithResolver(ctx context.Context, host string, r Resolver) (netip. } ipv4s, ipv6s := SortationAddr(ips) if len(ipv4s) > 0 { - return ipv4s[fastrand.Intn(len(ipv4s))], nil + return ipv4s[randv2.IntN(len(ipv4s))], nil } - return ipv6s[fastrand.Intn(len(ipv6s))], nil + return ipv6s[randv2.IntN(len(ipv6s))], nil } // ResolveIP with a host, return ip and priority return TypeA diff --git a/clash-meta-android/core/src/foss/golang/clash/component/tls/reality.go b/clash-meta-android/core/src/foss/golang/clash/component/tls/reality.go index 48da3e92ac..ff028257f7 100644 --- a/clash-meta-android/core/src/foss/golang/clash/component/tls/reality.go +++ b/clash-meta-android/core/src/foss/golang/clash/component/tls/reality.go @@ -22,8 +22,8 @@ import ( "github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/ntp" + "github.com/metacubex/randv2" utls "github.com/metacubex/utls" - "github.com/zhangyunhao116/fastrand" "golang.org/x/crypto/chacha20poly1305" "golang.org/x/crypto/hkdf" "golang.org/x/net/http2" @@ -138,13 +138,13 @@ func realityClientFallback(uConn net.Conn, serverName string, fingerprint utls.C return } request.Header.Set("User-Agent", fingerprint.Client) - request.AddCookie(&http.Cookie{Name: "padding", Value: strings.Repeat("0", fastrand.Intn(32)+30)}) + request.AddCookie(&http.Cookie{Name: "padding", Value: strings.Repeat("0", randv2.IntN(32)+30)}) response, err := client.Do(request) if err != nil { return } //_, _ = io.Copy(io.Discard, response.Body) - time.Sleep(time.Duration(5+fastrand.Int63n(10)) * time.Second) + time.Sleep(time.Duration(5+randv2.IntN(10)) * time.Second) response.Body.Close() client.CloseIdleConnections() } diff --git a/clash-meta-android/core/src/foss/golang/clash/config/config.go b/clash-meta-android/core/src/foss/golang/clash/config/config.go index 9bc0afc824..74a2053e33 100644 --- a/clash-meta-android/core/src/foss/golang/clash/config/config.go +++ b/clash-meta-android/core/src/foss/golang/clash/config/config.go @@ -716,8 +716,11 @@ func parseProxies(cfg *RawConfig) (proxies map[string]C.Proxy, providersMap map[ groupsConfig := cfg.ProxyGroup providersConfig := cfg.ProxyProvider - var proxyList []string - var AllProxies []string + var ( + proxyList []string + AllProxies []string + hasGlobal bool + ) proxiesList := list.New() groupsList := list.New() @@ -750,6 +753,9 @@ func parseProxies(cfg *RawConfig) (proxies map[string]C.Proxy, providersMap map[ if !existName { return nil, nil, fmt.Errorf("proxy group %d: missing name", idx) } + if groupName == "GLOBAL" { + hasGlobal = true + } proxyList = append(proxyList, groupName) groupsList.PushBack(mapping) } @@ -801,13 +807,15 @@ func parseProxies(cfg *RawConfig) (proxies map[string]C.Proxy, providersMap map[ pd, _ := provider.NewCompatibleProvider(provider.ReservedName, ps, hc) providersMap[provider.ReservedName] = pd - global := outboundgroup.NewSelector( - &outboundgroup.GroupCommonOption{ - Name: "GLOBAL", - }, - []providerTypes.ProxyProvider{pd}, - ) - proxies["GLOBAL"] = adapter.NewProxy(global) + if !hasGlobal { + global := outboundgroup.NewSelector( + &outboundgroup.GroupCommonOption{ + Name: "GLOBAL", + }, + []providerTypes.ProxyProvider{pd}, + ) + proxies["GLOBAL"] = adapter.NewProxy(global) + } ProxiesList = proxiesList GroupsList = groupsList if ParsingProxiesCallback != nil { diff --git a/clash-meta-android/core/src/foss/golang/clash/constant/features/version_windows.go b/clash-meta-android/core/src/foss/golang/clash/constant/features/version_windows.go index 192df950fe..2f75618835 100644 --- a/clash-meta-android/core/src/foss/golang/clash/constant/features/version_windows.go +++ b/clash-meta-android/core/src/foss/golang/clash/constant/features/version_windows.go @@ -6,5 +6,5 @@ func init() { version := windows.RtlGetVersion() WindowsMajorVersion = version.MajorVersion WindowsMinorVersion = version.MinorVersion - WindowsBuildNumber = version.MinorVersion + WindowsBuildNumber = version.BuildNumber } diff --git a/clash-meta-android/core/src/foss/golang/clash/dns/client.go b/clash-meta-android/core/src/foss/golang/clash/dns/client.go index 3b4efed105..a6f0a7d492 100644 --- a/clash-meta-android/core/src/foss/golang/clash/dns/client.go +++ b/clash-meta-android/core/src/foss/golang/clash/dns/client.go @@ -14,8 +14,8 @@ import ( C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/log" + "github.com/metacubex/randv2" D "github.com/miekg/dns" - "github.com/zhangyunhao116/fastrand" ) type client struct { @@ -65,7 +65,7 @@ func (c *client) ExchangeContext(ctx context.Context, m *D.Msg) (*D.Msg, error) } else if len(ips) == 0 { return nil, fmt.Errorf("%w: %s", resolver.ErrIPNotFound, c.host) } - ip = ips[fastrand.Intn(len(ips))] + ip = ips[randv2.IntN(len(ips))] } network := "udp" diff --git a/clash-meta-android/core/src/foss/golang/clash/docs/config.yaml b/clash-meta-android/core/src/foss/golang/clash/docs/config.yaml index 987491e349..fe8501636e 100644 --- a/clash-meta-android/core/src/foss/golang/clash/docs/config.yaml +++ b/clash-meta-android/core/src/foss/golang/clash/docs/config.yaml @@ -611,6 +611,10 @@ proxies: # socks5 # - h2 # - http/1.1 # skip-cert-verify: true + # ss-opts: # like trojan-go's `shadowsocks` config + # enabled: false + # method: aes-128-gcm # aes-128-gcm/aes-256-gcm/chacha20-ietf-poly1305 + # password: "example" - name: trojan-grpc server: server diff --git a/clash-meta-android/core/src/foss/golang/clash/go.mod b/clash-meta-android/core/src/foss/golang/clash/go.mod index ad2492ffa6..a6664b5909 100644 --- a/clash-meta-android/core/src/foss/golang/clash/go.mod +++ b/clash-meta-android/core/src/foss/golang/clash/go.mod @@ -19,11 +19,12 @@ require ( github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 github.com/mdlayher/netlink v1.7.2 github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 - github.com/metacubex/quic-go v0.44.1-0.20240521004242-fcd70d587e22 + github.com/metacubex/quic-go v0.45.1-0.20240607133845-b24f02b35a22 + github.com/metacubex/randv2 v0.2.0 github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72 github.com/metacubex/sing-shadowsocks v0.2.6 github.com/metacubex/sing-shadowsocks2 v0.2.0 - github.com/metacubex/sing-tun v0.2.7-0.20240512075008-89e7c6208eec + github.com/metacubex/sing-tun v0.2.7-0.20240521155100-e8316a45a414 github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f github.com/metacubex/sing-wireguard v0.0.0-20240321042214-224f96122a63 github.com/metacubex/tfo-go v0.0.0-20240228025757-be1269474a66 @@ -44,7 +45,6 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.9.0 github.com/wk8/go-ordered-map/v2 v2.1.8 - github.com/zhangyunhao116/fastrand v0.4.0 go.uber.org/automaxprocs v1.5.3 go4.org/netipx v0.0.0-20231129151722-fdeea329fbba golang.org/x/crypto v0.23.0 diff --git a/clash-meta-android/core/src/foss/golang/clash/go.sum b/clash-meta-android/core/src/foss/golang/clash/go.sum index 0b4b8d3caf..c75275bce0 100644 --- a/clash-meta-android/core/src/foss/golang/clash/go.sum +++ b/clash-meta-android/core/src/foss/golang/clash/go.sum @@ -104,8 +104,10 @@ github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvO github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88= github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec h1:HxreOiFTUrJXJautEo8rnE1uKTVGY8wtZepY1Tii/Nc= github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec/go.mod h1:8BVmQ+3cxjqzWElafm24rb2Ae4jRI6vAXNXWqWjfrXw= -github.com/metacubex/quic-go v0.44.1-0.20240521004242-fcd70d587e22 h1:hsQ0b2A509b6ubnLtLOcUgZ8vOb+d/667zVEJ1T2fao= -github.com/metacubex/quic-go v0.44.1-0.20240521004242-fcd70d587e22/go.mod h1:88wAATpevav4xdy5N8oejQ2cbbI6EcLYEklFeo+qywA= +github.com/metacubex/quic-go v0.45.1-0.20240607133845-b24f02b35a22 h1:dKYoWnrB5bbCMoMQit4INUDKiDcjc0Azsm3GltYf9Pw= +github.com/metacubex/quic-go v0.45.1-0.20240607133845-b24f02b35a22/go.mod h1:Yza2H7Ax1rxWPUcJx0vW+oAt9EsPuSiyQFhFabUPzwU= +github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs= +github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY= github.com/metacubex/sing v0.0.0-20240518125217-e63d65a914d1 h1:7hDHLTmjgtRoAp59STwPQpe5Pinwi4cWex+FB3Ohvco= github.com/metacubex/sing v0.0.0-20240518125217-e63d65a914d1/go.mod h1:+60H3Cm91RnL9dpVGWDPHt0zTQImO9Vfqt9a4rSambI= github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72 h1:Wr4g1HCb5Z/QIFwFiVNjO2qL+dRu25+Mdn9xtAZZ+ew= @@ -114,8 +116,8 @@ github.com/metacubex/sing-shadowsocks v0.2.6 h1:6oEB3QcsFYnNiFeoevcXrCwJ3sAablwV github.com/metacubex/sing-shadowsocks v0.2.6/go.mod h1:zIkMeSnb8Mbf4hdqhw0pjzkn1d99YJ3JQm/VBg5WMTg= github.com/metacubex/sing-shadowsocks2 v0.2.0 h1:hqwT/AfI5d5UdPefIzR6onGHJfDXs5zgOM5QSgaM/9A= github.com/metacubex/sing-shadowsocks2 v0.2.0/go.mod h1:LCKF6j1P94zN8ZS+LXRK1gmYTVGB3squivBSXAFnOg8= -github.com/metacubex/sing-tun v0.2.7-0.20240512075008-89e7c6208eec h1:K4Wq3GOdLZ/xcqwyzAt4kmYQrjokyKQ3u/Xh5Yft14U= -github.com/metacubex/sing-tun v0.2.7-0.20240512075008-89e7c6208eec/go.mod h1:4VsMwZH1IlgPGFK1ZbBomZ/B2MYkTgs2+gnBAr5GOIo= +github.com/metacubex/sing-tun v0.2.7-0.20240521155100-e8316a45a414 h1:IPxTZgQV6fVUBS8tozLMSFPHV3imYc/NbuGfp0bLQq0= +github.com/metacubex/sing-tun v0.2.7-0.20240521155100-e8316a45a414/go.mod h1:4VsMwZH1IlgPGFK1ZbBomZ/B2MYkTgs2+gnBAr5GOIo= github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f h1:QjXrHKbTMBip/C+R79bvbfr42xH1gZl3uFb0RELdZiQ= github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f/go.mod h1:olVkD4FChQ5gKMHG4ZzuD7+fMkJY1G8vwOKpRehjrmY= github.com/metacubex/sing-wireguard v0.0.0-20240321042214-224f96122a63 h1:AGyIB55UfQm/0ZH0HtQO9u3l//yjtHUpjeRjjPGfGRI= @@ -210,8 +212,6 @@ github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/ github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zhangyunhao116/fastrand v0.4.0 h1:86QB6Y+GGgLZRFRDCjMmAS28QULwspK9sgL5d1Bx3H4= -github.com/zhangyunhao116/fastrand v0.4.0/go.mod h1:vIyo6EyBhjGKpZv6qVlkPl4JVAklpMM4DSKzbAkMguA= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec/go.mod h1:BZ1RAoRPbCxum9Grlv5aeksu2H8BiKehBYooU2LFiOQ= go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= diff --git a/clash-meta-android/core/src/foss/golang/clash/listener/sing_tun/server.go b/clash-meta-android/core/src/foss/golang/clash/listener/sing_tun/server.go index 2dc6524ee3..a5edb77f63 100644 --- a/clash-meta-android/core/src/foss/golang/clash/listener/sing_tun/server.go +++ b/clash-meta-android/core/src/foss/golang/clash/listener/sing_tun/server.go @@ -24,6 +24,7 @@ import ( E "github.com/sagernet/sing/common/exceptions" F "github.com/sagernet/sing/common/format" "github.com/sagernet/sing/common/ranges" + "golang.org/x/exp/slices" ) var InterfaceName = "Meta" @@ -59,15 +60,25 @@ func CalculateInterfaceName(name string) (tunName string) { if err != nil { return } - var tunIndex int + tunIndex := 0 + indexArr := make([]int, 0, len(interfaces)) for _, netInterface := range interfaces { if strings.HasPrefix(netInterface.Name, tunName) { index, parseErr := strconv.ParseInt(netInterface.Name[len(tunName):], 10, 16) if parseErr == nil { - tunIndex = int(index) + 1 + indexArr = append(indexArr, int(index)) } } } + slices.Sort(indexArr) + indexArr = slices.Compact(indexArr) + for _, index := range indexArr { + if index == tunIndex { + tunIndex += 1 + } else { // indexArr already sorted and distinct, so this tunIndex nobody used + break + } + } tunName = F.ToString(tunName, tunIndex) return } diff --git a/clash-meta-android/core/src/foss/golang/clash/listener/tproxy/packet.go b/clash-meta-android/core/src/foss/golang/clash/listener/tproxy/packet.go index e485266515..b038d954f8 100644 --- a/clash-meta-android/core/src/foss/golang/clash/listener/tproxy/packet.go +++ b/clash-meta-android/core/src/foss/golang/clash/listener/tproxy/packet.go @@ -105,9 +105,9 @@ func listenLocalConn(rAddr, lAddr net.Addr, tunnel C.Tunnel) (*net.UDPConn, erro buf := pool.Get(pool.UDPBufferSize) br, err := lc.Read(buf) if err != nil { - pool.Put(buf) if errors.Is(err, net.ErrClosed) { log.Debugln("TProxy local conn listener exit.. rAddr=%s lAddr=%s", rAddr.String(), lAddr.String()) + pool.Put(buf) return } } diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/conns/udp/hop.go b/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/conns/udp/hop.go index eb0732f02b..0a88874921 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/conns/udp/hop.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/conns/udp/hop.go @@ -12,7 +12,7 @@ import ( "github.com/metacubex/mihomo/transport/hysteria/obfs" "github.com/metacubex/mihomo/transport/hysteria/utils" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) const ( @@ -86,7 +86,7 @@ func NewObfsUDPHopClientPacketConn(server string, serverPorts string, hopInterva serverAddrs: serverAddrs, hopInterval: hopInterval, obfs: obfs, - addrIndex: fastrand.Intn(len(serverAddrs)), + addrIndex: randv2.IntN(len(serverAddrs)), recvQueue: make(chan *udpPacket, packetQueueSize), closeChan: make(chan struct{}), bufPool: sync.Pool{ @@ -177,7 +177,7 @@ func (c *ObfsUDPHopClientPacketConn) hop(dialer utils.PacketDialer, rAddr net.Ad _ = trySetPacketConnWriteBuffer(c.currentConn, c.writeBufferSize) } go c.recvRoutine(c.currentConn) - c.addrIndex = fastrand.Intn(len(c.serverAddrs)) + c.addrIndex = randv2.IntN(len(c.serverAddrs)) } func (c *ObfsUDPHopClientPacketConn) ReadFrom(b []byte) (int, net.Addr, error) { diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/conns/wechat/obfs.go b/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/conns/wechat/obfs.go index 4266d268ca..c5ec47ee91 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/conns/wechat/obfs.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/conns/wechat/obfs.go @@ -9,7 +9,7 @@ import ( "github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/transport/hysteria/obfs" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) const udpBufferSize = 65535 @@ -31,7 +31,7 @@ func NewObfsWeChatUDPConn(orig net.PacketConn, obfs obfs.Obfuscator) *ObfsWeChat obfs: obfs, readBuf: make([]byte, udpBufferSize), writeBuf: make([]byte, udpBufferSize), - sn: fastrand.Uint32() & 0xFFFF, + sn: randv2.Uint32() & 0xFFFF, } } diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/core/client.go b/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/core/client.go index 97c9225e37..60db8fdf45 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/core/client.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/core/client.go @@ -19,7 +19,7 @@ import ( "github.com/lunixbochs/struc" "github.com/metacubex/quic-go" "github.com/metacubex/quic-go/congestion" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) var ( @@ -405,7 +405,7 @@ func (c *quicPktConn) WriteTo(p []byte, addr string) error { var errSize *quic.DatagramTooLargeError if errors.As(err, &errSize) { // need to frag - msg.MsgID = uint16(fastrand.Intn(0xFFFF)) + 1 // msgID must be > 0 when fragCount > 1 + msg.MsgID = uint16(randv2.IntN(0xFFFF)) + 1 // msgID must be > 0 when fragCount > 1 fragMsgs := fragUDPMessage(msg, int(errSize.MaxDatagramPayloadSize)) for _, fragMsg := range fragMsgs { msgBuf.Reset() diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/obfs/xplus.go b/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/obfs/xplus.go index 171bf28186..4d1e3f2944 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/obfs/xplus.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/hysteria/obfs/xplus.go @@ -1,9 +1,8 @@ package obfs import ( + "crypto/rand" "crypto/sha256" - - "github.com/zhangyunhao116/fastrand" ) // [salt][obfuscated payload] @@ -35,7 +34,7 @@ func (x *XPlusObfuscator) Deobfuscate(in []byte, out []byte) int { } func (x *XPlusObfuscator) Obfuscate(in []byte, out []byte) int { - _, _ = fastrand.Read(out[:saltLen]) // salt + _, _ = rand.Read(out[:saltLen]) // salt // Obfuscate the payload key := sha256.Sum256(append(x.Key, out[:saltLen]...)) for i, c := range in { diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/simple-obfs/http.go b/clash-meta-android/core/src/foss/golang/clash/transport/simple-obfs/http.go index a38b1d6971..9c3f8e0029 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/simple-obfs/http.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/simple-obfs/http.go @@ -2,6 +2,7 @@ package obfs import ( "bytes" + "crypto/rand" "encoding/base64" "fmt" "io" @@ -10,7 +11,7 @@ import ( "github.com/metacubex/mihomo/common/pool" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) // HTTPObfs is shadowsocks http simple-obfs implementation @@ -64,12 +65,12 @@ func (ho *HTTPObfs) Read(b []byte) (int, error) { func (ho *HTTPObfs) Write(b []byte) (int, error) { if ho.firstRequest { randBytes := make([]byte, 16) - fastrand.Read(randBytes) + rand.Read(randBytes) req, err := http.NewRequest("GET", fmt.Sprintf("http://%s/", ho.host), bytes.NewBuffer(b[:])) if err != nil { return 0, err } - req.Header.Set("User-Agent", fmt.Sprintf("curl/7.%d.%d", fastrand.Int()%54, fastrand.Int()%2)) + req.Header.Set("User-Agent", fmt.Sprintf("curl/7.%d.%d", randv2.Int()%54, randv2.Int()%2)) req.Header.Set("Upgrade", "websocket") req.Header.Set("Connection", "Upgrade") req.Host = ho.host diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/simple-obfs/tls.go b/clash-meta-android/core/src/foss/golang/clash/transport/simple-obfs/tls.go index 78317f0a37..a0cbc35038 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/simple-obfs/tls.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/simple-obfs/tls.go @@ -2,14 +2,13 @@ package obfs import ( "bytes" + "crypto/rand" "encoding/binary" "io" "net" "time" "github.com/metacubex/mihomo/common/pool" - - "github.com/zhangyunhao116/fastrand" ) const ( @@ -127,8 +126,8 @@ func NewTLSObfs(conn net.Conn, server string) net.Conn { func makeClientHelloMsg(data []byte, server string) []byte { random := make([]byte, 28) sessionID := make([]byte, 32) - fastrand.Read(random) - fastrand.Read(sessionID) + rand.Read(random) + rand.Read(sessionID) buf := &bytes.Buffer{} diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/ssr/obfs/http_simple.go b/clash-meta-android/core/src/foss/golang/clash/transport/ssr/obfs/http_simple.go index 359ca34272..d59b490d46 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/ssr/obfs/http_simple.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/ssr/obfs/http_simple.go @@ -10,7 +10,7 @@ import ( "github.com/metacubex/mihomo/common/pool" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) func init() { @@ -82,7 +82,7 @@ func (c *httpConn) Write(b []byte) (int, error) { bLength := len(b) headDataLength := bLength if bLength-headLength > 64 { - headDataLength = headLength + fastrand.Intn(65) + headDataLength = headLength + randv2.IntN(65) } headData := b[:headDataLength] b = b[headDataLength:] @@ -100,7 +100,7 @@ func (c *httpConn) Write(b []byte) (int, error) { } } hosts := strings.Split(host, ",") - host = hosts[fastrand.Intn(len(hosts))] + host = hosts[randv2.IntN(len(hosts))] buf := pool.GetBuffer() defer pool.PutBuffer(buf) @@ -119,7 +119,7 @@ func (c *httpConn) Write(b []byte) (int, error) { buf.WriteString(body + "\r\n\r\n") } else { buf.WriteString("User-Agent: ") - buf.WriteString(userAgent[fastrand.Intn(len(userAgent))]) + buf.WriteString(userAgent[randv2.IntN(len(userAgent))]) buf.WriteString("\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.8\r\nAccept-Encoding: gzip, deflate\r\n") if c.post { packBoundary(buf) @@ -147,7 +147,7 @@ func packBoundary(buf *bytes.Buffer) { buf.WriteString("Content-Type: multipart/form-data; boundary=") set := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" for i := 0; i < 32; i++ { - buf.WriteByte(set[fastrand.Intn(62)]) + buf.WriteByte(set[randv2.IntN(62)]) } buf.WriteString("\r\n") } diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/ssr/obfs/random_head.go b/clash-meta-android/core/src/foss/golang/clash/transport/ssr/obfs/random_head.go index 9a2072fe44..a5ad2dabc9 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/ssr/obfs/random_head.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/ssr/obfs/random_head.go @@ -1,13 +1,14 @@ package obfs import ( + "crypto/rand" "encoding/binary" "hash/crc32" "net" "github.com/metacubex/mihomo/common/pool" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) func init() { @@ -54,10 +55,10 @@ func (c *randomHeadConn) Write(b []byte) (int, error) { c.buf = append(c.buf, b...) if !c.hasSentHeader { c.hasSentHeader = true - dataLength := fastrand.Intn(96) + 4 + dataLength := randv2.IntN(96) + 4 buf := pool.Get(dataLength + 4) defer pool.Put(buf) - fastrand.Read(buf[:dataLength]) + rand.Read(buf[:dataLength]) binary.LittleEndian.PutUint32(buf[dataLength:], 0xffffffff-crc32.ChecksumIEEE(buf[:dataLength])) _, err := c.Conn.Write(buf) return len(b), err diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/ssr/obfs/tls1.2_ticket_auth.go b/clash-meta-android/core/src/foss/golang/clash/transport/ssr/obfs/tls1.2_ticket_auth.go index d5e3ca8875..d5955edc34 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/ssr/obfs/tls1.2_ticket_auth.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/ssr/obfs/tls1.2_ticket_auth.go @@ -3,6 +3,7 @@ package obfs import ( "bytes" "crypto/hmac" + "crypto/rand" "encoding/binary" "net" "strings" @@ -11,7 +12,7 @@ import ( "github.com/metacubex/mihomo/common/pool" "github.com/metacubex/mihomo/transport/ssr/tools" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) func init() { @@ -26,7 +27,7 @@ type tls12Ticket struct { func newTLS12Ticket(b *Base) Obfs { r := &tls12Ticket{Base: b, authData: &authData{}} - fastrand.Read(r.clientID[:]) + rand.Read(r.clientID[:]) return r } @@ -91,7 +92,7 @@ func (c *tls12TicketConn) Write(b []byte) (int, error) { buf := pool.GetBuffer() defer pool.PutBuffer(buf) for len(b) > 2048 { - size := fastrand.Intn(4096) + 100 + size := randv2.IntN(4096) + 100 if len(b) < size { size = len(b) } @@ -197,7 +198,7 @@ func packSNIData(buf *bytes.Buffer, u string) { } func (c *tls12TicketConn) packTicketBuf(buf *bytes.Buffer, u string) { - length := 16 * (fastrand.Intn(17) + 8) + length := 16 * (randv2.IntN(17) + 8) buf.Write([]byte{0, 0x23}) binary.Write(buf, binary.BigEndian, uint16(length)) tools.AppendRandBytes(buf, length) @@ -222,6 +223,6 @@ func (t *tls12Ticket) getHost() string { host = "" } hosts := strings.Split(host, ",") - host = hosts[fastrand.Intn(len(hosts))] + host = hosts[randv2.IntN(len(hosts))] return host } diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/auth_aes128_sha1.go b/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/auth_aes128_sha1.go index 6ee4160e33..cfd555102c 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/auth_aes128_sha1.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/auth_aes128_sha1.go @@ -2,6 +2,7 @@ package protocol import ( "bytes" + "crypto/rand" "encoding/binary" "math" "net" @@ -13,7 +14,7 @@ import ( "github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/transport/ssr/tools" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) type ( @@ -66,7 +67,7 @@ func (a *authAES128) initUserData() { } if len(a.userKey) == 0 { a.userKey = a.Key - fastrand.Read(a.userID[:]) + rand.Read(a.userID[:]) } } @@ -200,7 +201,7 @@ func (a *authAES128) packData(poolBuf *bytes.Buffer, data []byte, fullDataLength } func trapezoidRandom(max int, d float64) int { - base := fastrand.Float64() + base := randv2.Float64() if d-0 > 1e-6 { a := 1 - d base = (math.Sqrt(a*a+4*d*base) - a) / (2 * d) @@ -221,10 +222,10 @@ func (a *authAES128) getRandDataLengthForPackData(dataLength, fullDataLength int if revLength > -1460 { return trapezoidRandom(revLength+1460, -0.3) } - return fastrand.Intn(32) + return randv2.IntN(32) } if dataLength > 900 { - return fastrand.Intn(revLength) + return randv2.IntN(revLength) } return trapezoidRandom(revLength, -0.3) } @@ -249,7 +250,7 @@ func (a *authAES128) packAuthData(poolBuf *bytes.Buffer, data []byte) { copy(macKey, a.iv) copy(macKey[len(a.iv):], a.Key) - poolBuf.WriteByte(byte(fastrand.Intn(256))) + poolBuf.WriteByte(byte(randv2.IntN(256))) poolBuf.Write(a.hmac(macKey, poolBuf.Bytes())[:6]) poolBuf.Write(a.userID[:]) err := a.authData.putEncryptedData(poolBuf, a.userKey, [2]int{packedAuthDataLength, randDataLength}, a.salt) @@ -265,9 +266,9 @@ func (a *authAES128) packAuthData(poolBuf *bytes.Buffer, data []byte) { func (a *authAES128) getRandDataLengthForPackAuthData(size int) int { if size > 400 { - return fastrand.Intn(512) + return randv2.IntN(512) } - return fastrand.Intn(1024) + return randv2.IntN(1024) } func (a *authAES128) packRandData(poolBuf *bytes.Buffer, size int) { diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/auth_sha1_v4.go b/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/auth_sha1_v4.go index ed1a39f189..1c616c3fc2 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/auth_sha1_v4.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/auth_sha1_v4.go @@ -11,7 +11,7 @@ import ( "github.com/metacubex/mihomo/common/pool" "github.com/metacubex/mihomo/transport/ssr/tools" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) func init() { @@ -178,7 +178,7 @@ func (a *authSHA1V4) getRandDataLength(size int) int { return 0 } if size > 400 { - return fastrand.Intn(256) + return randv2.IntN(256) } - return fastrand.Intn(512) + return randv2.IntN(512) } diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/base.go b/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/base.go index e26a65875a..798701777e 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/base.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/base.go @@ -4,6 +4,7 @@ import ( "bytes" "crypto/aes" "crypto/cipher" + "crypto/rand" "encoding/base64" "encoding/binary" "sync" @@ -13,7 +14,7 @@ import ( "github.com/metacubex/mihomo/log" "github.com/metacubex/mihomo/transport/shadowsocks/core" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) type Base struct { @@ -38,8 +39,8 @@ func (a *authData) next() *authData { a.mutex.Lock() defer a.mutex.Unlock() if a.connectionID > 0xff000000 || a.connectionID == 0 { - fastrand.Read(a.clientID[:]) - a.connectionID = fastrand.Uint32() & 0xffffff + rand.Read(a.clientID[:]) + a.connectionID = randv2.Uint32() & 0xffffff } a.connectionID++ copy(r.clientID[:], a.clientID[:]) diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/protocol.go b/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/protocol.go index a04e6bd4d3..ad6bf6ba77 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/protocol.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/ssr/protocol/protocol.go @@ -8,7 +8,7 @@ import ( N "github.com/metacubex/mihomo/common/net" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) var ( @@ -71,7 +71,7 @@ func getHeadSize(b []byte, defaultValue int) int { func getDataLength(b []byte) int { bLength := len(b) - dataLength := getHeadSize(b, 30) + fastrand.Intn(32) + dataLength := getHeadSize(b, 30) + randv2.IntN(32) if bLength < dataLength { return bLength } diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/tuic/congestion/bbr_sender.go b/clash-meta-android/core/src/foss/golang/clash/transport/tuic/congestion/bbr_sender.go index 6cea9355fb..5a8633621f 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/tuic/congestion/bbr_sender.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/tuic/congestion/bbr_sender.go @@ -9,7 +9,7 @@ import ( "github.com/metacubex/quic-go" "github.com/metacubex/quic-go/congestion" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) const ( @@ -716,7 +716,7 @@ func (b *bbrSender) EnterProbeBandwidthMode(now time.Time) { // Pick a random offset for the gain cycle out of {0, 2..7} range. 1 is // excluded because in that case increased gain and decreased gain would not // follow each other. - b.cycleCurrentOffset = fastrand.Int() % (GainCycleLength - 1) + b.cycleCurrentOffset = randv2.Int() % (GainCycleLength - 1) if b.cycleCurrentOffset >= 1 { b.cycleCurrentOffset += 1 } diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/tuic/congestion_v2/bbr_sender.go b/clash-meta-android/core/src/foss/golang/clash/transport/tuic/congestion_v2/bbr_sender.go index 54705978cc..d8852fbc96 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/tuic/congestion_v2/bbr_sender.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/tuic/congestion_v2/bbr_sender.go @@ -9,7 +9,7 @@ import ( "github.com/metacubex/quic-go" "github.com/metacubex/quic-go/congestion" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) // BbrSender implements BBR congestion control algorithm. BBR aims to estimate @@ -62,7 +62,7 @@ const ( // Flag. defaultStartupFullLossCount = 8 quicBbr2DefaultLossThreshold = 0.02 - maxBbrBurstPackets = 3 + maxBbrBurstPackets = 10 ) type bbrMode int @@ -334,6 +334,8 @@ func (b *bbrSender) OnPacketSent( } b.sampler.OnPacketSent(sentTime, packetNumber, bytes, bytesInFlight, isRetransmittable) + + b.maybeAppLimited(bytesInFlight) } // CanSend implements the SendAlgorithm interface. @@ -413,8 +415,6 @@ func (b *bbrSender) OnCongestionEventEx(priorInFlight congestion.ByteCount, even // packet in lost_packets. var lastPacketSendState sendTimeState - b.maybeApplimited(priorInFlight) - // Update bytesInFlight b.bytesInFlight = priorInFlight for _, p := range ackedPackets { @@ -541,7 +541,7 @@ func (b *bbrSender) setDrainGain(drainGain float64) { b.drainGain = drainGain } -// What's the current estimated bandwidth in bytes per second. +// Get the current bandwidth estimate. Note that Bandwidth is in bits per second. func (b *bbrSender) bandwidthEstimate() Bandwidth { return b.maxBandwidth.GetBest() } @@ -620,7 +620,7 @@ func (b *bbrSender) enterProbeBandwidthMode(now time.Time) { // Pick a random offset for the gain cycle out of {0, 2..7} range. 1 is // excluded because in that case increased gain and decreased gain would not // follow each other. - b.cycleCurrentOffset = int(fastrand.Int31n(congestion.PacketsPerConnectionID)) % (gainCycleLength - 1) + b.cycleCurrentOffset = int(randv2.Int32N(congestion.PacketsPerConnectionID)) % (gainCycleLength - 1) if b.cycleCurrentOffset >= 1 { b.cycleCurrentOffset += 1 } @@ -700,14 +700,13 @@ func (b *bbrSender) checkIfFullBandwidthReached(lastPacketSendState *sendTimeSta } } -func (b *bbrSender) maybeApplimited(bytesInFlight congestion.ByteCount) { +func (b *bbrSender) maybeAppLimited(bytesInFlight congestion.ByteCount) { congestionWindow := b.GetCongestionWindow() if bytesInFlight >= congestionWindow { return } availableBytes := congestionWindow - bytesInFlight - drainLimited := b.mode == bbrModeDrain && bytesInFlight > congestionWindow/2 - if !drainLimited || availableBytes > maxBbrBurstPackets*b.maxDatagramSize { + if availableBytes > maxBbrBurstPackets*b.maxDatagramSize { b.sampler.OnAppLimited() } } diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/tuic/v4/client.go b/clash-meta-android/core/src/foss/golang/clash/transport/tuic/v4/client.go index 5c9c889cff..62b419b7a5 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/tuic/v4/client.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/tuic/v4/client.go @@ -20,8 +20,8 @@ import ( "github.com/metacubex/mihomo/transport/tuic/common" "github.com/metacubex/quic-go" + "github.com/metacubex/randv2" "github.com/puzpuzpuz/xsync/v3" - "github.com/zhangyunhao116/fastrand" ) type ClientOption struct { @@ -367,7 +367,7 @@ func (t *clientImpl) ListenPacketWithDialer(ctx context.Context, metadata *C.Met pipe1, pipe2 := N.Pipe() var connId uint32 for { - connId = fastrand.Uint32() + connId = randv2.Uint32() _, loaded := t.udpInputMap.LoadOrStore(connId, pipe1) if !loaded { break diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/tuic/v5/client.go b/clash-meta-android/core/src/foss/golang/clash/transport/tuic/v5/client.go index 89454add19..a3c13d2b29 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/tuic/v5/client.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/tuic/v5/client.go @@ -20,8 +20,8 @@ import ( "github.com/metacubex/mihomo/transport/tuic/common" "github.com/metacubex/quic-go" + "github.com/metacubex/randv2" "github.com/puzpuzpuz/xsync/v3" - "github.com/zhangyunhao116/fastrand" ) type ClientOption struct { @@ -351,7 +351,7 @@ func (t *clientImpl) ListenPacketWithDialer(ctx context.Context, metadata *C.Met pipe1, pipe2 := N.Pipe() var connId uint16 for { - connId = uint16(fastrand.Intn(0xFFFF)) + connId = uint16(randv2.IntN(0xFFFF)) _, loaded := t.udpInputMap.LoadOrStore(connId, pipe1) if !loaded { break diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/tuic/v5/packet.go b/clash-meta-android/core/src/foss/golang/clash/transport/tuic/v5/packet.go index 5608db81f7..8281a11eff 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/tuic/v5/packet.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/tuic/v5/packet.go @@ -12,7 +12,7 @@ import ( "github.com/metacubex/mihomo/transport/tuic/common" "github.com/metacubex/quic-go" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) type quicStreamPacketConn struct { @@ -157,7 +157,7 @@ func (q *quicStreamPacketConn) WriteTo(p []byte, addr net.Addr) (n int, err erro if err != nil { return } - pktId := uint16(fastrand.Uint32()) + pktId := uint16(randv2.Uint32()) packet := NewPacket(q.connId, pktId, 1, 0, uint16(len(p)), address, p) switch q.udpRelayMode { case common.QUIC: diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/vless/vision/padding.go b/clash-meta-android/core/src/foss/golang/clash/transport/vless/vision/padding.go index e5f9dc85e2..dd9cb261a3 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/vless/vision/padding.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/vless/vision/padding.go @@ -8,7 +8,7 @@ import ( "github.com/metacubex/mihomo/log" "github.com/gofrs/uuid/v5" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) const ( @@ -25,9 +25,9 @@ func WriteWithPadding(buffer *buf.Buffer, p []byte, command byte, userUUID *uuid if contentLen < 900 { if paddingTLS { //log.Debugln("long padding") - paddingLen = fastrand.Int31n(500) + 900 - contentLen + paddingLen = randv2.Int32N(500) + 900 - contentLen } else { - paddingLen = fastrand.Int31n(256) + paddingLen = randv2.Int32N(256) } } if userUUID != nil { @@ -49,9 +49,9 @@ func ApplyPadding(buffer *buf.Buffer, command byte, userUUID *uuid.UUID, padding if contentLen < 900 { if paddingTLS { //log.Debugln("long padding") - paddingLen = fastrand.Int31n(500) + 900 - contentLen + paddingLen = randv2.Int32N(500) + 900 - contentLen } else { - paddingLen = fastrand.Int31n(256) + paddingLen = randv2.Int32N(256) } } diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/vmess/conn.go b/clash-meta-android/core/src/foss/golang/clash/transport/vmess/conn.go index 292137abc3..b65a447d33 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/vmess/conn.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/vmess/conn.go @@ -6,6 +6,7 @@ import ( "crypto/cipher" "crypto/hmac" "crypto/md5" + "crypto/rand" "crypto/sha256" "encoding/binary" "errors" @@ -14,7 +15,7 @@ import ( "net" "time" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" "golang.org/x/crypto/chacha20poly1305" ) @@ -72,7 +73,7 @@ func (vc *Conn) sendRequest() error { buf.WriteByte(vc.respV) buf.WriteByte(OptionChunkStream) - p := fastrand.Intn(16) + p := randv2.IntN(16) // P Sec Reserve Cmd buf.WriteByte(byte(p<<4) | byte(vc.security)) buf.WriteByte(0) @@ -90,7 +91,7 @@ func (vc *Conn) sendRequest() error { // padding if p > 0 { padding := make([]byte, p) - fastrand.Read(padding) + rand.Read(padding) buf.Write(padding) } @@ -196,7 +197,7 @@ func hashTimestamp(t time.Time) []byte { // newConn return a Conn instance func newConn(conn net.Conn, id *ID, dst *DstAddr, security Security, isAead bool) (*Conn, error) { randBytes := make([]byte, 33) - fastrand.Read(randBytes) + rand.Read(randBytes) reqBodyIV := make([]byte, 16) reqBodyKey := make([]byte, 16) copy(reqBodyIV[:], randBytes[:16]) diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/vmess/h2.go b/clash-meta-android/core/src/foss/golang/clash/transport/vmess/h2.go index f91c276626..a39ec5d992 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/vmess/h2.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/vmess/h2.go @@ -7,7 +7,7 @@ import ( "net/http" "net/url" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" "golang.org/x/net/http2" ) @@ -27,7 +27,7 @@ type H2Config struct { func (hc *h2Conn) establishConn() error { preader, pwriter := io.Pipe() - host := hc.cfg.Hosts[fastrand.Intn(len(hc.cfg.Hosts))] + host := hc.cfg.Hosts[randv2.IntN(len(hc.cfg.Hosts))] path := hc.cfg.Path // TODO: connect use VMess Host instead of H2 Host req := http.Request{ diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/vmess/http.go b/clash-meta-android/core/src/foss/golang/clash/transport/vmess/http.go index 4a1b93ecd8..3c66fe6b24 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/vmess/http.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/vmess/http.go @@ -11,7 +11,7 @@ import ( "github.com/metacubex/mihomo/common/utils" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) type httpConn struct { @@ -59,10 +59,10 @@ func (hc *httpConn) Write(b []byte) (int, error) { return -1, errors.New("path is empty") } - path := hc.cfg.Path[fastrand.Intn(len(hc.cfg.Path))] + path := hc.cfg.Path[randv2.IntN(len(hc.cfg.Path))] host := hc.cfg.Host if header := hc.cfg.Headers["Host"]; len(header) != 0 { - host = header[fastrand.Intn(len(header))] + host = header[randv2.IntN(len(header))] } u := fmt.Sprintf("http://%s%s", net.JoinHostPort(host, "80"), path) @@ -71,7 +71,7 @@ func (hc *httpConn) Write(b []byte) (int, error) { return 0, err } for key, list := range hc.cfg.Headers { - req.Header.Set(key, list[fastrand.Intn(len(list))]) + req.Header.Set(key, list[randv2.IntN(len(list))]) } req.ContentLength = int64(len(b)) if err := req.Write(hc.Conn); err != nil { diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/vmess/vmess.go b/clash-meta-android/core/src/foss/golang/clash/transport/vmess/vmess.go index 7c587c6a0e..22c77ab7d5 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/vmess/vmess.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/vmess/vmess.go @@ -8,7 +8,7 @@ import ( "github.com/metacubex/mihomo/common/utils" "github.com/gofrs/uuid/v5" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) // Version of vmess @@ -78,7 +78,7 @@ type Config struct { // StreamConn return a Conn with net.Conn and DstAddr func (c *Client) StreamConn(conn net.Conn, dst *DstAddr) (net.Conn, error) { - r := fastrand.Intn(len(c.user)) + r := randv2.IntN(len(c.user)) return newConn(conn, c.user[r], dst, c.security, c.isAead) } diff --git a/clash-meta-android/core/src/foss/golang/clash/transport/vmess/websocket.go b/clash-meta-android/core/src/foss/golang/clash/transport/vmess/websocket.go index f69141998a..ca3a57b793 100644 --- a/clash-meta-android/core/src/foss/golang/clash/transport/vmess/websocket.go +++ b/clash-meta-android/core/src/foss/golang/clash/transport/vmess/websocket.go @@ -4,6 +4,7 @@ import ( "bufio" "bytes" "context" + "crypto/rand" "crypto/sha1" "crypto/tls" "encoding/base64" @@ -25,7 +26,7 @@ import ( "github.com/gobwas/ws" "github.com/gobwas/ws/wsutil" - "github.com/zhangyunhao116/fastrand" + "github.com/metacubex/randv2" ) type websocketConn struct { @@ -150,7 +151,7 @@ func (wsc *websocketConn) WriteBuffer(buffer *buf.Buffer) error { } if wsc.state.ClientSide() { - maskKey := fastrand.Uint32() + maskKey := randv2.Uint32() binary.LittleEndian.PutUint32(header[1+payloadBitLength:], maskKey) N.MaskWebSocket(maskKey, data) } @@ -398,7 +399,7 @@ func streamWebsocketConn(ctx context.Context, conn net.Conn, c *WebsocketConfig, const nonceKeySize = 16 // NOTE: bts does not escape. bts := make([]byte, nonceKeySize) - if _, err = fastrand.Read(bts); err != nil { + if _, err = rand.Read(bts); err != nil { return nil, fmt.Errorf("rand read error: %w", err) } secKey = base64.StdEncoding.EncodeToString(bts) diff --git a/clash-meta-android/core/src/foss/golang/go.mod b/clash-meta-android/core/src/foss/golang/go.mod index f5e3640c99..7694c1dba9 100644 --- a/clash-meta-android/core/src/foss/golang/go.mod +++ b/clash-meta-android/core/src/foss/golang/go.mod @@ -47,11 +47,12 @@ require ( github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 // indirect github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec // indirect github.com/metacubex/mihomo v1.7.0 // indirect - github.com/metacubex/quic-go v0.44.1-0.20240521004242-fcd70d587e22 // indirect + github.com/metacubex/quic-go v0.45.1-0.20240607133845-b24f02b35a22 // indirect + github.com/metacubex/randv2 v0.2.0 // indirect github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72 // indirect github.com/metacubex/sing-shadowsocks v0.2.6 // indirect github.com/metacubex/sing-shadowsocks2 v0.2.0 // indirect - github.com/metacubex/sing-tun v0.2.7-0.20240512075008-89e7c6208eec // indirect + github.com/metacubex/sing-tun v0.2.7-0.20240521155100-e8316a45a414 // indirect github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f // indirect github.com/metacubex/sing-wireguard v0.0.0-20240321042214-224f96122a63 // indirect github.com/metacubex/tfo-go v0.0.0-20240228025757-be1269474a66 // indirect @@ -87,7 +88,6 @@ require ( github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 // indirect github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - github.com/zhangyunhao116/fastrand v0.4.0 // indirect gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect go.uber.org/mock v0.4.0 // indirect go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect @@ -106,7 +106,7 @@ require ( lukechampine.com/blake3 v1.3.0 // indirect ) -replace github.com/sagernet/sing => github.com/metacubex/sing v0.0.0-20240111014253-f1818b6a82b2 +replace github.com/sagernet/sing => github.com/metacubex/sing v0.0.0-20240518125217-e63d65a914d1 replace cfa => ../../main/golang diff --git a/clash-meta-android/core/src/foss/golang/go.sum b/clash-meta-android/core/src/foss/golang/go.sum index f6ddc7b7d0..1cfaefffc9 100644 --- a/clash-meta-android/core/src/foss/golang/go.sum +++ b/clash-meta-android/core/src/foss/golang/go.sum @@ -98,18 +98,20 @@ github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvO github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88= github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec h1:HxreOiFTUrJXJautEo8rnE1uKTVGY8wtZepY1Tii/Nc= github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec/go.mod h1:8BVmQ+3cxjqzWElafm24rb2Ae4jRI6vAXNXWqWjfrXw= -github.com/metacubex/quic-go v0.44.1-0.20240521004242-fcd70d587e22 h1:hsQ0b2A509b6ubnLtLOcUgZ8vOb+d/667zVEJ1T2fao= -github.com/metacubex/quic-go v0.44.1-0.20240521004242-fcd70d587e22/go.mod h1:88wAATpevav4xdy5N8oejQ2cbbI6EcLYEklFeo+qywA= -github.com/metacubex/sing v0.0.0-20240111014253-f1818b6a82b2 h1:upEO8dt9WDBavhgcgkXB3hRcwVNbkTbnd+xyzy6ZQZo= -github.com/metacubex/sing v0.0.0-20240111014253-f1818b6a82b2/go.mod h1:9pfuAH6mZfgnz/YjP6xu5sxx882rfyjpcrTdUpd6w3g= +github.com/metacubex/quic-go v0.45.1-0.20240607133845-b24f02b35a22 h1:dKYoWnrB5bbCMoMQit4INUDKiDcjc0Azsm3GltYf9Pw= +github.com/metacubex/quic-go v0.45.1-0.20240607133845-b24f02b35a22/go.mod h1:Yza2H7Ax1rxWPUcJx0vW+oAt9EsPuSiyQFhFabUPzwU= +github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs= +github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY= +github.com/metacubex/sing v0.0.0-20240518125217-e63d65a914d1 h1:7hDHLTmjgtRoAp59STwPQpe5Pinwi4cWex+FB3Ohvco= +github.com/metacubex/sing v0.0.0-20240518125217-e63d65a914d1/go.mod h1:+60H3Cm91RnL9dpVGWDPHt0zTQImO9Vfqt9a4rSambI= github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72 h1:Wr4g1HCb5Z/QIFwFiVNjO2qL+dRu25+Mdn9xtAZZ+ew= github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72/go.mod h1:g7Mxj7b7zm7YVqD975mk/hSmrb0A0G4bVvIMr2MMzn8= github.com/metacubex/sing-shadowsocks v0.2.6 h1:6oEB3QcsFYnNiFeoevcXrCwJ3sAablwVSgtE9R3QeFQ= github.com/metacubex/sing-shadowsocks v0.2.6/go.mod h1:zIkMeSnb8Mbf4hdqhw0pjzkn1d99YJ3JQm/VBg5WMTg= github.com/metacubex/sing-shadowsocks2 v0.2.0 h1:hqwT/AfI5d5UdPefIzR6onGHJfDXs5zgOM5QSgaM/9A= github.com/metacubex/sing-shadowsocks2 v0.2.0/go.mod h1:LCKF6j1P94zN8ZS+LXRK1gmYTVGB3squivBSXAFnOg8= -github.com/metacubex/sing-tun v0.2.7-0.20240512075008-89e7c6208eec h1:K4Wq3GOdLZ/xcqwyzAt4kmYQrjokyKQ3u/Xh5Yft14U= -github.com/metacubex/sing-tun v0.2.7-0.20240512075008-89e7c6208eec/go.mod h1:4VsMwZH1IlgPGFK1ZbBomZ/B2MYkTgs2+gnBAr5GOIo= +github.com/metacubex/sing-tun v0.2.7-0.20240521155100-e8316a45a414 h1:IPxTZgQV6fVUBS8tozLMSFPHV3imYc/NbuGfp0bLQq0= +github.com/metacubex/sing-tun v0.2.7-0.20240521155100-e8316a45a414/go.mod h1:4VsMwZH1IlgPGFK1ZbBomZ/B2MYkTgs2+gnBAr5GOIo= github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f h1:QjXrHKbTMBip/C+R79bvbfr42xH1gZl3uFb0RELdZiQ= github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f/go.mod h1:olVkD4FChQ5gKMHG4ZzuD7+fMkJY1G8vwOKpRehjrmY= github.com/metacubex/sing-wireguard v0.0.0-20240321042214-224f96122a63 h1:AGyIB55UfQm/0ZH0HtQO9u3l//yjtHUpjeRjjPGfGRI= @@ -203,8 +205,6 @@ github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/ github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zhangyunhao116/fastrand v0.4.0 h1:86QB6Y+GGgLZRFRDCjMmAS28QULwspK9sgL5d1Bx3H4= -github.com/zhangyunhao116/fastrand v0.4.0/go.mod h1:vIyo6EyBhjGKpZv6qVlkPl4JVAklpMM4DSKzbAkMguA= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec/go.mod h1:BZ1RAoRPbCxum9Grlv5aeksu2H8BiKehBYooU2LFiOQ= go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= @@ -243,7 +243,7 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -260,8 +260,8 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/clash-meta-android/core/src/main/golang/go.mod b/clash-meta-android/core/src/main/golang/go.mod index 4aaac4a47a..57c23c4e00 100644 --- a/clash-meta-android/core/src/main/golang/go.mod +++ b/clash-meta-android/core/src/main/golang/go.mod @@ -14,7 +14,7 @@ require ( replace github.com/metacubex/mihomo => ../../foss/golang/clash -replace github.com/sagernet/sing => github.com/metacubex/sing v0.0.0-20240111014253-f1818b6a82b2 +replace github.com/sagernet/sing => github.com/metacubex/sing v0.0.0-20240518125217-e63d65a914d1 require ( github.com/3andne/restls-client-go v0.1.6 // indirect @@ -54,11 +54,12 @@ require ( github.com/mdlayher/socket v0.4.1 // indirect github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 // indirect github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec // indirect - github.com/metacubex/quic-go v0.44.1-0.20240521004242-fcd70d587e22 // indirect + github.com/metacubex/quic-go v0.45.1-0.20240607133845-b24f02b35a22 // indirect + github.com/metacubex/randv2 v0.2.0 // indirect github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72 // indirect github.com/metacubex/sing-shadowsocks v0.2.6 // indirect github.com/metacubex/sing-shadowsocks2 v0.2.0 // indirect - github.com/metacubex/sing-tun v0.2.7-0.20240512075008-89e7c6208eec // indirect + github.com/metacubex/sing-tun v0.2.7-0.20240521155100-e8316a45a414 // indirect github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f // indirect github.com/metacubex/sing-wireguard v0.0.0-20240321042214-224f96122a63 // indirect github.com/metacubex/tfo-go v0.0.0-20240228025757-be1269474a66 // indirect @@ -92,7 +93,6 @@ require ( github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 // indirect github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - github.com/zhangyunhao116/fastrand v0.4.0 // indirect gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect go.uber.org/mock v0.4.0 // indirect go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect diff --git a/clash-meta-android/core/src/main/golang/go.sum b/clash-meta-android/core/src/main/golang/go.sum index f6ddc7b7d0..1cfaefffc9 100644 --- a/clash-meta-android/core/src/main/golang/go.sum +++ b/clash-meta-android/core/src/main/golang/go.sum @@ -98,18 +98,20 @@ github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvO github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88= github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec h1:HxreOiFTUrJXJautEo8rnE1uKTVGY8wtZepY1Tii/Nc= github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec/go.mod h1:8BVmQ+3cxjqzWElafm24rb2Ae4jRI6vAXNXWqWjfrXw= -github.com/metacubex/quic-go v0.44.1-0.20240521004242-fcd70d587e22 h1:hsQ0b2A509b6ubnLtLOcUgZ8vOb+d/667zVEJ1T2fao= -github.com/metacubex/quic-go v0.44.1-0.20240521004242-fcd70d587e22/go.mod h1:88wAATpevav4xdy5N8oejQ2cbbI6EcLYEklFeo+qywA= -github.com/metacubex/sing v0.0.0-20240111014253-f1818b6a82b2 h1:upEO8dt9WDBavhgcgkXB3hRcwVNbkTbnd+xyzy6ZQZo= -github.com/metacubex/sing v0.0.0-20240111014253-f1818b6a82b2/go.mod h1:9pfuAH6mZfgnz/YjP6xu5sxx882rfyjpcrTdUpd6w3g= +github.com/metacubex/quic-go v0.45.1-0.20240607133845-b24f02b35a22 h1:dKYoWnrB5bbCMoMQit4INUDKiDcjc0Azsm3GltYf9Pw= +github.com/metacubex/quic-go v0.45.1-0.20240607133845-b24f02b35a22/go.mod h1:Yza2H7Ax1rxWPUcJx0vW+oAt9EsPuSiyQFhFabUPzwU= +github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs= +github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY= +github.com/metacubex/sing v0.0.0-20240518125217-e63d65a914d1 h1:7hDHLTmjgtRoAp59STwPQpe5Pinwi4cWex+FB3Ohvco= +github.com/metacubex/sing v0.0.0-20240518125217-e63d65a914d1/go.mod h1:+60H3Cm91RnL9dpVGWDPHt0zTQImO9Vfqt9a4rSambI= github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72 h1:Wr4g1HCb5Z/QIFwFiVNjO2qL+dRu25+Mdn9xtAZZ+ew= github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72/go.mod h1:g7Mxj7b7zm7YVqD975mk/hSmrb0A0G4bVvIMr2MMzn8= github.com/metacubex/sing-shadowsocks v0.2.6 h1:6oEB3QcsFYnNiFeoevcXrCwJ3sAablwVSgtE9R3QeFQ= github.com/metacubex/sing-shadowsocks v0.2.6/go.mod h1:zIkMeSnb8Mbf4hdqhw0pjzkn1d99YJ3JQm/VBg5WMTg= github.com/metacubex/sing-shadowsocks2 v0.2.0 h1:hqwT/AfI5d5UdPefIzR6onGHJfDXs5zgOM5QSgaM/9A= github.com/metacubex/sing-shadowsocks2 v0.2.0/go.mod h1:LCKF6j1P94zN8ZS+LXRK1gmYTVGB3squivBSXAFnOg8= -github.com/metacubex/sing-tun v0.2.7-0.20240512075008-89e7c6208eec h1:K4Wq3GOdLZ/xcqwyzAt4kmYQrjokyKQ3u/Xh5Yft14U= -github.com/metacubex/sing-tun v0.2.7-0.20240512075008-89e7c6208eec/go.mod h1:4VsMwZH1IlgPGFK1ZbBomZ/B2MYkTgs2+gnBAr5GOIo= +github.com/metacubex/sing-tun v0.2.7-0.20240521155100-e8316a45a414 h1:IPxTZgQV6fVUBS8tozLMSFPHV3imYc/NbuGfp0bLQq0= +github.com/metacubex/sing-tun v0.2.7-0.20240521155100-e8316a45a414/go.mod h1:4VsMwZH1IlgPGFK1ZbBomZ/B2MYkTgs2+gnBAr5GOIo= github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f h1:QjXrHKbTMBip/C+R79bvbfr42xH1gZl3uFb0RELdZiQ= github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f/go.mod h1:olVkD4FChQ5gKMHG4ZzuD7+fMkJY1G8vwOKpRehjrmY= github.com/metacubex/sing-wireguard v0.0.0-20240321042214-224f96122a63 h1:AGyIB55UfQm/0ZH0HtQO9u3l//yjtHUpjeRjjPGfGRI= @@ -203,8 +205,6 @@ github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/ github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zhangyunhao116/fastrand v0.4.0 h1:86QB6Y+GGgLZRFRDCjMmAS28QULwspK9sgL5d1Bx3H4= -github.com/zhangyunhao116/fastrand v0.4.0/go.mod h1:vIyo6EyBhjGKpZv6qVlkPl4JVAklpMM4DSKzbAkMguA= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec/go.mod h1:BZ1RAoRPbCxum9Grlv5aeksu2H8BiKehBYooU2LFiOQ= go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= @@ -243,7 +243,7 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -260,8 +260,8 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index 26779e8806..9fcb5dc4f7 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -57,8 +57,8 @@ "@typescript-eslint/parser": "7.12.0", "@vitejs/plugin-react": "4.3.0", "sass": "1.77.4", - "shiki": "1.6.2", - "vite": "5.2.12", + "shiki": "1.6.3", + "vite": "5.2.13", "vite-plugin-monaco-editor": "1.1.3", "vite-plugin-sass-dts": "1.3.22", "vite-plugin-svgr": "4.2.0", diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index e187877e73..36f42c0fb8 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -2,7 +2,7 @@ "manifest_version": 1, "latest": { "mihomo": "v1.18.5", - "mihomo_alpha": "alpha-063836f", + "mihomo_alpha": "alpha-0d4e57c", "clash_rs": "v0.1.18", "clash_premium": "2023-09-05-gdcc8d87" }, @@ -36,5 +36,5 @@ "darwin-x64": "clash-darwin-amd64-n{}.gz" } }, - "updated_at": "2024-06-05T22:20:11.986Z" + "updated_at": "2024-06-07T22:20:07.011Z" } diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json index 6c24c935aa..907a10ab95 100644 --- a/clash-nyanpasu/package.json +++ b/clash-nyanpasu/package.json @@ -106,7 +106,7 @@ "stylelint-order": "6.0.4", "stylelint-scss": "6.3.1", "tailwindcss": "3.4.4", - "tsx": "4.12.0", + "tsx": "4.14.0", "typescript": "5.4.5" }, "packageManager": "pnpm@9.2.0", diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index cdd6573ccb..086b3ddd2a 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -134,8 +134,8 @@ importers: specifier: 3.4.4 version: 3.4.4 tsx: - specifier: 4.12.0 - version: 4.12.0 + specifier: 4.14.0 + version: 4.14.0 typescript: specifier: 5.4.5 version: 5.4.5 @@ -178,7 +178,7 @@ importers: version: 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0))(react@19.0.0-rc-9d4fba0788-20240530)(types-react@19.0.0-rc.0) '@generouted/react-router': specifier: 1.19.5 - version: 1.19.5(react-router-dom@6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) + version: 1.19.5(react-router-dom@6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(vite@5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) '@juggle/resize-observer': specifier: 3.4.0 version: 3.4.0 @@ -299,28 +299,28 @@ importers: version: 7.12.0(eslint@8.57.0)(typescript@5.4.5) '@vitejs/plugin-react': specifier: 4.3.0 - version: 4.3.0(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) + version: 4.3.0(vite@5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) sass: specifier: 1.77.4 version: 1.77.4 shiki: - specifier: 1.6.2 - version: 1.6.2 + specifier: 1.6.3 + version: 1.6.3 vite: - specifier: 5.2.12 - version: 5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) + specifier: 5.2.13 + version: 5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) vite-plugin-monaco-editor: specifier: npm:vite-plugin-monaco-editor-new@1.1.3 version: vite-plugin-monaco-editor-new@1.1.3(monaco-editor@0.49.0) vite-plugin-sass-dts: specifier: 1.3.22 - version: 1.3.22(postcss@8.4.38)(prettier@3.3.1)(sass@1.77.4)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) + version: 1.3.22(postcss@8.4.38)(prettier@3.3.1)(sass@1.77.4)(vite@5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) vite-plugin-svgr: specifier: 4.2.0 - version: 4.2.0(rollup@4.17.2)(typescript@5.4.5)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) + version: 4.2.0(rollup@4.17.2)(typescript@5.4.5)(vite@5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) vite-tsconfig-paths: specifier: 4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) + version: 4.3.2(typescript@5.4.5)(vite@5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) frontend/ui: dependencies: @@ -1362,8 +1362,8 @@ packages: cpu: [x64] os: [win32] - '@shikijs/core@1.6.2': - resolution: {integrity: sha512-guW5JeDzZ7uwOjTfCOFZ2VtVXk5tmkMzBYbKGfXsmAH1qYOej49L5jQDcGmwd6/OgvpmWhzO2GNJkQIFnbwLPQ==} + '@shikijs/core@1.6.3': + resolution: {integrity: sha512-QnJKHFUW95GnlJLJGP6QLx4M69HM0KlXk+R2Y8lr/x4nAx1Yb/lsuxq4XwybuUjTxbJk+BT0g/kvn0bcsjGGHg==} '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} @@ -4353,8 +4353,8 @@ packages: shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - shiki@1.6.2: - resolution: {integrity: sha512-X3hSm5GzzBd/BmPmGfkueOUADLyBoZo1ojYQXhd+NU2VJn458yt4duaS0rVzC+WtqftSV7mTVvDw+OB9AHi3Eg==} + shiki@1.6.3: + resolution: {integrity: sha512-lE1/YGlzFY0hQSyEfsZj18xGrTWxyhFQkaiILALqTBZPbJeYFWpbUhlmTGPOupYB/qC+H6sV4UznJzcEh3WMHQ==} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -4676,8 +4676,8 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tsx@4.12.0: - resolution: {integrity: sha512-642NAWAbDqPZINjmL32Lh/B+pd8vbVj6LHPsWm09IIHqQuWhCrNfcPTjRlHFWvv3FfM4vt9NLReBIjUNj5ZhDg==} + tsx@4.14.0: + resolution: {integrity: sha512-DsDLlJlusAPyCnz07S4y0gqJoUl8GciBeYcXQd75/5DqkZ4gfjKpvAUFUzmZf62nEotkcqC7JCWrdL8d+PXSng==} engines: {node: '>=18.0.0'} hasBin: true @@ -4880,8 +4880,8 @@ packages: vite: optional: true - vite@5.2.12: - resolution: {integrity: sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==} + vite@5.2.13: + resolution: {integrity: sha512-SSq1noJfY9pR3I1TUENL3rQYDQCFqgD+lM6fTRAM8Nv6Lsg5hDLaXkjETVeBt+7vZBCMoibD+6IWnT2mJ+Zb/A==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5635,13 +5635,13 @@ snapshots: '@floating-ui/utils@0.2.2': {} - '@generouted/react-router@1.19.5(react-router-dom@6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0))': + '@generouted/react-router@1.19.5(react-router-dom@6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530)(vite@5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0))': dependencies: fast-glob: 3.3.2 - generouted: 1.19.5(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) + generouted: 1.19.5(vite@5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)) react: 19.0.0-rc-9d4fba0788-20240530 react-router-dom: 6.23.1(react-dom@19.0.0-rc-9d4fba0788-20240530(react@19.0.0-rc-9d4fba0788-20240530))(react@19.0.0-rc-9d4fba0788-20240530) - vite: 5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) + vite: 5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) '@humanwhocodes/config-array@0.11.14': dependencies: @@ -5948,7 +5948,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.17.2': optional: true - '@shikijs/core@1.6.2': {} + '@shikijs/core@1.6.3': {} '@sindresorhus/is@4.6.0': {} @@ -6282,14 +6282,14 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.3.0(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0))': + '@vitejs/plugin-react@4.3.0(vite@5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0))': dependencies: '@babel/core': 7.24.5 '@babel/plugin-transform-react-jsx-self': 7.24.5(@babel/core@7.24.5) '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.5) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) + vite: 5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) transitivePeerDependencies: - supports-color @@ -7545,9 +7545,9 @@ snapshots: functions-have-names@1.2.3: {} - generouted@1.19.5(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): + generouted@1.19.5(vite@5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): dependencies: - vite: 5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) + vite: 5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) gensync@1.0.0-beta.2: {} @@ -9265,9 +9265,9 @@ snapshots: shell-quote@1.8.1: {} - shiki@1.6.2: + shiki@1.6.3: dependencies: - '@shikijs/core': 1.6.2 + '@shikijs/core': 1.6.3 side-channel@1.0.6: dependencies: @@ -9674,7 +9674,7 @@ snapshots: tslib@2.6.2: {} - tsx@4.12.0: + tsx@4.14.0: dependencies: esbuild: 0.20.2 get-tsconfig: 4.7.5 @@ -9894,37 +9894,37 @@ snapshots: esbuild: 0.19.12 monaco-editor: 0.49.0 - vite-plugin-sass-dts@1.3.22(postcss@8.4.38)(prettier@3.3.1)(sass@1.77.4)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): + vite-plugin-sass-dts@1.3.22(postcss@8.4.38)(prettier@3.3.1)(sass@1.77.4)(vite@5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): dependencies: postcss: 8.4.38 postcss-js: 4.0.1(postcss@8.4.38) prettier: 3.3.1 sass: 1.77.4 - vite: 5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) + vite: 5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) - vite-plugin-svgr@4.2.0(rollup@4.17.2)(typescript@5.4.5)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): + vite-plugin-svgr@4.2.0(rollup@4.17.2)(typescript@5.4.5)(vite@5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.17.2) '@svgr/core': 8.1.0(typescript@5.4.5) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.4.5)) - vite: 5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) + vite: 5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0)): dependencies: debug: 4.3.4 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.5) optionalDependencies: - vite: 5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) + vite: 5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0) transitivePeerDependencies: - supports-color - typescript - vite@5.2.12(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0): + vite@5.2.13(@types/node@20.14.2)(less@4.2.0)(sass@1.77.4)(stylus@0.62.0): dependencies: esbuild: 0.20.2 postcss: 8.4.38 diff --git a/clash-verge-rev/.github/build-for-linux/build.sh b/clash-verge-rev/.github/build-for-linux/build.sh index 0a7a4bc0ca..7c2411b800 100644 --- a/clash-verge-rev/.github/build-for-linux/build.sh +++ b/clash-verge-rev/.github/build-for-linux/build.sh @@ -1,8 +1,5 @@ pnpm install pnpm check $INPUT_TARGET sed -i "s/#openssl/openssl={version=\"0.10\",features=[\"vendored\"]}/g" src-tauri/Cargo.toml -if [ "$INPUT_TARGET" = "x86_64-unknown-linux-gnu" ]; then - cargo tauri build --target $INPUT_TARGET -else - cargo tauri build --target $INPUT_TARGET -b deb,rpm -fi + +cargo tauri build --target $INPUT_TARGET diff --git a/clash-verge-rev/.github/workflows/alpha.yml b/clash-verge-rev/.github/workflows/alpha.yml index 705c9f15cc..f706828b7e 100644 --- a/clash-verge-rev/.github/workflows/alpha.yml +++ b/clash-verge-rev/.github/workflows/alpha.yml @@ -43,15 +43,17 @@ jobs: with: workspaces: src-tauri + - name: Install Tauri CLI + run: cargo install --git https://github.com/tauri-apps/tauri --branch 1.x tauri-cli + - name: Install Node uses: actions/setup-node@v4 with: node-version: "20" - - uses: pnpm/action-setup@v3 + - uses: pnpm/action-setup@v4 name: Install pnpm with: - version: 9 run_install: false - name: Pnpm install and check @@ -59,12 +61,6 @@ jobs: pnpm i pnpm check ${{ matrix.target }} - - name: Download and install Apple intermediate certificates - if: matrix.os == 'macos-latest' - run: | - curl -O https://www.apple.com/certificateauthority/DeveloperIDG2CA.cer - sudo security add-trusted-cert -d -r trustRoot -k ${HOME}/Library/Keychains/login.keychain-db DeveloperIDG2CA.cer - - name: Tauri build uses: tauri-apps/tauri-action@v0 env: @@ -75,17 +71,16 @@ jobs: APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} - #加入以下内容为提交app到apple认证,当前会报错,已发邮件与apple沟通 - #APPLE_ID: ${{ secrets.APPLE_ID }} - #APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} - #APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} with: tagName: alpha releaseName: "Clash Verge Rev Alpha" releaseBody: "More new features are now supported." releaseDraft: false prerelease: true - tauriScript: pnpm + tauriScript: cargo tauri args: --target ${{ matrix.target }} - name: Portable Bundle @@ -128,17 +123,6 @@ jobs: echo "VERSION=$(cat package.json | jq '.version' | tr -d '"')" >> $GITHUB_ENV echo "BUILDTIME=$(TZ=Asia/Shanghai date)" >> $GITHUB_ENV - - name: Upload Release - if: startsWith(matrix.target, 'x86_64') - uses: softprops/action-gh-release@v2 - with: - tag_name: alpha - name: "Clash Verge Rev Alpha" - body: "More new features are now supported." - prerelease: true - token: ${{ secrets.GITHUB_TOKEN }} - files: src-tauri/target/${{ matrix.target }}/release/bundle/appimage/*.AppImage* - - name: Upload Release uses: softprops/action-gh-release@v2 with: @@ -178,15 +162,17 @@ jobs: with: workspaces: src-tauri + - name: Install Tauri CLI + run: cargo install --git https://github.com/tauri-apps/tauri --branch 1.x tauri-cli + - name: Install Node uses: actions/setup-node@v4 with: node-version: "20" - - uses: pnpm/action-setup@v3 + - uses: pnpm/action-setup@v4 name: Install pnpm with: - version: 9 run_install: false - name: Pnpm install and check @@ -210,7 +196,7 @@ jobs: TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} with: - tauriScript: pnpm + tauriScript: cargo tauri args: --target ${{ matrix.target }} - name: Rename diff --git a/clash-verge-rev/.github/workflows/release.yml b/clash-verge-rev/.github/workflows/release.yml index e54a1fc4c1..1cb30859b2 100644 --- a/clash-verge-rev/.github/workflows/release.yml +++ b/clash-verge-rev/.github/workflows/release.yml @@ -45,10 +45,9 @@ jobs: with: node-version: "20" - - uses: pnpm/action-setup@v3 + - uses: pnpm/action-setup@v4 name: Install pnpm with: - version: 9 run_install: false - name: Pnpm install and check @@ -56,12 +55,6 @@ jobs: pnpm i pnpm check ${{ matrix.target }} - - name: Download and install Apple intermediate certificates - if: matrix.os == 'macos-latest' - run: | - curl -O https://www.apple.com/certificateauthority/DeveloperIDG2CA.cer - sudo security add-trusted-cert -d -r trustRoot -k ${HOME}/Library/Keychains/login.keychain-db DeveloperIDG2CA.cer - - name: Tauri build uses: tauri-apps/tauri-action@v0 env: @@ -69,6 +62,12 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} with: tagName: v__VERSION__ releaseName: "Clash Verge Rev v__VERSION__" @@ -106,13 +105,6 @@ jobs: NODE_OPTIONS: "--max_old_space_size=4096" TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} - APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} - #加入以下内容为提交app到apple认证,当前会报错,已发邮件与apple沟通 - #APPLE_ID: ${{ secrets.APPLE_ID }} - #APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} - #APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} with: target: ${{ matrix.target }} @@ -122,16 +114,6 @@ jobs: sudo apt-get install jq echo "VERSION=$(cat package.json | jq '.version' | tr -d '"')" >> $GITHUB_ENV - - name: Upload Release - if: startsWith(matrix.target, 'x86_64') - uses: softprops/action-gh-release@v2 - with: - tag_name: v${{env.VERSION}} - name: "Clash Verge Rev v${{env.VERSION}}" - body: "More new features are now supported." - token: ${{ secrets.GITHUB_TOKEN }} - files: src-tauri/target/${{ matrix.target }}/release/bundle/appimage/*.AppImage* - - name: Upload Release uses: softprops/action-gh-release@v2 with: @@ -175,10 +157,9 @@ jobs: with: node-version: "20" - - uses: pnpm/action-setup@v3 + - uses: pnpm/action-setup@v4 name: Install pnpm with: - version: 9 run_install: false - name: Pnpm install and check @@ -237,10 +218,9 @@ jobs: with: node-version: "20" - - uses: pnpm/action-setup@v2 + - uses: pnpm/action-setup@v4 name: Install pnpm with: - version: 9 run_install: false - name: Pnpm install @@ -263,10 +243,9 @@ jobs: with: node-version: "20" - - uses: pnpm/action-setup@v2 + - uses: pnpm/action-setup@v4 name: Install pnpm with: - version: 9 run_install: false - name: Pnpm install diff --git a/clash-verge-rev/.github/workflows/updater.yml b/clash-verge-rev/.github/workflows/updater.yml index f58e33f98c..3f144b40ad 100644 --- a/clash-verge-rev/.github/workflows/updater.yml +++ b/clash-verge-rev/.github/workflows/updater.yml @@ -7,17 +7,16 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Node uses: actions/setup-node@v4 with: node-version: "20" - - uses: pnpm/action-setup@v2 + - uses: pnpm/action-setup@v4 name: Install pnpm with: - version: 9 run_install: false - name: Pnpm install @@ -39,10 +38,9 @@ jobs: with: node-version: "20" - - uses: pnpm/action-setup@v2 + - uses: pnpm/action-setup@v4 name: Install pnpm with: - version: 9 run_install: false - name: Pnpm install diff --git a/clash-verge-rev/scripts/updater-fixed-webview2.mjs b/clash-verge-rev/scripts/updater-fixed-webview2.mjs index fdc3ac9ced..0ae00345ea 100644 --- a/clash-verge-rev/scripts/updater-fixed-webview2.mjs +++ b/clash-verge-rev/scripts/updater-fixed-webview2.mjs @@ -41,6 +41,7 @@ async function resolveUpdater() { "windows-x86_64": { signature: "", url: "" }, "windows-aarch64": { signature: "", url: "" }, "windows-x86": { signature: "", url: "" }, + "windows-i686": { signature: "", url: "" }, }, }; @@ -60,11 +61,13 @@ async function resolveUpdater() { // win32 url if (name.endsWith("x86_fixed_webview2-setup.nsis.zip")) { updateData.platforms["windows-x86"].url = browser_download_url; + updateData.platforms["windows-i686"].url = browser_download_url; } // win32 signature if (name.endsWith("x86_fixed_webview2-setup.nsis.zip.sig")) { const sig = await getSignature(browser_download_url); updateData.platforms["windows-x86"].signature = sig; + updateData.platforms["windows-i686"].signature = sig; } // win arm url diff --git a/clash-verge-rev/scripts/updater.mjs b/clash-verge-rev/scripts/updater.mjs index 4c1936bf68..34be835cbb 100644 --- a/clash-verge-rev/scripts/updater.mjs +++ b/clash-verge-rev/scripts/updater.mjs @@ -46,11 +46,13 @@ async function resolveUpdater() { "darwin-x86_64": { signature: "", url: "" }, "linux-x86_64": { signature: "", url: "" }, "linux-x86": { signature: "", url: "" }, + "linux-i686": { signature: "", url: "" }, "linux-aarch64": { signature: "", url: "" }, "linux-armv7": { signature: "", url: "" }, "windows-x86_64": { signature: "", url: "" }, "windows-aarch64": { signature: "", url: "" }, "windows-x86": { signature: "", url: "" }, + "windows-i686": { signature: "", url: "" }, }, }; @@ -72,11 +74,13 @@ async function resolveUpdater() { // win32 url if (name.endsWith("x64-setup.nsis.zip")) { updateData.platforms["windows-x86"].url = browser_download_url; + updateData.platforms["windows-i686"].url = browser_download_url; } // win32 signature if (name.endsWith("x64-setup.nsis.zip.sig")) { const sig = await getSignature(browser_download_url); updateData.platforms["windows-x86"].signature = sig; + updateData.platforms["windows-i686"].signature = sig; } // win arm url @@ -106,29 +110,22 @@ async function resolveUpdater() { // darwin url (aarch) if (name.endsWith("aarch64.app.tar.gz")) { updateData.platforms["darwin-aarch64"].url = browser_download_url; + // 使linux可以检查更新 + updateData.platforms.linux.url = browser_download_url; + updateData.platforms["linux-x86_64"].url = browser_download_url; + updateData.platforms["linux-x86"].url = browser_download_url; + updateData.platforms["linux-i686"].url = browser_download_url; + updateData.platforms["linux-aarch64"].url = browser_download_url; + updateData.platforms["linux-armv7"].url = browser_download_url; } // darwin signature (aarch) if (name.endsWith("aarch64.app.tar.gz.sig")) { const sig = await getSignature(browser_download_url); updateData.platforms["darwin-aarch64"].signature = sig; - } - - // linux x64 url - if (name.endsWith("amd64.AppImage.tar.gz")) { - updateData.platforms.linux.url = browser_download_url; - updateData.platforms["linux-x86_64"].url = browser_download_url; - updateData.platforms["linux-x86"].url = browser_download_url; - // 暂时使用x64版本的url和sig,使得可以检查更新,但aarch64版本还不支持构建appimage - updateData.platforms["linux-aarch64"].url = browser_download_url; - updateData.platforms["linux-armv7"].url = browser_download_url; - } - // linux x64 signature - if (name.endsWith("amd64.AppImage.tar.gz.sig")) { - const sig = await getSignature(browser_download_url); updateData.platforms.linux.signature = sig; updateData.platforms["linux-x86_64"].signature = sig; updateData.platforms["linux-x86"].url = browser_download_url; - // 暂时使用x64版本的url和sig,使得可以检查更新,但aarch64版本还不支持构建appimage + updateData.platforms["linux-i686"].url = browser_download_url; updateData.platforms["linux-aarch64"].signature = sig; updateData.platforms["linux-armv7"].signature = sig; } diff --git a/clash-verge-rev/src-tauri/Cargo.lock b/clash-verge-rev/src-tauri/Cargo.lock index a078b5378d..d5bc587fc0 100644 --- a/clash-verge-rev/src-tauri/Cargo.lock +++ b/clash-verge-rev/src-tauri/Cargo.lock @@ -123,9 +123,9 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "async-broadcast" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258b52a1aa741b9f09783b2d86cf0aeeb617bbf847f6933340a39644227acbdb" +checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" dependencies = [ "event-listener 5.3.0", "event-listener-strategy", @@ -214,9 +214,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.2" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" dependencies = [ "async-lock 3.4.0", "cfg-if", @@ -224,7 +224,7 @@ dependencies = [ "futures-io", "futures-lite 2.3.0", "parking", - "polling 3.7.0", + "polling 3.7.1", "rustix 0.38.34", "slab", "tracing", @@ -281,12 +281,12 @@ dependencies = [ [[package]] name = "async-process" -version = "2.2.2" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a53fc6301894e04a92cb2584fedde80cb25ba8e02d9dc39d4a87d036e22f397d" +checksum = "f7eda79bbd84e29c2b308d1dc099d7de8dcc7035e48f4bf5dc4a531a44ff5e2a" dependencies = [ "async-channel 2.3.1", - "async-io 2.3.2", + "async-io 2.3.3", "async-lock 3.4.0", "async-signal", "async-task", @@ -316,7 +316,7 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "329972aa325176e89114919f2a80fdae4f4c040f66a370b1a1159c6c0f94e7aa" dependencies = [ - "async-io 2.3.2", + "async-io 2.3.3", "async-lock 3.4.0", "atomic-waker", "cfg-if", @@ -714,9 +714,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" +checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" [[package]] name = "cesu8" @@ -797,7 +797,7 @@ dependencies = [ "log4rs", "nanoid", "once_cell", - "open 5.1.3", + "open 5.1.4", "parking_lot", "percent-encoding", "port_scanner", @@ -1341,9 +1341,9 @@ checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" [[package]] name = "dtoa-short" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" dependencies = [ "dtoa", ] @@ -1369,7 +1369,7 @@ dependencies = [ "cc", "memchr", "rustc_version 0.4.0", - "toml 0.8.13", + "toml 0.8.14", "vswhom", "winreg 0.52.0", ] @@ -1397,9 +1397,9 @@ checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" [[package]] name = "enumflags2" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" dependencies = [ "enumflags2_derive", "serde", @@ -1407,9 +1407,9 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", @@ -2286,9 +2286,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" dependencies = [ "bytes", "futures-channel", @@ -2301,7 +2301,7 @@ dependencies = [ "httpdate", "itoa 1.0.11", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.5.7", "tokio", "tower-service", "tracing", @@ -2352,7 +2352,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.28", + "hyper 0.14.29", "native-tls", "tokio", "tokio-native-tls", @@ -3615,9 +3615,9 @@ dependencies = [ [[package]] name = "open" -version = "5.1.3" +version = "5.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb49fbd5616580e9974662cb96a3463da4476e649a7e4b258df0de065db0657" +checksum = "b5ca541f22b1c46d4bb9801014f234758ab4297e7870b904b6a8415b980a7388" dependencies = [ "is-wsl", "libc", @@ -3695,9 +3695,9 @@ dependencies = [ [[package]] name = "os_pipe" -version = "1.1.5" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57119c3b893986491ec9aa85056780d3a0f3cf4da7cc09dd3650dbd6c6738fb9" +checksum = "29d73ba8daf8fac13b0501d1abeddcfe21ba7401ada61a819144b6c2a4f32209" dependencies = [ "libc", "windows-sys 0.52.0", @@ -4056,9 +4056,9 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3" +checksum = "5e6a007746f34ed64099e88783b0ae369eaa3da6392868ba262e2af9b8fbaea1" dependencies = [ "cfg-if", "concurrent-queue", @@ -4156,9 +4156,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.84" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" dependencies = [ "unicode-ident", ] @@ -4413,7 +4413,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.28", + "hyper 0.14.29", "hyper-tls 0.5.0", "ipnet", "js-sys", @@ -5291,7 +5291,7 @@ dependencies = [ "cfg-expr 0.15.8", "heck 0.5.0", "pkg-config", - "toml 0.8.13", + "toml 0.8.14", "version-compare 0.2.0", ] @@ -5363,9 +5363,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" dependencies = [ "filetime", "libc", @@ -5381,7 +5381,7 @@ checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" [[package]] name = "tauri" version = "1.6.7" -source = "git+https://github.com/Pylogmon/tauri?branch=1.x#9c0b64965560b28c3d06963494a3e0d2e1bae9f4" +source = "git+https://github.com/tauri-apps/tauri?branch=1.x#3752eb1e6be2a8c31ea5519b5f1886d5721e4435" dependencies = [ "anyhow", "base64 0.21.7", @@ -5444,7 +5444,7 @@ dependencies = [ [[package]] name = "tauri-build" version = "1.5.2" -source = "git+https://github.com/Pylogmon/tauri?branch=1.x#9c0b64965560b28c3d06963494a3e0d2e1bae9f4" +source = "git+https://github.com/tauri-apps/tauri?branch=1.x#3752eb1e6be2a8c31ea5519b5f1886d5721e4435" dependencies = [ "anyhow", "cargo_toml", @@ -5462,7 +5462,7 @@ dependencies = [ [[package]] name = "tauri-codegen" version = "1.4.3" -source = "git+https://github.com/Pylogmon/tauri?branch=1.x#9c0b64965560b28c3d06963494a3e0d2e1bae9f4" +source = "git+https://github.com/tauri-apps/tauri?branch=1.x#3752eb1e6be2a8c31ea5519b5f1886d5721e4435" dependencies = [ "base64 0.21.7", "brotli", @@ -5487,7 +5487,7 @@ dependencies = [ [[package]] name = "tauri-macros" version = "1.4.4" -source = "git+https://github.com/Pylogmon/tauri?branch=1.x#9c0b64965560b28c3d06963494a3e0d2e1bae9f4" +source = "git+https://github.com/tauri-apps/tauri?branch=1.x#3752eb1e6be2a8c31ea5519b5f1886d5721e4435" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -5500,7 +5500,7 @@ dependencies = [ [[package]] name = "tauri-runtime" version = "0.14.3" -source = "git+https://github.com/Pylogmon/tauri?branch=1.x#9c0b64965560b28c3d06963494a3e0d2e1bae9f4" +source = "git+https://github.com/tauri-apps/tauri?branch=1.x#3752eb1e6be2a8c31ea5519b5f1886d5721e4435" dependencies = [ "gtk", "http 0.2.12", @@ -5520,7 +5520,7 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" version = "0.14.8" -source = "git+https://github.com/Pylogmon/tauri?branch=1.x#9c0b64965560b28c3d06963494a3e0d2e1bae9f4" +source = "git+https://github.com/tauri-apps/tauri?branch=1.x#3752eb1e6be2a8c31ea5519b5f1886d5721e4435" dependencies = [ "arboard", "cocoa 0.24.1", @@ -5540,7 +5540,7 @@ dependencies = [ [[package]] name = "tauri-utils" version = "1.5.4" -source = "git+https://github.com/Pylogmon/tauri?branch=1.x#9c0b64965560b28c3d06963494a3e0d2e1bae9f4" +source = "git+https://github.com/tauri-apps/tauri?branch=1.x#3752eb1e6be2a8c31ea5519b5f1886d5721e4435" dependencies = [ "brotli", "ctor", @@ -5894,14 +5894,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.13" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e43f8cc456c9704c851ae29c67e17ef65d2c30017c17a9765b89c382dc8bba" +checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.13", + "toml_edit 0.22.14", ] [[package]] @@ -5939,15 +5939,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.13" +version = "0.22.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c127785850e8c20836d49732ae6abfa47616e60bf9d9f57c43c250361a9db96c" +checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" dependencies = [ "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.9", + "winnow 0.6.13", ] [[package]] @@ -6221,9 +6221,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" @@ -6329,7 +6329,7 @@ dependencies = [ "futures-util", "headers", "http 0.2.12", - "hyper 0.14.28", + "hyper 0.14.29", "log 0.4.21", "mime", "mime_guess", @@ -6570,9 +6570,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +checksum = "3c452ad30530b54a4d8e71952716a212b08efd0f3562baa66c29a618b07da7c3" dependencies = [ "rustls-pki-types", ] @@ -6803,9 +6803,9 @@ checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" [[package]] name = "windows-result" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "749f0da9cc72d82e600d8d2e44cadd0b9eedb9038f71a1c58556ac1c5791813b" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" dependencies = [ "windows-targets 0.52.5", ] @@ -7092,9 +7092,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.9" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86c949fede1d13936a99f14fafd3e76fd642b556dd2ce96287fbe2e0151bfac6" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" dependencies = [ "memchr", ] @@ -7296,9 +7296,9 @@ dependencies = [ "async-broadcast", "async-executor", "async-fs 2.1.2", - "async-io 2.3.2", + "async-io 2.3.3", "async-lock 3.4.0", - "async-process 2.2.2", + "async-process 2.2.3", "async-recursion", "async-task", "async-trait", diff --git a/clash-verge-rev/src-tauri/Cargo.toml b/clash-verge-rev/src-tauri/Cargo.toml index 71d5dded7c..da3165f932 100644 --- a/clash-verge-rev/src-tauri/Cargo.toml +++ b/clash-verge-rev/src-tauri/Cargo.toml @@ -10,7 +10,7 @@ edition = "2021" build = "build.rs" [build-dependencies] -tauri-build = { git="https://github.com/Pylogmon/tauri",branch = "1.x", features = [] } +tauri-build = { git="https://github.com/tauri-apps/tauri",branch = "1.x", features = [] } [dependencies] warp = "0.3" @@ -37,7 +37,7 @@ serde = { version = "1.0", features = ["derive"] } reqwest = { version = "0.12", features = ["json", "rustls-tls"] } sysproxy = { git="https://github.com/zzzgydi/sysproxy-rs", branch = "main" } auto-launch = { git="https://github.com/zzzgydi/auto-launch", branch = "main" } -tauri = { git="https://github.com/Pylogmon/tauri",branch = "1.x", features = [ "fs-read-file", "fs-exists", "path-all", "protocol-asset", "dialog-open", "notification-all", "icon-png", "icon-ico", "clipboard-all", "global-shortcut-all", "process-all", "shell-all", "system-tray", "updater", "window-all", "devtools"] } +tauri = { git="https://github.com/tauri-apps/tauri",branch = "1.x", features = [ "fs-read-file", "fs-exists", "path-all", "protocol-asset", "dialog-open", "notification-all", "icon-png", "icon-ico", "clipboard-all", "global-shortcut-all", "process-all", "shell-all", "system-tray", "updater", "window-all", "devtools"] } [target.'cfg(windows)'.dependencies] runas = "=1.2.0" deelevate = "0.2.0" diff --git a/clash-verge-rev/src-tauri/src/core/tray.rs b/clash-verge-rev/src-tauri/src/core/tray.rs index 7677b5a201..b0db804a22 100644 --- a/clash-verge-rev/src-tauri/src/core/tray.rs +++ b/clash-verge-rev/src-tauri/src/core/tray.rs @@ -88,7 +88,7 @@ impl Tray { ), )) .add_native_item(SystemTrayMenuItem::Separator) - .add_item(CustomMenuItem::new("quit", t!("Quit", "退出")).accelerator("CmdOrControl+Q")) + .add_item(CustomMenuItem::new("quit", t!("Quit", "退出"))) } pub fn update_systray(app_handle: &AppHandle) -> Result<()> { diff --git a/clash-verge-rev/src-tauri/tauri.linux.conf.json b/clash-verge-rev/src-tauri/tauri.linux.conf.json index 6300207260..cbf131f87d 100644 --- a/clash-verge-rev/src-tauri/tauri.linux.conf.json +++ b/clash-verge-rev/src-tauri/tauri.linux.conf.json @@ -6,7 +6,7 @@ }, "bundle": { "identifier": "io.github.clash-verge-rev.clash-verge-rev", - "targets": ["deb", "rpm", "appimage", "updater"], + "targets": ["deb", "rpm"], "deb": { "depends": ["openssl"], "desktopTemplate": "./template/clash-verge.desktop", diff --git a/clash-verge-rev/src-tauri/template/installer.nsi b/clash-verge-rev/src-tauri/template/installer.nsi index cfd00904f8..11280aa7bf 100644 --- a/clash-verge-rev/src-tauri/template/installer.nsi +++ b/clash-verge-rev/src-tauri/template/installer.nsi @@ -323,10 +323,15 @@ Var AppStartMenuFolder !define MUI_FINISHPAGE_SHOWREADME_TEXT "$(createDesktop)" !define MUI_FINISHPAGE_SHOWREADME_FUNCTION CreateDesktopShortcut ; Show run app after installation. -!define MUI_FINISHPAGE_RUN "$INSTDIR\${MAINBINARYNAME}.exe" +!define MUI_FINISHPAGE_RUN +!define MUI_FINISHPAGE_RUN_FUNCTION RunMainBinary !define MUI_PAGE_CUSTOMFUNCTION_PRE SkipIfPassive !insertmacro MUI_PAGE_FINISH +Function RunMainBinary + nsis_tauri_utils::RunAsUser "$INSTDIR\${MAINBINARYNAME}.exe" "" +FunctionEnd + ; Uninstaller Pages ; 1. Confirm uninstall page Var DeleteAppDataCheckbox @@ -729,7 +734,7 @@ Function .onInstSuccess ${GetOptions} $CMDLINE "/R" $R0 IfErrors run_done 0 ${GetOptions} $CMDLINE "/ARGS" $R0 - Exec '"$INSTDIR\${MAINBINARYNAME}.exe" $R0' + nsis_tauri_utils::RunAsUser "$INSTDIR\${MAINBINARYNAME}.exe" "$R0" run_done: FunctionEnd diff --git a/clash-verge-rev/src/components/setting/mods/update-viewer.tsx b/clash-verge-rev/src/components/setting/mods/update-viewer.tsx index 40a10dde90..8b52d1fb25 100644 --- a/clash-verge-rev/src/components/setting/mods/update-viewer.tsx +++ b/clash-verge-rev/src/components/setting/mods/update-viewer.tsx @@ -1,7 +1,7 @@ import useSWR from "swr"; import { forwardRef, useImperativeHandle, useState, useMemo } from "react"; import { useLockFn } from "ahooks"; -import { Box, LinearProgress } from "@mui/material"; +import { Box, LinearProgress, Button } from "@mui/material"; import { useTranslation } from "react-i18next"; import { relaunch } from "@tauri-apps/api/process"; import { checkUpdate, installUpdate } from "@tauri-apps/api/updater"; @@ -9,6 +9,7 @@ import { BaseDialog, DialogRef, Notice } from "@/components/base"; import { useUpdateState, useSetUpdateState } from "@/services/states"; import { listen, Event, UnlistenFn } from "@tauri-apps/api/event"; import { portableFlag } from "@/pages/_layout"; +import { open as openUrl } from "@tauri-apps/api/shell"; import ReactMarkdown from "react-markdown"; let eventListener: UnlistenFn | null = null; @@ -76,7 +77,24 @@ export const UpdateViewer = forwardRef((props, ref) => { return ( + {`New Version v${updateInfo?.manifest?.version}`} + + + + + } contentSx={{ minWidth: 360, maxWidth: 400, height: "50vh" }} okBtn={t("Update")} cancelBtn={t("Cancel")} diff --git a/clash-verge-rev/src/locales/en.json b/clash-verge-rev/src/locales/en.json index 8a2d39ab3c..989ac8ff66 100644 --- a/clash-verge-rev/src/locales/en.json +++ b/clash-verge-rev/src/locales/en.json @@ -168,6 +168,7 @@ "Runtime Config": "Runtime Config", "ReadOnly": "ReadOnly", "ReadOnlyMessage": "Cannot edit in read-only editor", + "Go to Release Page": "Go to Release Page", "Restart": "Restart", "Upgrade": "Upgrade", diff --git a/clash-verge-rev/src/locales/fa.json b/clash-verge-rev/src/locales/fa.json index 11ed46275a..772853abb2 100644 --- a/clash-verge-rev/src/locales/fa.json +++ b/clash-verge-rev/src/locales/fa.json @@ -163,6 +163,7 @@ "Runtime Config": "پیکربندی زمان اجرا", "ReadOnly": "فقط خواندنی", "ReadOnlyMessage": "نمی‌توان در ویرایشگر فقط خواندنی ویرایش کرد", + "Go to Release Page": "رفتن به صفحه انتشار", "Restart": "راه‌اندازی مجدد", "Upgrade": "ارتقاء", diff --git a/clash-verge-rev/src/locales/ru.json b/clash-verge-rev/src/locales/ru.json index 0047d5c5c4..b86d9edbf1 100644 --- a/clash-verge-rev/src/locales/ru.json +++ b/clash-verge-rev/src/locales/ru.json @@ -163,6 +163,7 @@ "Runtime Config": "Используемый конфиг", "ReadOnly": "Только для чтения", "ReadOnlyMessage": "Невозможно редактировать в режиме только для чтения", + "Go to Release Page": "Перейти на страницу релизов", "Restart": "Перезапуск", "Upgrade": "Обновлять", diff --git a/clash-verge-rev/src/locales/zh.json b/clash-verge-rev/src/locales/zh.json index ad59d10eec..53a66a5511 100644 --- a/clash-verge-rev/src/locales/zh.json +++ b/clash-verge-rev/src/locales/zh.json @@ -168,6 +168,7 @@ "Runtime Config": "当前配置", "ReadOnly": "只读", "ReadOnlyMessage": "无法在只读模式下编辑", + "Go to Release Page": "前往发布页", "Restart": "重启内核", "Upgrade": "升级内核", diff --git a/clash-verge-rev/src/main.tsx b/clash-verge-rev/src/main.tsx index b66f7d634b..efb3bc5917 100644 --- a/clash-verge-rev/src/main.tsx +++ b/clash-verge-rev/src/main.tsx @@ -37,7 +37,7 @@ document.addEventListener("keydown", (event) => { } if ( (event.ctrlKey || event.metaKey) && - ["F", "H", "P", "R", "U"].includes(event.key.toUpperCase()) + ["F", "H", "P", "Q", "R", "U"].includes(event.key.toUpperCase()) ) { event.preventDefault(); } diff --git a/echo/cf-workers/ws/wrangler.toml b/echo/cf-workers/ws/wrangler.toml index 26f2da7fe0..4975be5e90 100644 --- a/echo/cf-workers/ws/wrangler.toml +++ b/echo/cf-workers/ws/wrangler.toml @@ -2,7 +2,7 @@ name = "ws" main = "src/index.ts" compatibility_date = "2024-06-03" -compatibility_flags = ["nodejs_compat"] +compatibility_flags = ["nodejs_compat", "fetch_legacy_url"] # Automatically place your workloads in an optimal location to minimize latency. # If you are running back-end logic in a Worker, running it closer to your back-end infrastructure diff --git a/echo/examples/mws.json b/echo/examples/mws.json new file mode 100644 index 0000000000..62aff74a0d --- /dev/null +++ b/echo/examples/mws.json @@ -0,0 +1,24 @@ +{ + "relay_configs": [ + { + "listen": "127.0.0.1:1235", + "listen_type": "raw", + "transport_type": "mws", + "tcp_remotes": ["ws://0.0.0.0:2443"], + "ws_config": { + "path": "pwd", + "remote_addr": "127.0.0.1:5201" + } + }, + { + "listen": "127.0.0.1:2443", + "listen_type": "mws", + "transport_type": "raw", + "tcp_remotes": ["0.0.0.0:5201"], + "ws_config": { + "path": "pwd", + "remote_addr": "127.0.0.1:5201" + } + } + ] +} diff --git a/echo/internal/constant/constant.go b/echo/internal/constant/constant.go index d8a8b22d08..bbaafcddec 100644 --- a/echo/internal/constant/constant.go +++ b/echo/internal/constant/constant.go @@ -29,9 +29,13 @@ const ( // relay type const ( + // tcp relay RelayTypeRaw = "raw" + RelayTypeMTCP = "mtcp" + + // ws relay RelayTypeWS = "ws" + RelayTypeMWS = "mws" RelayTypeWSS = "wss" RelayTypeMWSS = "mwss" - RelayTypeMTCP = "mtcp" ) diff --git a/echo/internal/relay/conf/cfg.go b/echo/internal/relay/conf/cfg.go index eea710d1bb..c0082e2107 100644 --- a/echo/internal/relay/conf/cfg.go +++ b/echo/internal/relay/conf/cfg.go @@ -24,16 +24,17 @@ type WSConfig struct { } type Config struct { + Label string `json:"label,omitempty"` Listen string `json:"listen"` ListenType string `json:"listen_type"` TransportType string `json:"transport_type"` TCPRemotes []string `json:"tcp_remotes"` UDPRemotes []string `json:"udp_remotes"` - Label string `json:"label,omitempty"` - MaxConnection int `json:"max_connection,omitempty"` - BlockedProtocols []string `json:"blocked_protocols,omitempty"` - WSConfig *WSConfig `json:"ws_config,omitempty"` + MaxConnection int `json:"max_connection,omitempty"` + BlockedProtocols []string `json:"blocked_protocols,omitempty"` + + WSConfig *WSConfig `json:"ws_config,omitempty"` } func (r *Config) GetWSHandShakePath() string { @@ -58,20 +59,9 @@ func (r *Config) Validate() error { if r.Adjust() != nil { return errors.New("adjust config failed") } - if r.ListenType != constant.RelayTypeRaw && - r.ListenType != constant.RelayTypeWS && - r.ListenType != constant.RelayTypeWSS && - r.ListenType != constant.RelayTypeMTCP && - r.ListenType != constant.RelayTypeMWSS { - return fmt.Errorf("invalid listen type:%s", r.ListenType) - } - if r.TransportType != constant.RelayTypeRaw && - r.TransportType != constant.RelayTypeWS && - r.TransportType != constant.RelayTypeWSS && - r.TransportType != constant.RelayTypeMTCP && - r.TransportType != constant.RelayTypeMWSS { - return fmt.Errorf("invalid transport type:%s", r.ListenType) + if err := r.validateType(); err != nil { + return err } if r.Listen == "" { @@ -176,3 +166,24 @@ func (r *Config) ToTCPRemotes() lb.RoundRobin { func (r *Config) GetLoggerName() string { return fmt.Sprintf("%s(%s<->%s)", r.Label, r.ListenType, r.TransportType) } + +func (r *Config) validateType() error { + if r.ListenType != constant.RelayTypeRaw && + r.ListenType != constant.RelayTypeWS && + r.ListenType != constant.RelayTypeMWS && + r.ListenType != constant.RelayTypeWSS && + r.ListenType != constant.RelayTypeMTCP && + r.ListenType != constant.RelayTypeMWSS { + return fmt.Errorf("invalid listen type:%s", r.ListenType) + } + + if r.TransportType != constant.RelayTypeRaw && + r.TransportType != constant.RelayTypeWS && + r.TransportType != constant.RelayTypeMWS && + r.TransportType != constant.RelayTypeWSS && + r.TransportType != constant.RelayTypeMTCP && + r.TransportType != constant.RelayTypeMWSS { + return fmt.Errorf("invalid transport type:%s", r.ListenType) + } + return nil +} diff --git a/echo/internal/transporter/interface.go b/echo/internal/transporter/interface.go index 360f896620..f36c48e259 100644 --- a/echo/internal/transporter/interface.go +++ b/echo/internal/transporter/interface.go @@ -22,6 +22,8 @@ func newRelayClient(base *baseTransporter) (RelayClient, error) { return newRawClient(base) case constant.RelayTypeWS: return newWsClient(base) + case constant.RelayTypeMWS: + return newMwsClient(base) case constant.RelayTypeWSS: return newWssClient(base) case constant.RelayTypeMWSS: @@ -45,6 +47,8 @@ func NewRelayServer(cfg *conf.Config, cmgr cmgr.Cmgr) (RelayServer, error) { return newRawServer(base) case constant.RelayTypeWS: return newWsServer(base) + case constant.RelayTypeMWS: + return newMwsServer(base) case constant.RelayTypeWSS: return newWssServer(base) case constant.RelayTypeMWSS: diff --git a/echo/internal/transporter/ws_mux.go b/echo/internal/transporter/ws_mux.go new file mode 100644 index 0000000000..46a204455e --- /dev/null +++ b/echo/internal/transporter/ws_mux.go @@ -0,0 +1,121 @@ +// NOTE CAN NOT use real ws frame to transport smux frame +// err: accept stream err: buffer size:8 too small to transport ws payload size:45 +// so this transport just use ws protocol to handshake and then use smux protocol to transport +package transporter + +import ( + "context" + "net" + "net/http" + "time" + + "github.com/gobwas/ws" + "github.com/labstack/echo/v4" + "github.com/xtaci/smux" + + "github.com/Ehco1996/ehco/internal/metrics" + "github.com/Ehco1996/ehco/pkg/lb" +) + +var ( + _ RelayClient = &MwsClient{} + _ RelayServer = &MwsServer{} + _ muxServer = &MwsServer{} +) + +type MwsClient struct { + *WssClient + + muxTP *smuxTransporter +} + +func newMwsClient(base *baseTransporter) (*MwsClient, error) { + wc, err := newWssClient(base) + if err != nil { + return nil, err + } + c := &MwsClient{WssClient: wc} + c.muxTP = NewSmuxTransporter(c.l.Named("mwss"), c.initNewSession) + return c, nil +} + +func (c *MwsClient) initNewSession(ctx context.Context, addr string) (*smux.Session, error) { + rc, _, _, err := c.dialer.Dial(ctx, addr) + if err != nil { + return nil, err + } + // stream multiplex + cfg := smux.DefaultConfig() + cfg.KeepAliveDisabled = true + session, err := smux.Client(rc, cfg) + if err != nil { + return nil, err + } + c.l.Infof("init new session to: %s", rc.RemoteAddr()) + return session, nil +} + +func (s *MwsClient) TCPHandShake(remote *lb.Node) (net.Conn, error) { + t1 := time.Now() + addr, err := s.cfg.GetWSRemoteAddr(remote.Address) + if err != nil { + return nil, err + } + mwssc, err := s.muxTP.Dial(context.TODO(), addr) + if err != nil { + return nil, err + } + latency := time.Since(t1) + metrics.HandShakeDuration.WithLabelValues(remote.Label).Observe(float64(latency.Milliseconds())) + remote.HandShakeDuration = latency + return mwssc, nil +} + +type MwsServer struct { + *WsServer + *muxServerImpl +} + +func newMwsServer(base *baseTransporter) (*MwsServer, error) { + wsServer, err := newWsServer(base) + if err != nil { + return nil, err + } + s := &MwsServer{ + WsServer: wsServer, + muxServerImpl: newMuxServer(base.cfg.Listen, base.l.Named("mwss")), + } + s.e.GET(base.cfg.GetWSHandShakePath(), echo.WrapHandler(http.HandlerFunc(s.HandleRequest))) + return s, nil +} + +func (s *MwsServer) ListenAndServe() error { + go func() { + s.errChan <- s.e.StartServer(s.httpServer) + }() + + for { + conn, e := s.Accept() + if e != nil { + return e + } + go func(c net.Conn) { + if err := s.RelayTCPConn(c, s.relayer.TCPHandShake); err != nil { + s.l.Errorf("RelayTCPConn error: %s", err.Error()) + } + }(conn) + } +} + +func (s *MwsServer) HandleRequest(w http.ResponseWriter, r *http.Request) { + c, _, _, err := ws.UpgradeHTTP(r, w) + if err != nil { + s.l.Error(err) + return + } + s.mux(c) +} + +func (s *MwsServer) Close() error { + return s.e.Close() +} diff --git a/echo/test/relay_test.go b/echo/test/relay_test.go index dc0521c8e7..43ba035eb3 100644 --- a/echo/test/relay_test.go +++ b/echo/test/relay_test.go @@ -41,6 +41,10 @@ const ( MTCP_LISTEN = "0.0.0.0:1238" MTCP_REMOTE = "0.0.0.0:2003" MTCP_SERVER = "0.0.0.0:2003" + + MWS_LISTEN = "0.0.0.0:1239" + MWS_REMOTE = "ws://0.0.0.0:2004" + MSS_SERVER = "0.0.0.0:2004" ) func init() { @@ -127,6 +131,20 @@ func init() { TCPRemotes: []string{ECHO_SERVER}, TransportType: constant.RelayTypeRaw, }, + + // mws + { + Listen: MWS_LISTEN, + ListenType: constant.RelayTypeRaw, + TCPRemotes: []string{MWS_REMOTE}, + TransportType: constant.RelayTypeMWS, + }, + { + Listen: MSS_SERVER, + ListenType: constant.RelayTypeMWS, + TCPRemotes: []string{ECHO_SERVER}, + TransportType: constant.RelayTypeRaw, + }, }, } logger := zap.S() @@ -265,6 +283,16 @@ func TestRelayOverMTCP(t *testing.T) { t.Log("test tcp over mtcp done!") } +func TestRelayOverMWS(t *testing.T) { + msg := []byte("hello") + // test tcp + res := echo.SendTcpMsg(msg, MWS_LISTEN) + if string(res) != string(msg) { + t.Fatal(res) + } + t.Log("test tcp over mws done!") +} + func BenchmarkTcpRelay(b *testing.B) { msg := []byte("hello") for i := 0; i <= b.N; i++ { diff --git a/lede/package/boot/uboot-mediatek/patches/100-02-drivers-mtd-add-support-for-MediaTek-SPI-NAND-flash-.patch b/lede/package/boot/uboot-mediatek/patches/100-02-drivers-mtd-add-support-for-MediaTek-SPI-NAND-flash-.patch index 05138d984e..42908621c1 100644 --- a/lede/package/boot/uboot-mediatek/patches/100-02-drivers-mtd-add-support-for-MediaTek-SPI-NAND-flash-.patch +++ b/lede/package/boot/uboot-mediatek/patches/100-02-drivers-mtd-add-support-for-MediaTek-SPI-NAND-flash-.patch @@ -1213,7 +1213,7 @@ Signed-off-by: Weijie Gao + + SNAND_INFO("FM35Q1GA", SNAND_ID(SNAND_ID_DYMMY, 0xe5, 0x71), + SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_x4, ++ &snand_cap_read_from_cache_x4_only, + &snand_cap_program_load_x4), + + SNAND_INFO("PN26G01A", SNAND_ID(SNAND_ID_DYMMY, 0xa1, 0xe1), diff --git a/lede/target/linux/mediatek/patches-5.15/340-mtd-spinand-Add-support-for-the-Fidelix-FM35X1GA.patch b/lede/target/linux/mediatek/patches-5.15/340-mtd-spinand-Add-support-for-the-Fidelix-FM35X1GA.patch index 4a5d814b3b..e6d39c0f1a 100644 --- a/lede/target/linux/mediatek/patches-5.15/340-mtd-spinand-Add-support-for-the-Fidelix-FM35X1GA.patch +++ b/lede/target/linux/mediatek/patches-5.15/340-mtd-spinand-Add-support-for-the-Fidelix-FM35X1GA.patch @@ -56,8 +56,8 @@ Signed-off-by: Davide Fioravanti + SPINAND_PROG_LOAD(true, 0, NULL, 0)); + +static SPINAND_OP_VARIANTS(update_cache_variants, -+ SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), -+ SPINAND_PROG_LOAD(false, 0, NULL, 0)); ++ SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), ++ SPINAND_PROG_LOAD(true, 0, NULL, 0)); + +static int fm35x1ga_ooblayout_ecc(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) diff --git a/lede/target/linux/mediatek/patches-6.1/340-mtd-spinand-Add-support-for-the-Fidelix-FM35X1GA.patch b/lede/target/linux/mediatek/patches-6.1/340-mtd-spinand-Add-support-for-the-Fidelix-FM35X1GA.patch index ec66363dc9..b00c6fc3fb 100644 --- a/lede/target/linux/mediatek/patches-6.1/340-mtd-spinand-Add-support-for-the-Fidelix-FM35X1GA.patch +++ b/lede/target/linux/mediatek/patches-6.1/340-mtd-spinand-Add-support-for-the-Fidelix-FM35X1GA.patch @@ -56,8 +56,8 @@ Signed-off-by: Davide Fioravanti + SPINAND_PROG_LOAD(true, 0, NULL, 0)); + +static SPINAND_OP_VARIANTS(update_cache_variants, -+ SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), -+ SPINAND_PROG_LOAD(false, 0, NULL, 0)); ++ SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), ++ SPINAND_PROG_LOAD(true, 0, NULL, 0)); + +static int fm35x1ga_ooblayout_ecc(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua index ef406ad3ff..13bd889c39 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua @@ -402,7 +402,14 @@ o.description = "
    " .. "
" o:depends({dns_shunt = "dnsmasq", tcp_proxy_mode = "proxy", chn_list = "direct"}) -o = s:taboption("DNS", Button, "clear_ipset", translate("Clear IPSET"), translate("Try this feature if the rule modification does not take effect.")) +o = s:taboption("DNS", Flag, "dns_redirect", "DNS " .. translate("Redirect"), translate("Force Router DNS server to all local devices.")) +o.default = "0" + +if (uci:get(appname, "@global_forwarding[0]", "use_nft") or "0") == "1" then + o = s:taboption("DNS", Button, "clear_ipset", translate("Clear NFTSET"), translate("Try this feature if the rule modification does not take effect.")) +else + o = s:taboption("DNS", Button, "clear_ipset", translate("Clear IPSET"), translate("Try this feature if the rule modification does not take effect.")) +end o.inputstyle = "remove" function o.write(e, e) luci.sys.call('[ -n "$(nft list sets 2>/dev/null | grep \"passwall_\")" ] && sh /usr/share/passwall/nftables.sh flush_nftset_reload || sh /usr/share/passwall/iptables.sh flush_ipset_reload > /dev/null 2>&1 &') diff --git a/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po b/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po index 4cd5cdfe5b..f3d5894c44 100644 --- a/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po +++ b/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po @@ -187,9 +187,18 @@ msgstr "实验性功能。" msgid "Use FakeDNS work in the shunt domain that proxy." msgstr "需要代理的分流规则域名使用 FakeDNS。" +msgid "Redirect" +msgstr "重定向" + +msgid "Force Router DNS server to all local devices." +msgstr "强制所有本地设备使用路由器 DNS。" + msgid "Clear IPSET" msgstr "清空 IPSET" +msgid "Clear NFTSET" +msgstr "清空 NFTSET" + msgid "Try this feature if the rule modification does not take effect." msgstr "如果修改规则后没有生效,请尝试此功能。" diff --git a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh index 9b6319de54..1d7f5e2c04 100755 --- a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh @@ -204,14 +204,15 @@ check_port_exists() { } check_depends() { + local depends local tables=${1} if [ "$tables" == "iptables" ]; then for depends in "iptables-mod-tproxy" "iptables-mod-socket" "iptables-mod-iprange" "iptables-mod-conntrack-extra" "kmod-ipt-nat"; do - [ -z "$(opkg status ${depends} 2>/dev/null | grep 'Status' | awk -F ': ' '{print $2}' 2>/dev/null)" ] && echolog "$tables透明代理基础依赖 $depends 未安装..." + [ -s "/usr/lib/opkg/info/${depends}.control" ] || echolog "$tables透明代理基础依赖 $depends 未安装..." done else for depends in "kmod-nft-socket" "kmod-nft-tproxy" "kmod-nft-nat"; do - [ -z "$(opkg status ${depends} 2>/dev/null | grep 'Status' | awk -F ': ' '{print $2}' 2>/dev/null)" ] && echolog "$tables透明代理基础依赖 $depends 未安装..." + [ -s "/usr/lib/opkg/info/${depends}.control" ] || echolog "$tables透明代理基础依赖 $depends 未安装..." done fi } diff --git a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/iptables.sh b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/iptables.sh index 2a7e94d890..07dcc30796 100755 --- a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/iptables.sh +++ b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/iptables.sh @@ -1108,6 +1108,16 @@ add_firewall_rule() { $ip6t_m -I OUTPUT $(comment "mangle-OUTPUT-PSW") -o lo -j RETURN insert_rule_before "$ip6t_m" "OUTPUT" "mwan3" "$(comment mangle-OUTPUT-PSW) -m mark --mark 1 -j RETURN" + + [ $(config_t_get global dns_redirect) == "1" ] && { + $ipt_m -A PSW -p udp --dport 53 -j RETURN + $ip6t_m -A PSW -p udp --dport 53 -j RETURN + $ipt_n -I PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53 -m comment --comment "PSW_DNS_Hijack" 2>/dev/null + $ipt_n -I PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53 -m comment --comment "PSW_DNS_Hijack" 2>/dev/null + $ip6t_n -I PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53 -m comment --comment "PSW_DNS_Hijack" 2>/dev/null + $ip6t_n -I PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53 -m comment --comment "PSW_DNS_Hijack" 2>/dev/null + } + } # 加载ACLS diff --git a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/nftables.sh b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/nftables.sh index 0bff3d45f5..f8f3401422 100755 --- a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/nftables.sh +++ b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/nftables.sh @@ -1149,6 +1149,17 @@ add_firewall_rule() { nft "add rule inet fw4 mangle_output oif lo counter return comment \"PSW_OUTPUT_MANGLE\"" nft "add rule inet fw4 mangle_output meta mark 1 counter return comment \"PSW_OUTPUT_MANGLE\"" + + [ $(config_t_get global dns_redirect) == "1" ] && { + nft "add rule inet fw4 PSW_MANGLE ip protocol udp udp dport 53 counter return" + nft "add rule inet fw4 PSW_MANGLE_V6 meta l4proto udp udp dport 53 counter return" + nft insert rule inet fw4 dstnat position 0 tcp dport 53 counter redirect to :53 comment \"PSW_DNS_Hijack\" 2>/dev/null + nft insert rule inet fw4 dstnat position 0 udp dport 53 counter redirect to :53 comment \"PSW_DNS_Hijack\" 2>/dev/null + nft insert rule inet fw4 dstnat position 0 meta nfproto {ipv6} tcp dport 53 counter redirect to :53 comment \"PSW_DNS_Hijack\" 2>/dev/null + nft insert rule inet fw4 dstnat position 0 meta nfproto {ipv6} udp dport 53 counter redirect to :53 comment \"PSW_DNS_Hijack\" 2>/dev/null + uci -q set dhcp.@dnsmasq[0].dns_redirect='0' 2>/dev/null + uci commit dhcp 2>/dev/null + } } # 加载ACLS diff --git a/shadowsocks-rust/Cargo.lock b/shadowsocks-rust/Cargo.lock index 43e58e1c51..06b637551e 100644 --- a/shadowsocks-rust/Cargo.lock +++ b/shadowsocks-rust/Cargo.lock @@ -89,6 +89,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -136,9 +151,9 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] @@ -177,6 +192,22 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "async-compression" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5" +dependencies = [ + "brotli", + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", + "zstd", + "zstd-safe", +] + [[package]] name = "async-trait" version = "0.1.80" @@ -309,10 +340,31 @@ dependencies = [ ] [[package]] -name = "bson" -version = "2.10.0" +name = "brotli" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d43b38e074cc0de2957f10947e376a1d88b9c4dbab340b590800cc1b2e066b2" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bson" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a88e82b9106923b5c4d6edfca9e7db958d4e98a478ec115022e81b9b38e2c8" dependencies = [ "ahash", "base64 0.13.1", @@ -398,9 +450,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" +checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" dependencies = [ "jobserver", "libc", @@ -480,18 +532,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.4" +version = "4.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "a9689a29b593160de5bc4aacab7b5d54fb52231de70122626c178e6a368994c7" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "2e5387378c84f6faa26890ebf9f0a92989f8873d4d380467bcd0d8d8620424df" dependencies = [ "anstream", "anstyle", @@ -502,9 +554,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "cmake" @@ -883,6 +935,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1968,9 +2030,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.3.0+3.3.0" +version = "300.3.1+3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eba8804a1c5765b18c4b3f907e6897ebabeedebc9830e1a0046c4a4cf44663e1" +checksum = "7259953d42a81bf137fbbd73bd30a8e1914d6dce43c2b90ed575783a22608b91" dependencies = [ "cc", ] @@ -2247,9 +2309,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.84" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" dependencies = [ "unicode-ident", ] @@ -2446,6 +2508,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" dependencies = [ + "async-compression", "base64 0.22.1", "bytes", "encoding_rs", @@ -2453,6 +2516,7 @@ dependencies = [ "futures-core", "futures-util", "h2 0.4.5", + "hickory-resolver", "http 1.1.0", "http-body", "http-body-util", @@ -2480,12 +2544,13 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-rustls 0.25.0", + "tokio-util", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.26.1", + "webpki-roots 0.26.2", "winreg 0.52.0", ] @@ -2982,6 +3047,7 @@ dependencies = [ "log", "log4rs", "mimalloc", + "mime", "num_cpus", "qrcode", "rand", @@ -3044,7 +3110,7 @@ dependencies = [ "tokio-native-tls", "tokio-rustls 0.25.0", "tun2", - "webpki-roots 0.26.1", + "webpki-roots 0.26.2", "windows-sys 0.52.0", ] @@ -3104,7 +3170,6 @@ dependencies = [ "libc", "log", "parking_lot 0.11.2", - "zstd", ] [[package]] @@ -3693,9 +3758,9 @@ dependencies = [ [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" @@ -3834,9 +3899,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +checksum = "3c452ad30530b54a4d8e71952716a212b08efd0f3562baa66c29a618b07da7c3" dependencies = [ "rustls-pki-types", ] @@ -4123,29 +4188,28 @@ checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] name = "zstd" -version = "0.9.2+zstd.1.5.1" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2390ea1bf6c038c39674f22d95f0564725fc06034a47129179810b2fc58caa54" +checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "4.1.3+zstd.1.5.1" +version = "7.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e99d81b99fb3c2c2c794e3fe56c305c63d5173a16a46b5850b07c935ffc7db79" +checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" dependencies = [ - "libc", "zstd-sys", ] [[package]] name = "zstd-sys" -version = "1.6.2+zstd.1.5.1" +version = "2.0.10+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2daf2f248d9ea44454bfcb2516534e8b8ad2fc91bf818a1885495fc42bc8ac9f" +checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa" dependencies = [ "cc", - "libc", + "pkg-config", ] diff --git a/shadowsocks-rust/Cargo.toml b/shadowsocks-rust/Cargo.toml index 76fc6306de..198242316f 100644 --- a/shadowsocks-rust/Cargo.toml +++ b/shadowsocks-rust/Cargo.toml @@ -79,7 +79,6 @@ full = [ "hickory-dns", "dns-over-tls", "dns-over-https", - "dns-over-h3", "local", "server", "manager", @@ -102,6 +101,7 @@ full = [ # Full features with extra (non-stable) full-extra = [ "full", + "dns-over-h3", "aead-cipher-extra", "aead-cipher-2022-extra", "security-replay-attack-detect", @@ -121,7 +121,7 @@ service = ["local", "server", "manager"] winservice = ["service", "windows-service"] # Enables Hickory-DNS for replacing tokio's builtin DNS resolver -hickory-dns = ["shadowsocks-service/hickory-dns"] +hickory-dns = ["shadowsocks-service/hickory-dns", "reqwest/hickory-dns"] # Hickory-DNS was renamed from Trust-DNS, keep compatibility. trust-dns = ["hickory-dns"] dns-over-tls = ["shadowsocks-service/dns-over-tls"] @@ -167,6 +167,7 @@ local-fake-dns = ["local", "shadowsocks-service/local-fake-dns"] local-online-config = [ "local", "reqwest", + "mime", "shadowsocks-service/local-online-config", ] @@ -224,6 +225,7 @@ serde = { version = "1.0", features = ["derive"] } json5 = "0.4" thiserror = "1.0" base64 = "0.22" +mime = { version = "0.3", optional = true } clap = { version = "4.5", features = ["wrap_help", "suggestions"] } cfg-if = "1" @@ -260,12 +262,20 @@ reqwest = { version = "0.12", features = [ "blocking", "rustls-tls", "rustls-tls-native-roots", + "deflate", + "gzip", + "brotli", + "zstd", ], default-features = false, optional = true } [target.'cfg(not(any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64")))'.dependencies] reqwest = { version = "0.12", features = [ "blocking", "native-tls-vendored", + "deflate", + "gzip", + "brotli", + "zstd", ], optional = true } [dev-dependencies] diff --git a/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml b/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml index 5c4220a928..8421a9b630 100644 --- a/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml +++ b/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml @@ -133,7 +133,7 @@ bytes = "1.6" byte_string = "1.0" byteorder = "1.5" rand = { version = "0.8", features = ["small_rng"] } -sled = { version = "0.34.7", features = ["compression"], optional = true } +sled = { version = "0.34.7", optional = true } futures = "0.3" tokio = { version = "1.5", features = [ diff --git a/shadowsocks-rust/crates/shadowsocks-service/src/local/fake_dns/manager.rs b/shadowsocks-rust/crates/shadowsocks-service/src/local/fake_dns/manager.rs index 83db7d6a2c..dc2c27816d 100644 --- a/shadowsocks-rust/crates/shadowsocks-service/src/local/fake_dns/manager.rs +++ b/shadowsocks-rust/crates/shadowsocks-service/src/local/fake_dns/manager.rs @@ -161,7 +161,6 @@ impl FakeDnsManager { ) -> io::Result { let db = SledConfig::new() .cache_capacity(10 * 1024 * 1024) - .use_compression(true) .mode(sled::Mode::HighThroughput) .flush_every_ms(Some(1_000)) .path(db_path) diff --git a/shadowsocks-rust/src/service/local.rs b/shadowsocks-rust/src/service/local.rs index 100930ee80..92fd0a8614 100644 --- a/shadowsocks-rust/src/service/local.rs +++ b/shadowsocks-rust/src/service/local.rs @@ -1097,10 +1097,26 @@ async fn get_online_config_servers( online_config_url: &str, ) -> Result, Box> { use log::warn; + use mime::Mime; + use reqwest::{redirect::Policy, Client}; #[inline] async fn get_online_config(online_config_url: &str) -> reqwest::Result { - let response = reqwest::get(online_config_url).await?; + static SHADOWSOCKS_USER_AGENT: &str = concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION")); + + let client = Client::builder() + .user_agent(SHADOWSOCKS_USER_AGENT) + .deflate(true) + .gzip(true) + .brotli(true) + .zstd(true) + .redirect(Policy::limited(3)) + .timeout(Duration::from_secs(30)) + .read_timeout(Duration::from_secs(5)) + .connect_timeout(Duration::from_millis(500)) + .build()?; + + let response = client.get(online_config_url).send().await?; if response.url().scheme() != "https" { warn!( "SIP008 suggests configuration URL should use https, but current URL is {}", @@ -1111,14 +1127,29 @@ async fn get_online_config_servers( // Content-Type: application/json; charset=utf-8 // mandatory in standard SIP008 match response.headers().get("Content-Type") { - Some(h) => { - if h != "application/json; charset=utf-8" { - warn!( - "SIP008 Content-Type must be \"application/json; charset=utf-8\", but found {}", - h.to_str().unwrap_or("[non-utf8-value]") - ); + Some(h) => match h.to_str() { + Ok(hstr) => match hstr.parse::() { + Ok(content_type) => { + if content_type.type_() == mime::APPLICATION + && content_type.subtype() == mime::JSON + && content_type.get_param(mime::CHARSET) == Some(mime::UTF_8) + { + trace!("checked Content-Type: {:?}", h); + } else { + warn!( + "Content-Type is not \"application/json; charset=utf-8\", which is mandatory in standard SIP008. found {:?}", + h + ); + } + } + Err(err) => { + warn!("Content-Type parse failed, value: {:?}, error: {}", h, err); + } + }, + Err(..) => { + warn!("Content-Type is not a UTF-8 string: {:?}", h); } - } + }, None => { warn!("missing Content-Type in SIP008 response from {}", online_config_url); } @@ -1131,7 +1162,7 @@ async fn get_online_config_servers( Ok(b) => b, Err(err) => { error!( - "server-loader task failed to load from url: {}, error: {}", + "server-loader task failed to load from url: {}, error: {:?}", online_config_url, err ); return Err(Box::new(err)); diff --git a/sing-box/.github/workflows/debug.yml b/sing-box/.github/workflows/debug.yml index a925490a3f..79c5c26430 100644 --- a/sing-box/.github/workflows/debug.yml +++ b/sing-box/.github/workflows/debug.yml @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4 with: fetch-depth: 0 - name: Setup Go @@ -38,7 +38,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4 with: fetch-depth: 0 - name: Setup Go @@ -58,7 +58,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4 with: fetch-depth: 0 - name: Setup Go @@ -188,7 +188,7 @@ jobs: TAGS: with_clash_api,with_quic steps: - name: Checkout - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4 with: fetch-depth: 0 - name: Setup Go diff --git a/sing-box/.github/workflows/docker.yml b/sing-box/.github/workflows/docker.yml index cf21f6fe12..749b780d3f 100644 --- a/sing-box/.github/workflows/docker.yml +++ b/sing-box/.github/workflows/docker.yml @@ -30,7 +30,7 @@ jobs: echo "latest=$latest" echo "latest=$latest" >> $GITHUB_OUTPUT - name: Checkout - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4 with: ref: ${{ steps.ref.outputs.ref }} - name: Setup Docker Buildx diff --git a/sing-box/.github/workflows/lint.yml b/sing-box/.github/workflows/lint.yml index 15549b6131..d0c8cf0412 100644 --- a/sing-box/.github/workflows/lint.yml +++ b/sing-box/.github/workflows/lint.yml @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4 with: fetch-depth: 0 - name: Setup Go diff --git a/sing-box/.github/workflows/linux.yml b/sing-box/.github/workflows/linux.yml index f1b22d6b66..dce78bc5b0 100644 --- a/sing-box/.github/workflows/linux.yml +++ b/sing-box/.github/workflows/linux.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4 with: fetch-depth: 0 - name: Setup Go @@ -26,7 +26,7 @@ jobs: EOF echo "HOME=$HOME" >> "$GITHUB_ENV" - name: Publish release - uses: goreleaser/goreleaser-action@v5 + uses: goreleaser/goreleaser-action@v6 with: distribution: goreleaser-pro version: latest diff --git a/sing-box/adapter/router.go b/sing-box/adapter/router.go index 786a777ea5..54dc3396dc 100644 --- a/sing-box/adapter/router.go +++ b/sing-box/adapter/router.go @@ -93,7 +93,6 @@ type DNSRule interface { type RuleSet interface { StartContext(ctx context.Context, startContext RuleSetStartContext) error - PostStart() error Metadata() RuleSetMetadata Close() error HeadlessRule diff --git a/sing-box/clients/android/version.properties b/sing-box/clients/android/version.properties index 2210e4ac5f..7e46495af9 100644 --- a/sing-box/clients/android/version.properties +++ b/sing-box/clients/android/version.properties @@ -1,3 +1,3 @@ -VERSION_CODE=352 -VERSION_NAME=1.9.1 +VERSION_CODE=356 +VERSION_NAME=1.9.2 GO_VERSION=go1.22.4 diff --git a/sing-box/docs/changelog.md b/sing-box/docs/changelog.md index a208215b38..74f1dfd39f 100644 --- a/sing-box/docs/changelog.md +++ b/sing-box/docs/changelog.md @@ -2,6 +2,14 @@ icon: material/alert-decagram --- +#### 1.10.0-alpha.9 + +* Fixes and improvements + +### 1.9.2 + +* Fixes and improvements + #### 1.10.0-alpha.8 * Drop support for go1.18 and go1.19 **1** diff --git a/sing-box/experimental/libbox/service_pause.go b/sing-box/experimental/libbox/service_pause.go index 921e48d577..c4aa8daaff 100644 --- a/sing-box/experimental/libbox/service_pause.go +++ b/sing-box/experimental/libbox/service_pause.go @@ -16,25 +16,18 @@ func (s *BoxService) Pause() { if s.pauseTimer != nil { s.pauseTimer.Stop() } - s.pauseTimer = time.AfterFunc(time.Minute, s.pause) -} - -func (s *BoxService) pause() { - s.pauseAccess.Lock() - defer s.pauseAccess.Unlock() - s.pauseManager.DevicePause() - _ = s.instance.Router().ResetNetwork() - s.pauseTimer = nil + s.pauseTimer = time.AfterFunc(3*time.Second, s.ResetNetwork) } func (s *BoxService) Wake() { - _ = s.instance.Router().ResetNetwork() s.pauseAccess.Lock() defer s.pauseAccess.Unlock() if s.pauseTimer != nil { s.pauseTimer.Stop() - s.pauseTimer = nil - return } - s.pauseManager.DeviceWake() + s.pauseTimer = time.AfterFunc(3*time.Minute, s.ResetNetwork) +} + +func (s *BoxService) ResetNetwork() { + _ = s.instance.Router().ResetNetwork() } diff --git a/sing-box/go.mod b/sing-box/go.mod index 2f89dbaeab..b41626487f 100644 --- a/sing-box/go.mod +++ b/sing-box/go.mod @@ -27,7 +27,7 @@ require ( github.com/sagernet/quic-go v0.45.0-beta.1 github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 github.com/sagernet/sing v0.5.0-alpha.9 - github.com/sagernet/sing-dns v0.3.0-beta.2 + github.com/sagernet/sing-dns v0.3.0-beta.4 github.com/sagernet/sing-mux v0.2.0 github.com/sagernet/sing-quic v0.2.0-beta.8 github.com/sagernet/sing-shadowsocks v0.2.6 diff --git a/sing-box/go.sum b/sing-box/go.sum index 49100a90e1..3c03c2800b 100644 --- a/sing-box/go.sum +++ b/sing-box/go.sum @@ -115,8 +115,8 @@ github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4Wk github.com/sagernet/sing v0.2.18/go.mod h1:OL6k2F0vHmEzXz2KW19qQzu172FDgSbUSODylighuVo= github.com/sagernet/sing v0.5.0-alpha.9 h1:Mmg+LCbaKXBeQD/ttzi0/MQa3NcUyfadIgkGzhQW7o0= github.com/sagernet/sing v0.5.0-alpha.9/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= -github.com/sagernet/sing-dns v0.3.0-beta.2 h1:WRYifYptETBbzTqSopxYSEijt8QwEQX9SJPdq8maaGM= -github.com/sagernet/sing-dns v0.3.0-beta.2/go.mod h1:qeO/lOUK/c3Zczp5a1VO13fbmolaM8xGKCUXtaX0/NQ= +github.com/sagernet/sing-dns v0.3.0-beta.4 h1:d5PJhGjmWCjl1F9/XIdq0nISKSFyNdMee8TfWAHuMnQ= +github.com/sagernet/sing-dns v0.3.0-beta.4/go.mod h1:qeO/lOUK/c3Zczp5a1VO13fbmolaM8xGKCUXtaX0/NQ= github.com/sagernet/sing-mux v0.2.0 h1:4C+vd8HztJCWNYfufvgL49xaOoOHXty2+EAjnzN3IYo= github.com/sagernet/sing-mux v0.2.0/go.mod h1:khzr9AOPocLa+g53dBplwNDz4gdsyx/YM3swtAhlkHQ= github.com/sagernet/sing-quic v0.2.0-beta.8 h1:KnLNK3oVFKkelZOFKSGHWoDhD2SjRHSkq6Px0sI45VQ= diff --git a/sing-box/outbound/wireguard.go b/sing-box/outbound/wireguard.go index 8b19fb5b1c..7805e165a1 100644 --- a/sing-box/outbound/wireguard.go +++ b/sing-box/outbound/wireguard.go @@ -121,7 +121,7 @@ func (w *WireGuard) Start() error { return w.start() } -func (w *WireGuard) PortStart() error { +func (w *WireGuard) PostStart() error { if common.All(w.peers, func(peer wireguard.PeerConfig) bool { return peer.Endpoint.IsValid() }) { diff --git a/sing-box/route/router.go b/sing-box/route/router.go index a13d07fe74..75909cf740 100644 --- a/sing-box/route/router.go +++ b/sing-box/route/router.go @@ -221,7 +221,7 @@ func NewRouter( if serverAddress == "" { serverAddress = server.Address } - _, notIpAddress := netip.ParseAddr(serverAddress) + notIpAddress := !M.ParseSocksaddr(serverAddress).Addr.IsValid() if server.AddressResolver != "" { if !transportTagMap[server.AddressResolver] { return nil, E.New("parse dns server[", tag, "]: address resolver not found: ", server.AddressResolver) @@ -231,7 +231,7 @@ func NewRouter( } else { continue } - } else if notIpAddress != nil && strings.Contains(server.Address, ".") { + } else if notIpAddress && strings.Contains(server.Address, ".") { return nil, E.New("parse dns server[", tag, "]: missing address_resolver") } } @@ -509,78 +509,6 @@ func (r *Router) Start() error { r.geositeReader = nil } - if len(r.ruleSets) > 0 { - monitor.Start("initialize rule-set") - ruleSetStartContext := NewRuleSetStartContext() - var ruleSetStartGroup task.Group - for i, ruleSet := range r.ruleSets { - ruleSetInPlace := ruleSet - ruleSetStartGroup.Append0(func(ctx context.Context) error { - err := ruleSetInPlace.StartContext(ctx, ruleSetStartContext) - if err != nil { - return E.Cause(err, "initialize rule-set[", i, "]") - } - return nil - }) - } - ruleSetStartGroup.Concurrency(5) - ruleSetStartGroup.FastFail() - err := ruleSetStartGroup.Run(r.ctx) - monitor.Finish() - if err != nil { - return err - } - ruleSetStartContext.Close() - } - var ( - needProcessFromRuleSet bool - needWIFIStateFromRuleSet bool - ) - for _, ruleSet := range r.ruleSets { - metadata := ruleSet.Metadata() - if metadata.ContainsProcessRule { - needProcessFromRuleSet = true - } - if metadata.ContainsWIFIRule { - needWIFIStateFromRuleSet = true - } - } - if needProcessFromRuleSet || r.needFindProcess || r.needPackageManager { - if C.IsAndroid && r.platformInterface == nil { - monitor.Start("initialize package manager") - packageManager, err := tun.NewPackageManager(r) - monitor.Finish() - if err != nil { - return E.Cause(err, "create package manager") - } - monitor.Start("start package manager") - err = packageManager.Start() - monitor.Finish() - if err != nil { - return E.Cause(err, "start package manager") - } - r.packageManager = packageManager - } - - if r.platformInterface != nil { - r.processSearcher = r.platformInterface - } else { - monitor.Start("initialize process searcher") - searcher, err := process.NewSearcher(process.Config{ - Logger: r.logger, - PackageManager: r.packageManager, - }) - monitor.Finish() - if err != nil { - if err != os.ErrInvalid { - r.logger.Warn(E.Cause(err, "create process searcher")) - } - } else { - r.processSearcher = searcher - } - } - } - if runtime.GOOS == "windows" { powerListener, err := winpowrprof.NewEventListener(r.notifyWindowsPowerEvent) if err == nil { @@ -599,25 +527,6 @@ func (r *Router) Start() error { } } - if (needWIFIStateFromRuleSet || r.needWIFIState) && r.platformInterface != nil { - monitor.Start("initialize WIFI state") - r.needWIFIState = true - r.interfaceMonitor.RegisterCallback(func(_ int) { - r.updateWIFIState() - }) - r.updateWIFIState() - monitor.Finish() - } - - for i, rule := range r.rules { - monitor.Start("initialize rule[", i, "]") - err := rule.Start() - monitor.Finish() - if err != nil { - return E.Cause(err, "initialize rule[", i, "]") - } - } - monitor.Start("initialize DNS client") r.dnsClient.Start() monitor.Finish() @@ -726,12 +635,93 @@ func (r *Router) Close() error { } func (r *Router) PostStart() error { + monitor := taskmonitor.New(r.logger, C.StopTimeout) if len(r.ruleSets) > 0 { + monitor.Start("initialize rule-set") + ruleSetStartContext := NewRuleSetStartContext() + var ruleSetStartGroup task.Group for i, ruleSet := range r.ruleSets { - err := ruleSet.PostStart() + ruleSetInPlace := ruleSet + ruleSetStartGroup.Append0(func(ctx context.Context) error { + err := ruleSetInPlace.StartContext(ctx, ruleSetStartContext) + if err != nil { + return E.Cause(err, "initialize rule-set[", i, "]") + } + return nil + }) + } + ruleSetStartGroup.Concurrency(5) + ruleSetStartGroup.FastFail() + err := ruleSetStartGroup.Run(r.ctx) + monitor.Finish() + if err != nil { + return err + } + ruleSetStartContext.Close() + } + var ( + needProcessFromRuleSet bool + needWIFIStateFromRuleSet bool + ) + for _, ruleSet := range r.ruleSets { + metadata := ruleSet.Metadata() + if metadata.ContainsProcessRule { + needProcessFromRuleSet = true + } + if metadata.ContainsWIFIRule { + needWIFIStateFromRuleSet = true + } + } + if needProcessFromRuleSet || r.needFindProcess || r.needPackageManager { + if C.IsAndroid && r.platformInterface == nil { + monitor.Start("initialize package manager") + packageManager, err := tun.NewPackageManager(r) + monitor.Finish() if err != nil { - return E.Cause(err, "post start rule-set[", i, "]") + return E.Cause(err, "create package manager") } + monitor.Start("start package manager") + err = packageManager.Start() + monitor.Finish() + if err != nil { + return E.Cause(err, "start package manager") + } + r.packageManager = packageManager + } + + if r.platformInterface != nil { + r.processSearcher = r.platformInterface + } else { + monitor.Start("initialize process searcher") + searcher, err := process.NewSearcher(process.Config{ + Logger: r.logger, + PackageManager: r.packageManager, + }) + monitor.Finish() + if err != nil { + if err != os.ErrInvalid { + r.logger.Warn(E.Cause(err, "create process searcher")) + } + } else { + r.processSearcher = searcher + } + } + } + if (needWIFIStateFromRuleSet || r.needWIFIState) && r.platformInterface != nil { + monitor.Start("initialize WIFI state") + r.needWIFIState = true + r.interfaceMonitor.RegisterCallback(func(_ int) { + r.updateWIFIState() + }) + r.updateWIFIState() + monitor.Finish() + } + for i, rule := range r.rules { + monitor.Start("initialize rule[", i, "]") + err := rule.Start() + monitor.Finish() + if err != nil { + return E.Cause(err, "initialize rule[", i, "]") } } r.started = true diff --git a/sing-box/route/rule_set_local.go b/sing-box/route/rule_set_local.go index 1fd0924636..3945826708 100644 --- a/sing-box/route/rule_set_local.go +++ b/sing-box/route/rule_set_local.go @@ -78,10 +78,6 @@ func (s *LocalRuleSet) StartContext(ctx context.Context, startContext adapter.Ru return nil } -func (s *LocalRuleSet) PostStart() error { - return nil -} - func (s *LocalRuleSet) Metadata() adapter.RuleSetMetadata { return s.metadata } diff --git a/sing-box/route/rule_set_remote.go b/sing-box/route/rule_set_remote.go index a14c6fe543..8389c2f46b 100644 --- a/sing-box/route/rule_set_remote.go +++ b/sing-box/route/rule_set_remote.go @@ -112,16 +112,6 @@ func (s *RemoteRuleSet) StartContext(ctx context.Context, startContext adapter.R return nil } -func (s *RemoteRuleSet) PostStart() error { - if s.lastUpdated.IsZero() { - err := s.fetchOnce(s.ctx, nil) - if err != nil { - s.logger.Error("fetch rule-set ", s.options.Tag, ": ", err) - } - } - return nil -} - func (s *RemoteRuleSet) Metadata() adapter.RuleSetMetadata { return s.metadata } diff --git a/v2rayng/V2rayNG/app/build.gradle.kts b/v2rayng/V2rayNG/app/build.gradle.kts index 20dce75475..edefe388b0 100644 --- a/v2rayng/V2rayNG/app/build.gradle.kts +++ b/v2rayng/V2rayNG/app/build.gradle.kts @@ -11,7 +11,7 @@ android { applicationId = "com.v2ray.ang" minSdk = 21 targetSdk = 34 - versionCode = 562 + versionCode = 563 versionName = "1.8.25" multiDexEnabled = true splits.abi { @@ -95,7 +95,7 @@ dependencies { // Androidx implementation("androidx.constraintlayout:constraintlayout:2.1.4") implementation("androidx.legacy:legacy-support-v4:1.0.0") - implementation("androidx.appcompat:appcompat:1.6.1") + implementation("androidx.appcompat:appcompat:1.7.0") implementation("com.google.android.material:material:1.12.0") implementation("androidx.cardview:cardview:1.0.0") implementation("androidx.preference:preference-ktx:1.2.1") @@ -106,17 +106,17 @@ dependencies { // Androidx ktx implementation("androidx.activity:activity-ktx:1.9.0") - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.0") - implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.0") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.0") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.1") + implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.1") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.1") //kotlin implementation("org.jetbrains.kotlin:kotlin-reflect:1.9.23") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1") implementation("com.tencent:mmkv-static:1.3.4") - implementation("com.google.code.gson:gson:2.10.1") + implementation("com.google.code.gson:gson:2.11.0") implementation("io.reactivex:rxjava:1.3.8") implementation("io.reactivex:rxandroid:1.2.1") implementation("com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar") diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt index 4c3f81466b..f8f5e45bbe 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt @@ -9,7 +9,6 @@ import android.net.VpnService import android.os.Build import android.os.Bundle import android.text.TextUtils -import android.util.Log import android.view.KeyEvent import android.view.Menu import android.view.MenuItem @@ -28,7 +27,6 @@ import com.google.android.material.navigation.NavigationView import com.tbruyelle.rxpermissions.RxPermissions import com.tencent.mmkv.MMKV import com.v2ray.ang.AppConfig -import com.v2ray.ang.AppConfig.ANG_PACKAGE import com.v2ray.ang.R import com.v2ray.ang.databinding.ActivityMainBinding import com.v2ray.ang.databinding.LayoutProgressBinding @@ -46,8 +44,6 @@ import kotlinx.coroutines.launch import me.drakeet.support.toast.ToastCompat import rx.Observable import rx.android.schedulers.AndroidSchedulers -import java.io.File -import java.io.FileOutputStream import java.util.concurrent.TimeUnit class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener { @@ -112,8 +108,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList setupViewModel() - copyAssets() - //migrateLegacy() + mainViewModel.copyAssets(assets) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { RxPermissions(this) @@ -162,45 +157,6 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList mainViewModel.startListenBroadcast() } - private fun copyAssets() { - val extFolder = Utils.userAssetPath(this) - lifecycleScope.launch(Dispatchers.IO) { - try { - val geo = arrayOf("geosite.dat", "geoip.dat") - assets.list("") - ?.filter { geo.contains(it) } - ?.filter { !File(extFolder, it).exists() } - ?.forEach { - val target = File(extFolder, it) - assets.open(it).use { input -> - FileOutputStream(target).use { output -> - input.copyTo(output) - } - } - Log.i(ANG_PACKAGE, "Copied from apk assets folder to ${target.absolutePath}") - } - } catch (e: Exception) { - Log.e(ANG_PACKAGE, "asset copy failed", e) - } - } - } - -// private fun migrateLegacy() { -// lifecycleScope.launch(Dispatchers.IO) { -// val result = AngConfigManager.migrateLegacyConfig(this@MainActivity) -// if (result != null) { -// launch(Dispatchers.Main) { -// if (result) { -// toast(getString(R.string.migration_success)) -// mainViewModel.reloadServerList() -// } else { -// toast(getString(R.string.migration_fail)) -// } -// } -// } -// } -// } - fun startV2Ray() { if (mainStorage?.decodeString(MmkvManager.KEY_SELECTED_SERVER).isNullOrEmpty()) { return @@ -328,6 +284,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList AlertDialog.Builder(this).setMessage(R.string.del_config_comfirm) .setPositiveButton(android.R.string.ok) { _, _ -> mainViewModel.removeDuplicateServer() + mainViewModel.reloadServerList() } .setNegativeButton(android.R.string.no) {_, _ -> //do noting @@ -372,7 +329,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList /** * import config from qrcode */ - fun importQRcode(forConfig: Boolean): Boolean { + private fun importQRcode(forConfig: Boolean): Boolean { // try { // startActivityForResult(Intent("com.google.zxing.client.android.SCAN") // .addCategory(Intent.CATEGORY_DEFAULT) @@ -408,7 +365,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList /** * import config from clipboard */ - fun importClipboard() + private fun importClipboard() : Boolean { try { val clipboard = Utils.getClipboard(this) @@ -420,7 +377,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList return true } - fun importBatchConfig(server: String?) { + private fun importBatchConfig(server: String?) { val dialog = AlertDialog.Builder(this) .setView(LayoutProgressBinding.inflate(layoutInflater).root) .setCancelable(false) @@ -441,7 +398,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList } } - fun importConfigCustomClipboard() + private fun importConfigCustomClipboard() : Boolean { try { val configText = Utils.getClipboard(this) @@ -460,7 +417,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList /** * import config from local config file */ - fun importConfigCustomLocal(): Boolean { + private fun importConfigCustomLocal(): Boolean { try { showFileChooser() } catch (e: Exception) { @@ -470,7 +427,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList return true } - fun importConfigCustomUrlClipboard() + private fun importConfigCustomUrlClipboard() : Boolean { try { val url = Utils.getClipboard(this) @@ -488,7 +445,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList /** * import config from url */ - fun importConfigCustomUrl(url: String?): Boolean { + private fun importConfigCustomUrl(url: String?): Boolean { try { if (!Utils.isValidUrl(url)) { toast(R.string.toast_invalid_url) @@ -515,7 +472,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList /** * import config from sub */ - fun importConfigViaSub() : Boolean { + private fun importConfigViaSub() : Boolean { val dialog = AlertDialog.Builder(this) .setView(LayoutProgressBinding.inflate(layoutInflater).root) .setCancelable(false) @@ -587,7 +544,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList /** * import customize config */ - fun importCustomizeConfig(server: String?) { + private fun importCustomizeConfig(server: String?) { try { if (server == null || TextUtils.isEmpty(server)) { toast(R.string.toast_none_data) @@ -607,7 +564,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList } } - fun setTestState(content: String?) { + private fun setTestState(content: String?) { binding.tvTestState.text = content } diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt index 7e0510c8ac..6c3d8b9b1e 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt @@ -6,6 +6,7 @@ import android.content.Context import android.content.DialogInterface import android.content.Intent import android.content.IntentFilter +import android.content.res.AssetManager import android.os.Build import android.util.Log import android.view.LayoutInflater @@ -37,6 +38,8 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.cancelChildren import kotlinx.coroutines.launch +import java.io.File +import java.io.FileOutputStream import java.util.Collections class MainViewModel(application: Application) : AndroidViewModel(application) { @@ -283,7 +286,6 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { for (it in deleteServer) { MmkvManager.removeServer(it) } - reloadServerList() getApplication().toast( getApplication().getString( R.string.title_del_duplicate_config_count, @@ -292,6 +294,32 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { ) } + fun copyAssets(assets: AssetManager) { + val extFolder = Utils.userAssetPath(getApplication()) + viewModelScope.launch(Dispatchers.Default) { + try { + val geo = arrayOf("geosite.dat", "geoip.dat") + assets.list("") + ?.filter { geo.contains(it) } + ?.filter { !File(extFolder, it).exists() } + ?.forEach { + val target = File(extFolder, it) + assets.open(it).use { input -> + FileOutputStream(target).use { output -> + input.copyTo(output) + } + } + Log.i( + ANG_PACKAGE, + "Copied from apk assets folder to ${target.absolutePath}" + ) + } + } catch (e: Exception) { + Log.e(ANG_PACKAGE, "asset copy failed", e) + } + } + } + private val mMsgReceiver = object : BroadcastReceiver() { override fun onReceive(ctx: Context?, intent: Intent?) { when (intent?.getIntExtra("key", 0)) { diff --git a/v2rayng/V2rayNG/app/src/main/res/layout/activity_about.xml b/v2rayng/V2rayNG/app/src/main/res/layout/activity_about.xml index 9818c3a45e..640192eef0 100644 --- a/v2rayng/V2rayNG/app/src/main/res/layout/activity_about.xml +++ b/v2rayng/V2rayNG/app/src/main/res/layout/activity_about.xml @@ -20,7 +20,7 @@ android:layout_height="wrap_content" android:clickable="true" android:focusable="true" - android:foreground="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackground" android:gravity="center|start" android:orientation="horizontal" android:padding="16dp"> @@ -60,7 +60,7 @@ android:layout_height="@dimen/server_height" android:clickable="true" android:focusable="true" - android:foreground="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackground" android:gravity="center|start" android:orientation="horizontal" android:padding="16dp"> @@ -84,7 +84,7 @@ android:layout_height="@dimen/server_height" android:clickable="true" android:focusable="true" - android:foreground="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackground" android:gravity="center|start" android:orientation="horizontal" android:padding="16dp"> @@ -116,7 +116,7 @@ android:layout_height="@dimen/server_height" android:clickable="true" android:focusable="true" - android:foreground="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackground" android:gravity="center|start" android:orientation="horizontal" android:padding="16dp"> @@ -140,7 +140,7 @@ android:layout_height="@dimen/server_height" android:clickable="true" android:focusable="true" - android:foreground="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackground" android:gravity="center|start" android:orientation="horizontal" android:padding="16dp"> @@ -165,7 +165,7 @@ android:layout_height="@dimen/server_height" android:clickable="true" android:focusable="true" - android:foreground="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackground" android:gravity="center|start" android:orientation="horizontal" android:padding="16dp"> @@ -189,7 +189,7 @@ android:layout_height="@dimen/server_height" android:clickable="true" android:focusable="true" - android:foreground="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackground" android:gravity="center|start" android:orientation="horizontal" android:padding="16dp"> diff --git a/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_bypass_list.xml b/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_bypass_list.xml index 167a8d5a13..d43866c0b7 100644 --- a/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_bypass_list.xml +++ b/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_bypass_list.xml @@ -3,7 +3,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" - android:foreground="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackground" android:clickable="true" android:focusable="true"> diff --git a/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_main.xml b/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_main.xml index 82a3df8253..157a160480 100644 --- a/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_main.xml +++ b/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_main.xml @@ -21,7 +21,7 @@ android:layout_gravity="center" android:clickable="true" android:focusable="true" - android:foreground="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackground" android:gravity="center" android:nextFocusRight="@+id/layout_share" android:orientation="horizontal"> @@ -115,7 +115,7 @@ android:id="@+id/layout_share" android:layout_width="wrap_content" android:layout_height="@dimen/server_height" - android:background="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" android:focusable="true" android:gravity="center" @@ -134,7 +134,7 @@ android:id="@+id/layout_edit" android:layout_width="wrap_content" android:layout_height="@dimen/server_height" - android:background="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" android:focusable="true" android:gravity="center" @@ -152,7 +152,7 @@ android:id="@+id/layout_remove" android:layout_width="wrap_content" android:layout_height="@dimen/server_height" - android:background="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" android:focusable="true" android:gravity="center" diff --git a/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_sub_setting.xml b/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_sub_setting.xml index 4834ca9b4d..8589b0c5fd 100644 --- a/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_sub_setting.xml +++ b/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_sub_setting.xml @@ -21,7 +21,7 @@ android:layout_gravity="center" android:clickable="true" android:focusable="true" - android:foreground="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackground" android:gravity="center" android:nextFocusRight="@+id/layout_edit" android:orientation="horizontal"> @@ -67,7 +67,7 @@ android:id="@+id/layout_share" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" android:focusable="true" android:gravity="center" @@ -85,7 +85,7 @@ android:id="@+id/layout_edit" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" android:focusable="true" android:gravity="center" diff --git a/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_user_asset.xml b/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_user_asset.xml index 6620ef5412..397f168186 100644 --- a/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_user_asset.xml +++ b/v2rayng/V2rayNG/app/src/main/res/layout/item_recycler_user_asset.xml @@ -14,7 +14,7 @@ @@ -64,7 +64,7 @@ android:id="@+id/layout_edit" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" android:focusable="true" android:padding="@dimen/nav_header_vertical_spacing"> @@ -79,7 +79,7 @@ android:id="@+id/layout_remove" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="?attr/selectableItemBackground" + android:background="?attr/selectableItemBackgroundBorderless" android:clickable="true" android:focusable="true" android:padding="@dimen/nav_header_vertical_spacing"> diff --git a/yass/.github/workflows/releases-mingw.yml b/yass/.github/workflows/releases-mingw.yml index 629f8ebc05..9d75279679 100644 --- a/yass/.github/workflows/releases-mingw.yml +++ b/yass/.github/workflows/releases-mingw.yml @@ -119,7 +119,7 @@ jobs: REM start to build with workaround mkdir build-mingw cd build-mingw - cmake -G Ninja -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DBUILD_BENCHMARKS=on -DBUILD_TESTS=on -DGUI=on -DMINGW_MSVCRT100=on -DMINGW_WORKAROUND=on .. ${{ env.CMAKE_OPTIONS }} -DCMAKE_C_COMPILER_TARGET=${{ matrix.arch }}-pc-windows-gnu -DCMAKE_CXX_COMPILER_TARGET=${{ matrix.arch }}-pc-windows-gnu -DCMAKE_ASM_COMPILER_TARGET=${{ matrix.arch }}-pc-windows-gnu -DCMAKE_SYSROOT="%CD%\..\third_party\${{ matrix.mingw_dir }}\${{ matrix.arch }}-w64-mingw32" -DUSE_TCMALLOC=on + cmake -G Ninja -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DBUILD_BENCHMARKS=on -DBUILD_TESTS=on -DGUI=on -DMINGW_MSVCRT100=on -DMINGW_WORKAROUND=on .. ${{ env.CMAKE_OPTIONS }} -DCMAKE_C_COMPILER_TARGET=${{ matrix.arch }}-pc-windows-gnu -DCMAKE_CXX_COMPILER_TARGET=${{ matrix.arch }}-pc-windows-gnu -DCMAKE_ASM_COMPILER_TARGET=${{ matrix.arch }}-pc-windows-gnu -DCMAKE_SYSROOT="%CD%\..\third_party\${{ matrix.mingw_dir }}\${{ matrix.arch }}-w64-mingw32" -DUSE_TCMALLOC=on -DENABLE_LLD=on ninja yass yass_benchmark yass_test - name: Packaging shell: bash diff --git a/yass/CMakeLists.txt b/yass/CMakeLists.txt index f2d45df48d..8edff3be51 100644 --- a/yass/CMakeLists.txt +++ b/yass/CMakeLists.txt @@ -453,7 +453,6 @@ cmake_dependent_option( USE_NGHTTP2 OFF) option(USE_ICF "Build with ICF" OFF) -option(USE_LTO "Build with LTO" OFF) option(USE_CURL "Build with libcurl (test only)" ON) option(USE_CARES "Build with c-ares" ON) @@ -492,9 +491,10 @@ option(USE_SYSTEM_ZLIB "Build with system or vendered zlib" OFF) option(USE_SYSTEM_JSON "Build with system or vendered json library" OFF) option(ENABLE_FORTIFY "Enable build with Fortify Source (linux only)" OFF) -option(ENABLE_LTO "Enable build with LTO" ON) -option(ENABLE_LLD "Enable build with LLD" ON) -option(ENABLE_GOLD "Enable build with GOLD" ON) +option(ENABLE_LTO "Enable build with LTO" OFF) + +option(ENABLE_LLD "Enable build with LLD" OFF) +option(ENABLE_GOLD "Enable build with GOLD" OFF) option(USE_MOLD "Build with mold linker" OFF) option(USE_LLD "Build with lld linker" OFF) @@ -526,7 +526,14 @@ endif() if (USE_MOLD OR USE_LLD OR USE_GOLD) set(USE_ICF ON) else() - set(ENABLE_LTO OFF) + if (ENABLE_LTO) + set(ENABLE_LTO FALSE) + include(CheckIPOSupported) + check_ipo_supported(RESULT USE_LTO_CMAKE OUTPUT LTO_REASON) + if (NOT USE_LTO_CMAKE) + message(WARNING "LTO is not supported: ${LTO_REASON}, disabling") + endif() + endif() endif() if (ENABLE_CLANG_TIDY) @@ -594,20 +601,28 @@ if (ENABLE_LTO AND IS_RELEASE_BUILD) endif() endif() - ## adopt Full LTO - ## old gcc has regression on c++17 mode - ## https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81004 - if (COMPILER_GCC AND NOT WIN32 AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 7.3.1) - set(LTO ON) - set(LTO_FLAVOUR "full") - endif() - if (LTO) message(STATUS "Compiling with ${LTO_FLAVOUR} LTO") list(APPEND YASS_APP_FEATURES "lto ${LTO_FLAVOUR}") + set(USE_LTO_CMAKE OFF) endif() endif() +if (USE_LTO_CMAKE AND ${CMAKE_GENERATOR} MATCHES "^Xcode.*" AND IS_RELEASE_BUILD) + set(USE_LTO_CMAKE OFF) + # https://gitlab.kitware.com/cmake/cmake/-/issues/16749 + set(CMAKE_XCODE_ATTRIBUTE_LLVM_LTO "YES_THIN") + message(STATUS "Compiling with Xcode's LTO") + list(APPEND YASS_APP_FEATURES "lto thin") +endif() + +if (USE_LTO_CMAKE AND IS_RELEASE_BUILD) + message(STATUS "Compiling with CMake's LTO") + list(APPEND YASS_APP_FEATURES "lto auto") +else() + set(USE_LTO_CMAKE OFF) +endif() + if (NOT MSVC) if (USE_MOLD) add_link_options(-fuse-ld=mold -Wl,--gdb-index) @@ -2372,6 +2387,27 @@ set(SUPPORT_LIBS ${SUPPORT_LIBS} ) +if (USE_LTO_CMAKE) + set_target_properties( + absl_base + absl_core_headers + absl_flat_hash_map + absl_flat_hash_set + absl_flags + absl_flags_parse + absl_flags_marshalling + absl_synchronization + absl_stacktrace + absl_symbolize + absl_status + absl_statusor + absl_strings + absl_time + absl_optional + absl_failure_signal_handler + PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() + # ***************************************************************************************** # tcmalloc Library # ***************************************************************************************** @@ -2433,6 +2469,10 @@ elseif (USE_TCMALLOC AND NOT WIN32) set(GPERFTOOLS_ENABLE_INSTALL OFF CACHE BOOL "") set(GPERFTOOLS_BUILD_TESTING OFF CACHE BOOL "") add_subdirectory(third_party/gperftools EXCLUDE_FROM_ALL) + if (USE_LTO_CMAKE) + set_property(TARGET tcmalloc_minimal_static + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() list(APPEND YASS_APP_FEATURES "tcmalloc_minimal") @@ -2461,6 +2501,10 @@ elseif (USE_TCMALLOC AND WIN32) set(GPERFTOOLS_ENABLE_INSTALL OFF CACHE BOOL "") set(GPERFTOOLS_BUILD_TESTING OFF CACHE BOOL "") add_subdirectory(third_party/gperftools EXCLUDE_FROM_ALL) + if (USE_LTO_CMAKE) + set_property(TARGET tcmalloc_minimal + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() list(APPEND YASS_APP_FEATURES "tcmalloc_minimal (dll)") @@ -2567,6 +2611,10 @@ elseif(USE_MIMALLOC AND NOT WIN32) set(MI_LIBC_MUSL "${USE_MUSL}" CACHE INTERNAL "") add_subdirectory(third_party/mimalloc EXCLUDE_FROM_ALL) target_compile_definitions(mimalloc-static PRIVATE MI_USE_ENVIRON=0) + if (USE_LTO_CMAKE) + set_property(TARGET mimalloc-static + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() set(MIMALLOC_LIB mimalloc-static) add_library(mimalloc_override OBJECT src/mimalloc.cc) @@ -2594,6 +2642,10 @@ elseif(USE_MIMALLOC AND WIN32) add_subdirectory(third_party/mimalloc EXCLUDE_FROM_ALL) target_compile_definitions(mimalloc PRIVATE MI_USE_ENVIRON=0) target_compile_definitions(mimalloc PRIVATE _DLL=1) + if (USE_LTO_CMAKE) + set_property(TARGET mimalloc + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() set(MIMALLOC_LIB mimalloc) @@ -2980,6 +3032,10 @@ add_library(asio_core STATIC src/net/asio.cpp src/net/asio_throw_exceptions.hpp ) +if (USE_LTO_CMAKE) + set_property(TARGET asio_core + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() target_include_directories(asio_core PUBLIC src) target_include_directories(asio_core PUBLIC @@ -3020,6 +3076,10 @@ endif() add_library(asio STATIC src/net/asio_ssl.cpp ) +if (USE_LTO_CMAKE) + set_property(TARGET asio + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() target_link_libraries(asio PUBLIC asio_core absl::flags @@ -3128,7 +3188,6 @@ set(SUPPORT_LIBS asio ${SUPPORT_LIBS}) # json Library # ***************************************************************************************** - if (USE_SYSTEM_JSON) check_cxx_source_compiles (" #include @@ -4105,6 +4164,11 @@ else() target_sources(yass_core PRIVATE src/core/utils_freebsd.cpp) endif() +if (USE_LTO_CMAKE) + set_property(TARGET yass_core + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() + if (OHOS) target_link_libraries(yass_core PUBLIC libhilog_ndk.z.so) endif() @@ -4279,6 +4343,11 @@ add_library(yass_net STATIC ${files} ${hfiles} ) +if (USE_LTO_CMAKE) + set_property(TARGET yass_net + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() + target_include_directories(yass_net PUBLIC ${SUPPORT_INCLUDE_DIRS}) @@ -4303,6 +4372,11 @@ add_library(yass_cli_nogui_lib OBJECT src/cli/cli_connection_stats.cpp src/cli/cli_connection_stats.hpp ) + +if (USE_LTO_CMAKE) + set_property(TARGET yass_cli_nogui_lib + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() target_include_directories(yass_cli_nogui_lib PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) @@ -4312,6 +4386,10 @@ add_library(yass_cli_lib STATIC src/cli/cli_worker.cpp $ ) +if (USE_LTO_CMAKE) + set_property(TARGET yass_cli_lib + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() target_include_directories(yass_cli_lib PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) @@ -4322,6 +4400,10 @@ if (CLI) src/cli/cli.cpp ) minject_patch_exetuable(yass_cli) + if (USE_LTO_CMAKE) + set_property(TARGET yass_cli + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() if (WIN32) set(CLI_MSVC_MANIFEST "${CMAKE_CURRENT_BINARY_DIR}/yass_cli.manifest") @@ -4364,6 +4446,10 @@ add_library(yass_server_lib OBJECT src/server/server_connection.cpp src/server/server_connection.hpp ) +if (USE_LTO_CMAKE) + set_property(TARGET yass_server_lib + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() target_include_directories(yass_server_lib PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) @@ -4374,6 +4460,10 @@ if (SERVER) src/server/server.cpp ) minject_patch_exetuable(yass_server) + if (USE_LTO_CMAKE) + set_property(TARGET yass_server + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() if (WIN32) set(SERVER_MSVC_MANIFEST "${CMAKE_CURRENT_BINARY_DIR}/yass_server.manifest") @@ -4644,6 +4734,11 @@ if (GUI) minject_patch_exetuable(${APP_NAME}) endif() + if (USE_LTO_CMAKE) + set_property(TARGET ${APP_NAME} + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() + target_include_directories(${APP_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/third_party) @@ -4917,6 +5012,11 @@ if (GUI) set_source_files_properties("src/ios/extensions/PrivacyInfo.xcprivacy" PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") + if (USE_LTO_CMAKE) + set_property(TARGET network-extension + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() + target_include_directories(network-extension PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src/ios/extensions) @@ -5195,6 +5295,11 @@ if (BUILD_TESTS) else() set(USE_CURL OFF) endif() + + if (USE_LTO_CMAKE) + set_property(TARGET yass_test + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() endif() if (BUILD_BENCHMARKS) @@ -5222,6 +5327,12 @@ if (BUILD_BENCHMARKS) ${yass_benchmark_SOURCE}) minject_patch_exetuable(yass_benchmark) endif() + + if (USE_LTO_CMAKE) + set_property(TARGET yass_benchmark + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() + target_include_directories(yass_benchmark PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src/cli diff --git a/yass/debian/rules b/yass/debian/rules index 30eadc0473..4c2eb1b81d 100755 --- a/yass/debian/rules +++ b/yass/debian/rules @@ -51,8 +51,6 @@ ifneq ($(filter riscv64,$(DEB_HOST_GNU_CPU)),) override_dh_auto_configure: ASMFLAGS += -march=rv64gc -mabi=lp64d override_dh_auto_configure: CFLAGS += -march=rv64gc -mabi=lp64d override_dh_auto_configure: CXXFLAGS += -march=rv64gc -mabi=lp64d -# lto mess with d extension support -CMAKE_OPTIONS += -DENABLE_LTO=off endif endif @@ -60,6 +58,7 @@ ifneq ($(filter cross,$(DEB_BUILD_PROFILES)),) override_dh_auto_configure: PKG_CONFIG = ${DEB_HOST_GNU_TYPE}-pkg-config endif +override_dh_auto_configure: CMAKE_OPTIONS += -DENABLE_LTO=on -DENABLE_LLD=on override_dh_auto_configure: CMAKE_OPTIONS += -DUSE_SYSTEM_ZLIB=on override_dh_auto_configure: CMAKE_OPTIONS += -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=$(DEB_HOST_ARCH) override_dh_auto_configure: CMAKE_OPTIONS += -DUSE_OLD_SYSTEMD_SERVICE=on diff --git a/yass/third_party/CMakeLists.txt b/yass/third_party/CMakeLists.txt index 30d4e2096a..c3c1ea0a12 100644 --- a/yass/third_party/CMakeLists.txt +++ b/yass/third_party/CMakeLists.txt @@ -35,6 +35,10 @@ set(RE2_HEADERS ) add_library(re2 ${RE2_SOURCES} ${RE2_HEADERS}) +if (USE_LTO_CMAKE) + set_property(TARGET re2 + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() target_include_directories(re2 PUBLIC re2) target_link_libraries(re2 PUBLIC @@ -222,6 +226,11 @@ add_library(double_conversion STATIC googleurl-override/base/third_party/double_conversion/double-conversion/utils.h ) +if (USE_LTO_CMAKE) + set_property(TARGET double_conversion + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() + target_include_directories(double_conversion PRIVATE googleurl-override/base/third_party/double_conversion/double-conversion ) @@ -230,6 +239,11 @@ target_compile_options(double_conversion PRIVATE -Wno-unused-const-variable -Wno target_link_libraries(url PUBLIC double_conversion) +if (USE_LTO_CMAKE) + set_property(TARGET url + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() + target_include_directories(url PUBLIC googleurl-override googleurl diff --git a/yass/third_party/libc++/CMakeLists.txt b/yass/third_party/libc++/CMakeLists.txt index 8192c36900..2e66686859 100644 --- a/yass/third_party/libc++/CMakeLists.txt +++ b/yass/third_party/libc++/CMakeLists.txt @@ -452,6 +452,11 @@ else() endif() endif() +if (USE_LTO_CMAKE) + set_property(TARGET cxx + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() + if (NOT APPLE AND (ASAN OR TSAN OR MSAN)) # In {a,t,m}san configurations, operator new and operator delete will be # provided by the sanitizer runtime library. Since libc++ defines these @@ -556,6 +561,11 @@ if (NOT MSVC) target_compile_definitions(cxxabi PRIVATE ${libcxx_PUBLIC_DEFINITIONS}) target_compile_options(cxxabi PRIVATE ${libcxx_CFLAGS}) + if (USE_LTO_CMAKE) + set_property(TARGET cxxabi + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() + target_include_directories(cxxabi PRIVATE ../libc++ ../libc++/trunk/src diff --git a/yass/third_party/quiche/CMakeLists.txt b/yass/third_party/quiche/CMakeLists.txt index 2d5ad954d2..26dc610085 100644 --- a/yass/third_party/quiche/CMakeLists.txt +++ b/yass/third_party/quiche/CMakeLists.txt @@ -722,6 +722,11 @@ add_library(quiche STATIC #${quiche_protos_SRCS} ) +if (USE_LTO_CMAKE) + set_property(TARGET quiche + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() + target_include_directories(quiche PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/overrides ${CMAKE_CURRENT_BINARY_DIR}/src @@ -806,6 +811,11 @@ if (USE_BALSA_HTTP_PARSER) src/quiche/balsa/standard_header_map.cc ) + if (USE_LTO_CMAKE) + set_property(TARGET balsa + PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() + target_include_directories(balsa PUBLIC src ) @@ -817,3 +827,4 @@ if (USE_BALSA_HTTP_PARSER) absl::memory absl::strings) endif() + diff --git a/yass/tools/build.go b/yass/tools/build.go index 527df20b4b..058255c841 100644 --- a/yass/tools/build.go +++ b/yass/tools/build.go @@ -792,6 +792,7 @@ func buildStageGenerateBuildScript() { glog.Infof("Using compiler %s", _clangPath) } } + cmakeArgs = append(cmakeArgs, "-DENABLE_LLD=on") cmakeArgs = append(cmakeArgs, "-DGUI=ON", "-DCLI=ON", "-DSERVER=ON") cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DCMAKE_BUILD_TYPE=%s", cmakeBuildTypeFlag)) if systemNameFlag == "ios" { diff --git a/yass/yass.spec.in b/yass/yass.spec.in index 89c19c774d..c7e2b135b3 100644 --- a/yass/yass.spec.in +++ b/yass/yass.spec.in @@ -164,7 +164,7 @@ cd build -DUSE_SYSTEM_MBEDTLS="%enable_system_mbedtls_opt" \ -DUSE_SYSTEM_JSON="%enable_system_json_opt" \ -DUSE_SYSTEM_CARES="%enable_system_cares_opt" -DUSE_LIBCXX="%enable_libcxx_opt" \ - -DENABLE_LLD="%enable_lld_opt" -DUSE_BUILTIN_CA_BUNDLE_CRT=off .. + -DENABLE_LTO=on -DENABLE_LLD="%enable_lld_opt" -DUSE_BUILTIN_CA_BUNDLE_CRT=off .. ninja cd ..