From 92a05263bbf04c7183ddd2ac18017aee7ac633cc Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 28 Jan 2026 21:42:16 +0800 Subject: [PATCH] fix vpn --- Tun/Punchnet/SDLConfiguration.swift | 29 +--------- punchnet/Core/SystemConfig.swift | 43 ++++++++++++-- punchnet/Views/IndexView.swift | 9 +-- punchnet/Views/Login/LoginView.swift | 56 +++++++++---------- .../Network/NetworkDisconnctedView.swift | 20 ++++++- punchnet/punchnetApp.swift | 12 ++-- 6 files changed, 99 insertions(+), 70 deletions(-) diff --git a/Tun/Punchnet/SDLConfiguration.swift b/Tun/Punchnet/SDLConfiguration.swift index 0a43429..3f32520 100644 --- a/Tun/Punchnet/SDLConfiguration.swift +++ b/Tun/Punchnet/SDLConfiguration.swift @@ -85,33 +85,6 @@ public class SDLConfiguration { self.remoteDnsServer = remoteDnsServer self.hostname = hostname } - - // 获取mac地址 - public static func getMacAddress() -> Data { - let key = "gMacAddress2" - - let userDefaults = UserDefaults.standard - if let mac = userDefaults.value(forKey: key) as? Data { - return mac - } - else { - let mac = generateMacAddress() - userDefaults.setValue(mac, forKey: key) - - return mac - } - } - - // 随机生成mac地址 - private static func generateMacAddress() -> Data { - var macAddress = [UInt8](repeating: 0, count: 6) - for i in 0..<6 { - macAddress[i] = UInt8.random(in: 0...255) - } - - return Data(macAddress) - } - } // 解析配置文件 @@ -128,7 +101,7 @@ extension SDLConfiguration { let clientId = options["client_id"] as? String, let remoteDnsServer = options["remote_dns_server"] as? String, let hostname = options["hostname"] as? String, - let networkAddressDict = options["networkAddress"] as? [String: NSObject] else { + let networkAddressDict = options["network_address"] as? [String: NSObject] else { return nil } diff --git a/punchnet/Core/SystemConfig.swift b/punchnet/Core/SystemConfig.swift index 898ea31..7377520 100644 --- a/punchnet/Core/SystemConfig.swift +++ b/punchnet/Core/SystemConfig.swift @@ -26,23 +26,32 @@ struct SystemConfig { static let stunServers = "118.178.229.213:1265,1266;118.178.229.213:1265,1266" //static let stunServers = "127.0.0.1:1265,1266;127.0.0.1:1265,1266" - static func getOptions(networkCode: String, token: String, clientId: String, hostname: String, noticePort: Int) -> [String:NSObject]? { + static func getOptions(networkId: UInt32, networkDomain: String, ip: String, maskLen: UInt8, accessToken: String, hostname: String, noticePort: Int) -> [String: NSObject]? { guard let superIp = DNSResolver.resolveAddrInfos(superHost).first else { return nil } + let clientId = getClientId() + let mac = getMacAddress() + let options = [ "version:": version as NSObject, "installed_channel": installedChannel as NSObject, "client_id": clientId as NSObject, - "network_code": networkCode as NSObject, - "token": token as NSObject, + "access_token": accessToken as NSObject, "super_ip": superIp as NSObject, "super_port": superPort as NSObject, "stun_servers": stunServers as NSObject, "remote_dns_server": superIp as NSObject, "hostname": hostname as NSObject, - "notice_port": noticePort as NSObject + "notice_port": noticePort as NSObject, + "network_address": [ + "network_id": networkId as NSObject, + "ip": ip as NSObject, + "mask_len": maskLen as NSObject, + "mac": mac as NSObject, + "network_domain": networkDomain as NSObject + ] as NSObject ] return options @@ -60,4 +69,30 @@ struct SystemConfig { } } + // 获取mac地址 + public static func getMacAddress() -> Data { + let key = "gMacAddress2" + + let userDefaults = UserDefaults.standard + if let mac = userDefaults.value(forKey: key) as? Data { + return mac + } + else { + let mac = generateMacAddress() + userDefaults.setValue(mac, forKey: key) + + return mac + } + } + + // 随机生成mac地址 + private static func generateMacAddress() -> Data { + var macAddress = [UInt8](repeating: 0, count: 6) + for i in 0..<6 { + macAddress[i] = UInt8.random(in: 0...255) + } + + return Data(macAddress) + } + } diff --git a/punchnet/Views/IndexView.swift b/punchnet/Views/IndexView.swift index 5b4ac3d..08e3eb9 100644 --- a/punchnet/Views/IndexView.swift +++ b/punchnet/Views/IndexView.swift @@ -269,10 +269,11 @@ struct IndexView: View { self.ipAddress = "" try await vpnManager.disableVpn() case .disconnected: - let clientId = SystemConfig.getClientId() - NSLog("[IndexView] use token: \(self.token), network_code: \(networkCode)") - // token存在则优先使用token - try await vpnManager.enableVpn(options: SystemConfig.getOptions(networkCode: self.networkCode, token: self.token, clientId: clientId, hostname: self.hostname, noticePort: self.noticeServer.port)!) +// let clientId = SystemConfig.getClientId() +// NSLog("[IndexView] use token: \(self.token), network_code: \(networkCode)") +// // token存在则优先使用token +// try await vpnManager.enableVpn(options: SystemConfig.getOptions(networkCode: self.networkCode, token: self.token, clientId: clientId, hostname: self.hostname, noticePort: self.noticeServer.port)!) + () } } diff --git a/punchnet/Views/Login/LoginView.swift b/punchnet/Views/Login/LoginView.swift index ed8f68b..0f14fec 100644 --- a/punchnet/Views/Login/LoginView.swift +++ b/punchnet/Views/Login/LoginView.swift @@ -181,34 +181,34 @@ struct LoginAccountView: View { // 执行登陆操作 private func doLogin() async { - let clientId = SystemConfig.getClientId() - do { - let loginResult = try await SDLAPI.loginWithAccountAndPassword(clientId: clientId, username: self.username, password: self.password, as: LoginResult.self) - - print(loginResult.accessToken) - - // 保存信息到KeychainStore - let store = KeychainStore.shared - if let tokenData = loginResult.accessToken.data(using: .utf8) { - try store.save(tokenData, account: self.username) - } - - await MainActor.run { - self.userContext.isLogined = true - self.userContext.loginCredit = .accountAndPasword(account: username, password: password, networkId: loginResult.networkId) - } - - } catch let err as JSONRPCError { - await MainActor.run { - self.showAlert = true - self.errorMessage = err.message - } - } catch { - await MainActor.run { - self.showAlert = true - self.errorMessage = "内部错误,请稍后重试" - } - } +// let clientId = SystemConfig.getClientId() +// do { +// let loginResult = try await SDLAPI.loginWithAccountAndPassword(clientId: clientId, username: self.username, password: self.password, as: LoginResult.self) +// +// print(loginResult.accessToken) +// +// // 保存信息到KeychainStore +// let store = KeychainStore.shared +// if let tokenData = loginResult.accessToken.data(using: .utf8) { +// try store.save(tokenData, account: self.username) +// } +// +// await MainActor.run { +// self.userContext.isLogined = true +// self.userContext.loginCredit = .accountAndPasword(account: username, password: password, networkId: loginResult.networkId) +// } +// +// } catch let err as JSONRPCError { +// await MainActor.run { +// self.showAlert = true +// self.errorMessage = err.message +// } +// } catch { +// await MainActor.run { +// self.showAlert = true +// self.errorMessage = "内部错误,请稍后重试" +// } +// } } } diff --git a/punchnet/Views/Network/NetworkDisconnctedView.swift b/punchnet/Views/Network/NetworkDisconnctedView.swift index 73b75de..c16deae 100644 --- a/punchnet/Views/Network/NetworkDisconnctedView.swift +++ b/punchnet/Views/Network/NetworkDisconnctedView.swift @@ -15,7 +15,9 @@ struct NetworkDisconnctedView: View { Color.clear Button { - print("call me here") + Task { + try await startVpn() + } } label: { Text("连接") .font(.system(size: 14, weight: .regular)) @@ -30,6 +32,22 @@ struct NetworkDisconnctedView: View { } } + + // 执行登陆操作 + private func startVpn() async throws { + let clientId = SystemConfig.getClientId() + + let options = SystemConfig.getOptions(networkId: 8, + networkDomain: "punchnet.com", + ip: "10.211.179.1", + maskLen: 24, + accessToken: "accessToken1234", + hostname: "mysql", + noticePort: 123456) + // token存在则优先使用token + try await VPNManager.shared.enableVpn(options: options!) + } + } //#Preview { diff --git a/punchnet/punchnetApp.swift b/punchnet/punchnetApp.swift index e15a9a7..6e370be 100644 --- a/punchnet/punchnetApp.swift +++ b/punchnet/punchnetApp.swift @@ -45,7 +45,8 @@ struct punchnetApp: App { var body: some Scene { WindowGroup(id: "mainWindow") { //IndexView(noticeServer: self.noticeServer) - RootView() + //RootView() + NetworkDisconnctedView(state: NetworkState()) .onAppear { // 获取主屏幕的尺寸 guard let screenFrame = NSScreen.main?.frame else { return } @@ -104,10 +105,11 @@ struct punchnetApp: App { private func menuClick() { switch self.vpnManager.vpnStatus { case .disconnected: - Task { - let clientId = SystemConfig.getClientId() - try await vpnManager.enableVpn(options: SystemConfig.getOptions(networkCode: self.networkCode, token: self.token, clientId: clientId, hostname: self.hostname, noticePort: self.noticeServer.port)!) - } +// Task { +// let clientId = SystemConfig.getClientId() +// try await vpnManager.enableVpn(options: SystemConfig.getOptions(networkCode: self.networkCode, token: self.token, clientId: clientId, hostname: self.hostname, noticePort: self.noticeServer.port)!) +// } + () case .connected: Task { try await vpnManager.disableVpn()