From fca095173c08571ac1dd7bef03b91330037f0c2b Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Tue, 6 Jan 2026 16:33:02 +0800 Subject: [PATCH] add hostname support --- Tun/PacketTunnelProvider.swift | 4 +++- Tun/Punchnet/SDLConfiguration.swift | 4 +++- Tun/Punchnet/SDLMessage.pb.swift | 8 ++++++++ Tun/Punchnet/SDLSuperClient.swift | 1 + punchnet/Core/SystemConfig.swift | 3 ++- punchnet/Views/IndexView.swift | 10 +++++++++- punchnet/punchnetApp.swift | 3 ++- 7 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Tun/PacketTunnelProvider.swift b/Tun/PacketTunnelProvider.swift index 3cfa0c0..296e7da 100644 --- a/Tun/PacketTunnelProvider.swift +++ b/Tun/PacketTunnelProvider.swift @@ -40,6 +40,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { let networkCode = options["network_code"] as! String let clientId = options["client_id"] as! String let remoteDnsServer = options["remote_dns_server"] as! String + let hostname = options["hostname"] as! String let stunServers = stunServersStr.split(separator: ";").compactMap { server -> SDLConfiguration.StunServer? in let parts = server.split(separator: ":", maxSplits: 2) @@ -71,7 +72,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider { noticePort: noticePort, token: token, networkCode: networkCode, - remoteDnsServer: remoteDnsServer) + remoteDnsServer: remoteDnsServer, + hostname: hostname) // 加密算法 let rsaCipher = try! CCRSACipher(keySize: 1024) let aesChiper = CCAESChiper() diff --git a/Tun/Punchnet/SDLConfiguration.swift b/Tun/Punchnet/SDLConfiguration.swift index 76f54b2..4c8ee52 100644 --- a/Tun/Punchnet/SDLConfiguration.swift +++ b/Tun/Punchnet/SDLConfiguration.swift @@ -32,6 +32,7 @@ public class SDLConfiguration { let stunServers: [StunServer] let remoteDnsServer: String + let hostname: String let noticePort: Int @@ -54,7 +55,7 @@ public class SDLConfiguration { let token: String let networkCode: String - public init(version: UInt8, installedChannel: String, superHost: String, superPort: Int, stunServers: [StunServer], clientId: String, noticePort: Int, token: String, networkCode: String, remoteDnsServer: String) { + public init(version: UInt8, installedChannel: String, superHost: String, superPort: Int, stunServers: [StunServer], clientId: String, noticePort: Int, token: String, networkCode: String, remoteDnsServer: String, hostname: String) { self.version = version self.installedChannel = installedChannel self.superHost = superHost @@ -65,6 +66,7 @@ public class SDLConfiguration { self.token = token self.networkCode = networkCode self.remoteDnsServer = remoteDnsServer + self.hostname = hostname } } diff --git a/Tun/Punchnet/SDLMessage.pb.swift b/Tun/Punchnet/SDLMessage.pb.swift index 7068613..4c750c5 100644 --- a/Tun/Punchnet/SDLMessage.pb.swift +++ b/Tun/Punchnet/SDLMessage.pb.swift @@ -109,6 +109,8 @@ struct SDLRegisterSuper: Sendable { var networkCode: String = String() + var hostname: String = String() + var unknownFields = SwiftProtobuf.UnknownStorage() init() {} @@ -639,6 +641,7 @@ extension SDLRegisterSuper: SwiftProtobuf.Message, SwiftProtobuf._MessageImpleme 5: .standard(proto: "pub_key"), 6: .same(proto: "token"), 7: .standard(proto: "network_code"), + 8: .same(proto: "hostname"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -654,6 +657,7 @@ extension SDLRegisterSuper: SwiftProtobuf.Message, SwiftProtobuf._MessageImpleme case 5: try { try decoder.decodeSingularStringField(value: &self.pubKey) }() case 6: try { try decoder.decodeSingularStringField(value: &self.token) }() case 7: try { try decoder.decodeSingularStringField(value: &self.networkCode) }() + case 8: try { try decoder.decodeSingularStringField(value: &self.hostname) }() default: break } } @@ -685,6 +689,9 @@ extension SDLRegisterSuper: SwiftProtobuf.Message, SwiftProtobuf._MessageImpleme if !self.networkCode.isEmpty { try visitor.visitSingularStringField(value: self.networkCode, fieldNumber: 7) } + if !self.hostname.isEmpty { + try visitor.visitSingularStringField(value: self.hostname, fieldNumber: 8) + } try unknownFields.traverse(visitor: &visitor) } @@ -696,6 +703,7 @@ extension SDLRegisterSuper: SwiftProtobuf.Message, SwiftProtobuf._MessageImpleme if lhs.pubKey != rhs.pubKey {return false} if lhs.token != rhs.token {return false} if lhs.networkCode != rhs.networkCode {return false} + if lhs.hostname != rhs.hostname {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } diff --git a/Tun/Punchnet/SDLSuperClient.swift b/Tun/Punchnet/SDLSuperClient.swift index 82f18d2..ef10ff9 100644 --- a/Tun/Punchnet/SDLSuperClient.swift +++ b/Tun/Punchnet/SDLSuperClient.swift @@ -149,6 +149,7 @@ actor SDLSuperClient { registerSuper.pubKey = ctx.rsaCipher.pubKey registerSuper.token = ctx.config.token registerSuper.networkCode = ctx.config.networkCode + registerSuper.hostname = ctx.config.hostname NSLog("[SuperClient] register super request: \(registerSuper)") diff --git a/punchnet/Core/SystemConfig.swift b/punchnet/Core/SystemConfig.swift index b467ed9..898ea31 100644 --- a/punchnet/Core/SystemConfig.swift +++ b/punchnet/Core/SystemConfig.swift @@ -26,7 +26,7 @@ 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, noticePort: Int) -> [String:NSObject]? { + static func getOptions(networkCode: String, token: String, clientId: String, hostname: String, noticePort: Int) -> [String:NSObject]? { guard let superIp = DNSResolver.resolveAddrInfos(superHost).first else { return nil } @@ -41,6 +41,7 @@ struct SystemConfig { "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 ] diff --git a/punchnet/Views/IndexView.swift b/punchnet/Views/IndexView.swift index 8b0f599..5b4ac3d 100644 --- a/punchnet/Views/IndexView.swift +++ b/punchnet/Views/IndexView.swift @@ -11,6 +11,7 @@ import Combine struct IndexView: View { @AppStorage("token") private var token: String = "" + @AppStorage("hostname") private var hostname: String = "" @AppStorage("network_code") private var networkCode: String = "" @State private var showToken: Bool = false @@ -57,6 +58,13 @@ struct IndexView: View { .onTapGesture { self.showMenu = false } + TextField("主机名", text: $hostname) + .multilineTextAlignment(.leading) + .textFieldStyle(PlainTextFieldStyle()) + .frame(width: 200, height: 25) + .background(Color.white) + .foregroundColor(Color.black) + .cornerRadius(5.0) if showIpAdress { HStack { @@ -264,7 +272,7 @@ struct IndexView: View { 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, noticePort: self.noticeServer.port)!) + 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/punchnetApp.swift b/punchnet/punchnetApp.swift index 0c3b947..9e5f4e0 100644 --- a/punchnet/punchnetApp.swift +++ b/punchnet/punchnetApp.swift @@ -32,6 +32,7 @@ struct punchnetApp: App { @AppStorage("token") var token: String = "" @AppStorage("network_code") var networkCode: String = "" + @AppStorage("hostname") var hostname: String = "" @ObservedObject var vpnManager = VPNManager.shared private var noticeServer: UDPNoticeCenterServer @@ -104,7 +105,7 @@ struct punchnetApp: App { case .disconnected: Task { let clientId = SystemConfig.getClientId() - try await vpnManager.enableVpn(options: SystemConfig.getOptions(networkCode: self.networkCode, token: self.token, clientId: clientId, noticePort: self.noticeServer.port)!) + 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 {