This commit is contained in:
anlicheng 2025-08-27 19:11:22 +08:00
parent f86dd4c273
commit d00296737b
7 changed files with 75 additions and 19 deletions

View File

@ -36,6 +36,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
let superPort = options["super_port"] as! Int let superPort = options["super_port"] as! Int
let stunServersStr = options["stun_servers"] as! String let stunServersStr = options["stun_servers"] as! String
let noticePort = options["notice_port"] as! Int let noticePort = options["notice_port"] as! Int
let token = options["token"] as! String
let stunServers = stunServersStr.split(separator: ";").compactMap { server -> SDLConfiguration.StunServer? in let stunServers = stunServersStr.split(separator: ";").compactMap { server -> SDLConfiguration.StunServer? in
let parts = server.split(separator: ":", maxSplits: 2) let parts = server.split(separator: ":", maxSplits: 2)
@ -63,7 +64,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
stunServers: stunServers, stunServers: stunServers,
clientId: SDLContext.getUUID(), clientId: SDLContext.getUUID(),
noticePort: noticePort, noticePort: noticePort,
token: "") token: token)
// //
let rsaCipher = try! CCRSACipher(keySize: 1024) let rsaCipher = try! CCRSACipher(keySize: 1024)
let aesChiper = CCAESChiper() let aesChiper = CCAESChiper()

2
dmg.sh
View File

@ -1,3 +1,3 @@
#! /bin/sh #! /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/punchnet_v1 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/punchnet_macos_v1

View File

@ -10,10 +10,20 @@
<integer>0</integer> <integer>0</integer>
</dict> </dict>
<key>punchnet.xcscheme_^#shared#^_</key> <key>punchnet.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
</dict>
<key>punchnetTests.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>1</integer> <integer>1</integer>
</dict> </dict>
<key>punchnetUITests.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict> </dict>
<key>SuppressBuildableAutocreation</key> <key>SuppressBuildableAutocreation</key>
<dict> <dict>
@ -22,6 +32,11 @@
<key>primary</key> <key>primary</key>
<true/> <true/>
</dict> </dict>
<key>C8A77F052DD1E6D100195617</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>C8A77F262DD1E77B00195617</key> <key>C8A77F262DD1E77B00195617</key>
<dict> <dict>
<key>primary</key> <key>primary</key>

View File

