parent
df549d48e6
commit
abf1101484
43 changed files with 988 additions and 325 deletions
|
|
@ -5,10 +5,14 @@ import os
|
|||
|
||||
class PacketTunnelProvider: NEPacketTunnelProvider {
|
||||
private let logger = Logger.logger(for: PacketTunnelProvider.self)
|
||||
private var client: Client?
|
||||
|
||||
override init() {
|
||||
do {
|
||||
libburrow.spawnInProcess(socketPath: try Constants.socketURL.path)
|
||||
libburrow.spawnInProcess(
|
||||
socketPath: try Constants.socketURL.path(percentEncoded: false),
|
||||
dbPath: try Constants.dbURL.path(percentEncoded: false)
|
||||
)
|
||||
} catch {
|
||||
logger.error("Failed to spawn: \(error)")
|
||||
}
|
||||
|
|
@ -17,33 +21,17 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
|
|||
override func startTunnel(options: [String: NSObject]? = nil) async throws {
|
||||
do {
|
||||
let client = try Client()
|
||||
self.client = client
|
||||
register_events(client)
|
||||
|
||||
let command = BurrowRequest(id: 0, command: "ServerConfig")
|
||||
let data = try await client.request(command, type: Response<BurrowResult<ServerConfigData>>.self)
|
||||
|
||||
let encoded = try JSONEncoder().encode(data.result)
|
||||
self.logger.log("Received final data: \(String(decoding: encoded, as: UTF8.self))")
|
||||
guard let serverconfig = data.result.Ok else {
|
||||
throw BurrowError.resultIsError
|
||||
}
|
||||
guard let tunNs = generateTunSettings(from: serverconfig) else {
|
||||
throw BurrowError.addrDoesntExist
|
||||
}
|
||||
try await self.setTunnelNetworkSettings(tunNs)
|
||||
self.logger.info("Set remote tunnel address to \(tunNs.tunnelRemoteAddress)")
|
||||
|
||||
let startRequest = BurrowRequest(
|
||||
id: .random(in: (.min)..<(.max)),
|
||||
command: BurrowStartRequest(
|
||||
Start: BurrowStartRequest.StartOptions(
|
||||
tun: BurrowStartRequest.TunOptions(
|
||||
name: nil, no_pi: false, tun_excl: false, tun_retrieve: true, address: []
|
||||
)
|
||||
)
|
||||
_ = try await self.loadTunSettings()
|
||||
let startRequest = Start(
|
||||
tun: Start.TunOptions(
|
||||
name: nil, no_pi: false, tun_excl: false, tun_retrieve: true, address: []
|
||||
)
|
||||
)
|
||||
let response = try await client.request(startRequest, type: Response<BurrowResult<String>>.self)
|
||||
self.logger.log("Received start server response: \(String(describing: response.result))")
|
||||
let response = try await client.request(startRequest, type: BurrowResult<AnyResponseData>.self)
|
||||
self.logger.log("Received start server response: \(String(describing: response))")
|
||||
} catch {
|
||||
self.logger.error("Failed to start tunnel: \(error)")
|
||||
throw error
|
||||
|
|
@ -53,20 +41,33 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
|
|||
override func stopTunnel(with reason: NEProviderStopReason) async {
|
||||
do {
|
||||
let client = try Client()
|
||||
let command = BurrowRequest(id: 0, command: "Stop")
|
||||
let data = try await client.request(command, type: Response<BurrowResult<String>>.self)
|
||||
_ = try await client.single_request("Stop", type: BurrowResult<AnyResponseData>.self)
|
||||
self.logger.log("Stopped client.")
|
||||
} catch {
|
||||
self.logger.error("Failed to stop tunnel: \(error)")
|
||||
}
|
||||
}
|
||||
|
||||
private func generateTunSettings(from: ServerConfigData) -> NETunnelNetworkSettings? {
|
||||
let cfig = from.ServerConfig
|
||||
func loadTunSettings() async throws -> ServerConfig {
|
||||
guard let client = self.client else {
|
||||
throw BurrowError.noClient
|
||||
}
|
||||
let srvConfig = try await client.single_request("ServerConfig", type: BurrowResult<ServerConfig>.self)
|
||||
guard let serverconfig = srvConfig.Ok else {
|
||||
throw BurrowError.resultIsError
|
||||
}
|
||||
guard let tunNs = generateTunSettings(from: serverconfig) else {
|
||||
throw BurrowError.addrDoesntExist
|
||||
}
|
||||
try await self.setTunnelNetworkSettings(tunNs)
|
||||
self.logger.info("Set remote tunnel address to \(tunNs.tunnelRemoteAddress)")
|
||||
return serverconfig
|
||||
}
|
||||
private func generateTunSettings(from: ServerConfig) -> NETunnelNetworkSettings? {
|
||||
// Using a makeshift remote tunnel address
|
||||
let nst = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "1.1.1.1")
|
||||
var v4Addresses = [String]()
|
||||
var v6Addresses = [String]()
|
||||
for addr in cfig.address {
|
||||
for addr in from.address {
|
||||
if IPv4Address(addr) != nil {
|
||||
v6Addresses.append(addr)
|
||||
}
|
||||
|
|
@ -81,4 +82,11 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
|
|||
logger.log("Initialized ipv4 settings: \(nst.ipv4Settings)")
|
||||
return nst
|
||||
}
|
||||
func register_events(_ client: Client) {
|
||||
client.on_event(.ConfigChange) { (cfig: ServerConfig) in
|
||||
self.logger.info("Config Change Notification: \(String(describing: cfig))")
|
||||
self.setTunnelNetworkSettings(self.generateTunSettings(from: cfig))
|
||||
self.logger.info("Updated Tunnel Network Settings.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue