]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
Importing: macOS: Support importing of multiple files at a time
authorRoopesh Chander <roop@roopc.net>
Mon, 25 Feb 2019 10:52:52 +0000 (16:22 +0530)
committerRoopesh Chander <roop@roopc.net>
Mon, 25 Feb 2019 13:13:20 +0000 (18:43 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/Base.lproj/Localizable.strings
WireGuard/WireGuard/UI/TunnelImporter.swift
WireGuard/WireGuard/UI/iOS/AppDelegate.swift
WireGuard/WireGuard/UI/iOS/ViewController/TunnelsListTableViewController.swift
WireGuard/WireGuard/UI/macOS/ImportPanelPresenter.swift

index 15ef50b1417b348db80f79e8606f2579060ad19a..00f4d583690a74c0ec7570f1907dbb740e0871b0 100644 (file)
@@ -23,6 +23,9 @@
 
 // Tunnels list alerts
 
+"alertImportedFromMultipleFilesTitle (%d)" = "Created %d tunnels";
+"alertImportedFromMultipleFilesMessage (%1$d of %2$d)" = "Created %1$d of %2$d tunnels from imported files";
+
 "alertImportedFromZipTitle (%d)" = "Created %d tunnels";
 "alertImportedFromZipMessage (%1$d of %2$d)" = "Created %1$d of %2$d tunnels from zip archive";
 
index 7625761a968dea75976e18d8a70b9373b26ad484..e51c70d69a74669519d0b1f0745c9e9027673adf 100644 (file)
@@ -4,7 +4,45 @@
 import Foundation
 
 class TunnelImporter {
-    static func importFromFile(url: URL, into tunnelsManager: TunnelsManager, sourceVC: AnyObject?, errorPresenterType: ErrorPresenterProtocol.Type, completionHandler: (() -> Void)? = nil) {
+    static func importFromFile(urls: [URL], into tunnelsManager: TunnelsManager, sourceVC: AnyObject?, errorPresenterType: ErrorPresenterProtocol.Type, completionHandler: (() -> Void)? = nil) {
+        guard !urls.isEmpty else {
+            completionHandler?()
+            return
+        }
+        if urls.count > 1 {
+            let dispatchGroup = DispatchGroup()
+            var configs = [TunnelConfiguration?]()
+            for url in urls {
+                if url.pathExtension.lowercased() == "zip" {
+                    dispatchGroup.enter()
+                    ZipImporter.importConfigFiles(from: url) { result in
+                        if let configsInZip = result.value {
+                            configs.append(contentsOf: configsInZip)
+                        }
+                        dispatchGroup.leave()
+                    }
+                } else {
+                    let fileBaseName = url.deletingPathExtension().lastPathComponent.trimmingCharacters(in: .whitespacesAndNewlines)
+                    let fileContents = try? String(contentsOf: url)
+                    let tunnelConfiguration = try? TunnelConfiguration(fromWgQuickConfig: fileContents ?? "", called: fileBaseName)
+                    configs.append(tunnelConfiguration)
+                }
+            }
+            dispatchGroup.notify(queue: .main) {
+                tunnelsManager.addMultiple(tunnelConfigurations: configs.compactMap { $0 }) { numberSuccessful in
+                    if numberSuccessful == configs.count {
+                        completionHandler?()
+                        return
+                    }
+                    let title = tr(format: "alertImportedFromMultipleFilesTitle (%d)", numberSuccessful)
+                    let message = tr(format: "alertImportedFromMultipleFilesMessage (%1$d of %2$d)", numberSuccessful, configs.count)
+                    errorPresenterType.showErrorAlert(title: title, message: message, from: sourceVC, onPresented: completionHandler)
+                }
+            }
+            return
+        }
+        assert(urls.count == 1)
+        let url = urls.first!
         if url.pathExtension.lowercased() == "zip" {
             ZipImporter.importConfigFiles(from: url) { result in
                 if let error = result.error {
index c295002034ff23fc6635fcdffd363f4fbcecb138..8743c70d434b4cde07001aa0bbf93f57a88461db 100644 (file)
@@ -28,7 +28,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
 
     func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
         guard let tunnelsManager = mainVC?.tunnelsManager else { return true }
-        TunnelImporter.importFromFile(url: url, into: tunnelsManager, sourceVC: mainVC, errorPresenterType: ErrorPresenter.self) {
+        TunnelImporter.importFromFile(urls: [url], into: tunnelsManager, sourceVC: mainVC, errorPresenterType: ErrorPresenter.self) {
             _ = FileManager.deleteFile(at: url)
         }
         return true
index ccef4cd748fb0099cf3e42585f1b2c4ec5f03d96..e8e0a5269940e75d5c7fb5622d38a0a230c7807e 100644 (file)
@@ -164,9 +164,7 @@ class TunnelsListTableViewController: UIViewController {
 extension TunnelsListTableViewController: UIDocumentPickerDelegate {
     func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
         guard let tunnelsManager = tunnelsManager else { return }
-        urls.forEach { url in
-            TunnelImporter.importFromFile(url: url, into: tunnelsManager, sourceVC: self, errorPresenterType: ErrorPresenter.self)
-        }
+        TunnelImporter.importFromFile(urls: urls, into: tunnelsManager, sourceVC: self, errorPresenterType: ErrorPresenter.self)
     }
 }
 
index 1ef8f75b3cb7b6fde65e865661dad31105b011d1..67b074c9efa5dc0f5c43feb7ef63879dec55d408 100644 (file)
@@ -9,12 +9,12 @@ class ImportPanelPresenter {
         let openPanel = NSOpenPanel()
         openPanel.prompt = tr("macSheetButtonImport")
         openPanel.allowedFileTypes = ["conf", "zip"]
+        openPanel.allowsMultipleSelection = true
         openPanel.beginSheetModal(for: window) { [weak tunnelsManager] response in
             guard let tunnelsManager = tunnelsManager else { return }
             guard response == .OK else { return }
-            guard let url = openPanel.url else { return }
             AppStorePrivacyNotice.show(from: sourceVC, into: tunnelsManager) {
-                TunnelImporter.importFromFile(url: url, into: tunnelsManager, sourceVC: sourceVC, errorPresenterType: ErrorPresenter.self)
+                TunnelImporter.importFromFile(urls: openPanel.urls, into: tunnelsManager, sourceVC: sourceVC, errorPresenterType: ErrorPresenter.self)
             }
         }
     }