punchnet-macos/punchnet/Core/SystemConfig.swift
2026-05-27 18:22:22 +08:00

148 lines
4.4 KiB
Swift

//
// SystemConfig.swift
// sdlan
//
// Created by on 2024/6/3.
//
import Foundation
struct SystemConfig {
struct EnvConfig {
let serverHost: String
let stunAssistHost: String
let tunBundleId: String
let localizedDescription: String
}
enum Env: String {
case dev = "dev"
case prod = "prod"
}
static let env: Env = .prod
//
static let version: Int = 1
static let version_name = "1.1"
static let build: Int = 123
//
static let channel = "appstore"
static let envConfigs: [Env: EnvConfig] = [
.dev: EnvConfig(
serverHost: "test.punchsky.com",
stunAssistHost: "test.punchsky.com",
tunBundleId: "com.jihe.punchnetmac.tun",
localizedDescription: "punchnetmac-dev"
),
.prod: EnvConfig(
serverHost: "root.punchsky.com",
stunAssistHost: "root.punchsky.com",
tunBundleId: "com.jihe.punchnetmac.tun",
localizedDescription: "punchnetmac"
)
]
//
static let systemInfo: String = {
let version = ProcessInfo.processInfo.operatingSystemVersion
return "macOS \(version.majorVersion).\(version.minorVersion)"
}()
static func getCurrentEnvConfig() -> EnvConfig {
return envConfigs[Self.env]!
}
static func getOptions(networkId: UInt32,
networkDomain: String,
ip: String,
maskLen: UInt8,
accessToken: String,
identityId: UInt32,
hostname: String,
exposedService: NetworkContext.ExposedService?,
exitNodeIp: String?) -> [String: NSObject] {
let envConfig = getCurrentEnvConfig()
let clientId = getClientId()
let mac = getMacAddress()
var options = [
"version": version as NSObject,
"client_id": clientId as NSObject,
"access_token": accessToken as NSObject,
"identity_id": identityId as NSObject,
"server_host": envConfig.serverHost as NSObject,
"stun_assist_host": envConfig.stunAssistHost as NSObject,
"hostname": hostname as NSObject,
"env": Self.env.rawValue as NSObject,
"exposed_service": [
"tcp": (exposedService?.tcp ?? []) as NSObject,
"udp": (exposedService?.udp ?? []) as NSObject
] 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
]
if let exitNodeIp {
options["exit_node_ip"] = exitNodeIp as NSObject
}
return options
}
public static func getClientId() -> String {
let userDefaults = UserDefaults.standard
if let uuid = userDefaults.value(forKey: "gClientId") as? String {
return uuid
} else {
let uuid = UUID().uuidString.replacingOccurrences(of: "-", with: "").lowercased()
userDefaults.setValue(uuid, forKey: "gClientId")
return uuid
}
}
// 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
}
}
public static func macAddressString(mac: Data, separator: String = ":") -> String {
return mac.map { String(format: "%02X", $0) }
.joined(separator: separator)
}
// 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)
}
}