@ -25,7 +25,7 @@ struct SystemConfig {
// stun // stun
static let stunServers = "118.178.229.213:1265,1266;118.178.229.213:1265,1266" static let stunServers = "118.178.229.213:1265,1266;118.178.229.213:1265,1266"
static func getOptions(token: String) -> [String:NSObject]? { static func getOptions(token: String, noticePort: Int) -> [String:NSObject]? {
guard let superIp = DNSResolver.resolveAddrInfos(superHost).first else { guard let superIp = DNSResolver.resolveAddrInfos(superHost).first else {
return nil return nil
} }
@ -35,7 +35,8 @@ struct SystemConfig {
"token": token as NSObject, "token": token as NSObject,
"super_ip": "118.178.229.213" as NSObject, "super_ip": "118.178.229.213" as NSObject,
"super_port": superPort as NSObject, "super_port": superPort as NSObject,
"stun_servers": stunServers as NSObject "stun_servers": stunServers as NSObject,
"notice_port": noticePort as NSObject
] ]
print("options: \(options)") print("options: \(options)")

View File

@ -18,11 +18,7 @@ final class UDPNoticeCenterServer: ChannelInboundHandler {
private var channel: Channel? private var channel: Channel?
var messageFlow = PassthroughSubject<NoticeMessage.InboundMessage, Never>() var messageFlow = PassthroughSubject<NoticeMessage.InboundMessage, Never>()
static let shared = UDPNoticeCenterServer() public var port: Int = 0
private init() {
}
func start() { func start() {
self.group = MultiThreadedEventLoopGroup(numberOfThreads: 1) self.group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
@ -31,7 +27,8 @@ final class UDPNoticeCenterServer: ChannelInboundHandler {
.channelInitializer { channel in .channelInitializer { channel in
channel.pipeline.addHandler(self) channel.pipeline.addHandler(self)
} }
self.channel = try! bootstrap.bind(host: "127.0.0.1", port: 50195).wait() self.channel = try! bootstrap.bind(host: "127.0.0.1", port: 0).wait()
self.port = self.channel?.localAddress?.port ?? 0
} }
func stop() { func stop() {

View File

@ -21,6 +21,12 @@ struct IndexView: View {
@State private var showMenu: Bool = false @State private var showMenu: Bool = false
// ip
@State private var showIpAdress: Bool = false
@State private var ipAddress: String = ""
public var noticeServer: UDPNoticeCenterServer
var body: some View { var body: some View {
VStack(alignment: .center, spacing: 10) { VStack(alignment: .center, spacing: 10) {
@ -47,6 +53,24 @@ struct IndexView: View {
self.showMenu = false self.showMenu = false
} }
if showIpAdress {
HStack {
Spacer()
Text("ip: ")
.font(.system(size: 16, weight: .medium))
.foregroundColor(.white)
.cornerRadius(5.0)
Text(ipAddress)
.font(.system(size: 16, weight: .medium))
.foregroundColor(.white)
.cornerRadius(5.0)
Spacer()
}
}
Spacer() Spacer()
.frame(width: 1, height: 10) .frame(width: 1, height: 10)
@ -176,10 +200,18 @@ struct IndexView: View {
} }
} }
.onAppear { .onAppear {
self.cancel = UDPNoticeCenterServer.shared.messageFlow.sink{ message in self.cancel = self.noticeServer.messageFlow.sink{ message in
DispatchQueue.main.async { DispatchQueue.main.async {
self.message = message switch message {
self.showStunAlert = true case .none:
()
case .ip(let ip):
self.showIpAdress = true
self.ipAddress = ip
default:
self.message = message
self.showStunAlert = true
}
} }
} }
} }
@ -188,15 +220,17 @@ struct IndexView: View {
private func clickSwitchButton() async throws { private func clickSwitchButton() async throws {
switch self.vpnManager.vpnStatus { switch self.vpnManager.vpnStatus {
case .connected: case .connected:
self.showIpAdress = false
self.ipAddress = ""
try await vpnManager.disableVpn() try await vpnManager.disableVpn()
case .disconnected: case .disconnected:
try await vpnManager.enableVpn(options: SystemConfig.getOptions(token: self.token)!) try await vpnManager.enableVpn(options: SystemConfig.getOptions(token: self.token, noticePort: self.noticeServer.port)!)
} }
} }
} }
#Preview { #Preview {
IndexView() //IndexView(noticeServer: server)
//.modelContainer(for: Item.self, inMemory: true) //.modelContainer(for: Item.self, inMemory: true)
} }

View File

@ -33,9 +33,16 @@ struct punchnetApp: App {
@AppStorage("token") var token: String = "" @AppStorage("token") var token: String = ""
@ObservedObject var vpnManager = VPNManager.shared @ObservedObject var vpnManager = VPNManager.shared
private var noticeServer: UDPNoticeCenterServer
init() {
self.noticeServer = UDPNoticeCenterServer()
self.noticeServer.start()
}
var body: some Scene { var body: some Scene {
WindowGroup(id: "mainWindow") { WindowGroup(id: "mainWindow") {
IndexView() IndexView(noticeServer: self.noticeServer)
.frame(minWidth: 300, maxWidth: 300, minHeight: 500, maxHeight: 500) .frame(minWidth: 300, maxWidth: 300, minHeight: 500, maxHeight: 500)
.onAppear { .onAppear {
// //
@ -53,6 +60,8 @@ struct punchnetApp: App {
window.setFrameOrigin(NSPoint(x: centerX, y: centerY)) window.setFrameOrigin(NSPoint(x: centerX, y: centerY))
} }
} }
.toolbar(.hidden)
.navigationTitle("")
} }
.commands { .commands {
CommandGroup(replacing: .appInfo) { CommandGroup(replacing: .appInfo) {
@ -94,7 +103,7 @@ struct punchnetApp: App {
switch self.vpnManager.vpnStatus { switch self.vpnManager.vpnStatus {
case .disconnected: case .disconnected:
Task { Task {
try await vpnManager.enableVpn(options: SystemConfig.getOptions(token: self.token)!) try await vpnManager.enableVpn(options: SystemConfig.getOptions(token: self.token, noticePort: self.noticeServer.port)!)
} }
case .connected: case .connected:
Task { Task {
@ -109,7 +118,7 @@ struct punchnetApp: App {
class AppDelegate: NSObject, NSApplicationDelegate { class AppDelegate: NSObject, NSApplicationDelegate {
func applicationWillFinishLaunching(_ notification: Notification) { func applicationWillFinishLaunching(_ notification: Notification) {
UDPNoticeCenterServer.shared.start()
} }
func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply { func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {
@ -118,7 +127,6 @@ class AppDelegate: NSObject, NSApplicationDelegate {
DispatchQueue.main.async { DispatchQueue.main.async {
sender.reply(toApplicationShouldTerminate: true) sender.reply(toApplicationShouldTerminate: true)
} }
UDPNoticeCenterServer.shared.stop()
} }
return .terminateLater return .terminateLater