diff --git a/.github/update.log b/.github/update.log index 3322766ed3..7055c9be08 100644 --- a/.github/update.log +++ b/.github/update.log @@ -636,3 +636,4 @@ Update On Tue Apr 30 20:31:38 CEST 2024 Update On Wed May 1 20:30:48 CEST 2024 Update On Thu May 2 20:28:05 CEST 2024 Update On Fri May 3 20:27:51 CEST 2024 +Update On Sat May 4 20:29:46 CEST 2024 diff --git a/brook/brooklink.go b/brook/brooklink.go index d5def132ee..f0ad05f31b 100644 --- a/brook/brooklink.go +++ b/brook/brooklink.go @@ -238,6 +238,24 @@ func (blk *BrookLink) CreateExchanger(network, src string, dstb []byte, tcptimeo } return sc, rc, nil } + if blk.V.Get("udpoverstream") == "true" { + rc, err := QUICDialTCP(src, socks5.ToAddress(dstb[0], dstb[1:len(dstb)-2], dstb[len(dstb)-2:]), blk.Address, blk.Tc, tcptimeout) + if err != nil { + return nil, nil, err + } + var sc Exchanger + if blk.V.Get("withoutBrookProtocol") != "true" { + sc, err = NewStreamClient("udp", blk.Password, src, rc, tcptimeout, dstb) + } + if blk.V.Get("withoutBrookProtocol") == "true" { + sc, err = NewSimpleStreamClient("udp", blk.Password, src, rc, tcptimeout, dstb) + } + if err != nil { + rc.Close() + return nil, nil, err + } + return sc, rc, nil + } rc, err := QUICDialUDP(src, socks5.ToAddress(dstb[0], dstb[1:len(dstb)-2], dstb[len(dstb)-2:]), blk.Address, blk.Tc, udptimeout) if err != nil { return nil, nil, err diff --git a/brook/cli/brook/main.go b/brook/cli/brook/main.go index 20ab5b800f..f4968ac8c9 100644 --- a/brook/cli/brook/main.go +++ b/brook/cli/brook/main.go @@ -74,7 +74,7 @@ func main() { }, &cli.StringSliceFlag{ Name: "tag", - Usage: "Tag can be used to the process, will be append into log or serverLog, such as: 'key1:value1'", + Usage: "Tag can be used to the process, will be append into log or serverLog, such as: 'key1:value1'. All tags will also be appended as query parameters one by one to the userAPI", }, &cli.StringFlag{ Name: "dialWithDNS", @@ -1583,6 +1583,10 @@ func main() { Name: "udpovertcp", Usage: "When server is brook server, UDP over TCP", }, + &cli.BoolFlag{ + Name: "udpoverstream", + Usage: "When server is brook quicserver, UDP over Stream. Note: only brook CLI and tun2brook suppport for now", + }, &cli.StringFlag{ Name: "address", Usage: "When server is brook wsserver or brook wssserver or brook quicserver, specify address instead of resolving addresses from host, such as 1.2.3.4:443", @@ -1613,11 +1617,11 @@ func main() { }, &cli.StringFlag{ Name: "fragment", - Usage: "When server is brook wssserver, split the ClientHello into multiple fragments and then send them one by one with delays (millisecond). The format is min_length:max_length:min_delay:max_delay, cannot be zero, such as 50:100:10:50, Note that: This is an experimental feature, currently only supported by the brook CLI and tun2brook", + Usage: "When server is brook wssserver, split the ClientHello into multiple fragments and then send them one by one with delays (millisecond). The format is min_length:max_length:min_delay:max_delay, cannot be zero, such as 50:100:10:50", }, &cli.StringFlag{ Name: "token", - Usage: "A token represents a user's identity. A string encoded in hexadecimal. Server needs to have --userAPI enabled. Note that: Only supported by the brook GUI and tun2brook", + Usage: "A token represents a user's identity. A string encoded in hexadecimal. Server needs to have --userAPI enabled. Note that: Only supported by the brook GUI(except for OpenWrt) and tun2brook", }, &cli.BoolFlag{ Name: "example", @@ -1656,6 +1660,9 @@ func main() { if c.Bool("udpovertcp") { v.Set("udpovertcp", "true") } + if c.Bool("udpoverstream") { + v.Set("udpoverstream", "true") + } if c.String("address") != "" { v.Set("address", c.String("address")) } @@ -2735,11 +2742,11 @@ func main() { if ip == nil { return errors.New(c.String("ip") + " is not IP") } - b := iploc.Country(ip) - if b == nil { + s := iploc.Country(ip) + if s == "" { return errors.New(c.String("ip") + " unknown") } - fmt.Println(string(b)) + fmt.Println(s) return nil }, }, diff --git a/brook/docs/build.sh b/brook/docs/build.sh index 7d85cc9295..d7a8ec9b66 100755 --- a/brook/docs/build.sh +++ b/brook/docs/build.sh @@ -6,7 +6,7 @@ echo '' >> ../readme.md echo 'A cross-platform programmable network tool.' >> ../readme.md echo '' >> ../readme.md echo '# Sponsor' >> ../readme.md -echo '**❤️ [Shiliew - China Optimized Network App](https://www.txthinking.com/shiliew.html)**' >> ../readme.md +echo '**❤️ [Shiliew - A network app designed for those who value their time](https://www.txthinking.com/shiliew.html)**' >> ../readme.md cat getting-started.md >> ../readme.md cat gui.md >> ../readme.md @@ -16,7 +16,6 @@ echo '# CLI Documentation' >> ../readme.md jb '$1`brook mdpage`.split("\n").filter(v=>!v.startsWith("[")).join("\n").replace("```\n```", "```\nbrook --help\n```").split("\n").forEach(v=> echo(v.startsWith("**") && !v.startsWith("**Usage") ? "- "+v : v))' >> ../readme.md cat example.md >> ../readme.md -cat diagram.md >> ../readme.md markdown ../readme.md ./index.html diff --git a/brook/docs/diagram.md b/brook/docs/diagram.md deleted file mode 100644 index fd2d39f9fd..0000000000 --- a/brook/docs/diagram.md +++ /dev/null @@ -1,40 +0,0 @@ -# Diagram - -> Maybe outdated - -## overview - -![overview](https://txthinking.github.io/brook/svg/overview.svg) - -## withoutBrookProtocol - -![wbp](https://txthinking.github.io/brook/svg/wbp.svg) - -## relayoverbrook - -![relayoverbrook](https://txthinking.github.io/brook/svg/relayoverbrook.svg) - -## dnsserveroverbrook - -![dnsserveroverbrook](https://txthinking.github.io/brook/svg/dnsserveroverbrook.svg) - -## relay - -![relay](https://txthinking.github.io/brook/svg/relay.svg) - -## dnsserver - -![dnsserver](https://txthinking.github.io/brook/svg/dnsserver.svg) - -## tproxy - -![tproxy](https://txthinking.github.io/brook/svg/tproxy.svg) - -## gui - -![gui](https://txthinking.github.io/brook/svg/gui.svg) - -## script - -![script](https://txthinking.github.io/brook/svg/script.svg) - diff --git a/brook/docs/resources.md b/brook/docs/resources.md index 84bba8052e..5eff98e2a2 100644 --- a/brook/docs/resources.md +++ b/brook/docs/resources.md @@ -27,6 +27,6 @@ | [Socks5 Configurator](https://chromewebstore.google.com/detail/socks5-configurator/hnpgnjkeaobghpjjhaiemlahikgmnghb) | If you prefer CLI brook client | | [IPvBar](https://chromewebstore.google.com/detail/ipvbar/nepjlegfiihpkcdhlmaebfdfppckonlj) | See domain, IP and country in browser | | [TxThinking SSH](https://www.txthinking.com/ssh.html) | A SSH Terminal | -| [brook-manager](https://github.com/txthinking/brook-manager) | Brook Manager is a Brook management system for medium to large merchants | +| [brook-dashboard](https://github.com/txthinkinginc/brook-dashboard) | A Brook User System | | [TxThinking](https://www.txthinking.com) | Everything | diff --git a/brook/docs/svg/dnsserver.svg b/brook/docs/svg/dnsserver.svg deleted file mode 100644 index 8fc695aa3b..0000000000 --- a/brook/docs/svg/dnsserver.svg +++ /dev/null @@ -1,845 +0,0 @@ -

dnsserver

-
Local/UDPRemote/UDPRuleBlockSRCdnsserver.listendnsserver.dns - - -
diff --git a/brook/docs/svg/dnsserveroverbrook.svg b/brook/docs/svg/dnsserveroverbrook.svg deleted file mode 100644 index b03931d766..0000000000 --- a/brook/docs/svg/dnsserveroverbrook.svg +++ /dev/null @@ -1,845 +0,0 @@ -

dnsserveroverbrook

-
Local/UDPRemote/UDPBrookProtocolRuleBlockBypass/UDPSRCdnsserveroverbrook.listendnsserveroverbrook.dnsForBypassbrook server / brook wsserver / brook wssserver / brook quicserverdnsserveroverbrook.dnsMiddle/UDP - - -
diff --git a/brook/docs/svg/gui.svg b/brook/docs/svg/gui.svg deleted file mode 100644 index 24bed1b4e0..0000000000 --- a/brook/docs/svg/gui.svg +++ /dev/null @@ -1,849 +0,0 @@ -

GUI

-
DNSIPLocal/UDPRemote/UDPBypass/TCP/UDPBrookProtocolRuleBlock - -ScriptHostsFake DNSSRCSystemDNSBypass DNSbrook server / brook wsserver / brook wssserver / brook quicserverSystem DNSLocal/TCP/UDPRemote/TCP/UDPBrookProtocolBypass/TCP/UDPRuleConvert fake IP to domain - -ScriptSRCBrook ClientDSTbrook server / brook wsserver / brook wssserver / brook quicserverMiddle/UDPMiddle/TCP/UDP - - -
diff --git a/brook/docs/svg/overview.svg b/brook/docs/svg/overview.svg deleted file mode 100644 index ed835dadde..0000000000 --- a/brook/docs/svg/overview.svg +++ /dev/null @@ -1,845 +0,0 @@ -

Overview

-
Local/TCP/UDPRemote/TCP/UDPRANDOMHTTPHTTPSQUICMiddle/TCP/UDPSRCBrook Clientsocks5 serverbrook serverbrook wsserverbrook wssserverbrook quicserverDSTBrookProtocolBrookProtocolBrookProtocolBrookProtocolMiddle/TCP/UDPMiddle/TCP/UDPMiddle/TCP/UDPMiddle/TCP/UDP - - -
diff --git a/brook/docs/svg/relay.svg b/brook/docs/svg/relay.svg deleted file mode 100644 index 5240ed9240..0000000000 --- a/brook/docs/svg/relay.svg +++ /dev/null @@ -1,845 +0,0 @@ -

relay.from == relay.to

-
Local/TCP/UDPRemote/TCP/UDPSRCrelay.fromrelay.to - - -
diff --git a/brook/docs/svg/relayoverbrook.svg b/brook/docs/svg/relayoverbrook.svg deleted file mode 100644 index 1b436069de..0000000000 --- a/brook/docs/svg/relayoverbrook.svg +++ /dev/null @@ -1,845 +0,0 @@ -

relayoverbrook.from == relayoverbrook.to

-
Local/TCP/UDPRemote/TCP/UDPBrookProtocolSRCrelayoverbrook.frombrook server / brook wsserver / brook wssserver / brook quicserverrelayoverbrook.toMiddle/TCP/UDP - - -
diff --git a/brook/docs/svg/script.svg b/brook/docs/svg/script.svg deleted file mode 100644 index be52cbf949..0000000000 --- a/brook/docs/svg/script.svg +++ /dev/null @@ -1,874 +0,0 @@ -

Script

-
in_guiconfigin_dnsqueryin_addressin_httprequestin_httpresponseUserBrook ClientConnectingGUI ConfigurationScriptFinal ConfigurationConnectedSRCBrook ClientScriptblockipforcefakednssystembypassSRCBrook ClientScriptblockipaddressipaddressfrombypassdnsbypassmitmmitmprotocolmitmcertdomainmitmwithbodymitmautohandlecompressmitmclienttimeoutmitmserverreadtimeoutmitmserverwritetimeoutSRCBrook ClientScriptRequestResponseDSTBrook ClientScriptResponse in_guiconfigoutdns queryin_dnsquery{type, domain}outoutoutoutoutDSTin_address{network, ipaddress, domainaddress}outoutoutoutouthttp(s) requestin_httprequest{URL, Method, Body, Headers}outouthttp(s) responsein_httprequest{URL, Method, Body, Headers}in_httpresponse{StatusCode, Body, Headers}out - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/brook/docs/svg/tproxy.svg b/brook/docs/svg/tproxy.svg deleted file mode 100644 index a339c12418..0000000000 --- a/brook/docs/svg/tproxy.svg +++ /dev/null @@ -1,852 +0,0 @@ -

tproxy, OpenWrt

-
DNSIPLocal/UDPRemote/UDPBypass/UDPBrookProtocolRuleBlockSRCtproxy.dnsListentproxy.dnsForBypassbrook server / brook wsserver / brook wssserver / brook quicservertproxy.dnsForDefaultLocal/TCP/UDPRemote/TCP/UDPBrookProtocolBypass/TCP/UDPRuleSRCtproxy gatewayDSTtproxy.redirectDNSbrook server / brook wsserver / brook wssserver / brook quicserverMiddle/UDPMiddle/TCP/UDP UDP/53 - - -
diff --git a/brook/docs/svg/wbp.svg b/brook/docs/svg/wbp.svg deleted file mode 100644 index e637ee0260..0000000000 --- a/brook/docs/svg/wbp.svg +++ /dev/null @@ -1,845 +0,0 @@ -

--withoutBrookProtocol

-
Local/TCP/UDPRemote/TCP/UDPHTTPHTTPSQUICSRCBrook Clientbrook wsserverbrook wssserverbrook quicserverDSTMiddle/TCP/UDPMiddle/TCP/UDPMiddle/TCP/UDP - - -
diff --git a/brook/go.mod b/brook/go.mod index cc626eff51..61776bbd81 100644 --- a/brook/go.mod +++ b/brook/go.mod @@ -8,7 +8,7 @@ require ( github.com/krolaw/dhcp4 v0.0.0-20190909130307-a50d88189771 github.com/miekg/dns v1.1.57 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/phuslu/iploc v1.0.20231031 + github.com/phuslu/iploc v1.0.20240501 github.com/prometheus/client_golang v1.17.0 github.com/quic-go/quic-go v0.42.0 github.com/refraction-networking/utls v1.5.4 diff --git a/brook/go.sum b/brook/go.sum index 32d26e63ac..d1d598df4b 100644 --- a/brook/go.sum +++ b/brook/go.sum @@ -51,6 +51,8 @@ github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaR github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/phuslu/iploc v1.0.20231031 h1:AsKT2PqStXV+gqJjNJ5mcUJ7YT9i09W+NVthhz5987s= github.com/phuslu/iploc v1.0.20231031/go.mod h1:gsgExGWldwv1AEzZm+Ki9/vGfyjkL33pbSr9HGpt2Xg= +github.com/phuslu/iploc v1.0.20240501 h1:lX2dEFOQzxVpTH3dgJ+pcNEpLxwaJUhoCGMoajuAI5w= +github.com/phuslu/iploc v1.0.20240501/go.mod h1:VZqAWoi2A80YPvfk1AizLGHavNIG9nhBC8d87D/SeVs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= diff --git a/brook/list.go b/brook/list.go index a364e9b8cc..f821ea3da8 100644 --- a/brook/list.go +++ b/brook/list.go @@ -71,9 +71,8 @@ func ListHasIP(c4, c6 []*net.IPNet, i net.IP, c *cache.Cache, geo []string) bool } } if len(geo) != 0 { - b := iploc.Country(i) - if b != nil { - bs := string(b) + bs := iploc.Country(i) + if bs != "" { for _, v := range geo { if v == bs { if c != nil { diff --git a/brook/protocol/user-system.md b/brook/protocol/user-system.md index e0e50cdb18..007ad200ba 100644 --- a/brook/protocol/user-system.md +++ b/brook/protocol/user-system.md @@ -1,7 +1,5 @@ # User System -⚠️ Currently, this feature is experimental. At present, only this [brook_linux_amd64.20240606](https://github.com/txthinking/bash/releases/download/v20221005/brook_linux_amd64.20240606) and [tun2brook](https://github.com/txthinking/tun2brook) support it. - This content introduces how to develop a user system with Brook. Your system only needs to focus on two concepts: **Token** and **User API**. To support user system, you **must use brook server/wsserver/wssserver/quicserver with the brook protocol**. @@ -14,14 +12,14 @@ For example, encrypt user id or make session, and encode in hexadecimal: ``` hex_encode(your_encrypt_or_session_function(user id)) -// 3ae6afc9fad94abd8985d8ecc77afb273ae6afc9fad94abd8985d8ecc77afb273ae6afc9fad94abd8985d8ecc77afb27 // 48 bytes token +// 3ae6afc9fad94abd8985d8ecc77afb273ae6afc9fad94abd8985d8ecc77afb273ae6afc9fad94abd8985d8ecc77afb27 ``` For example, UUID: ```javascript crypto.randomUUID().replaceAll('-', '') -// 3ae6afc9fad94abd8985d8ecc77afb27 // 16 bytes token +// 3ae6afc9fad94abd8985d8ecc77afb27 ``` ## User API @@ -79,3 +77,6 @@ You can count the traffic of each user from serverLog brook link --server 1.2.3.4:9999 --password hello --token xxx ``` +## Basic reference implementation + +https://github.com/TxThinkingInc/brook-dashboard diff --git a/brook/quicserver.go b/brook/quicserver.go index 5c1538f37f..9be1f4c34f 100644 --- a/brook/quicserver.go +++ b/brook/quicserver.go @@ -148,8 +148,15 @@ func (s *QUICServer) ListenAndServe() error { return } defer ss.Clean() - if err := s.TCPHandle(ss); err != nil { - Log(Error{"from": ss.Src(), "dst": ss.Dst(), "error": err.Error()}) + if ss.Network() == "tcp" { + if err := s.TCPHandle(ss); err != nil { + Log(Error{"from": ss.Src(), "dst": ss.Dst(), "error": err.Error()}) + } + } + if ss.Network() == "udp" { + if err := s.UDPOverTCPHandle(ss); err != nil { + Log(Error{"from": c.RemoteAddr().String(), "dst": ss.Dst(), "error": err.Error()}) + } } }(&QUICConn{ Conn: c, @@ -240,6 +247,18 @@ func (s *QUICServer) TCPHandle(ss Exchanger) error { return nil } +func (s *QUICServer) UDPOverTCPHandle(ss Exchanger) error { + rc, err := NATDial("udp", ss.Src(), ss.Dst(), ss.Dst()) + if err != nil { + return err + } + defer rc.Close() + if err := ss.Exchange(rc); err != nil { + return nil + } + return nil +} + func (s *QUICServer) UDPHandle(ss Exchanger) error { rc, err := NATDial("udp", ss.Src(), ss.Dst(), ss.Dst()) if err != nil { diff --git a/brook/test_test.go b/brook/test_test.go index 40b49f3e6d..ff13564467 100644 --- a/brook/test_test.go +++ b/brook/test_test.go @@ -16,10 +16,12 @@ package brook import ( "log" + "net" "testing" + + "github.com/phuslu/iploc" ) func TestTest(t *testing.T) { - l, err := CAC("/tmp/a") - log.Printf("%#v %v\n", l, err) + log.Printf("%#v\n", iploc.Country(net.ParseIP("8.8.8.8"))) } diff --git a/clash-meta/README.md b/clash-meta/README.md index 975f1268e0..d38fbedd8a 100644 --- a/clash-meta/README.md +++ b/clash-meta/README.md @@ -98,4 +98,3 @@ API. This software is released under the GPL-3.0 license. -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FMetaCubeX%2Fmihomo.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2FMetaCubeX%2Fmihomo?ref=badge_large) diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index 219c86ba7d..7b47426cd4 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -35,7 +35,7 @@ "react-dom": "18.3.1", "react-error-boundary": "4.0.13", "react-fast-marquee": "1.6.4", - "react-hook-form": "7.51.3", + "react-hook-form": "7.51.4", "react-i18next": "14.1.1", "react-markdown": "9.0.1", "react-router-dom": "6.23.0", diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json index 6f103ba6ba..1db40c4e80 100644 --- a/clash-nyanpasu/package.json +++ b/clash-nyanpasu/package.json @@ -97,7 +97,7 @@ "stylelint-config-standard": "36.0.0", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-order": "6.0.4", - "stylelint-scss": "6.2.1", + "stylelint-scss": "6.3.0", "tailwindcss": "3.4.3", "tsx": "4.9.0", "typescript": "5.4.5" diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index deb0cf1e5a..5765120bb9 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -121,8 +121,8 @@ importers: specifier: 6.0.4 version: 6.0.4(stylelint@16.5.0(typescript@5.4.5)) stylelint-scss: - specifier: 6.2.1 - version: 6.2.1(stylelint@16.5.0(typescript@5.4.5)) + specifier: 6.3.0 + version: 6.3.0(stylelint@16.5.0(typescript@5.4.5)) tailwindcss: specifier: 3.4.3 version: 3.4.3 @@ -226,8 +226,8 @@ importers: specifier: 1.6.4 version: 1.6.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-hook-form: - specifier: 7.51.3 - version: 7.51.3(react@18.3.1) + specifier: 7.51.4 + version: 7.51.4(react@18.3.1) react-i18next: specifier: 14.1.1 version: 14.1.1(i18next@23.11.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -2127,8 +2127,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.4.754: - resolution: {integrity: sha512-7Kr5jUdns5rL/M9wFFmMZAgFDuL2YOnanFH4OI4iFzUqyh3XOL7nAGbSlSMZdzKMIyyTpNSbqZsWG9odwLeKvA==} + electron-to-chromium@1.4.756: + resolution: {integrity: sha512-RJKZ9+vEBMeiPAvKNWyZjuYyUqMndcP1f335oHqn3BEQbs2NFtVrnK5+6Xg5wSM9TknNNpWghGDUCKGYF+xWXw==} emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} @@ -2952,9 +2952,6 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - known-css-properties@0.29.0: - resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==} - known-css-properties@0.30.0: resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} @@ -3622,8 +3619,8 @@ packages: react: '>= 16.8.0 || 18.0.0' react-dom: '>= 16.8.0 || 18.0.0' - react-hook-form@7.51.3: - resolution: {integrity: sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ==} + react-hook-form@7.51.4: + resolution: {integrity: sha512-V14i8SEkh+V1gs6YtD0hdHYnoL4tp/HX/A45wWQN15CYr9bFRmmRdYStSO5L65lCCZRF+kYiSKhm9alqbcdiVA==} engines: {node: '>=12.22.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 @@ -3999,8 +3996,8 @@ packages: peerDependencies: stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1 - stylelint-scss@6.2.1: - resolution: {integrity: sha512-ZoGLbVb1keZYRVGQlhB8G6sZOoNqw61whzzzGFWp05N12ErqLFfBv3JPrXiMLZaW98sBS7K/vUQhRnvUj4vwdw==} + stylelint-scss@6.3.0: + resolution: {integrity: sha512-8OSpiuf1xC7f8kllJsBOFAOYp/mR/C1FXMVeOFjtJPw+AFvEmC93FaklHt7MlOqU4poxuQ1TkYMyfI0V+1SxjA==} engines: {node: '>=18.12.0'} peerDependencies: stylelint: ^16.0.2 @@ -4218,8 +4215,8 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - update-browserslist-db@1.0.14: - resolution: {integrity: sha512-JixKH8GR2pWYshIPUg/NujK3JO7JiqEEUiNArE86NQyrgUuZeTlZQN3xuS/yiV5Kb48ev9K6RqNkaJjXsdg7Jw==} + update-browserslist-db@1.0.15: + resolution: {integrity: sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -5829,9 +5826,9 @@ snapshots: browserslist@4.23.0: dependencies: caniuse-lite: 1.0.30001615 - electron-to-chromium: 1.4.754 + electron-to-chromium: 1.4.756 node-releases: 2.0.14 - update-browserslist-db: 1.0.14(browserslist@4.23.0) + update-browserslist-db: 1.0.15(browserslist@4.23.0) buffer-alloc-unsafe@1.1.0: {} @@ -6150,7 +6147,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.4.754: {} + electron-to-chromium@1.4.756: {} emoji-regex@10.3.0: {} @@ -7100,8 +7097,6 @@ snapshots: kind-of@6.0.3: {} - known-css-properties@0.29.0: {} - known-css-properties@0.30.0: {} less@4.2.0: @@ -7854,7 +7849,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-hook-form@7.51.3(react@18.3.1): + react-hook-form@7.51.4(react@18.3.1): dependencies: react: 18.3.1 @@ -8269,9 +8264,9 @@ snapshots: postcss-sorting: 8.0.2(postcss@8.4.38) stylelint: 16.5.0(typescript@5.4.5) - stylelint-scss@6.2.1(stylelint@16.5.0(typescript@5.4.5)): + stylelint-scss@6.3.0(stylelint@16.5.0(typescript@5.4.5)): dependencies: - known-css-properties: 0.29.0 + known-css-properties: 0.30.0 postcss-media-query-parser: 0.2.3 postcss-resolve-nested-selector: 0.1.1 postcss-selector-parser: 6.0.16 @@ -8606,7 +8601,7 @@ snapshots: universalify@2.0.1: {} - update-browserslist-db@1.0.14(browserslist@4.23.0): + update-browserslist-db@1.0.15(browserslist@4.23.0): dependencies: browserslist: 4.23.0 escalade: 3.1.2 diff --git a/clash-verge-rev/src-tauri/src/enhance/builtin/meta_guard.js b/clash-verge-rev/src-tauri/src/enhance/builtin/meta_guard.js index be4183bb2c..e8ac897087 100644 --- a/clash-verge-rev/src-tauri/src/enhance/builtin/meta_guard.js +++ b/clash-verge-rev/src-tauri/src/enhance/builtin/meta_guard.js @@ -1,6 +1,6 @@ -function main(params) { - if (params.mode === "script") { - params.mode = "rule"; +function main(config) { + if (config.mode === "script") { + config.mode = "rule"; } - return params; + return config; } diff --git a/clash-verge-rev/src-tauri/src/enhance/builtin/meta_hy_alpn.js b/clash-verge-rev/src-tauri/src/enhance/builtin/meta_hy_alpn.js index da1fac0eb6..92c196ed0e 100644 --- a/clash-verge-rev/src-tauri/src/enhance/builtin/meta_hy_alpn.js +++ b/clash-verge-rev/src-tauri/src/enhance/builtin/meta_hy_alpn.js @@ -1,10 +1,10 @@ -function main(params) { - if (Array.isArray(params.proxies)) { - params.proxies.forEach((p, i) => { +function main(config) { + if (Array.isArray(config.proxies)) { + config.proxies.forEach((p, i) => { if (p.type === "hysteria" && typeof p.alpn === "string") { - params.proxies[i].alpn = [p.alpn]; + config.proxies[i].alpn = [p.alpn]; } }); } - return params; + return config; } diff --git a/clash-verge-rev/src-tauri/src/utils/tmpl.rs b/clash-verge-rev/src-tauri/src/utils/tmpl.rs index 4d760ef421..9b43e397ea 100644 --- a/clash-verge-rev/src-tauri/src/utils/tmpl.rs +++ b/clash-verge-rev/src-tauri/src/utils/tmpl.rs @@ -1,18 +1,17 @@ //! Some config file template /// template for new a profile item -pub const ITEM_LOCAL: &str = "# Profile Template for clash verge +pub const ITEM_LOCAL: &str = "# Profile Template for Clash Verge -proxies: +proxies: [] -proxy-groups: +proxy-groups: [] -rules: +rules: [] "; /// enhanced profile -pub const ITEM_MERGE: &str = "# Merge Template for clash verge -# The `Merge` format used to enhance profile +pub const ITEM_MERGE: &str = "# Profile Enhancement Merge Template for Clash Verge prepend-rules: [] @@ -36,9 +35,9 @@ append-proxy-groups: [] "; /// enhanced profile -pub const ITEM_SCRIPT: &str = "// Define the `main` function +pub const ITEM_SCRIPT: &str = "// Define main function (script entry) -function main(params) { - return params; +function main(config) { + return config; } "; diff --git a/clash-verge-rev/src/components/setting/mods/tun-viewer.tsx b/clash-verge-rev/src/components/setting/mods/tun-viewer.tsx index 01a1df9eb1..27400d281b 100644 --- a/clash-verge-rev/src/components/setting/mods/tun-viewer.tsx +++ b/clash-verge-rev/src/components/setting/mods/tun-viewer.tsx @@ -13,6 +13,7 @@ import { import { useClash } from "@/hooks/use-clash"; import { BaseDialog, DialogRef, Notice, Switch } from "@/components/base"; import { StackModeSwitch } from "./stack-mode-switch"; +import { enhanceProfiles } from "@/services/cmds"; export const TunViewer = forwardRef((props, ref) => { const { t } = useTranslation(); @@ -65,6 +66,12 @@ export const TunViewer = forwardRef((props, ref) => { }), false ); + try { + await enhanceProfiles(); + Notice.success("Refresh clash config", 1000); + } catch (err: any) { + Notice.error(err.message || err.toString(), 3000); + } setOpen(false); } catch (err: any) { Notice.error(err.message || err.toString()); diff --git a/lede/include/kernel-5.10 b/lede/include/kernel-5.10 index 648a3c408a..13b903b54e 100644 --- a/lede/include/kernel-5.10 +++ b/lede/include/kernel-5.10 @@ -1,2 +1,2 @@ -LINUX_VERSION-5.10 = .215 -LINUX_KERNEL_HASH-5.10.215 = 879ca159c34ea9d3a6775f292cc59c2d3931d57dca00f0bebe2675ea0c82c6a9 +LINUX_VERSION-5.10 = .216 +LINUX_KERNEL_HASH-5.10.216 = e310588c4b23f0959614e60f007afc20e9b1a8f296d682b041fa129f96fbe151 diff --git a/lede/include/kernel-5.15 b/lede/include/kernel-5.15 index 3289f828be..71d13ebc5f 100644 --- a/lede/include/kernel-5.15 +++ b/lede/include/kernel-5.15 @@ -1,2 +1,2 @@ -LINUX_VERSION-5.15 = .157 -LINUX_KERNEL_HASH-5.15.157 = aff22351d34d69a16762dcf1fd51fe228da55d4b96b67247bdd598a86cc7a414 +LINUX_VERSION-5.15 = .158 +LINUX_KERNEL_HASH-5.15.158 = f9071c83a4fd8b80af026b48cfc1869bfa25883f9148b92b5dc1e1e1e26dd5c6 diff --git a/lede/include/kernel-5.4 b/lede/include/kernel-5.4 index 9a284524a5..5da4bf5b8d 100644 --- a/lede/include/kernel-5.4 +++ b/lede/include/kernel-5.4 @@ -1,2 +1,2 @@ -LINUX_VERSION-5.4 = .274 -LINUX_KERNEL_HASH-5.4.274 = eac7b421a43cd46a3dbebf7c85d075faa7e164d80d215d31fcd35544b6f79ed4 +LINUX_VERSION-5.4 = .275 +LINUX_KERNEL_HASH-5.4.275 = dad2b068946f0ca0026130d7ab17601d5074d90b381379c4479314d4edf4304c diff --git a/lede/target/linux/bcm47xx/patches-5.4/209-b44-register-adm-switch.patch b/lede/target/linux/bcm47xx/patches-5.4/209-b44-register-adm-switch.patch index 2b47501454..cc6e8fc039 100644 --- a/lede/target/linux/bcm47xx/patches-5.4/209-b44-register-adm-switch.patch +++ b/lede/target/linux/bcm47xx/patches-5.4/209-b44-register-adm-switch.patch @@ -19,7 +19,7 @@ Subject: [PATCH 210/210] b44: register adm switch #include #include -@@ -2249,6 +2251,69 @@ static void b44_adjust_link(struct net_d +@@ -2251,6 +2253,69 @@ static void b44_adjust_link(struct net_d } } @@ -89,7 +89,7 @@ Subject: [PATCH 210/210] b44: register adm switch static int b44_register_phy_one(struct b44 *bp) { __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; -@@ -2285,6 +2350,9 @@ static int b44_register_phy_one(struct b +@@ -2287,6 +2352,9 @@ static int b44_register_phy_one(struct b if (!mdiobus_is_registered_device(bp->mii_bus, bp->phy_addr) && (sprom->boardflags_lo & (B44_BOARDFLAG_ROBO | B44_BOARDFLAG_ADM))) { @@ -99,7 +99,7 @@ Subject: [PATCH 210/210] b44: register adm switch dev_info(sdev->dev, "could not find PHY at %i, use fixed one\n", bp->phy_addr); -@@ -2481,6 +2549,7 @@ static void b44_remove_one(struct ssb_de +@@ -2483,6 +2551,7 @@ static void b44_remove_one(struct ssb_de unregister_netdev(dev); if (bp->flags & B44_FLAG_EXTERNAL_PHY) b44_unregister_phy_one(bp); diff --git a/lede/target/linux/bcm47xx/patches-5.4/210-b44_phy_fix.patch b/lede/target/linux/bcm47xx/patches-5.4/210-b44_phy_fix.patch index 8c7a73ac0f..bff6052108 100644 --- a/lede/target/linux/bcm47xx/patches-5.4/210-b44_phy_fix.patch +++ b/lede/target/linux/bcm47xx/patches-5.4/210-b44_phy_fix.patch @@ -43,7 +43,7 @@ if (bp->flags & B44_FLAG_EXTERNAL_PHY) return 0; -@@ -2179,6 +2204,8 @@ static int b44_get_invariants(struct b44 +@@ -2181,6 +2206,8 @@ static int b44_get_invariants(struct b44 * valid PHY address. */ bp->phy_addr &= 0x1F; diff --git a/lede/target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch b/lede/target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch index 225be1255b..8fd5094e83 100644 --- a/lede/target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch +++ b/lede/target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch @@ -1913,7 +1913,7 @@ Signed-off-by: David S. Miller eth_hw_addr_inherit(slave_dev, master); --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c -@@ -506,13 +506,14 @@ unsigned char * __weak arch_get_platform +@@ -496,13 +496,14 @@ unsigned char * __weak arch_get_platform int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr) { diff --git a/lede/target/linux/generic/backport-5.10/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch b/lede/target/linux/generic/backport-5.10/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch index a2168aaba5..5402109e39 100644 --- a/lede/target/linux/generic/backport-5.10/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch +++ b/lede/target/linux/generic/backport-5.10/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch @@ -35,7 +35,7 @@ Signed-off-by: David S. Miller /* Enable checksum offload */ *tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP | -@@ -1587,17 +1588,19 @@ ax88179_tx_fixup(struct usbnet *dev, str +@@ -1582,17 +1583,19 @@ ax88179_tx_fixup(struct usbnet *dev, str { u32 tx_hdr1, tx_hdr2; int frame_size = dev->maxpacket; @@ -57,7 +57,7 @@ Signed-off-by: David S. Miller if ((skb_header_cloned(skb) || headroom < 0) && pskb_expand_head(skb, headroom < 0 ? 8 : 0, 0, GFP_ATOMIC)) { dev_kfree_skb_any(skb); -@@ -1608,6 +1611,8 @@ ax88179_tx_fixup(struct usbnet *dev, str +@@ -1603,6 +1606,8 @@ ax88179_tx_fixup(struct usbnet *dev, str put_unaligned_le32(tx_hdr1, ptr); put_unaligned_le32(tx_hdr2, ptr + 4); diff --git a/lede/target/linux/generic/backport-5.15/020-v6.1-02-mm-x86-add-CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG.patch b/lede/target/linux/generic/backport-5.15/020-v6.1-02-mm-x86-add-CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG.patch index 2ea2e2497a..8e4de36db0 100644 --- a/lede/target/linux/generic/backport-5.15/020-v6.1-02-mm-x86-add-CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG.patch +++ b/lede/target/linux/generic/backport-5.15/020-v6.1-02-mm-x86-add-CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG.patch @@ -73,7 +73,7 @@ Signed-off-by: Andrew Morton --- a/arch/Kconfig +++ b/arch/Kconfig -@@ -1299,6 +1299,14 @@ config ARCH_HAS_ELFCORE_COMPAT +@@ -1307,6 +1307,14 @@ config ARCH_HAS_ELFCORE_COMPAT config ARCH_HAS_PARANOID_L1D_FLUSH bool @@ -90,7 +90,7 @@ Signed-off-by: Andrew Morton source "scripts/gcc-plugins/Kconfig" --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig -@@ -85,6 +85,7 @@ config X86 +@@ -86,6 +86,7 @@ config X86 select ARCH_HAS_PMEM_API if X86_64 select ARCH_HAS_PTE_DEVMAP if X86_64 select ARCH_HAS_PTE_SPECIAL diff --git a/lede/target/linux/generic/backport-5.15/020-v6.1-05-mm-multi-gen-LRU-groundwork.patch b/lede/target/linux/generic/backport-5.15/020-v6.1-05-mm-multi-gen-LRU-groundwork.patch index 85710eb79b..ff4bb4df3e 100644 --- a/lede/target/linux/generic/backport-5.15/020-v6.1-05-mm-multi-gen-LRU-groundwork.patch +++ b/lede/target/linux/generic/backport-5.15/020-v6.1-05-mm-multi-gen-LRU-groundwork.patch @@ -552,7 +552,7 @@ Signed-off-by: Andrew Morton --- a/kernel/bounds.c +++ b/kernel/bounds.c @@ -22,6 +22,11 @@ int main(void) - DEFINE(NR_CPUS_BITS, bits_per(CONFIG_NR_CPUS)); + DEFINE(NR_CPUS_BITS, order_base_2(CONFIG_NR_CPUS)); #endif DEFINE(SPINLOCK_SIZE, sizeof(spinlock_t)); +#ifdef CONFIG_LRU_GEN diff --git a/lede/target/linux/generic/backport-5.15/702-v5.19-01-arm64-dts-mediatek-mt7622-add-support-for-coherent-D.patch b/lede/target/linux/generic/backport-5.15/702-v5.19-01-arm64-dts-mediatek-mt7622-add-support-for-coherent-D.patch deleted file mode 100644 index 9f2512a1d0..0000000000 --- a/lede/target/linux/generic/backport-5.15/702-v5.19-01-arm64-dts-mediatek-mt7622-add-support-for-coherent-D.patch +++ /dev/null @@ -1,30 +0,0 @@ -From: Felix Fietkau -Date: Mon, 7 Feb 2022 10:27:22 +0100 -Subject: [PATCH] arm64: dts: mediatek: mt7622: add support for coherent - DMA - -It improves performance by eliminating the need for a cache flush on rx and tx - -Signed-off-by: Felix Fietkau ---- - ---- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi -+++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi -@@ -357,7 +357,7 @@ - }; - - cci_control2: slave-if@5000 { -- compatible = "arm,cci-400-ctrl-if"; -+ compatible = "arm,cci-400-ctrl-if", "syscon"; - interface-type = "ace"; - reg = <0x5000 0x1000>; - }; -@@ -938,6 +938,8 @@ - power-domains = <&scpsys MT7622_POWER_DOMAIN_ETHSYS>; - mediatek,ethsys = <ðsys>; - mediatek,sgmiisys = <&sgmiisys>; -+ mediatek,cci-control = <&cci_control2>; -+ dma-coherent; - #address-cells = <1>; - #size-cells = <0>; - status = "disabled"; diff --git a/lede/target/linux/generic/backport-5.15/702-v5.19-04-arm64-dts-mediatek-mt7622-introduce-nodes-for-Wirele.patch b/lede/target/linux/generic/backport-5.15/702-v5.19-04-arm64-dts-mediatek-mt7622-introduce-nodes-for-Wirele.patch deleted file mode 100644 index 2c6e3fd3cd..0000000000 --- a/lede/target/linux/generic/backport-5.15/702-v5.19-04-arm64-dts-mediatek-mt7622-introduce-nodes-for-Wirele.patch +++ /dev/null @@ -1,62 +0,0 @@ -From: Felix Fietkau -Date: Sat, 5 Feb 2022 18:36:36 +0100 -Subject: [PATCH] arm64: dts: mediatek: mt7622: introduce nodes for - Wireless Ethernet Dispatch - -Introduce wed0 and wed1 nodes in order to enable offloading forwarding -between ethernet and wireless devices on the mt7622 chipset. - -Signed-off-by: Felix Fietkau ---- - ---- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi -+++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi -@@ -894,6 +894,11 @@ - }; - }; - -+ hifsys: syscon@1af00000 { -+ compatible = "mediatek,mt7622-hifsys", "syscon"; -+ reg = <0 0x1af00000 0 0x70>; -+ }; -+ - ethsys: syscon@1b000000 { - compatible = "mediatek,mt7622-ethsys", - "syscon"; -@@ -912,6 +917,26 @@ - #dma-cells = <1>; - }; - -+ pcie_mirror: pcie-mirror@10000400 { -+ compatible = "mediatek,mt7622-pcie-mirror", -+ "syscon"; -+ reg = <0 0x10000400 0 0x10>; -+ }; -+ -+ wed0: wed@1020a000 { -+ compatible = "mediatek,mt7622-wed", -+ "syscon"; -+ reg = <0 0x1020a000 0 0x1000>; -+ interrupts = ; -+ }; -+ -+ wed1: wed@1020b000 { -+ compatible = "mediatek,mt7622-wed", -+ "syscon"; -+ reg = <0 0x1020b000 0 0x1000>; -+ interrupts = ; -+ }; -+ - eth: ethernet@1b100000 { - compatible = "mediatek,mt7622-eth", - "mediatek,mt2701-eth", -@@ -939,6 +964,9 @@ - mediatek,ethsys = <ðsys>; - mediatek,sgmiisys = <&sgmiisys>; - mediatek,cci-control = <&cci_control2>; -+ mediatek,wed = <&wed0>, <&wed1>; -+ mediatek,pcie-mirror = <&pcie_mirror>; -+ mediatek,hifsys = <&hifsys>; - dma-coherent; - #address-cells = <1>; - #size-cells = <0>; diff --git a/lede/target/linux/generic/backport-5.15/702-v5.19-13-net-ethernet-mtk_eth_soc-use-standard-property-for-c.patch b/lede/target/linux/generic/backport-5.15/702-v5.19-13-net-ethernet-mtk_eth_soc-use-standard-property-for-c.patch index 70d46c16cd..22125a4546 100644 --- a/lede/target/linux/generic/backport-5.15/702-v5.19-13-net-ethernet-mtk_eth_soc-use-standard-property-for-c.patch +++ b/lede/target/linux/generic/backport-5.15/702-v5.19-13-net-ethernet-mtk_eth_soc-use-standard-property-for-c.patch @@ -13,7 +13,7 @@ Signed-off-by: David S. Miller --- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi -@@ -963,7 +963,7 @@ +@@ -957,7 +957,7 @@ power-domains = <&scpsys MT7622_POWER_DOMAIN_ETHSYS>; mediatek,ethsys = <ðsys>; mediatek,sgmiisys = <&sgmiisys>; diff --git a/lede/target/linux/generic/backport-5.15/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch b/lede/target/linux/generic/backport-5.15/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch index 698e524c35..b2af169b92 100644 --- a/lede/target/linux/generic/backport-5.15/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch +++ b/lede/target/linux/generic/backport-5.15/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch @@ -35,7 +35,7 @@ Signed-off-by: David S. Miller ax88179_reset(dev); -@@ -1507,17 +1508,19 @@ ax88179_tx_fixup(struct usbnet *dev, str +@@ -1502,17 +1503,19 @@ ax88179_tx_fixup(struct usbnet *dev, str { u32 tx_hdr1, tx_hdr2; int frame_size = dev->maxpacket; @@ -57,7 +57,7 @@ Signed-off-by: David S. Miller if ((skb_header_cloned(skb) || headroom < 0) && pskb_expand_head(skb, headroom < 0 ? 8 : 0, 0, GFP_ATOMIC)) { dev_kfree_skb_any(skb); -@@ -1528,6 +1531,8 @@ ax88179_tx_fixup(struct usbnet *dev, str +@@ -1523,6 +1526,8 @@ ax88179_tx_fixup(struct usbnet *dev, str put_unaligned_le32(tx_hdr1, ptr); put_unaligned_le32(tx_hdr2, ptr + 4); diff --git a/lede/target/linux/generic/backport-5.15/821-v5.16-Bluetooth-btusb-Support-public-address-configuration.patch b/lede/target/linux/generic/backport-5.15/821-v5.16-Bluetooth-btusb-Support-public-address-configuration.patch index 725af4b52c..4a63b89f57 100644 --- a/lede/target/linux/generic/backport-5.15/821-v5.16-Bluetooth-btusb-Support-public-address-configuration.patch +++ b/lede/target/linux/generic/backport-5.15/821-v5.16-Bluetooth-btusb-Support-public-address-configuration.patch @@ -17,7 +17,7 @@ Signed-off-by: Marcel Holtmann --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c -@@ -2287,6 +2287,23 @@ struct btmtk_section_map { +@@ -2289,6 +2289,23 @@ struct btmtk_section_map { }; } __packed; @@ -41,7 +41,7 @@ Signed-off-by: Marcel Holtmann static void btusb_mtk_wmt_recv(struct urb *urb) { struct hci_dev *hdev = urb->context; -@@ -3941,6 +3958,7 @@ static int btusb_probe(struct usb_interf +@@ -3943,6 +3960,7 @@ static int btusb_probe(struct usb_interf hdev->shutdown = btusb_mtk_shutdown; hdev->manufacturer = 70; hdev->cmd_timeout = btusb_mtk_cmd_timeout; diff --git a/lede/target/linux/generic/backport-5.15/822-v5.17-Bluetooth-btusb-Fix-application-of-sizeof-to-pointer.patch b/lede/target/linux/generic/backport-5.15/822-v5.17-Bluetooth-btusb-Fix-application-of-sizeof-to-pointer.patch index d72866eabf..d21adada97 100644 --- a/lede/target/linux/generic/backport-5.15/822-v5.17-Bluetooth-btusb-Fix-application-of-sizeof-to-pointer.patch +++ b/lede/target/linux/generic/backport-5.15/822-v5.17-Bluetooth-btusb-Fix-application-of-sizeof-to-pointer.patch @@ -18,7 +18,7 @@ Signed-off-by: Marcel Holtmann --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c -@@ -2292,7 +2292,7 @@ static int btusb_set_bdaddr_mtk(struct h +@@ -2294,7 +2294,7 @@ static int btusb_set_bdaddr_mtk(struct h struct sk_buff *skb; long ret; diff --git a/lede/target/linux/generic/backport-5.15/823-v5.18-Bluetooth-btusb-Add-a-new-PID-VID-13d3-3567-for-MT79.patch b/lede/target/linux/generic/backport-5.15/823-v5.18-Bluetooth-btusb-Add-a-new-PID-VID-13d3-3567-for-MT79.patch index ebb6cc4717..30492ac48d 100644 --- a/lede/target/linux/generic/backport-5.15/823-v5.18-Bluetooth-btusb-Add-a-new-PID-VID-13d3-3567-for-MT79.patch +++ b/lede/target/linux/generic/backport-5.15/823-v5.18-Bluetooth-btusb-Add-a-new-PID-VID-13d3-3567-for-MT79.patch @@ -58,7 +58,7 @@ Signed-off-by: Marcel Holtmann --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c -@@ -476,6 +476,9 @@ static const struct usb_device_id blackl +@@ -478,6 +478,9 @@ static const struct usb_device_id blackl { USB_DEVICE(0x13d3, 0x3564), .driver_info = BTUSB_MEDIATEK | BTUSB_WIDEBAND_SPEECH | BTUSB_VALID_LE_STATES }, diff --git a/lede/target/linux/generic/backport-5.15/824-v5.19-Bluetooth-btusb-Add-a-new-PID-VID-0489-e0c8-for-MT79.patch b/lede/target/linux/generic/backport-5.15/824-v5.19-Bluetooth-btusb-Add-a-new-PID-VID-0489-e0c8-for-MT79.patch index a8c7ca003a..6bcd81c3b8 100644 --- a/lede/target/linux/generic/backport-5.15/824-v5.19-Bluetooth-btusb-Add-a-new-PID-VID-0489-e0c8-for-MT79.patch +++ b/lede/target/linux/generic/backport-5.15/824-v5.19-Bluetooth-btusb-Add-a-new-PID-VID-0489-e0c8-for-MT79.patch @@ -56,7 +56,7 @@ Signed-off-by: Marcel Holtmann --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c -@@ -467,6 +467,9 @@ static const struct usb_device_id blackl +@@ -469,6 +469,9 @@ static const struct usb_device_id blackl BTUSB_VALID_LE_STATES }, /* Additional MediaTek MT7921 Bluetooth devices */ diff --git a/lede/target/linux/generic/backport-5.15/825-v6.1-Bluetooth-btusb-Add-a-new-VID-PID-0e8d-0608-for-MT79.patch b/lede/target/linux/generic/backport-5.15/825-v6.1-Bluetooth-btusb-Add-a-new-VID-PID-0e8d-0608-for-MT79.patch index b46e6926d1..b6b76f64fc 100644 --- a/lede/target/linux/generic/backport-5.15/825-v6.1-Bluetooth-btusb-Add-a-new-VID-PID-0e8d-0608-for-MT79.patch +++ b/lede/target/linux/generic/backport-5.15/825-v6.1-Bluetooth-btusb-Add-a-new-VID-PID-0e8d-0608-for-MT79.patch @@ -54,7 +54,7 @@ Signed-off-by: Luiz Augusto von Dentz --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c -@@ -485,6 +485,9 @@ static const struct usb_device_id blackl +@@ -487,6 +487,9 @@ static const struct usb_device_id blackl { USB_DEVICE(0x0489, 0xe0cd), .driver_info = BTUSB_MEDIATEK | BTUSB_WIDEBAND_SPEECH | BTUSB_VALID_LE_STATES }, diff --git a/lede/target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch b/lede/target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch index 20c3d75122..5027a8904e 100644 --- a/lede/target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch +++ b/lede/target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch @@ -1775,7 +1775,7 @@ Signed-off-by: David S. Miller eth_hw_addr_inherit(slave_dev, master); --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c -@@ -550,13 +550,14 @@ unsigned char * __weak arch_get_platform +@@ -540,13 +540,14 @@ unsigned char * __weak arch_get_platform int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr) { diff --git a/lede/target/linux/generic/hack-5.15/601-of_net-add-mac-address-ascii-support.patch b/lede/target/linux/generic/hack-5.15/601-of_net-add-mac-address-ascii-support.patch index 4ab05b4ea6..0c9a6656cc 100644 --- a/lede/target/linux/generic/hack-5.15/601-of_net-add-mac-address-ascii-support.patch +++ b/lede/target/linux/generic/hack-5.15/601-of_net-add-mac-address-ascii-support.patch @@ -11,7 +11,7 @@ Submitted-by: Yousong Zhou --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c -@@ -538,6 +538,63 @@ int eth_platform_get_mac_address(struct +@@ -528,6 +528,63 @@ int eth_platform_get_mac_address(struct } EXPORT_SYMBOL(eth_platform_get_mac_address); @@ -75,7 +75,7 @@ Submitted-by: Yousong Zhou /** * nvmem_get_mac_address - Obtain the MAC address from an nvmem cell named * 'mac-address' associated with given device. -@@ -551,19 +608,23 @@ int nvmem_get_mac_address(struct device +@@ -541,19 +598,23 @@ int nvmem_get_mac_address(struct device { struct nvmem_cell *cell; const void *mac; diff --git a/lede/target/linux/generic/hack-5.4/995-usb-serial-option-add-ec200a.patch b/lede/target/linux/generic/hack-5.4/995-usb-serial-option-add-ec200a.patch index 95b2ac0a9e..71b05f0732 100644 --- a/lede/target/linux/generic/hack-5.4/995-usb-serial-option-add-ec200a.patch +++ b/lede/target/linux/generic/hack-5.4/995-usb-serial-option-add-ec200a.patch @@ -1,6 +1,6 @@ --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c -@@ -278,6 +278,7 @@ static void option_instat_callback(struc +@@ -282,6 +282,7 @@ static void option_instat_callback(struc #define QUECTEL_PRODUCT_EM061K_LWW 0x6008 #define QUECTEL_PRODUCT_EM061K_LCN 0x6009 #define QUECTEL_PRODUCT_EC200T 0x6026 @@ -8,7 +8,7 @@ #define QUECTEL_PRODUCT_RM500K 0x7001 #define CMOTECH_VENDOR_ID 0x16d8 -@@ -1251,6 +1252,7 @@ static const struct usb_device_id option +@@ -1267,6 +1268,7 @@ static const struct usb_device_id option { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200U, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) }, diff --git a/lede/target/linux/generic/pending-5.10/610-netfilter_match_bypass_default_checks.patch b/lede/target/linux/generic/pending-5.10/610-netfilter_match_bypass_default_checks.patch index b17196d3a9..8b1e70bd0e 100644 --- a/lede/target/linux/generic/pending-5.10/610-netfilter_match_bypass_default_checks.patch +++ b/lede/target/linux/generic/pending-5.10/610-netfilter_match_bypass_default_checks.patch @@ -91,7 +91,7 @@ Signed-off-by: Felix Fietkau for (i = sizeof(struct ipt_entry); i < e->target_offset; i += m->u.match_size) { -@@ -1224,12 +1261,15 @@ compat_copy_entry_to_user(struct ipt_ent +@@ -1226,12 +1263,15 @@ compat_copy_entry_to_user(struct ipt_ent compat_uint_t origsize; const struct xt_entry_match *ematch; int ret = 0; diff --git a/lede/target/linux/generic/pending-5.10/680-NET-skip-GRO-for-foreign-MAC-addresses.patch b/lede/target/linux/generic/pending-5.10/680-NET-skip-GRO-for-foreign-MAC-addresses.patch index ceaf1e99f9..d3a0dec619 100644 --- a/lede/target/linux/generic/pending-5.10/680-NET-skip-GRO-for-foreign-MAC-addresses.patch +++ b/lede/target/linux/generic/pending-5.10/680-NET-skip-GRO-for-foreign-MAC-addresses.patch @@ -136,9 +136,9 @@ Signed-off-by: Felix Fietkau /** * eth_type_trans - determine the packet's protocol ID. * @skb: received socket data -@@ -174,6 +186,10 @@ __be16 eth_type_trans(struct sk_buff *sk - } else { - skb->pkt_type = PACKET_OTHERHOST; +@@ -426,6 +438,10 @@ struct sk_buff *eth_gro_receive(struct l + NAPI_GRO_CB(p)->same_flow = 0; + continue; } + + if (eth_check_local_mask(eth->h_dest, dev->dev_addr, @@ -146,4 +146,4 @@ Signed-off-by: Felix Fietkau + skb->gro_skip = 1; } - /* + type = eh->h_proto; diff --git a/lede/target/linux/generic/pending-5.10/701-01-arm64-dts-mediatek-mt7622-add-support-for-coherent-D.patch b/lede/target/linux/generic/pending-5.10/701-01-arm64-dts-mediatek-mt7622-add-support-for-coherent-D.patch deleted file mode 100644 index d9015d4805..0000000000 --- a/lede/target/linux/generic/pending-5.10/701-01-arm64-dts-mediatek-mt7622-add-support-for-coherent-D.patch +++ /dev/null @@ -1,30 +0,0 @@ -From: Felix Fietkau -Date: Mon, 7 Feb 2022 10:27:22 +0100 -Subject: [PATCH] arm64: dts: mediatek: mt7622: add support for coherent - DMA - -It improves performance by eliminating the need for a cache flush on rx and tx - -Signed-off-by: Felix Fietkau ---- - ---- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi -+++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi -@@ -357,7 +357,7 @@ - }; - - cci_control2: slave-if@5000 { -- compatible = "arm,cci-400-ctrl-if"; -+ compatible = "arm,cci-400-ctrl-if", "syscon"; - interface-type = "ace"; - reg = <0x5000 0x1000>; - }; -@@ -937,6 +937,8 @@ - power-domains = <&scpsys MT7622_POWER_DOMAIN_ETHSYS>; - mediatek,ethsys = <ðsys>; - mediatek,sgmiisys = <&sgmiisys>; -+ mediatek,cci-control = <&cci_control2>; -+ dma-coherent; - #address-cells = <1>; - #size-cells = <0>; - status = "disabled"; diff --git a/lede/target/linux/generic/pending-5.10/701-04-arm64-dts-mediatek-mt7622-introduce-nodes-for-Wirele.patch b/lede/target/linux/generic/pending-5.10/701-04-arm64-dts-mediatek-mt7622-introduce-nodes-for-Wirele.patch deleted file mode 100644 index f59a364a73..0000000000 --- a/lede/target/linux/generic/pending-5.10/701-04-arm64-dts-mediatek-mt7622-introduce-nodes-for-Wirele.patch +++ /dev/null @@ -1,62 +0,0 @@ -From: Felix Fietkau -Date: Sat, 5 Feb 2022 18:36:36 +0100 -Subject: [PATCH] arm64: dts: mediatek: mt7622: introduce nodes for - Wireless Ethernet Dispatch - -Introduce wed0 and wed1 nodes in order to enable offloading forwarding -between ethernet and wireless devices on the mt7622 chipset. - -Signed-off-by: Felix Fietkau ---- - ---- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi -+++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi -@@ -893,6 +893,11 @@ - }; - }; - -+ hifsys: syscon@1af00000 { -+ compatible = "mediatek,mt7622-hifsys", "syscon"; -+ reg = <0 0x1af00000 0 0x70>; -+ }; -+ - ethsys: syscon@1b000000 { - compatible = "mediatek,mt7622-ethsys", - "syscon"; -@@ -911,6 +916,26 @@ - #dma-cells = <1>; - }; - -+ pcie_mirror: pcie-mirror@10000400 { -+ compatible = "mediatek,mt7622-pcie-mirror", -+ "syscon"; -+ reg = <0 0x10000400 0 0x10>; -+ }; -+ -+ wed0: wed@1020a000 { -+ compatible = "mediatek,mt7622-wed", -+ "syscon"; -+ reg = <0 0x1020a000 0 0x1000>; -+ interrupts = ; -+ }; -+ -+ wed1: wed@1020b000 { -+ compatible = "mediatek,mt7622-wed", -+ "syscon"; -+ reg = <0 0x1020b000 0 0x1000>; -+ interrupts = ; -+ }; -+ - eth: ethernet@1b100000 { - compatible = "mediatek,mt7622-eth", - "mediatek,mt2701-eth", -@@ -938,6 +963,9 @@ - mediatek,ethsys = <ðsys>; - mediatek,sgmiisys = <&sgmiisys>; - mediatek,cci-control = <&cci_control2>; -+ mediatek,wed = <&wed0>, <&wed1>; -+ mediatek,pcie-mirror = <&pcie_mirror>; -+ mediatek,hifsys = <&hifsys>; - dma-coherent; - #address-cells = <1>; - #size-cells = <0>; diff --git a/lede/target/linux/generic/pending-5.10/920-mangle_bootargs.patch b/lede/target/linux/generic/pending-5.10/920-mangle_bootargs.patch index 72a5ca4d2f..79db26c275 100644 --- a/lede/target/linux/generic/pending-5.10/920-mangle_bootargs.patch +++ b/lede/target/linux/generic/pending-5.10/920-mangle_bootargs.patch @@ -61,7 +61,7 @@ Signed-off-by: Imre Kaloz /* * We need to store the untouched command line for future reference. * We also need to store the touched command line since the parameter -@@ -866,6 +889,7 @@ asmlinkage __visible void __init __no_sa +@@ -868,6 +891,7 @@ asmlinkage __visible void __init __no_sa pr_notice("%s", linux_banner); early_security_init(); setup_arch(&command_line); diff --git a/lede/target/linux/generic/pending-5.15/680-NET-skip-GRO-for-foreign-MAC-addresses.patch b/lede/target/linux/generic/pending-5.15/680-NET-skip-GRO-for-foreign-MAC-addresses.patch index 8cb8eeb3c1..fd0db60946 100644 --- a/lede/target/linux/generic/pending-5.15/680-NET-skip-GRO-for-foreign-MAC-addresses.patch +++ b/lede/target/linux/generic/pending-5.15/680-NET-skip-GRO-for-foreign-MAC-addresses.patch @@ -136,9 +136,9 @@ Signed-off-by: Felix Fietkau /** * eth_type_trans - determine the packet's protocol ID. * @skb: received socket data -@@ -173,6 +185,10 @@ __be16 eth_type_trans(struct sk_buff *sk - } else { - skb->pkt_type = PACKET_OTHERHOST; +@@ -421,6 +433,10 @@ struct sk_buff *eth_gro_receive(struct l + NAPI_GRO_CB(p)->same_flow = 0; + continue; } + + if (eth_check_local_mask(eth->h_dest, dev->dev_addr, @@ -146,4 +146,4 @@ Signed-off-by: Felix Fietkau + skb->gro_skip = 1; } - /* + type = eh->h_proto; diff --git a/lede/target/linux/generic/pending-5.15/901-usb-add-more-modem-support.patch b/lede/target/linux/generic/pending-5.15/901-usb-add-more-modem-support.patch index 66b5640a19..6f1946c54a 100644 --- a/lede/target/linux/generic/pending-5.15/901-usb-add-more-modem-support.patch +++ b/lede/target/linux/generic/pending-5.15/901-usb-add-more-modem-support.patch @@ -1,8 +1,8 @@ --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c -@@ -1431,6 +1431,9 @@ static const struct usb_device_id produc +@@ -1420,6 +1420,9 @@ static const struct usb_device_id produc + {QMI_FIXED_INTF(0x0489, 0xe0b5, 0)}, /* Foxconn T77W968 LTE with eSIM support*/ {QMI_FIXED_INTF(0x2692, 0x9025, 4)}, /* Cellient MPL200 (rebranded Qualcomm 05c6:9025) */ - {QMI_QUIRK_SET_DTR(0x1546, 0x1312, 4)}, /* u-blox LARA-R6 01B */ {QMI_QUIRK_SET_DTR(0x1546, 0x1342, 4)}, /* u-blox LARA-L6 */ + {QMI_FIXED_INTF(0x2077, 0x2002, 4)}, /* T&W TW04C */ + {QMI_FIXED_INTF(0x2077, 0x2003, 4)}, /* T&W TW12G */ diff --git a/lede/target/linux/generic/pending-5.4/640-netfilter-nf_flow_table-add-hardware-offload-support.patch b/lede/target/linux/generic/pending-5.4/640-netfilter-nf_flow_table-add-hardware-offload-support.patch index 2cdaf6dbdf..386a81945c 100644 --- a/lede/target/linux/generic/pending-5.4/640-netfilter-nf_flow_table-add-hardware-offload-support.patch +++ b/lede/target/linux/generic/pending-5.4/640-netfilter-nf_flow_table-add-hardware-offload-support.patch @@ -506,7 +506,7 @@ Signed-off-by: Pablo Neira Ayuso +MODULE_ALIAS("nf-flow-table-hw"); --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c -@@ -6041,6 +6041,13 @@ static int nf_tables_flowtable_parse_hoo +@@ -6045,6 +6045,13 @@ static int nf_tables_flowtable_parse_hoo if (err < 0) return err; @@ -520,7 +520,7 @@ Signed-off-by: Pablo Neira Ayuso ops = kcalloc(n, sizeof(struct nf_hook_ops), GFP_KERNEL); if (!ops) return -ENOMEM; -@@ -6190,10 +6197,19 @@ static int nf_tables_newflowtable(struct +@@ -6194,10 +6201,19 @@ static int nf_tables_newflowtable(struct } flowtable->data.type = type; @@ -540,7 +540,7 @@ Signed-off-by: Pablo Neira Ayuso err = nf_tables_flowtable_parse_hook(&ctx, nla[NFTA_FLOWTABLE_HOOK], flowtable); if (err < 0) -@@ -6319,7 +6335,8 @@ static int nf_tables_fill_flowtable_info +@@ -6323,7 +6339,8 @@ static int nf_tables_fill_flowtable_info nla_put_string(skb, NFTA_FLOWTABLE_NAME, flowtable->name) || nla_put_be32(skb, NFTA_FLOWTABLE_USE, htonl(flowtable->use)) || nla_put_be64(skb, NFTA_FLOWTABLE_HANDLE, cpu_to_be64(flowtable->handle), diff --git a/lede/target/linux/generic/pending-5.4/680-NET-skip-GRO-for-foreign-MAC-addresses.patch b/lede/target/linux/generic/pending-5.4/680-NET-skip-GRO-for-foreign-MAC-addresses.patch index 6f7edc161a..0fc16f57e7 100644 --- a/lede/target/linux/generic/pending-5.4/680-NET-skip-GRO-for-foreign-MAC-addresses.patch +++ b/lede/target/linux/generic/pending-5.4/680-NET-skip-GRO-for-foreign-MAC-addresses.patch @@ -136,9 +136,9 @@ Signed-off-by: Felix Fietkau /** * eth_type_trans - determine the packet's protocol ID. * @skb: received socket data -@@ -174,6 +186,10 @@ __be16 eth_type_trans(struct sk_buff *sk - } else { - skb->pkt_type = PACKET_OTHERHOST; +@@ -470,6 +482,10 @@ struct sk_buff *eth_gro_receive(struct l + NAPI_GRO_CB(p)->same_flow = 0; + continue; } + + if (eth_check_local_mask(eth->h_dest, dev->dev_addr, @@ -146,4 +146,4 @@ Signed-off-by: Felix Fietkau + skb->gro_skip = 1; } - /* + type = eh->h_proto; diff --git a/lede/target/linux/ipq806x/patches-5.10/0067-generic-Mangle-bootloader-s-kernel-arguments.patch b/lede/target/linux/ipq806x/patches-5.10/0067-generic-Mangle-bootloader-s-kernel-arguments.patch index 5bfc3eddef..4aa8c56598 100644 --- a/lede/target/linux/ipq806x/patches-5.10/0067-generic-Mangle-bootloader-s-kernel-arguments.patch +++ b/lede/target/linux/ipq806x/patches-5.10/0067-generic-Mangle-bootloader-s-kernel-arguments.patch @@ -189,7 +189,7 @@ Signed-off-by: Adrian Panella static int kernel_init(void *); extern void init_IRQ(void); -@@ -903,6 +907,18 @@ asmlinkage __visible void __init __no_sa +@@ -905,6 +909,18 @@ asmlinkage __visible void __init __no_sa pr_notice("Kernel command line: %s\n", saved_command_line); /* parameters may set static keys */ jump_label_init(); diff --git a/lede/target/linux/mediatek/patches-5.15/104-mt7622-add-snor-irq.patch b/lede/target/linux/mediatek/patches-5.15/104-mt7622-add-snor-irq.patch index 79b051147a..88aab4129d 100644 --- a/lede/target/linux/mediatek/patches-5.15/104-mt7622-add-snor-irq.patch +++ b/lede/target/linux/mediatek/patches-5.15/104-mt7622-add-snor-irq.patch @@ -1,6 +1,6 @@ --- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi -@@ -559,6 +559,7 @@ +@@ -556,6 +556,7 @@ compatible = "mediatek,mt7622-nor", "mediatek,mt8173-nor"; reg = <0 0x11014000 0 0xe0>; diff --git a/lede/target/linux/mediatek/patches-5.15/120-14-v5.19-arm64-dts-mediatek-add-mtk-snfi-for-mt7622.patch b/lede/target/linux/mediatek/patches-5.15/120-14-v5.19-arm64-dts-mediatek-add-mtk-snfi-for-mt7622.patch index 15d2671372..56548f3ace 100644 --- a/lede/target/linux/mediatek/patches-5.15/120-14-v5.19-arm64-dts-mediatek-add-mtk-snfi-for-mt7622.patch +++ b/lede/target/linux/mediatek/patches-5.15/120-14-v5.19-arm64-dts-mediatek-add-mtk-snfi-for-mt7622.patch @@ -14,7 +14,7 @@ Signed-off-by: Chuanhong Guo --- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi -@@ -553,6 +553,18 @@ +@@ -550,6 +550,18 @@ status = "disabled"; }; diff --git a/lede/target/linux/mediatek/patches-5.15/190-arm64-dts-mediatek-mt7622-fix-GICv2-range.patch b/lede/target/linux/mediatek/patches-5.15/190-arm64-dts-mediatek-mt7622-fix-GICv2-range.patch index 39a9770d98..8b41000a69 100644 --- a/lede/target/linux/mediatek/patches-5.15/190-arm64-dts-mediatek-mt7622-fix-GICv2-range.patch +++ b/lede/target/linux/mediatek/patches-5.15/190-arm64-dts-mediatek-mt7622-fix-GICv2-range.patch @@ -95,7 +95,7 @@ Signed-off-by: Daniel Golle --- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi -@@ -339,7 +339,7 @@ +@@ -337,7 +337,7 @@ #interrupt-cells = <3>; interrupt-parent = <&gic>; reg = <0 0x10310000 0 0x1000>, diff --git a/lede/target/linux/mediatek/patches-5.15/192-v5.19-arm64-dts-mt7622-specify-the-number-of-DMA-requests.patch b/lede/target/linux/mediatek/patches-5.15/192-v5.19-arm64-dts-mt7622-specify-the-number-of-DMA-requests.patch index 4fef9aea22..506a65266d 100644 --- a/lede/target/linux/mediatek/patches-5.15/192-v5.19-arm64-dts-mt7622-specify-the-number-of-DMA-requests.patch +++ b/lede/target/linux/mediatek/patches-5.15/192-v5.19-arm64-dts-mt7622-specify-the-number-of-DMA-requests.patch @@ -112,7 +112,7 @@ Signed-off-by: Rui Salvaterra --- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi -@@ -942,6 +942,7 @@ +@@ -938,6 +938,7 @@ clock-names = "hsdma"; power-domains = <&scpsys MT7622_POWER_DOMAIN_ETHSYS>; #dma-cells = <1>; diff --git a/lede/target/linux/mediatek/patches-5.15/600-v5.16-arm64-dts-mediatek-Split-PCIe-node-for-MT2712-and-MT.patch b/lede/target/linux/mediatek/patches-5.15/600-v5.16-arm64-dts-mediatek-Split-PCIe-node-for-MT2712-and-MT.patch index dc9dbad250..4ca9f9c724 100644 --- a/lede/target/linux/mediatek/patches-5.15/600-v5.16-arm64-dts-mediatek-Split-PCIe-node-for-MT2712-and-MT.patch +++ b/lede/target/linux/mediatek/patches-5.15/600-v5.16-arm64-dts-mediatek-Split-PCIe-node-for-MT2712-and-MT.patch @@ -21,7 +21,7 @@ Signed-off-by: Matthias Brugger --- a/arch/arm64/boot/dts/mediatek/mt2712e.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt2712e.dtsi -@@ -915,64 +915,67 @@ +@@ -916,64 +916,67 @@ }; }; @@ -194,7 +194,7 @@ Signed-off-by: Matthias Brugger &pio { --- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi -@@ -809,75 +809,83 @@ +@@ -804,75 +804,83 @@ #reset-cells = <1>; }; diff --git a/lede/target/linux/mediatek/patches-5.15/602-arm64-dts-mediatek-add-mt7622-pcie-slot-node.patch b/lede/target/linux/mediatek/patches-5.15/602-arm64-dts-mediatek-add-mt7622-pcie-slot-node.patch index bf479ab53b..d58082aa6f 100644 --- a/lede/target/linux/mediatek/patches-5.15/602-arm64-dts-mediatek-add-mt7622-pcie-slot-node.patch +++ b/lede/target/linux/mediatek/patches-5.15/602-arm64-dts-mediatek-add-mt7622-pcie-slot-node.patch @@ -1,6 +1,6 @@ --- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi -@@ -849,6 +849,12 @@ +@@ -844,6 +844,12 @@ #address-cells = <0>; #interrupt-cells = <1>; }; @@ -13,7 +13,7 @@ }; pcie1: pcie@1a145000 { -@@ -887,6 +893,12 @@ +@@ -882,6 +888,12 @@ #address-cells = <0>; #interrupt-cells = <1>; }; diff --git a/lede/target/linux/mediatek/patches-5.15/710-pci-pcie-mediatek-add-support-for-coherent-DMA.patch b/lede/target/linux/mediatek/patches-5.15/710-pci-pcie-mediatek-add-support-for-coherent-DMA.patch index 76ee2fc89a..a3247f1779 100644 --- a/lede/target/linux/mediatek/patches-5.15/710-pci-pcie-mediatek-add-support-for-coherent-DMA.patch +++ b/lede/target/linux/mediatek/patches-5.15/710-pci-pcie-mediatek-add-support-for-coherent-DMA.patch @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau --- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi -@@ -837,6 +837,9 @@ +@@ -832,6 +832,9 @@ bus-range = <0x00 0xff>; ranges = <0x82000000 0 0x20000000 0x0 0x20000000 0 0x8000000>; status = "disabled"; @@ -20,7 +20,7 @@ Signed-off-by: Felix Fietkau #interrupt-cells = <1>; interrupt-map-mask = <0 0 0 7>; -@@ -881,6 +884,9 @@ +@@ -876,6 +879,9 @@ bus-range = <0x00 0xff>; ranges = <0x82000000 0 0x28000000 0x0 0x28000000 0 0x8000000>; status = "disabled"; diff --git a/lede/target/linux/mvebu/patches-5.10/300-mvebu-Mangle-bootloader-s-kernel-arguments.patch b/lede/target/linux/mvebu/patches-5.10/300-mvebu-Mangle-bootloader-s-kernel-arguments.patch index c220e906cf..ba9c5685a2 100644 --- a/lede/target/linux/mvebu/patches-5.10/300-mvebu-Mangle-bootloader-s-kernel-arguments.patch +++ b/lede/target/linux/mvebu/patches-5.10/300-mvebu-Mangle-bootloader-s-kernel-arguments.patch @@ -187,7 +187,7 @@ Signed-off-by: Michael Gray static int kernel_init(void *); extern void init_IRQ(void); -@@ -901,6 +905,18 @@ asmlinkage __visible void __init __no_sa +@@ -903,6 +907,18 @@ asmlinkage __visible void __init __no_sa page_alloc_init(); pr_notice("Kernel command line: %s\n", saved_command_line); diff --git a/lede/target/linux/oxnas/patches-5.10/996-generic-Mangle-bootloader-s-kernel-arguments.patch b/lede/target/linux/oxnas/patches-5.10/996-generic-Mangle-bootloader-s-kernel-arguments.patch index de2868ce97..9cc33f5a42 100644 --- a/lede/target/linux/oxnas/patches-5.10/996-generic-Mangle-bootloader-s-kernel-arguments.patch +++ b/lede/target/linux/oxnas/patches-5.10/996-generic-Mangle-bootloader-s-kernel-arguments.patch @@ -168,7 +168,7 @@ Signed-off-by: Adrian Panella static int kernel_init(void *); extern void init_IRQ(void); -@@ -901,6 +905,18 @@ asmlinkage __visible void __init __no_sa +@@ -903,6 +907,18 @@ asmlinkage __visible void __init __no_sa page_alloc_init(); pr_notice("Kernel command line: %s\n", saved_command_line); diff --git a/lede/target/linux/phytium/patches-5.10/001-add-phytium-support.patch b/lede/target/linux/phytium/patches-5.10/001-add-phytium-support.patch index 8e997a711e..4de812ae3a 100644 --- a/lede/target/linux/phytium/patches-5.10/001-add-phytium-support.patch +++ b/lede/target/linux/phytium/patches-5.10/001-add-phytium-support.patch @@ -1849,7 +1849,7 @@ +obj-$(CONFIG_PHYTIUM_IXIC) += irq-phytium-ixic.o --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c -@@ -4792,6 +4792,7 @@ static void its_restore_enable(void) +@@ -4787,6 +4787,7 @@ static void its_restore_enable(void) { struct its_node *its; int ret; @@ -1857,7 +1857,7 @@ raw_spin_lock(&its_lock); list_for_each_entry(its, &its_nodes, entry) { -@@ -4845,6 +4846,23 @@ static void its_restore_enable(void) +@@ -4840,6 +4841,23 @@ static void its_restore_enable(void) GITS_TYPER_HCC(gic_read_typer(base + GITS_TYPER))) its_cpu_init_collection(its); } diff --git a/lede/target/linux/rockchip/patches-5.15/111-irqchip-gic-v3-add-hackaround-for-rk3568-its.patch b/lede/target/linux/rockchip/patches-5.15/111-irqchip-gic-v3-add-hackaround-for-rk3568-its.patch index cbda4d41d6..0a0611c4b5 100644 --- a/lede/target/linux/rockchip/patches-5.15/111-irqchip-gic-v3-add-hackaround-for-rk3568-its.patch +++ b/lede/target/linux/rockchip/patches-5.15/111-irqchip-gic-v3-add-hackaround-for-rk3568-its.patch @@ -138,7 +138,7 @@ Subject: [PATCH] irqchip: gic-v3: add hackaround for rk3568 its if (alloc_lpis) { lpi_map = its_lpi_alloc(nvecs, &lpi_base, &nr_lpis); if (lpi_map) -@@ -4726,6 +4763,13 @@ static bool __maybe_unused its_enable_qu +@@ -4721,6 +4758,13 @@ static bool __maybe_unused its_enable_qu return true; } @@ -152,7 +152,7 @@ Subject: [PATCH] irqchip: gic-v3: add hackaround for rk3568 its static const struct gic_quirk its_quirks[] = { #ifdef CONFIG_CAVIUM_ERRATUM_22375 { -@@ -4772,6 +4816,14 @@ static const struct gic_quirk its_quirks +@@ -4767,6 +4811,14 @@ static const struct gic_quirk its_quirks .init = its_enable_quirk_hip07_161600802, }, #endif @@ -167,7 +167,7 @@ Subject: [PATCH] irqchip: gic-v3: add hackaround for rk3568 its { } }; -@@ -4995,6 +5047,7 @@ static int __init its_probe_one(struct r +@@ -4990,6 +5042,7 @@ static int __init its_probe_one(struct r u64 baser, tmp, typer; struct page *page; int err; @@ -175,7 +175,7 @@ Subject: [PATCH] irqchip: gic-v3: add hackaround for rk3568 its its_base = ioremap(res->start, SZ_64K); if (!its_base) { -@@ -5063,7 +5116,9 @@ static int __init its_probe_one(struct r +@@ -5058,7 +5111,9 @@ static int __init its_probe_one(struct r its->numa_node = numa_node; @@ -186,7 +186,7 @@ Subject: [PATCH] irqchip: gic-v3: add hackaround for rk3568 its get_order(ITS_CMD_QUEUE_SZ)); if (!page) { err = -ENOMEM; -@@ -5094,6 +5149,9 @@ static int __init its_probe_one(struct r +@@ -5089,6 +5144,9 @@ static int __init its_probe_one(struct r gits_write_cbaser(baser, its->base + GITS_CBASER); tmp = gits_read_cbaser(its->base + GITS_CBASER); diff --git a/mihomo/README.md b/mihomo/README.md index 975f1268e0..d38fbedd8a 100644 --- a/mihomo/README.md +++ b/mihomo/README.md @@ -98,4 +98,3 @@ API. This software is released under the GPL-3.0 license. -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FMetaCubeX%2Fmihomo.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2FMetaCubeX%2Fmihomo?ref=badge_large) diff --git a/naiveproxy/USAGE.txt b/naiveproxy/USAGE.txt index 1643926660..4c1660e645 100644 --- a/naiveproxy/USAGE.txt +++ b/naiveproxy/USAGE.txt @@ -97,3 +97,7 @@ Options: --ssl-key-log-file= Saves SSL keys for Wireshark inspection. + + --no-post-quantum + + Overrides the default and disables post-quantum key agreement. diff --git a/naiveproxy/src/build.sh b/naiveproxy/src/build.sh index 8d6bea83f2..1e01b29827 100755 --- a/naiveproxy/src/build.sh +++ b/naiveproxy/src/build.sh @@ -115,6 +115,6 @@ mkdir -p out export DEPOT_TOOLS_WIN_TOOLCHAIN=0 -./gn/out/gn gen "$out" --args="$flags $EXTRA_FLAGS" --script-executable=$PYTHON +./gn/out/gn gen "$out" --args="$flags $EXTRA_FLAGS" ninja -C "$out" naive diff --git a/naiveproxy/src/get-sysroot.sh b/naiveproxy/src/get-sysroot.sh index ae9a98e8b2..5ffad2a4c6 100644 --- a/naiveproxy/src/get-sysroot.sh +++ b/naiveproxy/src/get-sysroot.sh @@ -24,7 +24,11 @@ if [ ! "$target_cpu" ]; then target_cpu="$host_cpu" fi -PYTHON=$(which python3 2>/dev/null || which python 2>/dev/null) +if which python3 >/dev/null 2>/dev/null; then + PYTHON=python3 +else + PYTHON=python +fi # sysroot case "$target_os" in diff --git a/naiveproxy/src/net/BUILD.gn b/naiveproxy/src/net/BUILD.gn index 8f1937fd5f..582a9a1d8c 100644 --- a/naiveproxy/src/net/BUILD.gn +++ b/naiveproxy/src/net/BUILD.gn @@ -1744,6 +1744,12 @@ static_library("preload_decoder") { executable("naive") { sources = [ + "tools/naive/http_proxy_server_socket.cc", + "tools/naive/http_proxy_server_socket.h", + "tools/naive/naive_command_line.cc", + "tools/naive/naive_command_line.h", + "tools/naive/naive_config.cc", + "tools/naive/naive_config.h", "tools/naive/naive_connection.cc", "tools/naive/naive_connection.h", "tools/naive/naive_padding_framer.cc", @@ -1752,15 +1758,13 @@ executable("naive") { "tools/naive/naive_padding_socket.h", "tools/naive/naive_protocol.cc", "tools/naive/naive_protocol.h", + "tools/naive/naive_proxy_bin.cc", + "tools/naive/naive_proxy_delegate.cc", + "tools/naive/naive_proxy_delegate.h", "tools/naive/naive_proxy.cc", "tools/naive/naive_proxy.h", - "tools/naive/naive_proxy_bin.cc", - "tools/naive/naive_proxy_delegate.h", - "tools/naive/naive_proxy_delegate.cc", - "tools/naive/http_proxy_server_socket.cc", - "tools/naive/http_proxy_server_socket.h", - "tools/naive/redirect_resolver.h", "tools/naive/redirect_resolver.cc", + "tools/naive/redirect_resolver.h", "tools/naive/socks5_server_socket.cc", "tools/naive/socks5_server_socket.h", ] diff --git a/naiveproxy/src/net/tools/naive/naive_command_line.cc b/naiveproxy/src/net/tools/naive/naive_command_line.cc new file mode 100644 index 0000000000..9b7d78381b --- /dev/null +++ b/naiveproxy/src/net/tools/naive/naive_command_line.cc @@ -0,0 +1,74 @@ +// Copyright 2024 klzgrad . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#include "net/tools/naive/naive_command_line.h" + +#include +#include + +#include "base/strings/utf_string_conversions.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_WIN) +#include "base/strings/string_util_win.h" +#endif + +DuplicateSwitchCollector::DuplicateSwitchCollector() = default; +DuplicateSwitchCollector::~DuplicateSwitchCollector() = default; + +void DuplicateSwitchCollector::ResolveDuplicate( + std::string_view key, + base::CommandLine::StringPieceType new_value, + base::CommandLine::StringType& out_value) { + out_value = new_value; + values_by_key_[std::string(key)].push_back( + base::CommandLine::StringType(new_value)); +} + +const std::vector& +DuplicateSwitchCollector::GetValuesByKey(std::string_view key) { + return values_by_key_[std::string(key)]; +} + +namespace { +DuplicateSwitchCollector* g_duplicate_switch_collector; +} + +void DuplicateSwitchCollector::InitInstance() { + auto new_duplicate_switch_collector = + std::make_unique(); + g_duplicate_switch_collector = new_duplicate_switch_collector.get(); + base::CommandLine::SetDuplicateSwitchHandler( + std::move(new_duplicate_switch_collector)); +} + +DuplicateSwitchCollector& DuplicateSwitchCollector::GetInstance() { + CHECK(g_duplicate_switch_collector != nullptr); + return *g_duplicate_switch_collector; +} + +base::Value::Dict GetSwitchesAsValue(const base::CommandLine& cmdline) { + base::Value::Dict dict; + for (const auto& [key, value] : cmdline.GetSwitches()) { + const std::vector& values = + DuplicateSwitchCollector::GetInstance().GetValuesByKey(key); + if (values.size() > 1) { + base::Value::List list; + for (const base::CommandLine::StringType& v : values) { +#if BUILDFLAG(IS_WIN) + list.Append(base::AsStringPiece16(v)); +#else + list.Append(v); +#endif + } + dict.Set(key, std::move(list)); + } else { +#if BUILDFLAG(IS_WIN) + dict.Set(key, base::AsStringPiece16(value)); +#else + dict.Set(key, value); +#endif + } + } + return dict; +} diff --git a/naiveproxy/src/net/tools/naive/naive_command_line.h b/naiveproxy/src/net/tools/naive/naive_command_line.h new file mode 100644 index 0000000000..450353a995 --- /dev/null +++ b/naiveproxy/src/net/tools/naive/naive_command_line.h @@ -0,0 +1,36 @@ +// Copyright 2024 klzgrad . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef NET_TOOLS_NAIVE_NAIVE_COMMAND_LINE_H_ +#define NET_TOOLS_NAIVE_NAIVE_COMMAND_LINE_H_ + +#include +#include +#include +#include + +#include "base/command_line.h" +#include "base/values.h" + +class DuplicateSwitchCollector : public base::DuplicateSwitchHandler { + public: + DuplicateSwitchCollector(); + ~DuplicateSwitchCollector() override; + + void ResolveDuplicate(std::string_view key, + base::CommandLine::StringPieceType new_value, + base::CommandLine::StringType& out_value) override; + + const std::vector& GetValuesByKey( + std::string_view key); + + static void InitInstance(); + static DuplicateSwitchCollector& GetInstance(); + + private: + std::map> + values_by_key_; +}; + +base::Value::Dict GetSwitchesAsValue(const base::CommandLine& cmdline); +#endif // NET_TOOLS_NAIVE_NAIVE_COMMAND_LINE_H_ diff --git a/naiveproxy/src/net/tools/naive/naive_config.cc b/naiveproxy/src/net/tools/naive/naive_config.cc new file mode 100644 index 0000000000..7e7eae3b51 --- /dev/null +++ b/naiveproxy/src/net/tools/naive/naive_config.cc @@ -0,0 +1,202 @@ +// Copyright 2024 klzgrad . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#include "net/tools/naive/naive_config.h" + +#include + +#include "base/strings/escape.h" +#include "base/strings/string_number_conversions.h" +#include "net/base/url_util.h" +#include "url/gurl.h" + +namespace net { + +NaiveListenConfig::NaiveListenConfig() = default; +NaiveListenConfig::NaiveListenConfig(const NaiveListenConfig&) = default; +NaiveListenConfig::~NaiveListenConfig() = default; + +bool NaiveListenConfig::Parse(const std::string& str) { + GURL url(str); + if (url.scheme() == "socks") { + protocol = ClientProtocol::kSocks5; + } else if (url.scheme() == "http") { + protocol = ClientProtocol::kHttp; + } else if (url.scheme() == "redir") { +#if BUILDFLAG(IS_LINUX) + protocol = ClientProtocol::kRedir; +#else + std::cerr << "Redir protocol only supports Linux." << std::endl; + return false; +#endif + } else { + std::cerr << "Invalid scheme in " << str << std::endl; + return false; + } + + if (!url.username().empty()) { + user = base::UnescapeBinaryURLComponent(url.username()); + } + if (!url.password().empty()) { + pass = base::UnescapeBinaryURLComponent(url.password()); + } + + if (!url.host().empty()) { + addr = url.HostNoBrackets(); + } + + int effective_port = url.EffectiveIntPort(); + if (effective_port == url::PORT_INVALID) { + std::cerr << "Invalid port in " << str << std::endl; + return false; + } + if (effective_port != url::PORT_UNSPECIFIED) { + port = effective_port; + } + + return true; +} + +NaiveConfig::NaiveConfig() = default; +NaiveConfig::NaiveConfig(const NaiveConfig&) = default; +NaiveConfig::~NaiveConfig() = default; + +bool NaiveConfig::Parse(const base::Value::Dict& value) { + if (const base::Value* v = value.Find("listen")) { + listen.clear(); + if (const std::string* str = v->GetIfString()) { + if (!listen.emplace_back().Parse(*str)) { + return false; + } + } else if (const base::Value::List* strs = v->GetIfList()) { + for (const auto& str_e : *strs) { + if (const std::string* s = str_e.GetIfString()) { + if (!listen.emplace_back().Parse(*s)) { + return false; + } + } else { + std::cerr << "Invalid listen element" << std::endl; + return false; + } + } + } else { + std::cerr << "Invalid listen" << std::endl; + return false; + } + } + + if (const base::Value* v = value.Find("insecure-concurrency")) { + if (std::optional i = v->GetIfInt()) { + insecure_concurrency = *i; + } else if (const std::string* str = v->GetIfString()) { + if (!base::StringToInt(*str, &insecure_concurrency)) { + std::cerr << "Invalid concurrency" << std::endl; + return false; + } + } else { + std::cerr << "Invalid concurrency" << std::endl; + return false; + } + if (insecure_concurrency < 1) { + std::cerr << "Invalid concurrency" << std::endl; + return false; + } + } + + if (const base::Value* v = value.Find("extra-headers")) { + if (const std::string* str = v->GetIfString()) { + extra_headers.AddHeadersFromString(*str); + } else { + std::cerr << "Invalid extra-headers" << std::endl; + return false; + } + } + + if (const base::Value* v = value.Find("proxy")) { + if (const std::string* str = v->GetIfString(); str && !str->empty()) { + GURL url(*str); + net::GetIdentityFromURL(url, &proxy_user, &proxy_pass); + + GURL::Replacements remove_auth; + remove_auth.ClearUsername(); + remove_auth.ClearPassword(); + GURL url_no_auth = url.ReplaceComponents(remove_auth); + proxy_url = url_no_auth.GetWithEmptyPath().spec(); + if (proxy_url.empty()) { + std::cerr << "Invalid proxy" << std::endl; + return false; + } else if (proxy_url.back() == '/') { + proxy_url.pop_back(); + } + } else { + std::cerr << "Invalid proxy" << std::endl; + return false; + } + } + + if (const base::Value* v = value.Find("host-resolver-rules")) { + if (const std::string* str = v->GetIfString()) { + host_resolver_rules = *str; + } else { + std::cerr << "Invalid host-resolver-rules" << std::endl; + return false; + } + } + + if (const base::Value* v = value.Find("resolver-range")) { + if (const std::string* str = v->GetIfString(); str && !str->empty()) { + if (!net::ParseCIDRBlock(*str, &resolver_range, &resolver_prefix)) { + std::cerr << "Invalid resolver-range" << std::endl; + return false; + } + if (resolver_range.IsIPv6()) { + std::cerr << "IPv6 resolver range not supported" << std::endl; + return false; + } + } else { + std::cerr << "Invalid resolver-range" << std::endl; + return false; + } + } + + if (const base::Value* v = value.Find("log")) { + if (const std::string* str = v->GetIfString()) { + if (!str->empty()) { + log.logging_dest = logging::LOG_TO_FILE; + log_file = base::FilePath::FromUTF8Unsafe(*str); + log.log_file_path = log_file.value().c_str(); + } else { + log.logging_dest = logging::LOG_TO_STDERR; + } + } else { + std::cerr << "Invalid log" << std::endl; + return false; + } + } + + if (const base::Value* v = value.Find("log-net-log")) { + if (const std::string* str = v->GetIfString(); str && !str->empty()) { + log_net_log = base::FilePath::FromUTF8Unsafe(*str); + } else { + std::cerr << "Invalid log-net-log" << std::endl; + return false; + } + } + + if (const base::Value* v = value.Find("ssl-key-log-file")) { + if (const std::string* str = v->GetIfString(); str && !str->empty()) { + ssl_key_log_file = base::FilePath::FromUTF8Unsafe(*str); + } else { + std::cerr << "Invalid ssl-key-log-file" << std::endl; + return false; + } + } + + if (const base::Value* v = value.Find("no-post-quantum")) { + no_post_quantum = true; + } + + return true; +} + +} // namespace net diff --git a/naiveproxy/src/net/tools/naive/naive_config.h b/naiveproxy/src/net/tools/naive/naive_config.h new file mode 100644 index 0000000000..b157f74f95 --- /dev/null +++ b/naiveproxy/src/net/tools/naive/naive_config.h @@ -0,0 +1,66 @@ +// Copyright 2024 klzgrad . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef NET_TOOLS_NAIVE_NAIVE_CONFIG_H_ +#define NET_TOOLS_NAIVE_NAIVE_CONFIG_H_ + +#include +#include +#include + +#include "base/files/file_path.h" +#include "base/logging.h" +#include "base/values.h" +#include "net/base/ip_address.h" +#include "net/http/http_request_headers.h" +#include "net/tools/naive/naive_protocol.h" + +namespace net { + +struct NaiveListenConfig { + ClientProtocol protocol = ClientProtocol::kSocks5; + std::string user; + std::string pass; + std::string addr = "0.0.0.0"; + int port = 1080; + + NaiveListenConfig(); + NaiveListenConfig(const NaiveListenConfig&); + ~NaiveListenConfig(); + bool Parse(const std::string& str); +}; + +struct NaiveConfig { + std::vector listen = {NaiveListenConfig()}; + + int insecure_concurrency = 1; + + HttpRequestHeaders extra_headers; + + std::string proxy_url = "direct://"; + + std::u16string proxy_user; + std::u16string proxy_pass; + + std::string host_resolver_rules; + + IPAddress resolver_range = {100, 64, 0, 0}; + size_t resolver_prefix = 10; + + logging::LoggingSettings log = {.logging_dest = logging::LOG_NONE}; + base::FilePath log_file; + + base::FilePath log_net_log; + + base::FilePath ssl_key_log_file; + + std::optional no_post_quantum; + + NaiveConfig(); + NaiveConfig(const NaiveConfig&); + ~NaiveConfig(); + bool Parse(const base::Value::Dict& value); +}; + +} // namespace net +#endif // NET_TOOLS_NAIVE_NAIVE_CONFIG_H_ diff --git a/naiveproxy/src/net/tools/naive/naive_proxy_bin.cc b/naiveproxy/src/net/tools/naive/naive_proxy_bin.cc index dcd8d33146..c580e0cc4d 100644 --- a/naiveproxy/src/net/tools/naive/naive_proxy_bin.cc +++ b/naiveproxy/src/net/tools/naive/naive_proxy_bin.cc @@ -7,6 +7,7 @@ #include #include #include +#include #include #include "base/allocator/allocator_check.h" @@ -60,8 +61,11 @@ #include "net/socket/ssl_client_socket.h" #include "net/socket/tcp_server_socket.h" #include "net/socket/udp_server_socket.h" +#include "net/ssl/ssl_config_service.h" #include "net/ssl/ssl_key_logger_impl.h" #include "net/third_party/quiche/src/quiche/quic/core/quic_versions.h" +#include "net/tools/naive/naive_command_line.h" +#include "net/tools/naive/naive_config.h" #include "net/tools/naive/naive_protocol.h" #include "net/tools/naive/naive_proxy.h" #include "net/tools/naive/naive_proxy_delegate.h" @@ -87,42 +91,6 @@ constexpr int kExpectedMaxUsers = 8; constexpr net::NetworkTrafficAnnotationTag kTrafficAnnotation = net::DefineNetworkTrafficAnnotation("naive", ""); -struct CommandLine { - std::vector listens; - std::string proxy; - std::string concurrency; - std::string extra_headers; - std::string host_resolver_rules; - std::string resolver_range; - bool no_log; - base::FilePath log; - base::FilePath log_net_log; - base::FilePath ssl_key_log_file; -}; - -struct ListenParams { - net::ClientProtocol protocol; - std::string listen_user; - std::string listen_pass; - std::string listen_addr; - int listen_port; -}; - -struct Params { - std::vector listens; - int concurrency; - net::HttpRequestHeaders extra_headers; - std::string proxy_url; - std::u16string proxy_user; - std::u16string proxy_pass; - std::string host_resolver_rules; - net::IPAddress resolver_range; - size_t resolver_prefix; - logging::LoggingSettings log_settings; - base::FilePath net_log_path; - base::FilePath ssl_key_path; -}; - std::unique_ptr GetConstants() { base::Value::Dict constants_dict = net::GetNetConstants(); base::Value::Dict dict; @@ -134,278 +102,6 @@ std::unique_ptr GetConstants() { constants_dict.Set("clientInfo", std::move(dict)); return std::make_unique(std::move(constants_dict)); } - -class MultipleListenCollector : public base::DuplicateSwitchHandler { - public: - void ResolveDuplicate(std::string_view key, - base::CommandLine::StringPieceType new_value, - base::CommandLine::StringType& out_value) override { - out_value = new_value; - if (key == "listen") { -#if BUILDFLAG(IS_WIN) - all_values_.push_back(base::WideToUTF8(new_value)); -#else - all_values_.push_back(std::string(new_value)); -#endif - } - } - - const std::vector& GetAllValues() const { - return all_values_; - } - - private: - std::vector all_values_; -}; - -void GetCommandLine(const base::CommandLine& proc, - CommandLine* cmdline, - MultipleListenCollector& multiple_listens) { - if (proc.HasSwitch("h") || proc.HasSwitch("help")) { - std::cout << "Usage: naive { OPTIONS | config.json }\n" - "\n" - "Options:\n" - "-h, --help Show this message\n" - "--version Print version\n" - "--listen=://[addr][:port] [--listen=...]\n" - " proto: socks, http\n" - " redir (Linux only)\n" - "--proxy=://[:@][:]\n" - " proto: https, quic\n" - "--insecure-concurrency= Use N connections, insecure\n" - "--extra-headers=... Extra headers split by CRLF\n" - "--host-resolver-rules=... Resolver rules\n" - "--resolver-range=... Redirect resolver range\n" - "--log[=] Log to stderr, or file\n" - "--log-net-log= Save NetLog\n" - "--ssl-key-log-file= Save SSL keys for Wireshark\n" - << std::endl; - exit(EXIT_SUCCESS); - } - - if (proc.HasSwitch("version")) { - std::cout << "naive " << version_info::GetVersionNumber() << std::endl; - exit(EXIT_SUCCESS); - } - - cmdline->listens = multiple_listens.GetAllValues(); - cmdline->proxy = proc.GetSwitchValueASCII("proxy"); - cmdline->concurrency = proc.GetSwitchValueASCII("insecure-concurrency"); - cmdline->extra_headers = proc.GetSwitchValueASCII("extra-headers"); - cmdline->host_resolver_rules = - proc.GetSwitchValueASCII("host-resolver-rules"); - cmdline->resolver_range = proc.GetSwitchValueASCII("resolver-range"); - cmdline->no_log = !proc.HasSwitch("log"); - cmdline->log = proc.GetSwitchValuePath("log"); - cmdline->log_net_log = proc.GetSwitchValuePath("log-net-log"); - cmdline->ssl_key_log_file = proc.GetSwitchValuePath("ssl-key-log-file"); -} - -void GetCommandLineFromConfig(const base::FilePath& config_path, - CommandLine* cmdline) { - JSONFileValueDeserializer reader(config_path); - int error_code; - std::string error_message; - std::unique_ptr value = - reader.Deserialize(&error_code, &error_message); - if (value == nullptr) { - std::cerr << "Error reading " << config_path << ": (" << error_code << ") " - << error_message << std::endl; - exit(EXIT_FAILURE); - } - base::Value::Dict* value_dict = value->GetIfDict(); - if (value_dict == nullptr) { - std::cerr << "Invalid config format" << std::endl; - exit(EXIT_FAILURE); - } - const std::string* listen = value_dict->FindString("listen"); - if (listen != nullptr) { - cmdline->listens = {*listen}; - } else { - const base::Value::List* listen_list = value_dict->FindList("listen"); - if (listen_list != nullptr) { - for (const auto& listen_element : *listen_list) { - const std::string* listen_elemet_str = listen_element.GetIfString(); - if (listen_elemet_str == nullptr) { - std::cerr << "Invalid listen element" << std::endl; - exit(EXIT_FAILURE); - } - cmdline->listens.push_back(*listen_elemet_str); - } - } - } - const std::string* proxy = value_dict->FindString("proxy"); - if (proxy) { - cmdline->proxy = *proxy; - } - const std::string* concurrency = - value_dict->FindString("insecure-concurrency"); - if (concurrency) { - cmdline->concurrency = *concurrency; - } - const std::string* extra_headers = value_dict->FindString("extra-headers"); - if (extra_headers) { - cmdline->extra_headers = *extra_headers; - } - const std::string* host_resolver_rules = - value_dict->FindString("host-resolver-rules"); - if (host_resolver_rules) { - cmdline->host_resolver_rules = *host_resolver_rules; - } - const std::string* resolver_range = value_dict->FindString("resolver-range"); - if (resolver_range) { - cmdline->resolver_range = *resolver_range; - } - cmdline->no_log = true; - const std::string* log = value_dict->FindString("log"); - if (log) { - cmdline->no_log = false; - cmdline->log = base::FilePath::FromUTF8Unsafe(*log); - } - const std::string* log_net_log = value_dict->FindString("log-net-log"); - if (log_net_log) { - cmdline->log_net_log = base::FilePath::FromUTF8Unsafe(*log_net_log); - } - const std::string* ssl_key_log_file = - value_dict->FindString("ssl-key-log-file"); - if (ssl_key_log_file) { - cmdline->ssl_key_log_file = - base::FilePath::FromUTF8Unsafe(*ssl_key_log_file); - } -} - -bool ParseListenParams(const std::string& listen_str, - ListenParams& listen_params) { - GURL url(listen_str); - if (url.scheme() == "socks") { - listen_params.protocol = net::ClientProtocol::kSocks5; - } else if (url.scheme() == "http") { - listen_params.protocol = net::ClientProtocol::kHttp; - } else if (url.scheme() == "redir") { -#if BUILDFLAG(IS_LINUX) - listen_params.protocol = net::ClientProtocol::kRedir; -#else - std::cerr << "Redir protocol only supports Linux." << std::endl; - return false; -#endif - } else { - std::cerr << "Invalid scheme in --listen" << std::endl; - return false; - } - if (!url.username().empty()) { - listen_params.listen_user = - base::UnescapeBinaryURLComponent(url.username()); - } - if (!url.password().empty()) { - listen_params.listen_pass = - base::UnescapeBinaryURLComponent(url.password()); - } - if (!url.host().empty()) { - listen_params.listen_addr = url.HostNoBrackets(); - } else { - listen_params.listen_addr = "0.0.0.0"; - } - int port = url.EffectiveIntPort(); - if (port == url::PORT_INVALID) { - std::cerr << "Invalid port in --listen" << std::endl; - return false; - } else if (port == url::PORT_UNSPECIFIED) { - port = 1080; - } - listen_params.listen_port = port; - return true; -} - -bool ParseCommandLine(const CommandLine& cmdline, Params* params) { - url::AddStandardScheme("socks", - url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION); - url::AddStandardScheme("redir", url::SCHEME_WITH_HOST_AND_PORT); - - bool any_redir_protocol = false; - if (!cmdline.listens.empty()) { - for (const std::string& listen : cmdline.listens) { - ListenParams listen_params; - if (!ParseListenParams(listen, listen_params)) { - std::cerr << "Invalid listen: " << listen << std::endl; - return false; - } - if (listen_params.protocol == net::ClientProtocol::kRedir) { - any_redir_protocol = true; - } - params->listens.push_back(listen_params); - } - } else { - ListenParams default_listen = { - .protocol = net::ClientProtocol::kSocks5, - .listen_addr = "0.0.0.0", - .listen_port = 1080, - }; - params->listens = {default_listen}; - } - - params->proxy_url = "direct://"; - GURL url(cmdline.proxy); - GURL::Replacements remove_auth; - remove_auth.ClearUsername(); - remove_auth.ClearPassword(); - GURL url_no_auth = url.ReplaceComponents(remove_auth); - if (!cmdline.proxy.empty()) { - params->proxy_url = url_no_auth.GetWithEmptyPath().spec(); - if (params->proxy_url.empty()) { - std::cerr << "Invalid proxy URL" << std::endl; - return false; - } else if (params->proxy_url.back() == '/') { - params->proxy_url.pop_back(); - } - net::GetIdentityFromURL(url, ¶ms->proxy_user, ¶ms->proxy_pass); - } - - if (!cmdline.concurrency.empty()) { - if (!base::StringToInt(cmdline.concurrency, ¶ms->concurrency) || - params->concurrency < 1) { - std::cerr << "Invalid concurrency" << std::endl; - return false; - } - } else { - params->concurrency = 1; - } - - params->extra_headers.AddHeadersFromString(cmdline.extra_headers); - - params->host_resolver_rules = cmdline.host_resolver_rules; - - if (any_redir_protocol) { - std::string range = "100.64.0.0/10"; - if (!cmdline.resolver_range.empty()) - range = cmdline.resolver_range; - - if (!net::ParseCIDRBlock(range, ¶ms->resolver_range, - ¶ms->resolver_prefix)) { - std::cerr << "Invalid resolver range" << std::endl; - return false; - } - if (params->resolver_range.IsIPv6()) { - std::cerr << "IPv6 resolver range not supported" << std::endl; - return false; - } - } - - if (!cmdline.no_log) { - if (!cmdline.log.empty()) { - params->log_settings.logging_dest = logging::LOG_TO_FILE; - params->log_settings.log_file_path = cmdline.log.value().c_str(); - } else { - params->log_settings.logging_dest = logging::LOG_TO_STDERR; - } - } else { - params->log_settings.logging_dest = logging::LOG_NONE; - } - - params->net_log_path = cmdline.log_net_log; - params->ssl_key_path = cmdline.ssl_key_log_file; - - return true; -} } // namespace namespace net { @@ -471,7 +167,7 @@ std::unique_ptr BuildCertURLRequestContext(NetLog* net_log) { // Builds a URLRequestContext assuming there's only a single loop. std::unique_ptr BuildURLRequestContext( - const Params& params, + const NaiveConfig& config, scoped_refptr cert_net_fetcher, NetLog* net_log) { URLRequestContextBuilder builder; @@ -479,7 +175,7 @@ std::unique_ptr BuildURLRequestContext( builder.DisableHttpCache(); builder.set_net_log(net_log); - std::string proxy_url = params.proxy_url; + std::string proxy_url = config.proxy_url; bool force_quic = false; if (proxy_url.compare(0, 7, "quic://") == 0) { proxy_url.replace(0, 4, "https"); @@ -505,21 +201,36 @@ std::unique_ptr BuildURLRequestContext( proxy_service->ForceReloadProxyConfig(); builder.set_proxy_resolution_service(std::move(proxy_service)); - if (!params.host_resolver_rules.empty()) { - builder.set_host_mapping_rules(params.host_resolver_rules); + if (!config.host_resolver_rules.empty()) { + builder.set_host_mapping_rules(config.host_resolver_rules); } builder.SetCertVerifier( CertVerifier::CreateDefault(std::move(cert_net_fetcher))); builder.set_proxy_delegate(std::make_unique( - params.extra_headers, + config.extra_headers, std::vector{PaddingType::kVariant1, PaddingType::kNone})); + if (config.no_post_quantum == true) { + struct NoPostQuantum : public SSLConfigService { + SSLContextConfig GetSSLContextConfig() override { + SSLContextConfig config; + config.post_quantum_override = false; + return config; + } + + bool CanShareConnectionWithClientCerts(std::string_view) const override { + return false; + } + }; + builder.set_ssl_config_service(std::make_unique()); + } + auto context = builder.Build(); - if (!params.proxy_url.empty() && !params.proxy_user.empty() && - !params.proxy_pass.empty()) { + if (!config.proxy_url.empty() && !config.proxy_user.empty() && + !config.proxy_pass.empty()) { auto* session = context->http_transaction_factory()->GetSession(); auto* auth_cache = session->http_auth_cache(); GURL proxy_gurl(proxy_url); @@ -530,7 +241,7 @@ std::unique_ptr BuildURLRequestContext( net::HostPortPair::FromURL(proxy_gurl)); } url::SchemeHostPort auth_origin(proxy_gurl); - AuthCredentials credentials(params.proxy_user, params.proxy_pass); + AuthCredentials credentials(config.proxy_user, config.proxy_pass); auth_cache->Add(auth_origin, HttpAuth::AUTH_PROXY, /*realm=*/{}, HttpAuth::AUTH_SCHEME_BASIC, {}, /*challenge=*/"Basic", credentials, /*path=*/"/"); @@ -565,9 +276,7 @@ int main(int argc, char* argv[]) { // content/app/content_main.cc: RunContentProcess() base::EnableTerminationOnOutOfMemory(); - auto multiple_listens = std::make_unique(); - MultipleListenCollector& multiple_listens_ref = *multiple_listens; - base::CommandLine::SetDuplicateSwitchHandler(std::move(multiple_listens)); + DuplicateSwitchCollector::InitInstance(); // content/app/content_main.cc: RunContentProcess() base::CommandLine::Init(argc, argv); @@ -606,6 +315,9 @@ int main(int argc, char* argv[]) { url::AddStandardScheme("quic", url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION); + url::AddStandardScheme("socks", + url::SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION); + url::AddStandardScheme("redir", url::SCHEME_WITH_HOST_AND_PORT); net::ClientSocketPoolManager::set_max_sockets_per_pool( net::HttpNetworkSession::NORMAL_SOCKET_POOL, kDefaultMaxSocketsPerPool * kExpectedMaxUsers); @@ -616,30 +328,70 @@ int main(int argc, char* argv[]) { net::HttpNetworkSession::NORMAL_SOCKET_POOL, kDefaultMaxSocketsPerGroup * kExpectedMaxUsers); - CommandLine cmdline; - - Params params; const auto& proc = *base::CommandLine::ForCurrentProcess(); const auto& args = proc.GetArgs(); - if (args.empty()) { - if (proc.argv().size() >= 2) { - GetCommandLine(proc, &cmdline, multiple_listens_ref); - } else { - auto path = base::FilePath::FromUTF8Unsafe("config.json"); - GetCommandLineFromConfig(path, &cmdline); - } + base::Value::Dict config_dict; + if (args.empty() && proc.argv().size() >= 2) { + config_dict = GetSwitchesAsValue(proc); } else { - base::FilePath path(args[0]); - GetCommandLineFromConfig(path, &cmdline); + base::FilePath config_file; + if (!args.empty()) { + config_file = base::FilePath(args[0]); + } else { + config_file = base::FilePath::FromUTF8Unsafe("config.json"); + } + JSONFileValueDeserializer reader(config_file); + int error_code; + std::string error_message; + std::unique_ptr value = + reader.Deserialize(&error_code, &error_message); + if (value == nullptr) { + std::cerr << "Error reading " << config_file << ": (" << error_code + << ") " << error_message << std::endl; + return EXIT_FAILURE; + } + if (const base::Value::Dict* dict = value->GetIfDict()) { + config_dict = dict->Clone(); + } } - if (!ParseCommandLine(cmdline, ¶ms)) { + + if (config_dict.contains("h") || config_dict.contains("help")) { + std::cout << "Usage: naive { OPTIONS | config.json }\n" + "\n" + "Options:\n" + "-h, --help Show this message\n" + "--version Print version\n" + "--listen=://[addr][:port] [--listen=...]\n" + " proto: socks, http\n" + " redir (Linux only)\n" + "--proxy=://[:@][:]\n" + " proto: https, quic\n" + "--insecure-concurrency= Use N connections, insecure\n" + "--extra-headers=... Extra headers split by CRLF\n" + "--host-resolver-rules=... Resolver rules\n" + "--resolver-range=... Redirect resolver range\n" + "--log[=] Log to stderr, or file\n" + "--log-net-log= Save NetLog\n" + "--ssl-key-log-file= Save SSL keys for Wireshark\n" + "--no-post-quantum No post-quantum key agreement\n" + << std::endl; + exit(EXIT_SUCCESS); + } + + if (config_dict.contains("version")) { + std::cout << "naive " << version_info::GetVersionNumber() << std::endl; + exit(EXIT_SUCCESS); + } + + net::NaiveConfig config; + if (!config.Parse(config_dict)) { return EXIT_FAILURE; } - CHECK(logging::InitLogging(params.log_settings)); + CHECK(logging::InitLogging(config.log)); - if (!params.ssl_key_path.empty()) { + if (!config.ssl_key_log_file.empty()) { net::SSLClientSocket::SetSSLKeyLogger( - std::make_unique(params.ssl_key_path)); + std::make_unique(config.ssl_key_log_file)); } // The declaration order for net_log and printing_log_observer is @@ -648,15 +400,15 @@ int main(int argc, char* argv[]) { // printing_log_observer. net::NetLog* net_log = net::NetLog::Get(); std::unique_ptr observer; - if (!params.net_log_path.empty()) { + if (!config.log_net_log.empty()) { observer = net::FileNetLogObserver::CreateUnbounded( - params.net_log_path, net::NetLogCaptureMode::kDefault, GetConstants()); + config.log_net_log, net::NetLogCaptureMode::kDefault, GetConstants()); observer->StartObserving(net_log); } // Avoids net log overhead if verbose logging is disabled. std::unique_ptr printing_log_observer; - if (params.log_settings.logging_dest != logging::LOG_NONE && VLOG_IS_ON(1)) { + if (config.log.logging_dest != logging::LOG_NONE && VLOG_IS_ON(1)) { printing_log_observer = std::make_unique(); net_log->AddObserver(printing_log_observer.get(), net::NetLogCaptureMode::kDefault); @@ -675,43 +427,41 @@ int main(int argc, char* argv[]) { cert_net_fetcher->SetURLRequestContext(cert_context.get()); #endif auto context = - net::BuildURLRequestContext(params, std::move(cert_net_fetcher), net_log); + net::BuildURLRequestContext(config, std::move(cert_net_fetcher), net_log); auto* session = context->http_transaction_factory()->GetSession(); std::vector> naive_proxies; std::unique_ptr resolver; - for (const ListenParams& listen_params : params.listens) { + for (const net::NaiveListenConfig& listen_config : config.listen) { auto listen_socket = std::make_unique(net_log, net::NetLogSource()); int result = listen_socket->ListenWithAddressAndPort( - listen_params.listen_addr, listen_params.listen_port, kListenBackLog); + listen_config.addr, listen_config.port, kListenBackLog); if (result != net::OK) { LOG(ERROR) << "Failed to listen on " - << net::ToString(listen_params.protocol) << "://" - << listen_params.listen_addr << " " - << listen_params.listen_port << ": " + << net::ToString(listen_config.protocol) << "://" + << listen_config.addr << " " << listen_config.port << ": " << net::ErrorToShortString(result); return EXIT_FAILURE; } - LOG(INFO) << "Listening on " << net::ToString(listen_params.protocol) - << "://" << listen_params.listen_addr << ":" - << listen_params.listen_port; + LOG(INFO) << "Listening on " << net::ToString(listen_config.protocol) + << "://" << listen_config.addr << ":" << listen_config.port; if (resolver == nullptr && - listen_params.protocol == net::ClientProtocol::kRedir) { + listen_config.protocol == net::ClientProtocol::kRedir) { auto resolver_socket = std::make_unique(net_log, net::NetLogSource()); resolver_socket->AllowAddressReuse(); net::IPAddress listen_addr; - if (!listen_addr.AssignFromIPLiteral(listen_params.listen_addr)) { - LOG(ERROR) << "Failed to open resolver: " << listen_params.listen_addr; + if (!listen_addr.AssignFromIPLiteral(listen_config.addr)) { + LOG(ERROR) << "Failed to open resolver: " << listen_config.addr; return EXIT_FAILURE; } result = resolver_socket->Listen( - net::IPEndPoint(listen_addr, listen_params.listen_port)); + net::IPEndPoint(listen_addr, listen_config.port)); if (result != net::OK) { LOG(ERROR) << "Failed to open resolver: " << net::ErrorToShortString(result); @@ -719,14 +469,14 @@ int main(int argc, char* argv[]) { } resolver = std::make_unique( - std::move(resolver_socket), params.resolver_range, - params.resolver_prefix); + std::move(resolver_socket), config.resolver_range, + config.resolver_prefix); } auto naive_proxy = std::make_unique( - std::move(listen_socket), listen_params.protocol, - listen_params.listen_user, listen_params.listen_pass, - params.concurrency, resolver.get(), session, kTrafficAnnotation, + std::move(listen_socket), listen_config.protocol, listen_config.user, + listen_config.pass, config.insecure_concurrency, resolver.get(), + session, kTrafficAnnotation, std::vector{net::PaddingType::kVariant1, net::PaddingType::kNone}); naive_proxies.push_back(std::move(naive_proxy)); diff --git a/openwrt-packages/homeproxy/root/etc/homeproxy/scripts/update_resources.sh b/openwrt-packages/homeproxy/root/etc/homeproxy/scripts/update_resources.sh index a77a1a22fb..576293d016 100755 --- a/openwrt-packages/homeproxy/root/etc/homeproxy/scripts/update_resources.sh +++ b/openwrt-packages/homeproxy/root/etc/homeproxy/scripts/update_resources.sh @@ -95,8 +95,8 @@ case "$1" in check_list_update "$1" "Loyalsoldier/v2ray-rules-dat" "release" "gfw.txt" ;; "china_list") - check_list_update "$1" "Loyalsoldier/v2ray-rules-dat" "release" "direct-list.txt" - sed -i -e "s/full://g" -e "/:/d" "$RESOURCES_DIR/china_list.txt" + check_list_update "$1" "Loyalsoldier/v2ray-rules-dat" "release" "direct-list.txt" && \ + sed -i -e "s/full://g" -e "/:/d" "$RESOURCES_DIR/china_list.txt" ;; *) echo -e "Usage: $0 " diff --git a/small/v2ray-geodata/Makefile b/small/v2ray-geodata/Makefile index e46c26c22f..7c12883ede 100644 --- a/small/v2ray-geodata/Makefile +++ b/small/v2ray-geodata/Makefile @@ -21,13 +21,13 @@ define Download/geoip HASH:=2f7516c0f853625e0a7ca932f534eb6d963f4287d4a2c585b1d193b4bb0a0f4f endef -GEOSITE_VER:=20240426060244 +GEOSITE_VER:=20240504082351 GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER) define Download/geosite URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/ URL_FILE:=dlc.dat FILE:=$(GEOSITE_FILE) - HASH:=7aa19bb7fa5f99d62d3db87b632334caa356fb9b901f85f7168c064370973646 + HASH:=a4d70989c3928289f07528894f29788d7844bdbfb450dd6597595d1d0210881d endef GEOSITE_IRAN_VER:=202404290026 diff --git a/v2rayn/v2rayN/v2rayN/Common/Utils.cs b/v2rayn/v2rayN/v2rayN/Common/Utils.cs index 0fe1a66623..6a2a0bb3ce 100644 --- a/v2rayn/v2rayN/v2rayN/Common/Utils.cs +++ b/v2rayn/v2rayN/v2rayN/Common/Utils.cs @@ -57,11 +57,14 @@ namespace v2rayN /// 取得存储资源 /// /// - public static string? LoadResource(string res) + public static string? LoadResource(string? res) { try { - if (!File.Exists(res)) return null; + if (!File.Exists(res)) + { + return null; + } return File.ReadAllText(res); } catch (Exception ex) diff --git a/v2rayn/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs b/v2rayn/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs index fbe1dcd961..12b3aaaeb6 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs @@ -895,18 +895,45 @@ namespace v2rayN.Handler ruleSets.AddRange(dnsRule.rule_set); } + //load custom ruleset file + List customRulesets = []; + if (_config.routingBasicItem.enableRoutingAdvanced) + { + var routing = ConfigHandler.GetDefaultRouting(_config); + if (!Utils.IsNullOrEmpty(routing.customRulesetPath4Singbox)) + { + var result = Utils.LoadResource(routing.customRulesetPath4Singbox); + if (!Utils.IsNullOrEmpty(result)) + { + customRulesets = (JsonUtils.Deserialize>(result) ?? []) + .Where(t => t.tag != null) + .Where(t => t.type != null) + .Where(t => t.format != null) + .ToList(); + } + } + } + //Add ruleset srs singboxConfig.route.rule_set = []; foreach (var item in new HashSet(ruleSets)) { - singboxConfig.route.rule_set.Add(new() + var customRuleset = customRulesets.FirstOrDefault(t => t.tag != null && t.tag.Equals(item)); + if (customRuleset != null) { - type = "remote", - format = "binary", - tag = item, - url = string.Format(Global.SingboxRulesetUrl, item.StartsWith(geosite) ? geosite : geoip, item), - download_detour = Global.ProxyTag - }); + singboxConfig.route.rule_set.Add(customRuleset); + } + else + { + singboxConfig.route.rule_set.Add(new() + { + type = "remote", + format = "binary", + tag = item, + url = string.Format(Global.SingboxRulesetUrl, item.StartsWith(geosite) ? geosite : geoip, item), + download_detour = Global.ProxyTag + }); + } } return 0; diff --git a/v2rayn/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayn/v2rayN/v2rayN/Handler/ShareHandler.cs index a647b5bb21..0c73d3c64c 100644 --- a/v2rayn/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayn/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -264,7 +264,21 @@ namespace v2rayN.Handler private static string GetIpv6(string address) { - return Utils.IsIpv6(address) ? $"[{address}]" : address; + if (Utils.IsIpv6(address)) + { + if (address.StartsWith('[') && address.EndsWith(']')) + { + return address; + } + else + { + return $"[{address}]"; + } + } + else + { + return address; + } } private static int GetStdTransport(ProfileItem item, string? securityDef, ref Dictionary dicQuery) diff --git a/v2rayn/v2rayN/v2rayN/Models/ConfigItems.cs b/v2rayn/v2rayN/v2rayN/Models/ConfigItems.cs index 098514a1a7..7b1ff7797f 100644 --- a/v2rayn/v2rayN/v2rayN/Models/ConfigItems.cs +++ b/v2rayn/v2rayN/v2rayN/Models/ConfigItems.cs @@ -182,16 +182,11 @@ namespace v2rayN.Models [Serializable] public class RoutingBasicItem { - /// - /// 域名解析策略 - /// public string domainStrategy { get; set; } - public string domainStrategy4Singbox { get; set; } - public string domainMatcher { get; set; } public string routingIndexId { get; set; } - public bool enableRoutingAdvanced { get; set; } + public bool enableRoutingAdvanced { get; set; } } [Serializable] diff --git a/v2rayn/v2rayN/v2rayN/Models/RoutingItem.cs b/v2rayn/v2rayN/v2rayN/Models/RoutingItem.cs index ac0d36d5d7..de5cfb2afd 100644 --- a/v2rayn/v2rayN/v2rayN/Models/RoutingItem.cs +++ b/v2rayn/v2rayN/v2rayN/Models/RoutingItem.cs @@ -15,6 +15,7 @@ namespace v2rayN.Models public bool enabled { get; set; } = true; public bool locked { get; set; } public string customIcon { get; set; } + public string customRulesetPath4Singbox { get; set; } public string domainStrategy { get; set; } public string domainStrategy4Singbox { get; set; } public int sort { get; set; } diff --git a/v2rayn/v2rayN/v2rayN/Models/SingboxConfig.cs b/v2rayn/v2rayN/v2rayN/Models/SingboxConfig.cs index 6c5e444b61..b157a468bd 100644 --- a/v2rayn/v2rayN/v2rayN/Models/SingboxConfig.cs +++ b/v2rayn/v2rayN/v2rayN/Models/SingboxConfig.cs @@ -238,7 +238,9 @@ public string? tag { get; set; } public string? type { get; set; } public string? format { get; set; } + public string? path { get; set; } public string? url { get; set; } public string? download_detour { get; set; } + public string? update_interval { get; set; } } } \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayn/v2rayN/v2rayN/Resx/ResUI.Designer.cs index d090c90d26..4a78a85624 100644 --- a/v2rayn/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayn/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 // -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ @@ -13,12 +13,12 @@ namespace v2rayN.Resx { /// - /// A strongly-typed resource class, for looking up localized strings, etc. + /// 一个强类型的资源类,用于查找本地化的字符串等。 /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] @@ -33,7 +33,7 @@ namespace v2rayN.Resx { } /// - /// Returns the cached ResourceManager instance used by this class. + /// 返回此类使用的缓存的 ResourceManager 实例。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { @@ -47,8 +47,8 @@ namespace v2rayN.Resx { } /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { @@ -61,7 +61,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Do you want to append rules? Choose yes to append, choose otherwise to replace. + /// 查找类似 Do you want to append rules? Choose yes to append, choose otherwise to replace 的本地化字符串。 /// public static string AddBatchRoutingRulesYesNo { get { @@ -70,7 +70,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to All. + /// 查找类似 All 的本地化字符串。 /// public static string AllGroupServers { get { @@ -79,7 +79,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Batch export subscription to clipboard successfully. + /// 查找类似 Batch export subscription to clipboard successfully 的本地化字符串。 /// public static string BatchExportSubscriptionSuccessfully { get { @@ -88,7 +88,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Batch export share URL to clipboard successfully. + /// 查找类似 Batch export share URL to clipboard successfully 的本地化字符串。 /// public static string BatchExportURLSuccessfully { get { @@ -97,7 +97,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please check the server settings first. + /// 查找类似 Please check the server settings first 的本地化字符串。 /// public static string CheckServerSettings { get { @@ -106,7 +106,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Invalid configuration format. + /// 查找类似 Invalid configuration format 的本地化字符串。 /// public static string ConfigurationFormatIncorrect { get { @@ -115,7 +115,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually.. + /// 查找类似 Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually. 的本地化字符串。 /// public static string CustomServerTips { get { @@ -124,7 +124,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Downloading.... + /// 查找类似 Downloading... 的本地化字符串。 /// public static string Downloading { get { @@ -133,7 +133,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Download. + /// 查找类似 Download 的本地化字符串。 /// public static string downloadSpeed { get { @@ -142,7 +142,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Whether to download? {0}. + /// 查找类似 Whether to download? {0} 的本地化字符串。 /// public static string DownloadYesNo { get { @@ -151,7 +151,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Failed to convert configuration file. + /// 查找类似 Failed to convert configuration file 的本地化字符串。 /// public static string FailedConversionConfiguration { get { @@ -160,7 +160,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Failed to generate default configuration file. + /// 查找类似 Failed to generate default configuration file 的本地化字符串。 /// public static string FailedGenDefaultConfiguration { get { @@ -169,7 +169,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Failed to get the default configuration. + /// 查找类似 Failed to get the default configuration 的本地化字符串。 /// public static string FailedGetDefaultConfiguration { get { @@ -178,7 +178,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Failed to import custom configuration server. + /// 查找类似 Failed to import custom configuration server 的本地化字符串。 /// public static string FailedImportedCustomServer { get { @@ -187,7 +187,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Failed to read configuration file. + /// 查找类似 Failed to read configuration file 的本地化字符串。 /// public static string FailedReadConfiguration { get { @@ -196,7 +196,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Failed to run Core, please see the log. + /// 查找类似 Failed to run Core, please see the log 的本地化字符串。 /// public static string FailedToRunCore { get { @@ -205,7 +205,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the correct custom DNS. + /// 查找类似 Please fill in the correct custom DNS 的本地化字符串。 /// public static string FillCorrectDNSText { get { @@ -214,7 +214,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the correct format server port. + /// 查找类似 Please fill in the correct format server port 的本地化字符串。 /// public static string FillCorrectServerPort { get { @@ -223,7 +223,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the KCP parameters correctly. + /// 查找类似 Please fill in the KCP parameters correctly 的本地化字符串。 /// public static string FillKcpParameters { get { @@ -232,7 +232,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the local listening port. + /// 查找类似 Please fill in the local listening port 的本地化字符串。 /// public static string FillLocalListeningPort { get { @@ -241,7 +241,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the password. + /// 查找类似 Please fill in the password 的本地化字符串。 /// public static string FillPassword { get { @@ -250,7 +250,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the server address. + /// 查找类似 Please fill in the server address 的本地化字符串。 /// public static string FillServerAddress { get { @@ -259,7 +259,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please browse to import server configuration. + /// 查找类似 Please browse to import server configuration 的本地化字符串。 /// public static string FillServerAddressCustom { get { @@ -268,7 +268,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the user ID. + /// 查找类似 Please fill in the user ID 的本地化字符串。 /// public static string FillUUID { get { @@ -277,7 +277,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Transport. + /// 查找类似 Transport 的本地化字符串。 /// public static string GbTransport { get { @@ -286,7 +286,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Is not the correct client configuration file, please check. + /// 查找类似 Is not the correct client configuration file, please check 的本地化字符串。 /// public static string IncorrectClientConfiguration { get { @@ -295,7 +295,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Is not the correct configuration, please check. + /// 查找类似 Is not the correct configuration, please check 的本地化字符串。 /// public static string Incorrectconfiguration { get { @@ -304,7 +304,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Is not the correct server configuration file, please check. + /// 查找类似 Is not the correct server configuration file, please check 的本地化字符串。 /// public static string IncorrectServerConfiguration { get { @@ -313,7 +313,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Initial Configuration. + /// 查找类似 Initial Configuration 的本地化字符串。 /// public static string InitialConfiguration { get { @@ -322,7 +322,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to {0} {1} already up to date.. + /// 查找类似 {0} {1} already up to date. 的本地化字符串。 /// public static string IsLatestCore { get { @@ -331,7 +331,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to {0} {1} already up to date.. + /// 查找类似 {0} {1} already up to date. 的本地化字符串。 /// public static string IsLatestN { get { @@ -340,7 +340,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to LAN. + /// 查找类似 LAN 的本地化字符串。 /// public static string LabLAN { get { @@ -349,7 +349,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Local. + /// 查找类似 Local 的本地化字符串。 /// public static string LabLocal { get { @@ -358,7 +358,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Address. + /// 查找类似 Address 的本地化字符串。 /// public static string LvAddress { get { @@ -367,7 +367,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Automatic update interval(minutes). + /// 查找类似 Automatic update interval(minutes) 的本地化字符串。 /// public static string LvAutoUpdateInterval { get { @@ -376,7 +376,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Convert target type. + /// 查找类似 Convert target type 的本地化字符串。 /// public static string LvConvertTarget { get { @@ -385,7 +385,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please leave blank if no conversion is required. + /// 查找类似 Please leave blank if no conversion is required 的本地化字符串。 /// public static string LvConvertTargetTip { get { @@ -394,7 +394,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Count. + /// 查找类似 Count 的本地化字符串。 /// public static string LvCount { get { @@ -403,7 +403,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Custom Icon. + /// 查找类似 Custom Icon 的本地化字符串。 /// public static string LvCustomIcon { get { @@ -412,7 +412,16 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Enabled Update. + /// 查找类似 Custom the rule-set of sing-box 的本地化字符串。 + /// + public static string LvCustomRulesetPath4Singbox { + get { + return ResourceManager.GetString("LvCustomRulesetPath4Singbox", resourceCulture); + } + } + + /// + /// 查找类似 Enabled Update 的本地化字符串。 /// public static string LvEnabled { get { @@ -421,7 +430,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Security. + /// 查找类似 Security 的本地化字符串。 /// public static string LvEncryptionMethod { get { @@ -430,7 +439,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Remarks regular filter. + /// 查找类似 Remarks regular filter 的本地化字符串。 /// public static string LvFilter { get { @@ -439,7 +448,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to More urls, separated by commas;Subscription conversion will be invalid. + /// 查找类似 More urls, separated by commas;Subscription conversion will be invalid 的本地化字符串。 /// public static string LvMoreUrl { get { @@ -448,7 +457,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Next proxy remarks. + /// 查找类似 Next proxy remarks 的本地化字符串。 /// public static string LvNextProfile { get { @@ -457,7 +466,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Port. + /// 查找类似 Port 的本地化字符串。 /// public static string LvPort { get { @@ -466,7 +475,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Previous proxy remarks. + /// 查找类似 Previous proxy remarks 的本地化字符串。 /// public static string LvPrevProfile { get { @@ -475,7 +484,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please make sure the remarks exists and is unique. + /// 查找类似 Please make sure the remarks exists and is unique 的本地化字符串。 /// public static string LvPrevProfileTip { get { @@ -484,7 +493,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Remarks. + /// 查找类似 Remarks 的本地化字符串。 /// public static string LvRemarks { get { @@ -493,7 +502,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Type. + /// 查找类似 Type 的本地化字符串。 /// public static string LvServiceType { get { @@ -502,7 +511,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Sort. + /// 查找类似 Sort 的本地化字符串。 /// public static string LvSort { get { @@ -511,7 +520,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Subs group. + /// 查找类似 Subs group 的本地化字符串。 /// public static string LvSubscription { get { @@ -520,7 +529,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Delay(ms). + /// 查找类似 Delay(ms) 的本地化字符串。 /// public static string LvTestDelay { get { @@ -529,7 +538,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Speed(M/s). + /// 查找类似 Speed(M/s) 的本地化字符串。 /// public static string LvTestSpeed { get { @@ -538,7 +547,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to TLS. + /// 查找类似 TLS 的本地化字符串。 /// public static string LvTLS { get { @@ -547,7 +556,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Download traffic today. + /// 查找类似 Download traffic today 的本地化字符串。 /// public static string LvTodayDownloadDataAmount { get { @@ -556,7 +565,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Upload traffic today. + /// 查找类似 Upload traffic today 的本地化字符串。 /// public static string LvTodayUploadDataAmount { get { @@ -565,7 +574,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Total download traffic. + /// 查找类似 Total download traffic 的本地化字符串。 /// public static string LvTotalDownloadDataAmount { get { @@ -574,7 +583,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Total upload traffic. + /// 查找类似 Total upload traffic 的本地化字符串。 /// public static string LvTotalUploadDataAmount { get { @@ -583,7 +592,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Transport. + /// 查找类似 Transport 的本地化字符串。 /// public static string LvTransportProtocol { get { @@ -592,7 +601,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to URL(Optional). + /// 查找类似 URL(Optional) 的本地化字符串。 /// public static string LvUrl { get { @@ -601,7 +610,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to User Agent. + /// 查找类似 User Agent 的本地化字符串。 /// public static string LvUserAgent { get { @@ -610,7 +619,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Add a custom configuration server. + /// 查找类似 Add a custom configuration server 的本地化字符串。 /// public static string menuAddCustomServer { get { @@ -619,7 +628,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Add [Http] server. + /// 查找类似 Add [Http] server 的本地化字符串。 /// public static string menuAddHttpServer { get { @@ -628,7 +637,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Add [Hysteria2] server. + /// 查找类似 Add [Hysteria2] server 的本地化字符串。 /// public static string menuAddHysteria2Server { get { @@ -637,7 +646,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Import bulk URL from clipboard (Ctrl+V). + /// 查找类似 Import bulk URL from clipboard (Ctrl+V) 的本地化字符串。 /// public static string menuAddServerViaClipboard { get { @@ -646,7 +655,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Scan QR code on the screen (Ctrl+S). + /// 查找类似 Scan QR code on the screen (Ctrl+S) 的本地化字符串。 /// public static string menuAddServerViaScan { get { @@ -655,7 +664,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Add [Shadowsocks] server. + /// 查找类似 Add [Shadowsocks] server 的本地化字符串。 /// public static string menuAddShadowsocksServer { get { @@ -664,7 +673,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Add [Socks] server. + /// 查找类似 Add [Socks] server 的本地化字符串。 /// public static string menuAddSocksServer { get { @@ -673,7 +682,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Add [Trojan] server. + /// 查找类似 Add [Trojan] server 的本地化字符串。 /// public static string menuAddTrojanServer { get { @@ -682,7 +691,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Add [Tuic] server. + /// 查找类似 Add [Tuic] server 的本地化字符串。 /// public static string menuAddTuicServer { get { @@ -691,7 +700,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Add [VLESS] server. + /// 查找类似 Add [VLESS] server 的本地化字符串。 /// public static string menuAddVlessServer { get { @@ -700,7 +709,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Add [VMess] server. + /// 查找类似 Add [VMess] server 的本地化字符串。 /// public static string menuAddVmessServer { get { @@ -709,7 +718,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Add [Wireguard] server. + /// 查找类似 Add [Wireguard] server 的本地化字符串。 /// public static string menuAddWireguardServer { get { @@ -718,7 +727,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Check Update. + /// 查找类似 Check Update 的本地化字符串。 /// public static string menuCheckUpdate { get { @@ -727,7 +736,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Clear all service statistics. + /// 查找类似 Clear all service statistics 的本地化字符串。 /// public static string menuClearServerStatistics { get { @@ -736,7 +745,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Close. + /// 查找类似 Close 的本地化字符串。 /// public static string menuClose { get { @@ -745,7 +754,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Clone selected server. + /// 查找类似 Clone selected server 的本地化字符串。 /// public static string menuCopyServer { get { @@ -754,7 +763,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to DNS Settings. + /// 查找类似 DNS Settings 的本地化字符串。 /// public static string menuDNSSetting { get { @@ -763,7 +772,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Edit Server (Ctrl+D). + /// 查找类似 Edit Server (Ctrl+D) 的本地化字符串。 /// public static string menuEditServer { get { @@ -772,7 +781,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Exit. + /// 查找类似 Exit 的本地化字符串。 /// public static string menuExit { get { @@ -781,7 +790,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Export selected server for client configuration. + /// 查找类似 Export selected server for client configuration 的本地化字符串。 /// public static string menuExport2ClientConfig { get { @@ -790,7 +799,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Export share URLs to clipboard (Ctrl+C). + /// 查找类似 Export share URLs to clipboard (Ctrl+C) 的本地化字符串。 /// public static string menuExport2ShareUrl { get { @@ -799,7 +808,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Export subscription (base64) share to clipboard. + /// 查找类似 Export subscription (base64) share to clipboard 的本地化字符串。 /// public static string menuExport2SubContent { get { @@ -808,7 +817,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Global Hotkey Setting. + /// 查找类似 Global Hotkey Setting 的本地化字符串。 /// public static string menuGlobalHotkeySetting { get { @@ -817,7 +826,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Help. + /// 查找类似 Help 的本地化字符串。 /// public static string menuHelp { get { @@ -826,7 +835,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Import old config (guiNConfig). + /// 查找类似 Import old config (guiNConfig) 的本地化字符串。 /// public static string menuImportOldGuiConfig { get { @@ -835,7 +844,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Import Rules From Clipboard. + /// 查找类似 Import Rules From Clipboard 的本地化字符串。 /// public static string menuImportRulesFromClipboard { get { @@ -844,7 +853,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Import Rules From File. + /// 查找类似 Import Rules From File 的本地化字符串。 /// public static string menuImportRulesFromFile { get { @@ -853,7 +862,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Import Rules From Subscription URL. + /// 查找类似 Import Rules From Subscription URL 的本地化字符串。 /// public static string menuImportRulesFromUrl { get { @@ -862,7 +871,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to One-click multi test Latency and speed (Ctrl+E). + /// 查找类似 One-click multi test Latency and speed (Ctrl+E) 的本地化字符串。 /// public static string menuMixedTestServer { get { @@ -871,7 +880,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Move to bottom (B). + /// 查找类似 Move to bottom (B) 的本地化字符串。 /// public static string menuMoveBottom { get { @@ -880,7 +889,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Down (D). + /// 查找类似 Down (D) 的本地化字符串。 /// public static string menuMoveDown { get { @@ -889,7 +898,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Move up and down. + /// 查找类似 Move up and down 的本地化字符串。 /// public static string menuMoveTo { get { @@ -898,7 +907,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Move to group. + /// 查找类似 Move to group 的本地化字符串。 /// public static string menuMoveToGroup { get { @@ -907,7 +916,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Move to top (T). + /// 查找类似 Move to top (T) 的本地化字符串。 /// public static string menuMoveTop { get { @@ -916,7 +925,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Up (U). + /// 查找类似 Up (U) 的本地化字符串。 /// public static string menuMoveUp { get { @@ -925,7 +934,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Clear all. + /// 查找类似 Clear all 的本地化字符串。 /// public static string menuMsgViewClear { get { @@ -934,7 +943,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Copy (Ctrl+C). + /// 查找类似 Copy (Ctrl+C) 的本地化字符串。 /// public static string menuMsgViewCopy { get { @@ -943,7 +952,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Copy all. + /// 查找类似 Copy all 的本地化字符串。 /// public static string menuMsgViewCopyAll { get { @@ -952,7 +961,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Set message filters. + /// 查找类似 Set message filters 的本地化字符串。 /// public static string menuMsgViewFilter { get { @@ -961,7 +970,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Select all (Ctrl+A). + /// 查找类似 Select all (Ctrl+A) 的本地化字符串。 /// public static string menuMsgViewSelectAll { get { @@ -970,7 +979,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Option Setting. + /// 查找类似 Option Setting 的本地化字符串。 /// public static string menuOptionSetting { get { @@ -979,7 +988,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Promotion. + /// 查找类似 Promotion 的本地化字符串。 /// public static string menuPromotion { get { @@ -988,7 +997,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Test servers real delay (Ctrl+R). + /// 查找类似 Test servers real delay (Ctrl+R) 的本地化字符串。 /// public static string menuRealPingServer { get { @@ -997,7 +1006,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Restart as Administrator. + /// 查找类似 Restart as Administrator 的本地化字符串。 /// public static string menuRebootAsAdmin { get { @@ -1006,7 +1015,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Reload. + /// 查找类似 Reload 的本地化字符串。 /// public static string menuReload { get { @@ -1015,7 +1024,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Remove duplicate servers. + /// 查找类似 Remove duplicate servers 的本地化字符串。 /// public static string menuRemoveDuplicateServer { get { @@ -1024,7 +1033,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Remove selected servers (Delete). + /// 查找类似 Remove selected servers (Delete) 的本地化字符串。 /// public static string menuRemoveServer { get { @@ -1033,7 +1042,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Routing. + /// 查找类似 Routing 的本地化字符串。 /// public static string menuRouting { get { @@ -1042,7 +1051,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Advanced Function. + /// 查找类似 Advanced Function 的本地化字符串。 /// public static string menuRoutingAdvanced { get { @@ -1051,7 +1060,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Add. + /// 查找类似 Add 的本地化字符串。 /// public static string menuRoutingAdvancedAdd { get { @@ -1060,7 +1069,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Import Advanced Rules. + /// 查找类似 Import Advanced Rules 的本地化字符串。 /// public static string menuRoutingAdvancedImportRules { get { @@ -1069,7 +1078,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Remove selected (Delete). + /// 查找类似 Remove selected (Delete) 的本地化字符串。 /// public static string menuRoutingAdvancedRemove { get { @@ -1078,7 +1087,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Set as active rule(Enter). + /// 查找类似 Set as active rule(Enter) 的本地化字符串。 /// public static string menuRoutingAdvancedSetDefault { get { @@ -1087,7 +1096,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Basic Function. + /// 查找类似 Basic Function 的本地化字符串。 /// public static string menuRoutingBasic { get { @@ -1096,7 +1105,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Import Basic Rules. + /// 查找类似 Import Basic Rules 的本地化字符串。 /// public static string menuRoutingBasicImportRules { get { @@ -1105,7 +1114,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to RoutingRuleDetailsSetting. + /// 查找类似 RoutingRuleDetailsSetting 的本地化字符串。 /// public static string menuRoutingRuleDetailsSetting { get { @@ -1114,7 +1123,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Rule Settings. + /// 查找类似 Rule Settings 的本地化字符串。 /// public static string menuRoutingRuleSetting { get { @@ -1123,7 +1132,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Routing Setting. + /// 查找类似 Routing Setting 的本地化字符串。 /// public static string menuRoutingSetting { get { @@ -1132,7 +1141,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Add Rule. + /// 查找类似 Add Rule 的本地化字符串。 /// public static string menuRuleAdd { get { @@ -1141,7 +1150,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Export Selected Rules. + /// 查找类似 Export Selected Rules 的本地化字符串。 /// public static string menuRuleExportSelected { get { @@ -1150,7 +1159,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Rule List. + /// 查找类似 Rule List 的本地化字符串。 /// public static string menuRuleList { get { @@ -1159,7 +1168,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Remove Rule (Delete). + /// 查找类似 Remove Rule (Delete) 的本地化字符串。 /// public static string menuRuleRemove { get { @@ -1168,7 +1177,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Select all (Ctrl+A). + /// 查找类似 Select all (Ctrl+A) 的本地化字符串。 /// public static string menuSelectAll { get { @@ -1177,7 +1186,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Servers. + /// 查找类似 Servers 的本地化字符串。 /// public static string menuServers { get { @@ -1186,7 +1195,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Set as active server (Enter). + /// 查找类似 Set as active server (Enter) 的本地化字符串。 /// public static string menuSetDefaultServer { get { @@ -1195,7 +1204,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Settings. + /// 查找类似 Settings 的本地化字符串。 /// public static string menuSetting { get { @@ -1204,7 +1213,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Share Server (Ctrl+F). + /// 查找类似 Share Server (Ctrl+F) 的本地化字符串。 /// public static string menuShareServer { get { @@ -1213,7 +1222,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Sort by test result. + /// 查找类似 Sort by test result 的本地化字符串。 /// public static string menuSortServerResult { get { @@ -1222,7 +1231,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Test servers download speed (Ctrl+T). + /// 查找类似 Test servers download speed (Ctrl+T) 的本地化字符串。 /// public static string menuSpeedServer { get { @@ -1231,7 +1240,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Add. + /// 查找类似 Add 的本地化字符串。 /// public static string menuSubAdd { get { @@ -1240,7 +1249,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Delete. + /// 查找类似 Delete 的本地化字符串。 /// public static string menuSubDelete { get { @@ -1249,7 +1258,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Edit. + /// 查找类似 Edit 的本地化字符串。 /// public static string menuSubEdit { get { @@ -1258,7 +1267,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Update current subscription without proxy. + /// 查找类似 Update current subscription without proxy 的本地化字符串。 /// public static string menuSubGroupUpdate { get { @@ -1267,7 +1276,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Update current subscription with proxy. + /// 查找类似 Update current subscription with proxy 的本地化字符串。 /// public static string menuSubGroupUpdateViaProxy { get { @@ -1276,7 +1285,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Subscription group. + /// 查找类似 Subscription group 的本地化字符串。 /// public static string menuSubscription { get { @@ -1285,7 +1294,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Subscription group settings. + /// 查找类似 Subscription group settings 的本地化字符串。 /// public static string menuSubSetting { get { @@ -1294,7 +1303,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Share. + /// 查找类似 Share 的本地化字符串。 /// public static string menuSubShare { get { @@ -1303,7 +1312,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Update subscription without proxy. + /// 查找类似 Update subscription without proxy 的本地化字符串。 /// public static string menuSubUpdate { get { @@ -1312,7 +1321,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Update subscription with proxy. + /// 查找类似 Update subscription with proxy 的本地化字符串。 /// public static string menuSubUpdateViaProxy { get { @@ -1321,7 +1330,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to System proxy. + /// 查找类似 System proxy 的本地化字符串。 /// public static string menuSystemproxy { get { @@ -1330,7 +1339,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Clear system proxy. + /// 查找类似 Clear system proxy 的本地化字符串。 /// public static string menuSystemProxyClear { get { @@ -1339,7 +1348,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Do not change system proxy. + /// 查找类似 Do not change system proxy 的本地化字符串。 /// public static string menuSystemProxyNothing { get { @@ -1348,7 +1357,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to PAC mode. + /// 查找类似 PAC mode 的本地化字符串。 /// public static string menuSystemProxyPac { get { @@ -1357,7 +1366,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Set system proxy. + /// 查找类似 Set system proxy 的本地化字符串。 /// public static string menuSystemProxySet { get { @@ -1366,7 +1375,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Test servers with tcping (Ctrl+O). + /// 查找类似 Test servers with tcping (Ctrl+O) 的本地化字符串。 /// public static string menuTcpingServer { get { @@ -1375,7 +1384,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Test current service status. + /// 查找类似 Test current service status 的本地化字符串。 /// public static string menuTestMe { get { @@ -1384,7 +1393,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to {0} Website. + /// 查找类似 {0} Website 的本地化字符串。 /// public static string menuWebsiteItem { get { @@ -1393,7 +1402,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Clear original subscription content. + /// 查找类似 Clear original subscription content 的本地化字符串。 /// public static string MsgClearSubscription { get { @@ -1402,7 +1411,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Download GeoFile: {0} successfully. + /// 查找类似 Download GeoFile: {0} successfully 的本地化字符串。 /// public static string MsgDownloadGeoFileSuccessfully { get { @@ -1411,7 +1420,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Download Core successfully. + /// 查找类似 Download Core successfully 的本地化字符串。 /// public static string MsgDownloadV2rayCoreSuccessfully { get { @@ -1420,7 +1429,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Failed to import subscription content. + /// 查找类似 Failed to import subscription content 的本地化字符串。 /// public static string MsgFailedImportSubscription { get { @@ -1429,7 +1438,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Filter, support regular. + /// 查找类似 Filter, support regular 的本地化字符串。 /// public static string MsgFilterTitle { get { @@ -1438,7 +1447,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Get subscription content successfully. + /// 查找类似 Get subscription content successfully 的本地化字符串。 /// public static string MsgGetSubscriptionSuccessfully { get { @@ -1447,7 +1456,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Information. + /// 查找类似 Information 的本地化字符串。 /// public static string MsgInformationTitle { get { @@ -1456,7 +1465,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in the URL. + /// 查找类似 Please fill in the URL 的本地化字符串。 /// public static string MsgNeedUrl { get { @@ -1465,7 +1474,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to No valid subscriptions set. + /// 查找类似 No valid subscriptions set 的本地化字符串。 /// public static string MsgNoValidSubscription { get { @@ -1474,7 +1483,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Resolve {0} successfully. + /// 查找类似 Resolve {0} successfully 的本地化字符串。 /// public static string MsgParsingSuccessfully { get { @@ -1483,7 +1492,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Servers Filter, press Enter to execute. + /// 查找类似 Servers Filter, press Enter to execute 的本地化字符串。 /// public static string MsgServerTitle { get { @@ -1492,7 +1501,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Updates are not enabled, skip this subscription. + /// 查找类似 Updates are not enabled, skip this subscription 的本地化字符串。 /// public static string MsgSkipSubscriptionUpdate { get { @@ -1501,7 +1510,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Start getting subscriptions. + /// 查找类似 Start getting subscriptions 的本地化字符串。 /// public static string MsgStartGettingSubscriptions { get { @@ -1510,7 +1519,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Start updating {0}.... + /// 查找类似 Start updating {0}... 的本地化字符串。 /// public static string MsgStartUpdating { get { @@ -1519,7 +1528,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Invalid subscription content. + /// 查找类似 Invalid subscription content 的本地化字符串。 /// public static string MsgSubscriptionDecodingFailed { get { @@ -1528,7 +1537,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Is unpacking....... + /// 查找类似 Is unpacking...... 的本地化字符串。 /// public static string MsgUnpacking { get { @@ -1537,7 +1546,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Update subscription end. + /// 查找类似 Update subscription end 的本地化字符串。 /// public static string MsgUpdateSubscriptionEnd { get { @@ -1546,7 +1555,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Update subscription starts. + /// 查找类似 Update subscription starts 的本地化字符串。 /// public static string MsgUpdateSubscriptionStart { get { @@ -1555,7 +1564,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Update Core successfully. + /// 查找类似 Update Core successfully 的本地化字符串。 /// public static string MsgUpdateV2rayCoreSuccessfully { get { @@ -1564,7 +1573,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Update Core successfully! Restarting service.... + /// 查找类似 Update Core successfully! Restarting service... 的本地化字符串。 /// public static string MsgUpdateV2rayCoreSuccessfullyMore { get { @@ -1573,7 +1582,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Non-VMess or ss protocol. + /// 查找类似 Non-VMess or ss protocol 的本地化字符串。 /// public static string NonvmessOrssProtocol { get { @@ -1582,7 +1591,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Non-standard service, this feature is invalid. + /// 查找类似 Non-standard service, this feature is invalid 的本地化字符串。 /// public static string NonVmessService { get { @@ -1591,7 +1600,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to The Core file (file name: {1}) was not found under the folder ({0}), please download and put it in the folder, download address: {2}. + /// 查找类似 The Core file (file name: {1}) was not found under the folder ({0}), please download and put it in the folder, download address: {2} 的本地化字符串。 /// public static string NotFoundCore { get { @@ -1600,7 +1609,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Not run as Admin. + /// 查找类似 Not run as Admin 的本地化字符串。 /// public static string NotRunAsAdmin { get { @@ -1609,7 +1618,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Scan completed, no valid QR code found. + /// 查找类似 Scan completed, no valid QR code found 的本地化字符串。 /// public static string NoValidQRcodeFound { get { @@ -1618,7 +1627,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Operation failed, please check and retry. + /// 查找类似 Operation failed, please check and retry 的本地化字符串。 /// public static string OperationFailed { get { @@ -1627,7 +1636,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Operation success. + /// 查找类似 Operation success 的本地化字符串。 /// public static string OperationSuccess { get { @@ -1636,7 +1645,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please Fill Remarks. + /// 查找类似 Please Fill Remarks 的本地化字符串。 /// public static string PleaseFillRemarks { get { @@ -1645,7 +1654,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please select the encryption method. + /// 查找类似 Please select the encryption method 的本地化字符串。 /// public static string PleaseSelectEncryption { get { @@ -1654,7 +1663,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please select a protocol. + /// 查找类似 Please select a protocol 的本地化字符串。 /// public static string PleaseSelectProtocol { get { @@ -1663,7 +1672,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please select rules. + /// 查找类似 Please select rules 的本地化字符串。 /// public static string PleaseSelectRules { get { @@ -1672,7 +1681,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please select the server first. + /// 查找类似 Please select the server first 的本地化字符串。 /// public static string PleaseSelectServer { get { @@ -1681,7 +1690,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Global hotkey {0} registered failed, reason {1}. + /// 查找类似 Global hotkey {0} registered failed, reason {1} 的本地化字符串。 /// public static string RegisterGlobalHotkeyFailed { get { @@ -1690,7 +1699,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Global hotkey {0} registered successfully. + /// 查找类似 Global hotkey {0} registered successfully 的本地化字符串。 /// public static string RegisterGlobalHotkeySuccessfully { get { @@ -1699,7 +1708,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Servers deduplication completed. Old: {0}, New: {1}.. + /// 查找类似 Servers deduplication completed. Old: {0}, New: {1}. 的本地化字符串。 /// public static string RemoveDuplicateServerResult { get { @@ -1708,7 +1717,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Are you sure to remove the rules?. + /// 查找类似 Are you sure to remove the rules? 的本地化字符串。 /// public static string RemoveRules { get { @@ -1717,7 +1726,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Are you sure to remove the server?. + /// 查找类似 Are you sure to remove the server? 的本地化字符串。 /// public static string RemoveServer { get { @@ -1726,7 +1735,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to {0},One of the required.. + /// 查找类似 {0},One of the required. 的本地化字符串。 /// public static string RoutingRuleDetailRequiredTips { get { @@ -1735,7 +1744,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Run as Admin. + /// 查找类似 Run as Admin 的本地化字符串。 /// public static string RunAsAdmin { get { @@ -1744,7 +1753,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to The client configuration file is saved at: {0}. + /// 查找类似 The client configuration file is saved at: {0} 的本地化字符串。 /// public static string SaveClientConfigurationIn { get { @@ -1753,7 +1762,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to {0} : {1}/s↑ | {2}/s↓. + /// 查找类似 {0} : {1}/s↑ | {2}/s↓ 的本地化字符串。 /// public static string SpeedDisplayText { get { @@ -1762,7 +1771,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Testing.... + /// 查找类似 Testing... 的本地化字符串。 /// public static string Speedtesting { get { @@ -1771,7 +1780,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Test completed. + /// 查找类似 Test completed 的本地化字符串。 /// public static string SpeedtestingCompleted { get { @@ -1780,7 +1789,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Skip test. + /// 查找类似 Skip test 的本地化字符串。 /// public static string SpeedtestingSkip { get { @@ -1789,7 +1798,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Test terminating.... + /// 查找类似 Test terminating... 的本地化字符串。 /// public static string SpeedtestingStop { get { @@ -1798,7 +1807,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Waiting for testing (press ESC to terminate).... + /// 查找类似 Waiting for testing (press ESC to terminate)... 的本地化字符串。 /// public static string SpeedtestingWait { get { @@ -1807,7 +1816,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Start service ({0}).... + /// 查找类似 Start service ({0})... 的本地化字符串。 /// public static string StartService { get { @@ -1816,7 +1825,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Group please leave blank here. + /// 查找类似 Group please leave blank here 的本地化字符串。 /// public static string SubUrlTips { get { @@ -1825,8 +1834,8 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Configuration successful - ///{0}. + /// 查找类似 Configuration successful + ///{0} 的本地化字符串。 /// public static string SuccessfulConfiguration { get { @@ -1835,7 +1844,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Custom configuration server imported successfully. + /// 查找类似 Custom configuration server imported successfully 的本地化字符串。 /// public static string SuccessfullyImportedCustomServer { get { @@ -1844,7 +1853,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to {0} servers have been imported from clipboard. + /// 查找类似 {0} servers have been imported from clipboard 的本地化字符串。 /// public static string SuccessfullyImportedServerViaClipboard { get { @@ -1853,7 +1862,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Scan import URL successfully. + /// 查找类似 Scan import URL successfully 的本地化字符串。 /// public static string SuccessfullyImportedServerViaScan { get { @@ -1862,7 +1871,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to System proxy. + /// 查找类似 System proxy 的本地化字符串。 /// public static string SystemProxy { get { @@ -1871,7 +1880,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Address. + /// 查找类似 Address 的本地化字符串。 /// public static string TbAddress { get { @@ -1880,7 +1889,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to AllowInsecure. + /// 查找类似 AllowInsecure 的本地化字符串。 /// public static string TbAllowInsecure { get { @@ -1889,7 +1898,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to ALPN. + /// 查找类似 ALPN 的本地化字符串。 /// public static string TbAlpn { get { @@ -1898,7 +1907,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to AlterID. + /// 查找类似 AlterID 的本地化字符串。 /// public static string TbAlterId { get { @@ -1907,7 +1916,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to AutoRefresh. + /// 查找类似 AutoRefresh 的本地化字符串。 /// public static string TbAutoRefresh { get { @@ -1916,7 +1925,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Auto ScrollToEnd. + /// 查找类似 Auto ScrollToEnd 的本地化字符串。 /// public static string TbAutoScrollToEnd { get { @@ -1925,7 +1934,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Domain, ip, process are auto sorted when saving. + /// 查找类似 Domain, ip, process are auto sorted when saving 的本地化字符串。 /// public static string TbAutoSort { get { @@ -1934,7 +1943,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Browse. + /// 查找类似 Browse 的本地化字符串。 /// public static string TbBrowse { get { @@ -1943,7 +1952,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Cancel. + /// 查找类似 Cancel 的本地化字符串。 /// public static string TbCancel { get { @@ -1952,7 +1961,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Clear system proxy. + /// 查找类似 Clear system proxy 的本地化字符串。 /// public static string TbClearSystemProxy { get { @@ -1961,7 +1970,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Confirm. + /// 查找类似 Confirm 的本地化字符串。 /// public static string TbConfirm { get { @@ -1970,7 +1979,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Core Type. + /// 查找类似 Core Type 的本地化字符串。 /// public static string TbCoreType { get { @@ -1979,7 +1988,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Display GUI. + /// 查找类似 Display GUI 的本地化字符串。 /// public static string TbDisplayGUI { get { @@ -1988,7 +1997,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Display Log. + /// 查找类似 Display Log 的本地化字符串。 /// public static string TbDisplayLog { get { @@ -1997,7 +2006,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Support DnsObject, Click to view the document. + /// 查找类似 Support DnsObject, Click to view the document 的本地化字符串。 /// public static string TbDnsObjectDoc { get { @@ -2006,7 +2015,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please fill in DNS Structure, Click to view the document. + /// 查找类似 Please fill in DNS Structure, Click to view the document 的本地化字符串。 /// public static string TbDnsSingboxObjectDoc { get { @@ -2015,7 +2024,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Domain Matcher. + /// 查找类似 Domain Matcher 的本地化字符串。 /// public static string TbdomainMatcher { get { @@ -2024,7 +2033,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Domain strategy. + /// 查找类似 Domain strategy 的本地化字符串。 /// public static string TbdomainStrategy { get { @@ -2033,7 +2042,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to sing-box domain strategy. + /// 查找类似 sing-box domain strategy 的本地化字符串。 /// public static string TbdomainStrategy4Singbox { get { @@ -2042,7 +2051,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Edit. + /// 查找类似 Edit 的本地化字符串。 /// public static string TbEdit { get { @@ -2051,7 +2060,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Enable advanced function. + /// 查找类似 Enable advanced function 的本地化字符串。 /// public static string TbenableRoutingAdvanced { get { @@ -2060,7 +2069,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Enable Tun. + /// 查找类似 Enable Tun 的本地化字符串。 /// public static string TbEnableTunAs { get { @@ -2069,7 +2078,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Fingerprint. + /// 查找类似 Fingerprint 的本地化字符串。 /// public static string TbFingerprint { get { @@ -2078,7 +2087,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Flow. + /// 查找类似 Flow 的本地化字符串。 /// public static string TbFlow5 { get { @@ -2087,7 +2096,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Global Hotkey Settings. + /// 查找类似 Global Hotkey Settings 的本地化字符串。 /// public static string TbGlobalHotkeySetting { get { @@ -2096,7 +2105,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Set directly by pressing the keyboard, take effect after restart. + /// 查找类似 Set directly by pressing the keyboard, take effect after restart 的本地化字符串。 /// public static string TbGlobalHotkeySettingTip { get { @@ -2105,7 +2114,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Generate. + /// 查找类似 Generate 的本地化字符串。 /// public static string TbGUID { get { @@ -2114,7 +2123,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Camouflage type. + /// 查找类似 Camouflage type 的本地化字符串。 /// public static string TbHeaderType { get { @@ -2123,7 +2132,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Congestion control. + /// 查找类似 Congestion control 的本地化字符串。 /// public static string TbHeaderType8 { get { @@ -2132,7 +2141,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to UUID(id). + /// 查找类似 UUID(id) 的本地化字符串。 /// public static string TbId { get { @@ -2141,7 +2150,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Password. + /// 查找类似 Password 的本地化字符串。 /// public static string TbId3 { get { @@ -2150,7 +2159,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Password(Optional). + /// 查找类似 Password(Optional) 的本地化字符串。 /// public static string TbId4 { get { @@ -2159,7 +2168,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to UUID(id). + /// 查找类似 UUID(id) 的本地化字符串。 /// public static string TbId5 { get { @@ -2168,7 +2177,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Address(Ip,Ipv6). + /// 查找类似 Address(Ip,Ipv6) 的本地化字符串。 /// public static string TbLocalAddress { get { @@ -2177,7 +2186,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Transport protocol(network). + /// 查找类似 Transport protocol(network) 的本地化字符串。 /// public static string TbNetwork { get { @@ -2186,7 +2195,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Do not change system proxy. + /// 查找类似 Do not change system proxy 的本地化字符串。 /// public static string TbNotChangeSystemProxy { get { @@ -2195,7 +2204,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Path. + /// 查找类似 Path 的本地化字符串。 /// public static string TbPath { get { @@ -2204,7 +2213,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to obfs password. + /// 查找类似 obfs password 的本地化字符串。 /// public static string TbPath7 { get { @@ -2213,7 +2222,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Port. + /// 查找类似 Port 的本地化字符串。 /// public static string TbPort { get { @@ -2222,7 +2231,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to txtPreSocksPort. + /// 查找类似 txtPreSocksPort 的本地化字符串。 /// public static string TbPreSocksPort { get { @@ -2231,7 +2240,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to PrivateKey. + /// 查找类似 PrivateKey 的本地化字符串。 /// public static string TbPrivateKey { get { @@ -2240,7 +2249,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to PublicKey. + /// 查找类似 PublicKey 的本地化字符串。 /// public static string TbPublicKey { get { @@ -2249,7 +2258,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Alias (remarks). + /// 查找类似 Alias (remarks) 的本地化字符串。 /// public static string TbRemarks { get { @@ -2258,7 +2267,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Camouflage domain(host). + /// 查找类似 Camouflage domain(host) 的本地化字符串。 /// public static string TbRequestHost { get { @@ -2267,7 +2276,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Reserved(2,3,4). + /// 查找类似 Reserved(2,3,4) 的本地化字符串。 /// public static string TbReserved { get { @@ -2276,7 +2285,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Reset. + /// 查找类似 Reset 的本地化字符串。 /// public static string TbReset { get { @@ -2285,7 +2294,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Domain. + /// 查找类似 Domain 的本地化字符串。 /// public static string TbRoutingRuleDomain { get { @@ -2294,7 +2303,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to IP or IP CIDR. + /// 查找类似 IP or IP CIDR 的本地化字符串。 /// public static string TbRoutingRuleIP { get { @@ -2303,7 +2312,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Full process name (Tun mode). + /// 查找类似 Full process name (Tun mode) 的本地化字符串。 /// public static string TbRoutingRuleProcess { get { @@ -2312,7 +2321,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to 3.Block Domain or IP. + /// 查找类似 3.Block Domain or IP 的本地化字符串。 /// public static string TbRoutingTabBlock { get { @@ -2321,7 +2330,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to 2.Direct Domain or IP. + /// 查找类似 2.Direct Domain or IP 的本地化字符串。 /// public static string TbRoutingTabDirect { get { @@ -2330,7 +2339,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to 1.Proxy Domain or IP. + /// 查找类似 1.Proxy Domain or IP 的本地化字符串。 /// public static string TbRoutingTabProxy { get { @@ -2339,7 +2348,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Pre-defined Rule Set List. + /// 查找类似 Pre-defined Rule Set List 的本地化字符串。 /// public static string TbRoutingTabRuleList { get { @@ -2348,7 +2357,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA>. + /// 查找类似 *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> 的本地化字符串。 /// public static string TbRoutingTips { get { @@ -2357,7 +2366,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to (Domain or IP or ProcName) and Port and Protocol and InboundTag => OutboundTag. + /// 查找类似 (Domain or IP or ProcName) and Port and Protocol and InboundTag => OutboundTag 的本地化字符串。 /// public static string TbRuleMatchingTips { get { @@ -2366,7 +2375,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Ruleobject Doc. + /// 查找类似 Ruleobject Doc 的本地化字符串。 /// public static string TbRuleobjectDoc { get { @@ -2375,7 +2384,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Encryption method (security). + /// 查找类似 Encryption method (security) 的本地化字符串。 /// public static string TbSecurity { get { @@ -2384,7 +2393,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Encryption. + /// 查找类似 Encryption 的本地化字符串。 /// public static string TbSecurity3 { get { @@ -2393,7 +2402,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to User(Optional). + /// 查找类似 User(Optional) 的本地化字符串。 /// public static string TbSecurity4 { get { @@ -2402,7 +2411,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Encryption. + /// 查找类似 Encryption 的本地化字符串。 /// public static string TbSecurity5 { get { @@ -2411,7 +2420,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Set system proxy. + /// 查找类似 Set system proxy 的本地化字符串。 /// public static string TbSetSystemProxy { get { @@ -2420,7 +2429,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Click to import default DNS config. + /// 查找类似 Click to import default DNS config 的本地化字符串。 /// public static string TbSettingDnsImportDefConfig { get { @@ -2429,7 +2438,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Advanced proxy settings, protocol selection (optional). + /// 查找类似 Advanced proxy settings, protocol selection (optional) 的本地化字符串。 /// public static string TbSettingsAdvancedProtocol { get { @@ -2438,7 +2447,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Allow connections from the LAN. + /// 查找类似 Allow connections from the LAN 的本地化字符串。 /// public static string TbSettingsAllowLAN { get { @@ -2447,7 +2456,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Auto hide startup. + /// 查找类似 Auto hide startup 的本地化字符串。 /// public static string TbSettingsAutoHideStartup { get { @@ -2456,7 +2465,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Automatic update interval of Geo (hours). + /// 查找类似 Automatic update interval of Geo (hours) 的本地化字符串。 /// public static string TbSettingsAutoUpdateInterval { get { @@ -2465,7 +2474,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Color. + /// 查找类似 Color 的本地化字符串。 /// public static string TbSettingsColor { get { @@ -2474,7 +2483,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Dark Mode. + /// 查找类似 Dark Mode 的本地化字符串。 /// public static string TbSettingsColorMode { get { @@ -2483,7 +2492,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Core: basic settings. + /// 查找类似 Core: basic settings 的本地化字符串。 /// public static string TbSettingsCore { get { @@ -2492,7 +2501,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to V2ray DNS settings. + /// 查找类似 V2ray DNS settings 的本地化字符串。 /// public static string TbSettingsCoreDns { get { @@ -2501,7 +2510,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to sing-box DNS settings. + /// 查找类似 sing-box DNS settings 的本地化字符串。 /// public static string TbSettingsCoreDnsSingbox { get { @@ -2510,7 +2519,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Core: KCP settings. + /// 查找类似 Core: KCP settings 的本地化字符串。 /// public static string TbSettingsCoreKcp { get { @@ -2519,7 +2528,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to CoreType settings. + /// 查找类似 CoreType settings 的本地化字符串。 /// public static string TbSettingsCoreType { get { @@ -2528,7 +2537,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to FontFamily(Require restart). + /// 查找类似 FontFamily(Require restart) 的本地化字符串。 /// public static string TbSettingsCurrentFontFamily { get { @@ -2537,7 +2546,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Copy the font TTF/TTC file to the directory guiFonts, restart the settings. + /// 查找类似 Copy the font TTF/TTC file to the directory guiFonts, restart the settings 的本地化字符串。 /// public static string TbSettingsCurrentFontFamilyTip { get { @@ -2546,7 +2555,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to AllowInsecure. + /// 查找类似 AllowInsecure 的本地化字符串。 /// public static string TbSettingsDefAllowInsecure { get { @@ -2555,7 +2564,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Default TLS fingerprint. + /// 查找类似 Default TLS fingerprint 的本地化字符串。 /// public static string TbSettingsDefFingerprint { get { @@ -2564,7 +2573,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to User-Agent. + /// 查找类似 User-Agent 的本地化字符串。 /// public static string TbSettingsDefUserAgent { get { @@ -2573,7 +2582,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to This parameter is valid only for tcp/http and ws. + /// 查找类似 This parameter is valid only for tcp/http and ws 的本地化字符串。 /// public static string TbSettingsDefUserAgentTips { get { @@ -2582,7 +2591,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Outbound Freedom domainStrategy. + /// 查找类似 Outbound Freedom domainStrategy 的本地化字符串。 /// public static string TbSettingsDomainStrategy4Freedom { get { @@ -2591,7 +2600,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Double-click server make active. + /// 查找类似 Double-click server make active 的本地化字符串。 /// public static string TbSettingsDoubleClick2Activate { get { @@ -2600,7 +2609,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Automatically adjust column width after updating subscription. + /// 查找类似 Automatically adjust column width after updating subscription 的本地化字符串。 /// public static string TbSettingsEnableAutoAdjustMainLvColWidth { get { @@ -2609,7 +2618,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Enable cache file for sing-box (ruleset files). + /// 查找类似 Enable cache file for sing-box (ruleset files) 的本地化字符串。 /// public static string TbSettingsEnableCacheFile4Sbox { get { @@ -2618,7 +2627,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Check for pre-release updates. + /// 查找类似 Check for pre-release updates 的本地化字符串。 /// public static string TbSettingsEnableCheckPreReleaseUpdate { get { @@ -2627,7 +2636,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Enable Server Drag Drop Sort(Require restart). + /// 查找类似 Enable Server Drag Drop Sort(Require restart) 的本地化字符串。 /// public static string TbSettingsEnableDragDropSort { get { @@ -2636,7 +2645,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Enable additional Inbound. + /// 查找类似 Enable additional Inbound 的本地化字符串。 /// public static string TbSettingsEnableExInbound { get { @@ -2645,7 +2654,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Enable fragment. + /// 查找类似 Enable fragment 的本地化字符串。 /// public static string TbSettingsEnableFragment { get { @@ -2654,7 +2663,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Use Xray and enable non-Tun mode, which conflicts with the group previous proxy. + /// 查找类似 Use Xray and enable non-Tun mode, which conflicts with the group previous proxy 的本地化字符串。 /// public static string TbSettingsEnableFragmentTips { get { @@ -2663,7 +2672,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Enable hardware acceleration(Require restart). + /// 查找类似 Enable hardware acceleration(Require restart) 的本地化字符串。 /// public static string TbSettingsEnableHWA { get { @@ -2672,7 +2681,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Enable IPv6 Address. + /// 查找类似 Enable IPv6 Address 的本地化字符串。 /// public static string TbSettingsEnableIPv6Address { get { @@ -2681,7 +2690,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Updating subscription, only determine remarks exists. + /// 查找类似 Updating subscription, only determine remarks exists 的本地化字符串。 /// public static string TbSettingsEnableUpdateSubOnlyRemarksExist { get { @@ -2690,7 +2699,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Exception. + /// 查找类似 Exception 的本地化字符串。 /// public static string TbSettingsException { get { @@ -2699,7 +2708,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Exception. Do not use proxy server for addresses beginning with,Use semicolon (;). + /// 查找类似 Exception. Do not use proxy server for addresses beginning with,Use semicolon (;) 的本地化字符串。 /// public static string TbSettingsExceptionTip { get { @@ -2708,7 +2717,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Follow System Theme. + /// 查找类似 Follow System Theme 的本地化字符串。 /// public static string TbSettingsFollowSystemTheme { get { @@ -2717,7 +2726,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Font Size. + /// 查找类似 Font Size 的本地化字符串。 /// public static string TbSettingsFontSize { get { @@ -2726,7 +2735,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to HTTP Port. + /// 查找类似 HTTP Port 的本地化字符串。 /// public static string TbSettingsHttpPort { get { @@ -2735,7 +2744,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Hysteria Max bandwidth (Up/Dw). + /// 查找类似 Hysteria Max bandwidth (Up/Dw) 的本地化字符串。 /// public static string TbSettingsHysteriaBandwidth { get { @@ -2744,7 +2753,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Ignore Geo files when updating core. + /// 查找类似 Ignore Geo files when updating core 的本地化字符串。 /// public static string TbSettingsIgnoreGeoUpdateCore { get { @@ -2753,7 +2762,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Keep older when deduplication. + /// 查找类似 Keep older when deduplication 的本地化字符串。 /// public static string TbSettingsKeepOlderDedupl { get { @@ -2762,7 +2771,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Language (Restart). + /// 查找类似 Language (Restart) 的本地化字符串。 /// public static string TbSettingsLanguage { get { @@ -2771,7 +2780,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Enable Log. + /// 查找类似 Enable Log 的本地化字符串。 /// public static string TbSettingsLogEnabled { get { @@ -2780,7 +2789,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Enable logging to file. + /// 查找类似 Enable logging to file 的本地化字符串。 /// public static string TbSettingsLogEnabledToFile { get { @@ -2789,7 +2798,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Log Level. + /// 查找类似 Log Level 的本地化字符串。 /// public static string TbSettingsLogLevel { get { @@ -2798,7 +2807,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to sing-box Mux Protocol. + /// 查找类似 sing-box Mux Protocol 的本地化字符串。 /// public static string TbSettingsMux4SboxProtocol { get { @@ -2807,7 +2816,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Turn on Mux Multiplexing. + /// 查找类似 Turn on Mux Multiplexing 的本地化字符串。 /// public static string TbSettingsMuxEnabled { get { @@ -2816,7 +2825,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to v2rayN settings. + /// 查找类似 v2rayN settings 的本地化字符串。 /// public static string TbSettingsN { get { @@ -2825,7 +2834,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to New Port for LAN. + /// 查找类似 New Port for LAN 的本地化字符串。 /// public static string TbSettingsNewPort4LAN { get { @@ -2834,7 +2843,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Auth pass. + /// 查找类似 Auth pass 的本地化字符串。 /// public static string TbSettingsPass { get { @@ -2843,7 +2852,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Custom DNS (multiple, separated by commas (,)). + /// 查找类似 Custom DNS (multiple, separated by commas (,)) 的本地化字符串。 /// public static string TbSettingsRemoteDNS { get { @@ -2852,7 +2861,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to RouteOnly. + /// 查找类似 RouteOnly 的本地化字符串。 /// public static string TbSettingsRouteOnly { get { @@ -2861,7 +2870,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Set Win10 UWP Loopback. + /// 查找类似 Set Win10 UWP Loopback 的本地化字符串。 /// public static string TbSettingsSetUWP { get { @@ -2870,7 +2879,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Turn on Sniffing. + /// 查找类似 Turn on Sniffing 的本地化字符串。 /// public static string TbSettingsSniffingEnabled { get { @@ -2879,7 +2888,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to SOCKS Port. + /// 查找类似 SOCKS Port 的本地化字符串。 /// public static string TbSettingsSocksPort { get { @@ -2888,7 +2897,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to HTTP port=SOCKS port+1;Pac port=SOCKS port+4;API port=SOCKS port+5;. + /// 查找类似 HTTP port=SOCKS port+1;Pac port=SOCKS port+4;API port=SOCKS port+5; 的本地化字符串。 /// public static string TbSettingsSocksPortTip { get { @@ -2897,7 +2906,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Speed Ping Test URL. + /// 查找类似 Speed Ping Test URL 的本地化字符串。 /// public static string TbSettingsSpeedPingTestUrl { get { @@ -2906,7 +2915,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to SpeedTest Single Timeout Value. + /// 查找类似 SpeedTest Single Timeout Value 的本地化字符串。 /// public static string TbSettingsSpeedTestTimeout { get { @@ -2915,7 +2924,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to SpeedTest URL. + /// 查找类似 SpeedTest URL 的本地化字符串。 /// public static string TbSettingsSpeedTestUrl { get { @@ -2924,7 +2933,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Start on boot. + /// 查找类似 Start on boot 的本地化字符串。 /// public static string TbSettingsStartBoot { get { @@ -2933,7 +2942,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Set this with admin privileges, get admin privileges after startup. + /// 查找类似 Set this with admin privileges, get admin privileges after startup 的本地化字符串。 /// public static string TbSettingsStartBootTip { get { @@ -2942,7 +2951,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Enable Statistics (Require restart). + /// 查找类似 Enable Statistics (Require restart) 的本地化字符串。 /// public static string TbSettingsStatistics { get { @@ -2951,7 +2960,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Subscription conversion URL. + /// 查找类似 Subscription conversion URL 的本地化字符串。 /// public static string TbSettingsSubConvert { get { @@ -2960,7 +2969,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to System proxy settings. + /// 查找类似 System proxy settings 的本地化字符串。 /// public static string TbSettingsSystemproxy { get { @@ -2969,7 +2978,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Enable Security Protocol TLS v1.3 (subscription/update). + /// 查找类似 Enable Security Protocol TLS v1.3 (subscription/update) 的本地化字符串。 /// public static string TbSettingsTLS13 { get { @@ -2978,7 +2987,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Tray right-click menu servers display limit. + /// 查找类似 Tray right-click menu servers display limit 的本地化字符串。 /// public static string TbSettingsTrayMenuServersLimit { get { @@ -2987,7 +2996,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to TunMode settings. + /// 查找类似 TunMode settings 的本地化字符串。 /// public static string TbSettingsTunMode { get { @@ -2996,7 +3005,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Bypass Mode. + /// 查找类似 Bypass Mode 的本地化字符串。 /// public static string TbSettingsTunModeBypassMode { get { @@ -3005,7 +3014,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Custom Template. + /// 查找类似 Custom Template 的本地化字符串。 /// public static string TbSettingsTunModeCustomTemplate { get { @@ -3014,7 +3023,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Direct IP CIDR, separated by commas (,). + /// 查找类似 Direct IP CIDR, separated by commas (,) 的本地化字符串。 /// public static string TbSettingsTunModeDirectIP { get { @@ -3023,7 +3032,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Direct Process name, separated by commas (,). + /// 查找类似 Direct Process name, separated by commas (,) 的本地化字符串。 /// public static string TbSettingsTunModeDirectProcess { get { @@ -3032,7 +3041,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to DNS object, e.g. {"servers":[]}. + /// 查找类似 DNS object, e.g. {"servers":[]} 的本地化字符串。 /// public static string TbSettingsTunModeDNS { get { @@ -3041,7 +3050,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Proxy IP CIDR, separated by commas (,). + /// 查找类似 Proxy IP CIDR, separated by commas (,) 的本地化字符串。 /// public static string TbSettingsTunModeProxyIP { get { @@ -3050,7 +3059,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Proxy Process name, separated by commas (,). + /// 查找类似 Proxy Process name, separated by commas (,) 的本地化字符串。 /// public static string TbSettingsTunModeProxyProcess { get { @@ -3059,7 +3068,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Show console. + /// 查找类似 Show console 的本地化字符串。 /// public static string TbSettingsTunModeShowWindow { get { @@ -3068,7 +3077,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Enable UDP. + /// 查找类似 Enable UDP 的本地化字符串。 /// public static string TbSettingsUdpEnabled { get { @@ -3077,7 +3086,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Auth user. + /// 查找类似 Auth user 的本地化字符串。 /// public static string TbSettingsUser { get { @@ -3086,7 +3095,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Use System Hosts. + /// 查找类似 Use System Hosts 的本地化字符串。 /// public static string TbSettingsUseSystemHosts { get { @@ -3095,7 +3104,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to ShortId. + /// 查找类似 ShortId 的本地化字符串。 /// public static string TbShortId { get { @@ -3104,7 +3113,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to SNI. + /// 查找类似 SNI 的本地化字符串。 /// public static string TbSNI { get { @@ -3113,7 +3122,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to SpiderX. + /// 查找类似 SpiderX 的本地化字符串。 /// public static string TbSpiderX { get { @@ -3122,7 +3131,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to TLS. + /// 查找类似 TLS 的本地化字符串。 /// public static string TbStreamSecurity { get { @@ -3131,7 +3140,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to PAC mode. + /// 查找类似 PAC mode 的本地化字符串。 /// public static string TbSystemProxyPac { get { @@ -3140,7 +3149,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to The ping of current service: {0} ms. + /// 查找类似 The ping of current service: {0} ms 的本地化字符串。 /// public static string TestMeOutput { get { @@ -3149,7 +3158,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Routing setting is changed. + /// 查找类似 Routing setting is changed 的本地化字符串。 /// public static string TipChangeRouting { get { @@ -3158,7 +3167,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to System proxy setting is changed. + /// 查找类似 System proxy setting is changed 的本地化字符串。 /// public static string TipChangeSystemProxy { get { @@ -3167,7 +3176,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Please turn off when there is an abnormal disconnection. + /// 查找类似 Please turn off when there is an abnormal disconnection 的本地化字符串。 /// public static string TipDisplayLog { get { @@ -3176,7 +3185,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *Default value tcp. + /// 查找类似 *Default value tcp 的本地化字符串。 /// public static string TipNetwork { get { @@ -3185,7 +3194,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to * After setting this value, an socks service will be started using Xray/sing-box(Tun) to provide functions such as speed display. + /// 查找类似 * After setting this value, an socks service will be started using Xray/sing-box(Tun) to provide functions such as speed display 的本地化字符串。 /// public static string TipPreSocksPort { get { @@ -3194,7 +3203,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Too many servers, please open the main interface. + /// 查找类似 Too many servers, please open the main interface 的本地化字符串。 /// public static string TooManyServersTip { get { @@ -3203,7 +3212,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *tcp camouflage type. + /// 查找类似 *tcp camouflage type 的本地化字符串。 /// public static string TransportHeaderTypeTip1 { get { @@ -3212,7 +3221,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *kcp camouflage type. + /// 查找类似 *kcp camouflage type 的本地化字符串。 /// public static string TransportHeaderTypeTip2 { get { @@ -3221,7 +3230,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *QUIC camouflage type. + /// 查找类似 *QUIC camouflage type 的本地化字符串。 /// public static string TransportHeaderTypeTip3 { get { @@ -3230,7 +3239,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *grpc mode. + /// 查找类似 *grpc mode 的本地化字符串。 /// public static string TransportHeaderTypeTip4 { get { @@ -3239,7 +3248,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *ws/httpupgrade path. + /// 查找类似 *ws/httpupgrade path 的本地化字符串。 /// public static string TransportPathTip1 { get { @@ -3248,7 +3257,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *h2 path. + /// 查找类似 *h2 path 的本地化字符串。 /// public static string TransportPathTip2 { get { @@ -3257,7 +3266,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *QUIC key/KCP seed. + /// 查找类似 *QUIC key/KCP seed 的本地化字符串。 /// public static string TransportPathTip3 { get { @@ -3266,7 +3275,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *grpc serviceName. + /// 查找类似 *grpc serviceName 的本地化字符串。 /// public static string TransportPathTip4 { get { @@ -3275,7 +3284,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *kcp seed. + /// 查找类似 *kcp seed 的本地化字符串。 /// public static string TransportPathTip5 { get { @@ -3284,7 +3293,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *http host Separated by commas (,). + /// 查找类似 *http host Separated by commas (,) 的本地化字符串。 /// public static string TransportRequestHostTip1 { get { @@ -3293,7 +3302,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *ws/httpupgrade host. + /// 查找类似 *ws/httpupgrade host 的本地化字符串。 /// public static string TransportRequestHostTip2 { get { @@ -3302,7 +3311,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *h2 host Separated by commas (,). + /// 查找类似 *h2 host Separated by commas (,) 的本地化字符串。 /// public static string TransportRequestHostTip3 { get { @@ -3311,7 +3320,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *QUIC security. + /// 查找类似 *QUIC security 的本地化字符串。 /// public static string TransportRequestHostTip4 { get { @@ -3320,7 +3329,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to *grpc Authority. + /// 查找类似 *grpc Authority 的本地化字符串。 /// public static string TransportRequestHostTip5 { get { @@ -3329,7 +3338,7 @@ namespace v2rayN.Resx { } /// - /// Looks up a localized string similar to Ungrouped. + /// 查找类似 Ungrouped 的本地化字符串。 /// public static string UngroupedServers { get { diff --git a/v2rayn/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayn/v2rayN/v2rayN/Resx/ResUI.resx index 54aca4d97b..feb6e20b08 100644 --- a/v2rayn/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayn/v2rayN/v2rayN/Resx/ResUI.resx @@ -1210,4 +1210,7 @@ Enable cache file for sing-box (ruleset files) + + Custom the rule-set of sing-box + \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayn/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index 2c67ce518d..6e21268ef1 100644 --- a/v2rayn/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayn/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -1207,4 +1207,7 @@ 启用sing-box(规则集文件)的缓存文件 + + 自定义sing-box rule-set + \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/Resx/ResUI.zh-Hant.resx b/v2rayn/v2rayN/v2rayN/Resx/ResUI.zh-Hant.resx index 52a97d6503..8c1247d1cc 100644 --- a/v2rayn/v2rayN/v2rayN/Resx/ResUI.zh-Hant.resx +++ b/v2rayn/v2rayN/v2rayN/Resx/ResUI.zh-Hant.resx @@ -1180,4 +1180,7 @@ 啟用sing-box(規則集文件)的緩存文件 + + 自訂sing-box rule-set + \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN/ViewModels/RoutingSettingViewModel.cs b/v2rayn/v2rayN/v2rayN/ViewModels/RoutingSettingViewModel.cs index 5c1936a032..9a7e6ca187 100644 --- a/v2rayn/v2rayN/v2rayN/ViewModels/RoutingSettingViewModel.cs +++ b/v2rayn/v2rayN/v2rayN/ViewModels/RoutingSettingViewModel.cs @@ -192,6 +192,7 @@ namespace v2rayN.ViewModels remarks = item.remarks, url = item.url, customIcon = item.customIcon, + customRulesetPath4Singbox = item.customRulesetPath4Singbox, sort = item.sort, }; _routingItems.Add(it); diff --git a/v2rayn/v2rayN/v2rayN/Views/DNSSettingWindow.xaml b/v2rayn/v2rayN/v2rayN/Views/DNSSettingWindow.xaml index ddc5de7579..d2b05ea873 100644 --- a/v2rayn/v2rayN/v2rayN/Views/DNSSettingWindow.xaml +++ b/v2rayn/v2rayN/v2rayN/Views/DNSSettingWindow.xaml @@ -88,6 +88,7 @@ Style="{StaticResource ToolbarTextBlock}"> +