Init commit

This commit is contained in:
世界
2023-07-15 15:03:45 +08:00
commit f441b89efb
122 changed files with 7355 additions and 0 deletions
+70
View File
@@ -0,0 +1,70 @@
import Foundation
import NetworkExtension
public class ExtensionProfile: ObservableObject {
private let manager: NEVPNManager
private var connection: NEVPNConnection
private var observer: Any?
@Published public var status: NEVPNStatus
public init(_ manager: NEVPNManager) {
self.manager = manager
connection = manager.connection
status = manager.connection.status
}
deinit {
unregister()
}
public func register() {
observer = NotificationCenter.default.addObserver(
forName: NSNotification.Name.NEVPNStatusDidChange,
object: manager.connection,
queue: .main
) { [weak self] notification in
guard let self else {
return
}
self.connection = notification.object as! NEVPNConnection
self.status = self.connection.status
}
}
private func unregister() {
if let observer {
NotificationCenter.default.removeObserver(observer)
}
}
public func start() async throws {
manager.isEnabled = true
try await manager.saveToPreferences()
try manager.connection.startVPNTunnel()
}
public func stop() {
manager.connection.stopVPNTunnel()
}
public static func load() async throws -> ExtensionProfile? {
let managers = try await NETunnelProviderManager.loadAllFromPreferences()
if managers.isEmpty {
return nil
}
let profile = ExtensionProfile(managers[0])
return profile
}
public static func install() async throws {
let manager = NETunnelProviderManager()
manager.localizedDescription = "utun interface"
let tunnelProtocol = NETunnelProviderProtocol()
tunnelProtocol.providerBundleIdentifier = "\(FilePath.packageName).extension"
tunnelProtocol.serverAddress = "sing-box"
manager.protocolConfiguration = tunnelProtocol
manager.isEnabled = true
try await manager.saveToPreferences()
}
}
+40
View File
@@ -0,0 +1,40 @@
import Foundation
import Libbox
public class HTTPClient {
private static var userAgent: String {
var userAgent = FilePath.httpClientName
userAgent += "/"
userAgent += Bundle.main.version
userAgent += " (Build "
userAgent += Bundle.main.versionNumber
userAgent += "; sing-box "
userAgent += LibboxVersion()
userAgent += ")"
return userAgent
}
private let client: any LibboxHTTPClientProtocol
public init() {
client = LibboxNewHTTPClient()!
client.modernTLS()
}
public func getString(_ url: String?) throws -> String {
let request = client.newRequest()!
request.setUserAgent(HTTPClient.userAgent)
try request.setURL(url)
let response = try request.execute()
var error: NSError?
let contentString = response.getContentString(&error)
if let error {
throw error
}
return contentString
}
deinit {
client.close()
}
}
@@ -0,0 +1,40 @@
import Foundation
import NetworkExtension
public extension NEVPNStatus {
var isEnabled: Bool {
switch self {
case .connected, .disconnected, .reasserting:
return true
default:
return false
}
}
var isSwitchable: Bool {
switch self {
case .connected, .disconnected:
return true
default:
return false
}
}
var isConnected: Bool {
switch self {
case .connecting, .connected, .disconnecting, .reasserting:
return true
default:
return false
}
}
var isConnectedStrict: Bool {
switch self {
case .connected, .reasserting:
return true
default:
return false
}
}
}