From 136c73ccd177939fac011f1d9fb4bbb66f8c70ed Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Thu, 30 Apr 2026 11:22:49 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=BD=91=E7=BB=9C=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=8F=98=E5=8C=96=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tun/PacketTunnelProvider.swift | 89 ++++++++++++------- Tun/Punchnet/Actors/SDLPuncherActor.swift | 7 +- dmg.sh | 2 +- punchnet/App/punchnetApp.swift | 7 +- punchnet/Shared/Networking/SDLAPIClient.swift | 12 ++- 5 files changed, 76 insertions(+), 41 deletions(-) diff --git a/Tun/PacketTunnelProvider.swift b/Tun/PacketTunnelProvider.swift index 83a6b0b..0a793b6 100644 --- a/Tun/PacketTunnelProvider.swift +++ b/Tun/PacketTunnelProvider.swift @@ -13,33 +13,28 @@ enum TunnelError: Error { } class PacketTunnelProvider: NEPacketTunnelProvider { - var contextActor: SDLContextActor? - private var rootTask: Task? - + private var runtimeEnv: SDLRuntimeEnvironment? + override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) { - // 重置通知中心 - SDLTunnelAppNotifier.shared.clear() - // 如果当前在运行状态,不允许重复请求 - guard self.contextActor == nil else { + guard self.runtimeEnv == nil else { completionHandler(TunnelError.invalidContext) return } - - // 加密算法 - let rsaCipher = try! CCRSACipher(keySize: 1024) - self.rootTask = Task { - // host: "192.168.0.101", port: 1265 - guard let options, let config = await SDLConfiguration.parse(options: options) else { - completionHandler(TunnelError.invalidConfiguration) - return + + guard let options else { + completionHandler(TunnelError.invalidConfiguration) + return + } + + self.runtimeEnv = SDLRuntimeEnvironment(options: options) + Task { + do { + try await self.runtimeEnv?.start(provider: self) + completionHandler(nil) + } catch let err { + completionHandler(err) } - - let contextActor = SDLContextActor(provider: self, config: config, rsaCipher: rsaCipher) - self.contextActor = contextActor - await contextActor.start() - - completionHandler(nil) } } @@ -47,12 +42,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { // Add code here to start the process of stopping the tunnel. Task { - await self.contextActor?.stop() - self.contextActor = nil - - self.rootTask?.cancel() - self.rootTask = nil - + await self.runtimeEnv?.stop() completionHandler() } } @@ -78,7 +68,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { override func sleep(completionHandler: @escaping () -> Void) { // Add code here to get ready to sleep. Task { - await self.contextActor?.sleep() + await self.runtimeEnv?.stop() completionHandler() } } @@ -86,15 +76,15 @@ class PacketTunnelProvider: NEPacketTunnelProvider { override func wake() { // Add code here to wake up. Task { - await self.contextActor?.wake() + try await self.runtimeEnv?.start(provider: self) } } private func handleAppRequest(message: AppRequest) async throws -> Data? { - guard let contextActor = self.contextActor else { + guard let contextActor = self.runtimeEnv?.getContextActor() else { throw TunnelError.invalidContext } - + switch message.command { case .changeExitNode(let changeExitNode): let exitNodeIp = changeExitNode.ip @@ -104,12 +94,12 @@ class PacketTunnelProvider: NEPacketTunnelProvider { reply.code = 0 reply.message = "操作成功" return try reply.serializedData() - + } catch let err { var reply = TunnelResponse() reply.code = 1 reply.message = err.localizedDescription - + return try reply.serializedData() } case .none: @@ -121,3 +111,36 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } } + +private class SDLRuntimeEnvironment { + var contextActor: SDLContextActor? + private var options: [String: NSObject] + + init(options: [String: NSObject]) { + self.options = options + } + + func start(provider: PacketTunnelProvider) async throws { + // 重置通知中心 + SDLTunnelAppNotifier.shared.clear() + + guard let config = await SDLConfiguration.parse(options: options) else { + throw TunnelError.invalidConfiguration + } + + // 加密算法 + let rsaCipher = try! CCRSACipher(keySize: 1024) + let contextActor = SDLContextActor(provider: provider, config: config, rsaCipher: rsaCipher) + self.contextActor = contextActor + await contextActor.start() + } + + func getContextActor() -> SDLContextActor? { + return self.contextActor + } + + func stop() async { + await self.contextActor?.stop() + } + +} diff --git a/Tun/Punchnet/Actors/SDLPuncherActor.swift b/Tun/Punchnet/Actors/SDLPuncherActor.swift index c44b05e..cf1306d 100644 --- a/Tun/Punchnet/Actors/SDLPuncherActor.swift +++ b/Tun/Punchnet/Actors/SDLPuncherActor.swift @@ -90,7 +90,7 @@ actor SDLPuncherActor { phase: .waitingPeerInfo(deadline: now.addingTimeInterval(self.peerInfoTimeout)) ) - await quicClient.send(type: .queryInfo, data: queryData) + quicClient.send(type: .queryInfo, data: queryData) } func handlePeerInfo(using udpHole: SDLUDPHole?, udpHoleV6: SDLUDPHoleV6?, peerInfo: SDLPeerInfo) async { @@ -156,10 +156,7 @@ actor SDLPuncherActor { } } - private func sendRegister(using udpHole: SDLUDPHole?, - udpHoleV6: SDLUDPHoleV6?, - registerData: Data, - remoteAddress: SocketAddress) { + private func sendRegister(using udpHole: SDLUDPHole?, udpHoleV6: SDLUDPHoleV6?, registerData: Data, remoteAddress: SocketAddress) { switch remoteAddress { case .v4: guard let udpHole else { diff --git a/dmg.sh b/dmg.sh index 91afa53..343a743 100755 --- a/dmg.sh +++ b/dmg.sh @@ -1,3 +1,3 @@ #! /bin/sh -create-dmg --volname "punchnet" --window-pos 200 120 --window-size 800 400 --icon "punchnet.app" 200 190 --hide-extension "punchnet.app" --app-drop-link 600 185 ~/Desktop/punchnet.dmg /Users/anlicheng/Desktop/punchnetv3 +create-dmg --volname "punchnet" --window-pos 200 120 --window-size 800 400 --icon "punchnet.app" 200 190 --hide-extension "punchnet.app" --app-drop-link 600 185 ~/Desktop/punchnet.dmg /Users/anlicheng/Desktop/punchnetv6 diff --git a/punchnet/App/punchnetApp.swift b/punchnet/App/punchnetApp.swift index 6b130a7..1ab1bc0 100644 --- a/punchnet/App/punchnetApp.swift +++ b/punchnet/App/punchnetApp.swift @@ -9,6 +9,7 @@ import SwiftUI import AppKit import SwiftData import Combine +//import SystemConfiguration @main struct punchnetApp: App { @@ -86,7 +87,11 @@ struct punchnetApp: App { class AppDelegate: NSObject, NSApplicationDelegate { func applicationWillFinishLaunching(_ notification: Notification) { - +// let settings = SCDynamicStoreCopyProxies(nil) +// let proxies = settings as? [String: Any] ?? [:] +// for (key, value) in proxies { +// print("\(key): \(value)") +// } } func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply { diff --git a/punchnet/Shared/Networking/SDLAPIClient.swift b/punchnet/Shared/Networking/SDLAPIClient.swift index 3ebe160..863ab61 100644 --- a/punchnet/Shared/Networking/SDLAPIClient.swift +++ b/punchnet/Shared/Networking/SDLAPIClient.swift @@ -33,6 +33,16 @@ struct SDLAPIClient { ] static func doPost(path: String, params: [String: Any], as: T.Type) async throws -> T { + let config = URLSessionConfiguration.default + config.connectionProxyDictionary = [ + kCFNetworkProxiesHTTPEnable as String: 0, + kCFNetworkProxiesHTTPSEnable as String: 0, + kCFNetworkProxiesSOCKSEnable as String: 0, + kCFNetworkProxiesProxyAutoConfigEnable as String: 0, + kCFNetworkProxiesProxyAutoDiscoveryEnable as String: 0 + ] + let session = URLSession(configuration: config) + let postData = try! JSONSerialization.data(withJSONObject: params) var request = URLRequest(url: URL(string: baseUrl + path)!) request.httpMethod = "POST" @@ -40,7 +50,7 @@ struct SDLAPIClient { request.addValue(sign(params: params), forHTTPHeaderField: "X-sign") request.httpBody = postData - let (data, _) = try await URLSession.shared.data(for: request) + let (data, _) = try await session.data(for: request) if let response = String(bytes: data, encoding: .utf8) { NSLog("url: \(path), response is: \(response)")