Fixe file/function related warnings.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
parent
cd6c9a1203
commit
a55eefcd5d
|
@ -34,6 +34,11 @@
|
||||||
4A4BAD2320B6026900F12B28 /* Interface+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A4BAD1F20B6026900F12B28 /* Interface+CoreDataClass.swift */; };
|
4A4BAD2320B6026900F12B28 /* Interface+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A4BAD1F20B6026900F12B28 /* Interface+CoreDataClass.swift */; };
|
||||||
4A61D82E20D98CE2006C7A76 /* WireGuardNetworkExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 4A61D82620D98CE1006C7A76 /* WireGuardNetworkExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
4A61D82E20D98CE2006C7A76 /* WireGuardNetworkExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 4A61D82620D98CE1006C7A76 /* WireGuardNetworkExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||||
4A61D83520D98D25006C7A76 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A61D83420D98D25006C7A76 /* NetworkExtension.framework */; };
|
4A61D83520D98D25006C7A76 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A61D83420D98D25006C7A76 /* NetworkExtension.framework */; };
|
||||||
|
4A8A2296215B77D300736141 /* AppCoordinator+QRScanViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A8A2295215B77D300736141 /* AppCoordinator+QRScanViewControllerDelegate.swift */; };
|
||||||
|
4A8A2298215B780600736141 /* AppCoordinator+SettingsTableViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A8A2297215B780600736141 /* AppCoordinator+SettingsTableViewControllerDelegate.swift */; };
|
||||||
|
4A8A229A215B782E00736141 /* AppCoordinator+TunnelConfigurationTableViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A8A2299215B782D00736141 /* AppCoordinator+TunnelConfigurationTableViewControllerDelegate.swift */; };
|
||||||
|
4A8A229C215B787E00736141 /* AppCoordinator+TunnelsTableViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A8A229B215B787E00736141 /* AppCoordinator+TunnelsTableViewControllerDelegate.swift */; };
|
||||||
|
4A8A229E215B793C00736141 /* AppCoordinator+TunnelInfoTableViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A8A229D215B793C00736141 /* AppCoordinator+TunnelInfoTableViewControllerDelegate.swift */; };
|
||||||
4A8AABD820B6A79100B6D8C1 /* UITableView+WireGuard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A8AABD720B6A79100B6D8C1 /* UITableView+WireGuard.swift */; };
|
4A8AABD820B6A79100B6D8C1 /* UITableView+WireGuard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A8AABD720B6A79100B6D8C1 /* UITableView+WireGuard.swift */; };
|
||||||
4AADEA2B212616F7008C24FD /* String+Arrays.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FA1D50F2124D80C00DBA2E6 /* String+Arrays.swift */; };
|
4AADEA2B212616F7008C24FD /* String+Arrays.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FA1D50F2124D80C00DBA2E6 /* String+Arrays.swift */; };
|
||||||
4ABF718E214D8B0300A1E0BF /* TunnelInfoTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ABF718D214D8B0300A1E0BF /* TunnelInfoTableViewController.swift */; };
|
4ABF718E214D8B0300A1E0BF /* TunnelInfoTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ABF718D214D8B0300A1E0BF /* TunnelInfoTableViewController.swift */; };
|
||||||
|
@ -123,6 +128,11 @@
|
||||||
4A61D82B20D98CE2006C7A76 /* WireGuardNetworkExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WireGuardNetworkExtension.entitlements; sourceTree = "<group>"; };
|
4A61D82B20D98CE2006C7A76 /* WireGuardNetworkExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WireGuardNetworkExtension.entitlements; sourceTree = "<group>"; };
|
||||||
4A61D83320D98D07006C7A76 /* WireGuard.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WireGuard.entitlements; sourceTree = "<group>"; };
|
4A61D83320D98D07006C7A76 /* WireGuard.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WireGuard.entitlements; sourceTree = "<group>"; };
|
||||||
4A61D83420D98D25006C7A76 /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; };
|
4A61D83420D98D25006C7A76 /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; };
|
||||||
|
4A8A2295215B77D300736141 /* AppCoordinator+QRScanViewControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppCoordinator+QRScanViewControllerDelegate.swift"; sourceTree = "<group>"; };
|
||||||
|
4A8A2297215B780600736141 /* AppCoordinator+SettingsTableViewControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppCoordinator+SettingsTableViewControllerDelegate.swift"; sourceTree = "<group>"; };
|
||||||
|
4A8A2299215B782D00736141 /* AppCoordinator+TunnelConfigurationTableViewControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppCoordinator+TunnelConfigurationTableViewControllerDelegate.swift"; sourceTree = "<group>"; };
|
||||||
|
4A8A229B215B787E00736141 /* AppCoordinator+TunnelsTableViewControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppCoordinator+TunnelsTableViewControllerDelegate.swift"; sourceTree = "<group>"; };
|
||||||
|
4A8A229D215B793C00736141 /* AppCoordinator+TunnelInfoTableViewControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppCoordinator+TunnelInfoTableViewControllerDelegate.swift"; sourceTree = "<group>"; };
|
||||||
4A8AABD720B6A79100B6D8C1 /* UITableView+WireGuard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableView+WireGuard.swift"; sourceTree = "<group>"; };
|
4A8AABD720B6A79100B6D8C1 /* UITableView+WireGuard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableView+WireGuard.swift"; sourceTree = "<group>"; };
|
||||||
4ABF718D214D8B0300A1E0BF /* TunnelInfoTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelInfoTableViewController.swift; sourceTree = "<group>"; };
|
4ABF718D214D8B0300A1E0BF /* TunnelInfoTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelInfoTableViewController.swift; sourceTree = "<group>"; };
|
||||||
4ABFFE9D212D399F00107136 /* WireGuard-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WireGuard-Bridging-Header.h"; sourceTree = "<group>"; };
|
4ABFFE9D212D399F00107136 /* WireGuard-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WireGuard-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||||
|
@ -248,6 +258,11 @@
|
||||||
4A4BAD0D20B5F6C300F12B28 /* Coordinator.swift */,
|
4A4BAD0D20B5F6C300F12B28 /* Coordinator.swift */,
|
||||||
4A4BAD0F20B5F6EC00F12B28 /* RootCoordinator.swift */,
|
4A4BAD0F20B5F6EC00F12B28 /* RootCoordinator.swift */,
|
||||||
4A4BAD0B20B5F6AA00F12B28 /* AppCoordinator.swift */,
|
4A4BAD0B20B5F6AA00F12B28 /* AppCoordinator.swift */,
|
||||||
|
4A8A229D215B793C00736141 /* AppCoordinator+TunnelInfoTableViewControllerDelegate.swift */,
|
||||||
|
4A8A229B215B787E00736141 /* AppCoordinator+TunnelsTableViewControllerDelegate.swift */,
|
||||||
|
4A8A2295215B77D300736141 /* AppCoordinator+QRScanViewControllerDelegate.swift */,
|
||||||
|
4A8A2297215B780600736141 /* AppCoordinator+SettingsTableViewControllerDelegate.swift */,
|
||||||
|
4A8A2299215B782D00736141 /* AppCoordinator+TunnelConfigurationTableViewControllerDelegate.swift */,
|
||||||
);
|
);
|
||||||
path = Coordinators;
|
path = Coordinators;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -585,16 +600,21 @@
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
4A8A229A215B782E00736141 /* AppCoordinator+TunnelConfigurationTableViewControllerDelegate.swift in Sources */,
|
||||||
4A4BAD0C20B5F6AA00F12B28 /* AppCoordinator.swift in Sources */,
|
4A4BAD0C20B5F6AA00F12B28 /* AppCoordinator.swift in Sources */,
|
||||||
4A4BAD2220B6026900F12B28 /* Interface+CoreDataProperties.swift in Sources */,
|
4A4BAD2220B6026900F12B28 /* Interface+CoreDataProperties.swift in Sources */,
|
||||||
|
4A8A2298215B780600736141 /* AppCoordinator+SettingsTableViewControllerDelegate.swift in Sources */,
|
||||||
4AEAC32B20F14BA9007B67AB /* Log.swift in Sources */,
|
4AEAC32B20F14BA9007B67AB /* Log.swift in Sources */,
|
||||||
|
4A8A229E215B793C00736141 /* AppCoordinator+TunnelInfoTableViewControllerDelegate.swift in Sources */,
|
||||||
4A4BAD1320B5F82400F12B28 /* Identifyable.swift in Sources */,
|
4A4BAD1320B5F82400F12B28 /* Identifyable.swift in Sources */,
|
||||||
4A4BAD1720B5F8DE00F12B28 /* WireGuard.xcdatamodeld in Sources */,
|
4A4BAD1720B5F8DE00F12B28 /* WireGuard.xcdatamodeld in Sources */,
|
||||||
5FCC4347212B3E2C009A9C58 /* Attribute.swift in Sources */,
|
5FCC4347212B3E2C009A9C58 /* Attribute.swift in Sources */,
|
||||||
4A4BAD1A20B5F8FF00F12B28 /* Tunnel+CoreDataClass.swift in Sources */,
|
4A4BAD1A20B5F8FF00F12B28 /* Tunnel+CoreDataClass.swift in Sources */,
|
||||||
4A4BACE820B5F1BF00F12B28 /* TunnelsTableViewController.swift in Sources */,
|
4A4BACE820B5F1BF00F12B28 /* TunnelsTableViewController.swift in Sources */,
|
||||||
4A4BAD1020B5F6EC00F12B28 /* RootCoordinator.swift in Sources */,
|
4A4BAD1020B5F6EC00F12B28 /* RootCoordinator.swift in Sources */,
|
||||||
|
4A8A2296215B77D300736141 /* AppCoordinator+QRScanViewControllerDelegate.swift in Sources */,
|
||||||
4A4351592124956200261999 /* Validators.swift in Sources */,
|
4A4351592124956200261999 /* Validators.swift in Sources */,
|
||||||
|
4A8A229C215B787E00736141 /* AppCoordinator+TunnelsTableViewControllerDelegate.swift in Sources */,
|
||||||
5FA1D4CB21249F7D00DBA2E6 /* Peer+Extension.swift in Sources */,
|
5FA1D4CB21249F7D00DBA2E6 /* Peer+Extension.swift in Sources */,
|
||||||
5FA1D5122124DA6400DBA2E6 /* String+Base64.swift in Sources */,
|
5FA1D5122124DA6400DBA2E6 /* String+Base64.swift in Sources */,
|
||||||
4AC5462E2116306F00749D21 /* Tunnel+Extension.swift in Sources */,
|
4AC5462E2116306F00749D21 /* Tunnel+Extension.swift in Sources */,
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
//
|
||||||
|
// Copyright © 2018 WireGuard LLC. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
extension AppCoordinator: QRScanViewControllerDelegate {
|
||||||
|
func didSave(tunnel: Tunnel, qrScanViewController: QRScanViewController) {
|
||||||
|
qrScanViewController.navigationController?.popViewController(animated: true)
|
||||||
|
showTunnelInfoViewController(tunnel: tunnel, context: tunnel.managedObjectContext!)
|
||||||
|
}
|
||||||
|
|
||||||
|
func didCancel(qrScanViewController: QRScanViewController) {
|
||||||
|
qrScanViewController.navigationController?.popViewController(animated: true)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
//
|
||||||
|
// Copyright © 2018 WireGuard LLC. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
import PromiseKit
|
||||||
|
import NetworkExtension
|
||||||
|
|
||||||
|
enum GoVersionCoordinatorError: Error {
|
||||||
|
case noSession
|
||||||
|
}
|
||||||
|
|
||||||
|
extension AppCoordinator: SettingsTableViewControllerDelegate {
|
||||||
|
func exportTunnels(settingsTableViewController: SettingsTableViewController, sourceView: UIView) {
|
||||||
|
self.exportConfigs(sourceView: sourceView)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
//
|
||||||
|
// Copyright © 2018 WireGuard LLC. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
extension AppCoordinator: TunnelConfigurationTableViewControllerDelegate {
|
||||||
|
func didSave(tunnel: Tunnel, tunnelConfigurationTableViewController: TunnelConfigurationTableViewController) {
|
||||||
|
saveTunnel(tunnel)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
//
|
||||||
|
// Copyright © 2018 WireGuard LLC. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
extension AppCoordinator: TunnelInfoTableViewControllerDelegate {
|
||||||
|
func configure(tunnel: Tunnel, tunnelInfoTableViewController: TunnelInfoTableViewController) {
|
||||||
|
print("configure tunnel \(tunnel)")
|
||||||
|
let editContext = persistentContainer.newBackgroundContext()
|
||||||
|
var backgroundTunnel: Tunnel?
|
||||||
|
editContext.performAndWait {
|
||||||
|
backgroundTunnel = editContext.object(with: tunnel.objectID) as? Tunnel
|
||||||
|
}
|
||||||
|
|
||||||
|
showTunnelConfigurationViewController(tunnel: backgroundTunnel, context: editContext)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,196 @@
|
||||||
|
//
|
||||||
|
// Copyright © 2018 WireGuard LLC. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
import NetworkExtension
|
||||||
|
import os.log
|
||||||
|
|
||||||
|
import MobileCoreServices
|
||||||
|
|
||||||
|
import ZIPFoundation
|
||||||
|
import PromiseKit
|
||||||
|
|
||||||
|
extension AppCoordinator: TunnelsTableViewControllerDelegate {
|
||||||
|
func status(for tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) -> NEVPNStatus {
|
||||||
|
let session = self.providerManager(for: tunnel)?.connection as? NETunnelProviderSession
|
||||||
|
return session?.status ?? .invalid
|
||||||
|
}
|
||||||
|
|
||||||
|
func addProvider(tunnelsTableViewController: TunnelsTableViewController) {
|
||||||
|
let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
|
||||||
|
actionSheet.addAction(UIAlertAction(title: NSLocalizedString("Create from file or archive", comment: ""), style: .default) { [unowned self] _ in
|
||||||
|
self.addProviderFromFile()
|
||||||
|
})
|
||||||
|
actionSheet.addAction(UIAlertAction(title: NSLocalizedString("Create from QR code", comment: ""), style: .default) { [unowned self] _ in
|
||||||
|
self.addProviderWithQRScan()
|
||||||
|
})
|
||||||
|
actionSheet.addAction(UIAlertAction(title: NSLocalizedString("Create from scratch", comment: ""), style: .default) { [unowned self] _ in
|
||||||
|
self.addProviderManually()
|
||||||
|
})
|
||||||
|
actionSheet.addAction(UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel))
|
||||||
|
|
||||||
|
tunnelsTableViewController.present(actionSheet, animated: true, completion: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func addProviderFromFile() {
|
||||||
|
let documentPickerController = UIDocumentPickerViewController(documentTypes: [String(kUTTypeZipArchive), "com.wireguard.config.quick"], in: .import)
|
||||||
|
documentPickerController.delegate = documentPickerDelegateObject
|
||||||
|
tunnelsTableViewController.present(documentPickerController, animated: true, completion: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func addProviderManually() {
|
||||||
|
let addContext = persistentContainer.newBackgroundContext()
|
||||||
|
showTunnelConfigurationViewController(tunnel: nil, context: addContext)
|
||||||
|
}
|
||||||
|
|
||||||
|
func addProviderWithQRScan() {
|
||||||
|
let addContext = persistentContainer.newBackgroundContext()
|
||||||
|
|
||||||
|
let qrScanViewController = storyboard.instantiateViewController(type: QRScanViewController.self)
|
||||||
|
|
||||||
|
qrScanViewController.configure(context: addContext, delegate: self)
|
||||||
|
|
||||||
|
self.navigationController.pushViewController(qrScanViewController, animated: true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func connect(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) {
|
||||||
|
_ = refreshProviderManagers().then { () -> Promise<Void> in
|
||||||
|
let manager = self.providerManager(for: tunnel)!
|
||||||
|
let block = {
|
||||||
|
switch manager.connection.status {
|
||||||
|
case .invalid, .disconnected:
|
||||||
|
self.connect(tunnel: tunnel)
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if manager.connection.status == .invalid {
|
||||||
|
manager.loadFromPreferences { (_) in
|
||||||
|
block()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
block()
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.value(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func disconnect(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) {
|
||||||
|
_ = refreshProviderManagers().then { () -> Promise<Void> in
|
||||||
|
let manager = self.providerManager(for: tunnel)!
|
||||||
|
let block = {
|
||||||
|
switch manager.connection.status {
|
||||||
|
case .connected, .connecting:
|
||||||
|
self.disconnect(tunnel: tunnel)
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if manager.connection.status == .invalid {
|
||||||
|
manager.loadFromPreferences { (_) in
|
||||||
|
block()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
block()
|
||||||
|
}
|
||||||
|
return Promise.value(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func connect(tunnel: Tunnel) {
|
||||||
|
os_log("connect tunnel: %{public}@", log: Log.general, type: .info, tunnel.description)
|
||||||
|
// Should the manager be enabled?
|
||||||
|
|
||||||
|
let manager = providerManager(for: tunnel)
|
||||||
|
manager?.isEnabled = true
|
||||||
|
manager?.saveToPreferences { (error) in
|
||||||
|
if let error = error {
|
||||||
|
os_log("error saving preferences: %{public}@", log: Log.general, type: .error, error.localizedDescription)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
os_log("saved preferences", log: Log.general, type: .info)
|
||||||
|
|
||||||
|
let session = manager?.connection as! NETunnelProviderSession //swiftlint:disable:this force_cast
|
||||||
|
do {
|
||||||
|
try session.startTunnel()
|
||||||
|
} catch let error {
|
||||||
|
os_log("error starting tunnel: %{public}@", log: Log.general, type: .error, error.localizedDescription)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func disconnect(tunnel: Tunnel) {
|
||||||
|
let manager = providerManager(for: tunnel)
|
||||||
|
manager?.connection.stopVPNTunnel()
|
||||||
|
}
|
||||||
|
|
||||||
|
func info(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) {
|
||||||
|
print("info tunnel \(tunnel)")
|
||||||
|
|
||||||
|
showTunnelInfoViewController(tunnel: tunnel, context: self.persistentContainer.viewContext)
|
||||||
|
}
|
||||||
|
|
||||||
|
func delete(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) {
|
||||||
|
print("delete tunnel \(tunnel)")
|
||||||
|
|
||||||
|
if let moc = tunnel.managedObjectContext {
|
||||||
|
moc.perform {
|
||||||
|
moc.delete(tunnel)
|
||||||
|
moc.saveContextToStore()
|
||||||
|
}
|
||||||
|
let manager = providerManager(for: tunnel)
|
||||||
|
manager?.removeFromPreferences { (error) in
|
||||||
|
if let error = error {
|
||||||
|
os_log("error removing preferences: %{public}@", log: Log.general, type: .error, error.localizedDescription)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
self.providerManagers?.removeAll { $0 == manager }
|
||||||
|
os_log("removed preferences", log: Log.general, type: .info)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func providerManager(for tunnel: Tunnel) -> NETunnelProviderManager? {
|
||||||
|
return self.providerManagers?.first {
|
||||||
|
guard let prot = $0.protocolConfiguration as? NETunnelProviderProtocol else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
guard let tunnelIdentifier = prot.providerConfiguration?[PCKeys.tunnelIdentifier.rawValue] as? String else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return tunnelIdentifier == tunnel.tunnelIdentifier
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func saveTunnel(_ tunnel: Tunnel) {
|
||||||
|
let manager = providerManager(for: tunnel) ?? NETunnelProviderManager()
|
||||||
|
manager.localizedDescription = tunnel.title
|
||||||
|
|
||||||
|
let protocolConfiguration = NETunnelProviderProtocol()
|
||||||
|
protocolConfiguration.providerBundleIdentifier = VPNBUNDLE
|
||||||
|
protocolConfiguration.serverAddress = (tunnel.peers?.array as? [Peer])?.compactMap { $0.endpoint}.joined(separator: ", ")
|
||||||
|
protocolConfiguration.providerConfiguration = tunnel.generateProviderConfiguration()
|
||||||
|
|
||||||
|
manager.protocolConfiguration = protocolConfiguration
|
||||||
|
let connectRule = NEOnDemandRuleConnect()
|
||||||
|
connectRule.interfaceTypeMatch = .any
|
||||||
|
manager.onDemandRules = [connectRule]
|
||||||
|
|
||||||
|
manager.saveToPreferences { (error) in
|
||||||
|
if let error = error {
|
||||||
|
os_log("error saving preferences: %{public}@", log: Log.general, type: .error, error.localizedDescription)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
os_log("saved preferences", log: Log.general, type: .info)
|
||||||
|
}
|
||||||
|
|
||||||
|
_ = refreshProviderManagers().then { () -> Promise<Void> in
|
||||||
|
self.navigationController.popViewController(animated: true)
|
||||||
|
return Promise.value(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,7 +27,7 @@ class AppCoordinator: RootViewCoordinator {
|
||||||
let persistentContainer = NSPersistentContainer(name: "WireGuard")
|
let persistentContainer = NSPersistentContainer(name: "WireGuard")
|
||||||
let storyboard = UIStoryboard(name: "Main", bundle: nil)
|
let storyboard = UIStoryboard(name: "Main", bundle: nil)
|
||||||
var providerManagers: [NETunnelProviderManager]?
|
var providerManagers: [NETunnelProviderManager]?
|
||||||
private let documentPickerDelegate: AppDocumentPickerDelegate
|
let documentPickerDelegateObject: AppDocumentPickerDelegate
|
||||||
|
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
|
|
||||||
|
@ -54,8 +54,8 @@ class AppCoordinator: RootViewCoordinator {
|
||||||
self.window.rootViewController = self.navigationController
|
self.window.rootViewController = self.navigationController
|
||||||
self.window.makeKeyAndVisible()
|
self.window.makeKeyAndVisible()
|
||||||
|
|
||||||
documentPickerDelegate = AppDocumentPickerDelegate()
|
documentPickerDelegateObject = AppDocumentPickerDelegate()
|
||||||
documentPickerDelegate.appCoordinator = self
|
documentPickerDelegateObject.appCoordinator = self
|
||||||
|
|
||||||
NotificationCenter.default.addObserver(self,
|
NotificationCenter.default.addObserver(self,
|
||||||
selector: #selector(VPNStatusDidChange(notification:)),
|
selector: #selector(VPNStatusDidChange(notification:)),
|
||||||
|
@ -315,227 +315,6 @@ class AppCoordinator: RootViewCoordinator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension AppCoordinator: TunnelInfoTableViewControllerDelegate {
|
|
||||||
func configure(tunnel: Tunnel, tunnelInfoTableViewController: TunnelInfoTableViewController) {
|
|
||||||
print("configure tunnel \(tunnel)")
|
|
||||||
let editContext = persistentContainer.newBackgroundContext()
|
|
||||||
var backgroundTunnel: Tunnel?
|
|
||||||
editContext.performAndWait {
|
|
||||||
backgroundTunnel = editContext.object(with: tunnel.objectID) as? Tunnel
|
|
||||||
}
|
|
||||||
|
|
||||||
showTunnelConfigurationViewController(tunnel: backgroundTunnel, context: editContext)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
extension AppCoordinator: TunnelsTableViewControllerDelegate {
|
|
||||||
func status(for tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) -> NEVPNStatus {
|
|
||||||
let session = self.providerManager(for: tunnel)?.connection as? NETunnelProviderSession
|
|
||||||
return session?.status ?? .invalid
|
|
||||||
}
|
|
||||||
|
|
||||||
func addProvider(tunnelsTableViewController: TunnelsTableViewController) {
|
|
||||||
let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
|
|
||||||
actionSheet.addAction(UIAlertAction(title: NSLocalizedString("Add from File", comment: ""), style: .default) { [unowned self] _ in
|
|
||||||
self.addProviderFromFile()
|
|
||||||
})
|
|
||||||
actionSheet.addAction(UIAlertAction(title: NSLocalizedString("Add Manually", comment: ""), style: .default) { [unowned self] _ in
|
|
||||||
self.addProviderManually()
|
|
||||||
})
|
|
||||||
actionSheet.addAction(UIAlertAction(title: NSLocalizedString("Scan QR Code", comment: ""), style: .default) { [unowned self] _ in
|
|
||||||
self.addProviderWithQRScan()
|
|
||||||
})
|
|
||||||
actionSheet.addAction(UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel))
|
|
||||||
|
|
||||||
tunnelsTableViewController.present(actionSheet, animated: true, completion: nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func addProviderFromFile() {
|
|
||||||
let documentPickerController = UIDocumentPickerViewController(documentTypes: [String(kUTTypeZipArchive), "com.wireguard.config.quick"], in: .import)
|
|
||||||
documentPickerController.delegate = documentPickerDelegate
|
|
||||||
tunnelsTableViewController.present(documentPickerController, animated: true, completion: nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func addProviderManually() {
|
|
||||||
let addContext = persistentContainer.newBackgroundContext()
|
|
||||||
showTunnelConfigurationViewController(tunnel: nil, context: addContext)
|
|
||||||
}
|
|
||||||
|
|
||||||
func addProviderWithQRScan() {
|
|
||||||
let addContext = persistentContainer.newBackgroundContext()
|
|
||||||
|
|
||||||
let qrScanViewController = storyboard.instantiateViewController(type: QRScanViewController.self)
|
|
||||||
|
|
||||||
qrScanViewController.configure(context: addContext, delegate: self)
|
|
||||||
|
|
||||||
self.navigationController.pushViewController(qrScanViewController, animated: true)
|
|
||||||
}
|
|
||||||
|
|
||||||
func connect(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) {
|
|
||||||
_ = refreshProviderManagers().then { () -> Promise<Void> in
|
|
||||||
let manager = self.providerManager(for: tunnel)!
|
|
||||||
let block = {
|
|
||||||
switch manager.connection.status {
|
|
||||||
case .invalid, .disconnected:
|
|
||||||
self.connect(tunnel: tunnel)
|
|
||||||
default:
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if manager.connection.status == .invalid {
|
|
||||||
manager.loadFromPreferences { (_) in
|
|
||||||
block()
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
block()
|
|
||||||
}
|
|
||||||
|
|
||||||
return Promise.value(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func disconnect(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) {
|
|
||||||
_ = refreshProviderManagers().then { () -> Promise<Void> in
|
|
||||||
let manager = self.providerManager(for: tunnel)!
|
|
||||||
let block = {
|
|
||||||
switch manager.connection.status {
|
|
||||||
case .connected, .connecting:
|
|
||||||
self.disconnect(tunnel: tunnel)
|
|
||||||
default:
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if manager.connection.status == .invalid {
|
|
||||||
manager.loadFromPreferences { (_) in
|
|
||||||
block()
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
block()
|
|
||||||
}
|
|
||||||
return Promise.value(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func connect(tunnel: Tunnel) {
|
|
||||||
os_log("connect tunnel: %{public}@", log: Log.general, type: .info, tunnel.description)
|
|
||||||
// Should the manager be enabled?
|
|
||||||
|
|
||||||
let manager = providerManager(for: tunnel)
|
|
||||||
manager?.isEnabled = true
|
|
||||||
manager?.saveToPreferences { (error) in
|
|
||||||
if let error = error {
|
|
||||||
os_log("error saving preferences: %{public}@", log: Log.general, type: .error, error.localizedDescription)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
os_log("saved preferences", log: Log.general, type: .info)
|
|
||||||
|
|
||||||
let session = manager?.connection as! NETunnelProviderSession //swiftlint:disable:this force_cast
|
|
||||||
do {
|
|
||||||
try session.startTunnel()
|
|
||||||
} catch let error {
|
|
||||||
os_log("error starting tunnel: %{public}@", log: Log.general, type: .error, error.localizedDescription)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func disconnect(tunnel: Tunnel) {
|
|
||||||
let manager = providerManager(for: tunnel)
|
|
||||||
manager?.connection.stopVPNTunnel()
|
|
||||||
}
|
|
||||||
|
|
||||||
func info(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) {
|
|
||||||
print("info tunnel \(tunnel)")
|
|
||||||
|
|
||||||
showTunnelInfoViewController(tunnel: tunnel, context: self.persistentContainer.viewContext)
|
|
||||||
}
|
|
||||||
|
|
||||||
func delete(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) {
|
|
||||||
print("delete tunnel \(tunnel)")
|
|
||||||
|
|
||||||
if let moc = tunnel.managedObjectContext {
|
|
||||||
moc.perform {
|
|
||||||
moc.delete(tunnel)
|
|
||||||
moc.saveContextToStore()
|
|
||||||
}
|
|
||||||
let manager = providerManager(for: tunnel)
|
|
||||||
manager?.removeFromPreferences { (error) in
|
|
||||||
if let error = error {
|
|
||||||
os_log("error removing preferences: %{public}@", log: Log.general, type: .error, error.localizedDescription)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
self.providerManagers?.removeAll { $0 == manager }
|
|
||||||
os_log("removed preferences", log: Log.general, type: .info)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func providerManager(for tunnel: Tunnel) -> NETunnelProviderManager? {
|
|
||||||
return self.providerManagers?.first {
|
|
||||||
guard let prot = $0.protocolConfiguration as? NETunnelProviderProtocol else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
guard let tunnelIdentifier = prot.providerConfiguration?[PCKeys.tunnelIdentifier.rawValue] as? String else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return tunnelIdentifier == tunnel.tunnelIdentifier
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func saveTunnel(_ tunnel: Tunnel) {
|
|
||||||
let manager = providerManager(for: tunnel) ?? NETunnelProviderManager()
|
|
||||||
manager.localizedDescription = tunnel.title
|
|
||||||
|
|
||||||
let protocolConfiguration = NETunnelProviderProtocol()
|
|
||||||
protocolConfiguration.providerBundleIdentifier = VPNBUNDLE
|
|
||||||
protocolConfiguration.serverAddress = (tunnel.peers?.array as? [Peer])?.compactMap { $0.endpoint}.joined(separator: ", ")
|
|
||||||
protocolConfiguration.providerConfiguration = tunnel.generateProviderConfiguration()
|
|
||||||
|
|
||||||
manager.protocolConfiguration = protocolConfiguration
|
|
||||||
let connectRule = NEOnDemandRuleConnect()
|
|
||||||
connectRule.interfaceTypeMatch = .any
|
|
||||||
manager.onDemandRules = [connectRule]
|
|
||||||
|
|
||||||
manager.saveToPreferences { (error) in
|
|
||||||
if let error = error {
|
|
||||||
os_log("error saving preferences: %{public}@", log: Log.general, type: .error, error.localizedDescription)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
os_log("saved preferences", log: Log.general, type: .info)
|
|
||||||
}
|
|
||||||
|
|
||||||
_ = refreshProviderManagers().then { () -> Promise<Void> in
|
|
||||||
self.navigationController.popViewController(animated: true)
|
|
||||||
return Promise.value(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension AppCoordinator: TunnelConfigurationTableViewControllerDelegate {
|
|
||||||
func didSave(tunnel: Tunnel, tunnelConfigurationTableViewController: TunnelConfigurationTableViewController) {
|
|
||||||
saveTunnel(tunnel)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension AppCoordinator: QRScanViewControllerDelegate {
|
|
||||||
func didSave(tunnel: Tunnel, qrScanViewController: QRScanViewController) {
|
|
||||||
qrScanViewController.navigationController?.popViewController(animated: true)
|
|
||||||
showTunnelInfoViewController(tunnel: tunnel, context: tunnel.managedObjectContext!)
|
|
||||||
}
|
|
||||||
|
|
||||||
func didCancel(qrScanViewController: QRScanViewController) {
|
|
||||||
qrScanViewController.navigationController?.popViewController(animated: true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension AppCoordinator: SettingsTableViewControllerDelegate {
|
|
||||||
func exportTunnels(settingsTableViewController: SettingsTableViewController, sourceView: UIView) {
|
|
||||||
self.exportConfigs(sourceView: sourceView)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class AppDocumentPickerDelegate: NSObject, UIDocumentPickerDelegate {
|
class AppDocumentPickerDelegate: NSObject, UIDocumentPickerDelegate {
|
||||||
weak var appCoordinator: AppCoordinator?
|
weak var appCoordinator: AppCoordinator?
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue