connect网络的时候,增加acl
This commit is contained in:
parent
efe454058e
commit
50dbe9ecae
@ -45,6 +45,13 @@ public class SDLConfiguration {
|
||||
let exitNodeIp: UInt32
|
||||
}
|
||||
|
||||
public struct ACL {
|
||||
let tcpPorts: Set<UInt16>
|
||||
let udpPorts: Set<UInt16>
|
||||
|
||||
static let empty = ACL(tcpPorts: [], udpPorts: [])
|
||||
}
|
||||
|
||||
// 解析的服务器地址信息
|
||||
public struct ResolvedServerEndpoint: Sendable {
|
||||
let host: String
|
||||
@ -66,6 +73,7 @@ public class SDLConfiguration {
|
||||
let hostname: String
|
||||
let accessToken: String
|
||||
let identityId: UInt32
|
||||
let acl: ACL
|
||||
|
||||
var exitNode: ExitNode?
|
||||
|
||||
@ -77,6 +85,7 @@ public class SDLConfiguration {
|
||||
hostname: String,
|
||||
accessToken: String,
|
||||
identityId: UInt32,
|
||||
acl: ACL,
|
||||
exitNode: ExitNode?) {
|
||||
self.version = version
|
||||
self.serverEndpoint = serverEndpoint
|
||||
@ -92,6 +101,7 @@ public class SDLConfiguration {
|
||||
self.networkAddress = networkAddress
|
||||
self.accessToken = accessToken
|
||||
self.identityId = identityId
|
||||
self.acl = acl
|
||||
self.hostname = hostname
|
||||
self.exitNode = exitNode
|
||||
}
|
||||
@ -129,6 +139,7 @@ extension SDLConfiguration {
|
||||
guard let networkAddress = parseNetworkAddress(networkAddressDict) else {
|
||||
return nil
|
||||
}
|
||||
let acl = parseACL(options["acl"])
|
||||
|
||||
// 网络出口配置是可选的
|
||||
var exitNode: ExitNode? = nil
|
||||
@ -149,6 +160,7 @@ extension SDLConfiguration {
|
||||
hostname: hostname,
|
||||
accessToken: accessToken,
|
||||
identityId: identityId,
|
||||
acl: acl,
|
||||
exitNode: exitNode)
|
||||
}
|
||||
|
||||
@ -164,5 +176,49 @@ extension SDLConfiguration {
|
||||
|
||||
return .init(networkId: networkId, ip: ip, maskLen: maskLen, mac: mac, networkDomain: networkDomain)
|
||||
}
|
||||
|
||||
private static func parseACL(_ value: NSObject?) -> SDLConfiguration.ACL {
|
||||
guard let dict = value as? [String: NSObject] else {
|
||||
return .empty
|
||||
}
|
||||
|
||||
return .init(
|
||||
tcpPorts: parsePortSet(dict["tcp"]),
|
||||
udpPorts: parsePortSet(dict["udp"])
|
||||
)
|
||||
}
|
||||
|
||||
private static func parsePortSet(_ value: NSObject?) -> Set<UInt16> {
|
||||
let ports: [UInt32]
|
||||
if let values = value as? [UInt32] {
|
||||
ports = values
|
||||
} else if let values = value as? [Int] {
|
||||
ports = values.compactMap { $0 >= 0 ? UInt32($0) : nil }
|
||||
} else if let values = value as? [NSNumber] {
|
||||
ports = values.map(\.uint32Value)
|
||||
} else if let values = value as? NSArray {
|
||||
ports = values.compactMap { item in
|
||||
if let value = item as? UInt32 {
|
||||
return value
|
||||
}
|
||||
if let value = item as? Int, value >= 0 {
|
||||
return UInt32(value)
|
||||
}
|
||||
if let value = item as? NSNumber {
|
||||
return value.uint32Value
|
||||
}
|
||||
return nil
|
||||
}
|
||||
} else {
|
||||
ports = []
|
||||
}
|
||||
|
||||
return Set(ports.compactMap { port in
|
||||
guard port > 0, port <= UInt32(UInt16.max) else {
|
||||
return nil
|
||||
}
|
||||
return UInt16(port)
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -144,6 +144,7 @@ class AppContext {
|
||||
accessToken: session.accessToken,
|
||||
identityId: context.identityId,
|
||||
hostname: context.hostname,
|
||||
acl: context.acl,
|
||||
exitNodeIp: self.selectedExitNodeIp
|
||||
)
|
||||
try await self.vpnManager.enableVpn(options: options)
|
||||
|
||||
@ -36,6 +36,7 @@ struct SystemConfig {
|
||||
accessToken: String,
|
||||
identityId: UInt32,
|
||||
hostname: String,
|
||||
acl: NetworkContext.ACL,
|
||||
exitNodeIp: String?) -> [String: NSObject] {
|
||||
// guard let serverIp = DNSResolver.resolveAddrInfos(serverHost).first,
|
||||
// let stunAssistIp = DNSResolver.resolveAddrInfos(stunAssistHost).first else {
|
||||
@ -53,6 +54,10 @@ struct SystemConfig {
|
||||
"server_host": serverHost as NSObject,
|
||||
"stun_assist_host": stunAssistHost as NSObject,
|
||||
"hostname": hostname as NSObject,
|
||||
"acl": [
|
||||
"tcp": acl.tcp as NSObject,
|
||||
"udp": acl.udp as NSObject
|
||||
] as NSObject,
|
||||
"network_address": [
|
||||
"network_id": networkId as NSObject,
|
||||
"ip": ip as NSObject,
|
||||
|
||||
@ -15,6 +15,7 @@ struct NetworkContext: Codable {
|
||||
let identityId: UInt32
|
||||
let resourceList: [Resource]
|
||||
let nodeList: [Node]
|
||||
let acl: ACL
|
||||
let exitNodeList: [ExitNode]
|
||||
|
||||
enum CodingKeys: String, CodingKey {
|
||||
@ -24,6 +25,7 @@ struct NetworkContext: Codable {
|
||||
case identityId = "identity_id"
|
||||
case resourceList = "resource_list"
|
||||
case nodeList = "node_list"
|
||||
case acl = "acl"
|
||||
case exitNodeList = "exit_node"
|
||||
}
|
||||
|
||||
@ -38,6 +40,11 @@ struct NetworkContext: Codable {
|
||||
|
||||
extension NetworkContext {
|
||||
|
||||
struct ACL: Codable {
|
||||
let tcp: [UInt32]
|
||||
let udp: [UInt32]
|
||||
}
|
||||
|
||||
struct ExitNode: Codable {
|
||||
let uuid = UUID().uuidString
|
||||
let nnid: Int
|
||||
|
||||
@ -47,7 +47,7 @@ struct SDLAPIClient {
|
||||
|
||||
let (data, _) = try await session.data(for: request)
|
||||
if let response = String(bytes: data, encoding: .utf8) {
|
||||
NSLog("url: \(url.absoluteString), response is: \(response)")
|
||||
print("url: \(url.absoluteString), reqeust data: \(String(data: postData, encoding: .utf8)!), response is: \(response)")
|
||||
}
|
||||
|
||||
let apiResponse = try JSONDecoder().decode(SDLAPIResponse<T>.self, from: data)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user