diff options
author | Jeroen Leenarts <jeroen.leenarts@gmail.com> | 2018-09-02 22:31:39 +0200 |
---|---|---|
committer | Jeroen Leenarts <jeroen.leenarts@gmail.com> | 2018-09-02 22:47:41 +0200 |
commit | 8766750bb878da6b849edb6da3fb9baa26d0a353 (patch) | |
tree | 1fb3f11a27263ed34d0e41a1c7644f2c3b6e6f86 /WireGuard | |
parent | Add import and export logic. (diff) | |
download | wireguard-apple-8766750bb878da6b849edb6da3fb9baa26d0a353.tar.xz wireguard-apple-8766750bb878da6b849edb6da3fb9baa26d0a353.zip |
Zip export.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'WireGuard')
-rw-r--r-- | WireGuard/Base.lproj/Main.storyboard | 17 | ||||
-rw-r--r-- | WireGuard/Coordinators/AppCoordinator.swift | 71 | ||||
-rw-r--r-- | WireGuard/ViewControllers/TunnelsTableViewController.swift | 7 |
3 files changed, 89 insertions, 6 deletions
diff --git a/WireGuard/Base.lproj/Main.storyboard b/WireGuard/Base.lproj/Main.storyboard index ccf19f2..e36f076 100644 --- a/WireGuard/Base.lproj/Main.storyboard +++ b/WireGuard/Base.lproj/Main.storyboard @@ -87,11 +87,18 @@ </connections> </tableView> <navigationItem key="navigationItem" title="WireGuard Tunnels" largeTitleDisplayMode="always" id="j0L-5U-jDs"> - <barButtonItem key="rightBarButtonItem" systemItem="add" id="h2H-H8-3Tn"> - <connections> - <action selector="addProvider:" destination="kTU-BV-32R" id="xSg-ap-3Fx"/> - </connections> - </barButtonItem> + <rightBarButtonItems> + <barButtonItem systemItem="add" id="h2H-H8-3Tn"> + <connections> + <action selector="addProvider:" destination="kTU-BV-32R" id="xSg-ap-3Fx"/> + </connections> + </barButtonItem> + <barButtonItem systemItem="action" id="zxB-ao-5JR"> + <connections> + <action selector="exportTunnels:" destination="kTU-BV-32R" id="PwM-I1-n6B"/> + </connections> + </barButtonItem> + </rightBarButtonItems> </navigationItem> <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/> </tableViewController> diff --git a/WireGuard/Coordinators/AppCoordinator.swift b/WireGuard/Coordinators/AppCoordinator.swift index 5bb83e2..31de8f1 100644 --- a/WireGuard/Coordinators/AppCoordinator.swift +++ b/WireGuard/Coordinators/AppCoordinator.swift @@ -9,6 +9,7 @@ import Foundation import NetworkExtension import os.log +import ZIPFoundation import CoreData import BNRCoreDataStack @@ -111,6 +112,72 @@ class AppCoordinator: RootViewCoordinator { } + // swiftlint:disable next function_body_length + func exportConfigs(barButtonItem: UIBarButtonItem) { + guard let path = FileManager.default + .urls(for: .documentDirectory, in: .userDomainMask).first else { + return + } + let saveFileURL = path.appendingPathComponent("wireguard-export.zip") + do { + try FileManager.default.removeItem(at: saveFileURL) + } catch { + os_log("Failed to delete file: %{public}@ : %{public}@", log: Log.general, type: .error, saveFileURL.absoluteString, error.localizedDescription) + } + + guard let archive = Archive(url: saveFileURL, accessMode: .create) else { + return + } + + do { + var tunnelsByTitle = [String: [Tunnel]]() + let tunnels = try Tunnel.allInContext(persistentContainer.viewContext) + tunnels.forEach { + guard let title = $0.title ?? $0.tunnelIdentifier else { + // there is always a tunnelidentifier. + return + } + if let tunnels = tunnelsByTitle[title] { + tunnelsByTitle[title] = tunnels + [$0] + } else { + tunnelsByTitle[title] = [$0] + } + } + + func addEntry(title: String, tunnel: Tunnel) throws { + let data = tunnel.export().data(using: .utf8)! + let byteCount: UInt32 = UInt32(data.count) + try archive.addEntry(with: "\(title).conf", type: .file, uncompressedSize: byteCount, provider: { (position, size) -> Data in + return data.subdata(in: position ..< size) + }) + } + + try tunnelsByTitle.keys.forEach { + if let tunnels = tunnelsByTitle[$0] { + if tunnels.count == 1 { + try addEntry(title: $0, tunnel: tunnels[0]) + } else { + for (index, tunnel) in tunnels.enumerated() { + try addEntry(title: $0 + "-\(index + 1)", tunnel: tunnel) + } + } + } + } + } catch { + os_log("Failed to create archive file: %{public}@ : %{public}@", log: Log.general, type: .error, saveFileURL.absoluteString, error.localizedDescription) + return + } + + let activityViewController = UIActivityViewController( + activityItems: [saveFileURL], + applicationActivities: nil) + if let popoverPresentationController = activityViewController.popoverPresentationController { + popoverPresentationController.barButtonItem = barButtonItem + } + navigationController.present(activityViewController, animated: true) { + } + } + func exportConfig(tunnel: Tunnel, barButtonItem: UIBarButtonItem) { let exportString = tunnel.export() @@ -195,6 +262,10 @@ class AppCoordinator: RootViewCoordinator { } extension AppCoordinator: TunnelsTableViewControllerDelegate { + func exportTunnels(tunnelsTableViewController: TunnelsTableViewController, barButtonItem: UIBarButtonItem) { + self.exportConfigs(barButtonItem: barButtonItem) + } + func status(for tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) -> NEVPNStatus { let session = self.providerManager(for: tunnel)?.connection as? NETunnelProviderSession return session?.status ?? .invalid diff --git a/WireGuard/ViewControllers/TunnelsTableViewController.swift b/WireGuard/ViewControllers/TunnelsTableViewController.swift index 8198a2f..a9ab09b 100644 --- a/WireGuard/ViewControllers/TunnelsTableViewController.swift +++ b/WireGuard/ViewControllers/TunnelsTableViewController.swift @@ -13,6 +13,7 @@ import BNRCoreDataStack import NetworkExtension protocol TunnelsTableViewControllerDelegate: class { + func exportTunnels(tunnelsTableViewController: TunnelsTableViewController, barButtonItem: UIBarButtonItem) func addProvider(tunnelsTableViewController: TunnelsTableViewController) func connect(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) func disconnect(tunnel: Tunnel, tunnelsTableViewController: TunnelsTableViewController) @@ -63,7 +64,11 @@ class TunnelsTableViewController: UITableViewController { tableView.tableFooterView = UIView(frame: CGRect.zero) } - @IBAction func addProvider(_ sender: Any) { + @IBAction func exportTunnels(_ sender: UIBarButtonItem) { + delegate?.exportTunnels(tunnelsTableViewController: self, barButtonItem: sender) + } + + @IBAction func addProvider(_ sender: UIBarButtonItem) { delegate?.addProvider(tunnelsTableViewController: self) } |