diff --git a/.github/update.log b/.github/update.log index 4d8e979634..4c2d53d1cc 100644 --- a/.github/update.log +++ b/.github/update.log @@ -605,3 +605,4 @@ Update On Sat Mar 30 19:27:32 CET 2024 Update On Sun Mar 31 20:25:39 CEST 2024 Update On Mon Apr 1 20:26:51 CEST 2024 Update On Tue Apr 2 20:27:11 CEST 2024 +Update On Wed Apr 3 20:26:29 CEST 2024 diff --git a/clash-meta/adapter/outbound/direct.go b/clash-meta/adapter/outbound/direct.go index 7def7b208f..1b01a576c4 100644 --- a/clash-meta/adapter/outbound/direct.go +++ b/clash-meta/adapter/outbound/direct.go @@ -3,18 +3,18 @@ package outbound import ( "context" "errors" - "fmt" "net/netip" N "github.com/metacubex/mihomo/common/net" "github.com/metacubex/mihomo/component/dialer" + "github.com/metacubex/mihomo/component/loopback" "github.com/metacubex/mihomo/component/resolver" C "github.com/metacubex/mihomo/constant" ) type Direct struct { *Base - loopBack *loopBackDetector + loopBack *loopback.Detector } type DirectOption struct { @@ -24,8 +24,8 @@ type DirectOption struct { // DialContext implements C.ProxyAdapter func (d *Direct) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) { - if d.loopBack.CheckConn(metadata.SourceAddrPort()) { - return nil, fmt.Errorf("reject loopback connection to: %s", metadata.RemoteAddress()) + if err := d.loopBack.CheckConn(metadata); err != nil { + return nil, err } opts = append(opts, dialer.WithResolver(resolver.DefaultResolver)) c, err := dialer.DialContext(ctx, "tcp", metadata.RemoteAddress(), d.Base.DialOptions(opts...)...) @@ -38,8 +38,8 @@ func (d *Direct) DialContext(ctx context.Context, metadata *C.Metadata, opts ... // ListenPacketContext implements C.ProxyAdapter func (d *Direct) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { - if d.loopBack.CheckPacketConn(metadata.SourceAddrPort()) { - return nil, fmt.Errorf("reject loopback connection to: %s", metadata.RemoteAddress()) + if err := d.loopBack.CheckPacketConn(metadata); err != nil { + return nil, err } // net.UDPConn.WriteTo only working with *net.UDPAddr, so we need a net.UDPAddr if !metadata.Resolved() { @@ -68,7 +68,7 @@ func NewDirectWithOption(option DirectOption) *Direct { rmark: option.RoutingMark, prefer: C.NewDNSPrefer(option.IPVersion), }, - loopBack: newLoopBackDetector(), + loopBack: loopback.NewDetector(), } } @@ -80,7 +80,7 @@ func NewDirect() *Direct { udp: true, prefer: C.DualStack, }, - loopBack: newLoopBackDetector(), + loopBack: loopback.NewDetector(), } } @@ -92,6 +92,6 @@ func NewCompatible() *Direct { udp: true, prefer: C.DualStack, }, - loopBack: newLoopBackDetector(), + loopBack: loopback.NewDetector(), } } diff --git a/clash-meta/adapter/outbound/direct_loopback_detect.go b/clash-meta/component/loopback/detector.go similarity index 58% rename from clash-meta/adapter/outbound/direct_loopback_detect.go rename to clash-meta/component/loopback/detector.go index 410d5a2fc8..b07270ed0a 100644 --- a/clash-meta/adapter/outbound/direct_loopback_detect.go +++ b/clash-meta/component/loopback/detector.go @@ -1,6 +1,8 @@ -package outbound +package loopback import ( + "errors" + "fmt" "net/netip" "github.com/metacubex/mihomo/common/callback" @@ -9,19 +11,21 @@ import ( "github.com/puzpuzpuz/xsync/v3" ) -type loopBackDetector struct { +var ErrReject = errors.New("reject loopback connection") + +type Detector struct { connMap *xsync.MapOf[netip.AddrPort, struct{}] packetConnMap *xsync.MapOf[netip.AddrPort, struct{}] } -func newLoopBackDetector() *loopBackDetector { - return &loopBackDetector{ +func NewDetector() *Detector { + return &Detector{ connMap: xsync.NewMapOf[netip.AddrPort, struct{}](), packetConnMap: xsync.NewMapOf[netip.AddrPort, struct{}](), } } -func (l *loopBackDetector) NewConn(conn C.Conn) C.Conn { +func (l *Detector) NewConn(conn C.Conn) C.Conn { metadata := C.Metadata{} if metadata.SetRemoteAddr(conn.LocalAddr()) != nil { return conn @@ -36,7 +40,7 @@ func (l *loopBackDetector) NewConn(conn C.Conn) C.Conn { }) } -func (l *loopBackDetector) NewPacketConn(conn C.PacketConn) C.PacketConn { +func (l *Detector) NewPacketConn(conn C.PacketConn) C.PacketConn { metadata := C.Metadata{} if metadata.SetRemoteAddr(conn.LocalAddr()) != nil { return conn @@ -51,18 +55,24 @@ func (l *loopBackDetector) NewPacketConn(conn C.PacketConn) C.PacketConn { }) } -func (l *loopBackDetector) CheckConn(connAddr netip.AddrPort) bool { +func (l *Detector) CheckConn(metadata *C.Metadata) error { + connAddr := metadata.SourceAddrPort() if !connAddr.IsValid() { - return false + return nil } - _, ok := l.connMap.Load(connAddr) - return ok + if _, ok := l.connMap.Load(connAddr); ok { + return fmt.Errorf("%w to: %s", ErrReject, metadata.RemoteAddress()) + } + return nil } -func (l *loopBackDetector) CheckPacketConn(connAddr netip.AddrPort) bool { +func (l *Detector) CheckPacketConn(metadata *C.Metadata) error { + connAddr := metadata.SourceAddrPort() if !connAddr.IsValid() { - return false + return nil } - _, ok := l.packetConnMap.Load(connAddr) - return ok + if _, ok := l.packetConnMap.Load(connAddr); ok { + return fmt.Errorf("%w to: %s", ErrReject, metadata.RemoteAddress()) + } + return nil } diff --git a/clash-meta/listener/sing_tun/server.go b/clash-meta/listener/sing_tun/server.go index 384ff016b5..8fe534df53 100644 --- a/clash-meta/listener/sing_tun/server.go +++ b/clash-meta/listener/sing_tun/server.go @@ -261,15 +261,17 @@ func New(options LC.Tun, tunnel C.Tunnel, additions ...inbound.Addition) (l *Lis } } l.tunIf = tunIf - l.tunStack, err = tun.NewStack(strings.ToLower(options.Stack.String()), stackOptions) + + tunStack, err := tun.NewStack(strings.ToLower(options.Stack.String()), stackOptions) if err != nil { return } - err = l.tunStack.Start() + err = tunStack.Start() if err != nil { return } + l.tunStack = tunStack //l.openAndroidHotspot(tunOptions) diff --git a/clash-meta/tunnel/tunnel.go b/clash-meta/tunnel/tunnel.go index d5a226e961..608ab2c5bd 100644 --- a/clash-meta/tunnel/tunnel.go +++ b/clash-meta/tunnel/tunnel.go @@ -12,6 +12,7 @@ import ( "time" N "github.com/metacubex/mihomo/common/net" + "github.com/metacubex/mihomo/component/loopback" "github.com/metacubex/mihomo/component/nat" P "github.com/metacubex/mihomo/component/process" "github.com/metacubex/mihomo/component/resolver" @@ -694,6 +695,9 @@ func shouldStopRetry(err error) bool { if errors.Is(err, resolver.ErrIPv6Disabled) { return true } + if errors.Is(err, loopback.ErrReject) { + return true + } return false } diff --git a/clash-nyanpasu/.eslintrc.cjs b/clash-nyanpasu/.eslintrc.cjs index af79a90e1f..c5c9f176a6 100644 --- a/clash-nyanpasu/.eslintrc.cjs +++ b/clash-nyanpasu/.eslintrc.cjs @@ -28,7 +28,7 @@ module.exports = { alias: { map: [ ["@", "./src"], - ["@root", "./"], + ["~", "./"], ], extensions: [".tsx", ".ts", ".jsx", ".js", ".mjs", ".cjs"], }, diff --git a/clash-nyanpasu/backend/Cargo.lock b/clash-nyanpasu/backend/Cargo.lock index c51a242f02..0c505e58f4 100644 --- a/clash-nyanpasu/backend/Cargo.lock +++ b/clash-nyanpasu/backend/Cargo.lock @@ -2520,7 +2520,7 @@ dependencies = [ "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core 0.52.0", + "windows-core 0.51.1", ] [[package]] @@ -3023,7 +3023,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-targets 0.52.4", + "windows-targets 0.48.5", ] [[package]] @@ -5545,9 +5545,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.30.7" +version = "0.30.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c385888ef380a852a16209afc8cfad22795dd8873d69c9a14d2e2088f118d18" +checksum = "4b1a378e48fb3ce3a5cf04359c456c9c98ff689bcf1c1bc6e6a31f247686f275" dependencies = [ "cfg-if", "core-foundation-sys", diff --git a/clash-nyanpasu/backend/tauri/src/utils/resolve.rs b/clash-nyanpasu/backend/tauri/src/utils/resolve.rs index f2cd79f4b5..33fa7872ae 100644 --- a/clash-nyanpasu/backend/tauri/src/utils/resolve.rs +++ b/clash-nyanpasu/backend/tauri/src/utils/resolve.rs @@ -125,7 +125,7 @@ pub fn create_window(app_handle: &AppHandle) { let mut builder = tauri::window::WindowBuilder::new( app_handle, "main".to_string(), - tauri::WindowUrl::App("index.html".into()), + tauri::WindowUrl::App("/proxies".into()), ) .title("Clash Nyanpasu") .fullscreen(false) diff --git a/clash-nyanpasu/src/index.html b/clash-nyanpasu/index.html similarity index 94% rename from clash-nyanpasu/src/index.html rename to clash-nyanpasu/index.html index 451f29847e..8177b519ed 100644 --- a/clash-nyanpasu/src/index.html +++ b/clash-nyanpasu/index.html @@ -33,6 +33,6 @@
- +