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