This commit is contained in:
anlicheng 2026-01-28 21:42:16 +08:00
parent dc59e1870a
commit 92a05263bb
6 changed files with 99 additions and 70 deletions

View File

@ -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
}

View File

@ -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)
}
}

View File

@ -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)!)
()
}
}

View File

@ -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 = ""
// }
// }
}
}

View File

@ -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 {

View File

@ -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()