]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
Zip: Import configs from zip files
authorRoopesh Chander <roop@roopc.net>
Sun, 28 Oct 2018 20:22:43 +0000 (01:52 +0530)
committerRoopesh Chander <roop@roopc.net>
Sun, 28 Oct 2018 20:22:43 +0000 (01:52 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard.xcodeproj/project.pbxproj
WireGuard/WireGuard/UI/iOS/FilePicker.swift [deleted file]
WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift

index 0c777d3a5a22d8f65b527a61164721d588672a72..9ad2ee8a92ba7ebd12649e30625df2a453943754 100644 (file)
@@ -19,7 +19,6 @@
                6F6899A62180447E0012E523 /* x25519.c in Sources */ = {isa = PBXBuildFile; fileRef = 6F6899A52180447E0012E523 /* x25519.c */; };
                6F6899A8218044FC0012E523 /* Curve25519.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F6899A7218044FC0012E523 /* Curve25519.swift */; };
                6F6899AC218099F00012E523 /* WgQuickConfigFileParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F6899AB218099F00012E523 /* WgQuickConfigFileParser.swift */; };
-               6F6899B02181B07B0012E523 /* FilePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F6899AF2181B07A0012E523 /* FilePicker.swift */; };
                6F693A562179E556008551C1 /* Endpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F693A552179E556008551C1 /* Endpoint.swift */; };
                6F7774E1217181B1006A79B3 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7774DF217181B1006A79B3 /* MainViewController.swift */; };
                6F7774E2217181B1006A79B3 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7774E0217181B1006A79B3 /* AppDelegate.swift */; };
@@ -87,7 +86,6 @@
                6F6899A52180447E0012E523 /* x25519.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = x25519.c; sourceTree = "<group>"; };
                6F6899A7218044FC0012E523 /* Curve25519.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Curve25519.swift; sourceTree = "<group>"; };
                6F6899AB218099F00012E523 /* WgQuickConfigFileParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WgQuickConfigFileParser.swift; sourceTree = "<group>"; };
-               6F6899AF2181B07A0012E523 /* FilePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilePicker.swift; sourceTree = "<group>"; };
                6F693A552179E556008551C1 /* Endpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Endpoint.swift; sourceTree = "<group>"; };
                6F7774DF217181B1006A79B3 /* MainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = "<group>"; };
                6F7774E0217181B1006A79B3 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
                                6F7774E321718281006A79B3 /* TunnelsListTableViewController.swift */,
                                6F7774F221774263006A79B3 /* TunnelEditTableViewController.swift */,
                                6F628C40217F47DB003482A3 /* TunnelDetailTableViewController.swift */,
-                               6F6899AF2181B07A0012E523 /* FilePicker.swift */,
                        );
                        path = iOS;
                        sourceTree = "<group>";
                                6FDEF7FB21863B6100D8FBF6 /* unzip.c in Sources */,
                                6F6899A8218044FC0012E523 /* Curve25519.swift in Sources */,
                                6F628C41217F47DB003482A3 /* TunnelDetailTableViewController.swift in Sources */,
-                               6F6899B02181B07B0012E523 /* FilePicker.swift in Sources */,
                                6F7774F321774263006A79B3 /* TunnelEditTableViewController.swift in Sources */,
                                6FDEF802218646BA00D8FBF6 /* ZipArchive.swift in Sources */,
                                6F7774E1217181B1006A79B3 /* MainViewController.swift in Sources */,
diff --git a/WireGuard/WireGuard/UI/iOS/FilePicker.swift b/WireGuard/WireGuard/UI/iOS/FilePicker.swift
deleted file mode 100644 (file)
index 25da7b9..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-// SPDX-License-Identifier: MIT
-// Copyright © 2018 WireGuard LLC. All rights reserved.
-
-import UIKit
-
-class FileImportViewController: UIDocumentPickerViewController {
-    enum DocumentType: String {
-        case wgQuickConfigFile = "com.wireguard.config.quick"
-    }
-
-    init(documentTypes: [DocumentType]) {
-        super.init(documentTypes: documentTypes.map { $0.rawValue }, in: .import)
-    }
-
-    required init?(coder aDecoder: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
-    }
-}
index 5d8646c45ed54eb80f1ec04d0cf63d303c285a52..b7601769b5910964348a713e93ca176b68a08f2e 100644 (file)
@@ -2,6 +2,7 @@
 // Copyright © 2018 WireGuard LLC. All rights reserved.
 
 import UIKit
+import MobileCoreServices
 
 class TunnelsListTableViewController: UITableViewController {
 
@@ -42,7 +43,7 @@ class TunnelsListTableViewController: UITableViewController {
         let alert = UIAlertController(title: "",
                                       message: "Add a tunnel",
                                       preferredStyle: .actionSheet)
-        let importFileAction = UIAlertAction(title: "Import wg-quick config (.conf)", style: .default) { [weak self] (action) in
+        let importFileAction = UIAlertAction(title: "Import file or archive", style: .default) { [weak self] (action) in
             self?.presentViewControllerForFileImport()
         }
         alert.addAction(importFileAction)
@@ -96,7 +97,8 @@ class TunnelsListTableViewController: UITableViewController {
     }
 
     func presentViewControllerForFileImport() {
-        let filePicker = FileImportViewController(documentTypes: [.wgQuickConfigFile])
+        let documentTypes = ["com.wireguard.config.quick", String(kUTTypeZipArchive)]
+        let filePicker = UIDocumentPickerViewController(documentTypes: documentTypes, in: .import)
         filePicker.delegate = self
         self.present(filePicker, animated: true)
     }
@@ -138,7 +140,31 @@ extension TunnelsListTableViewController: TunnelEditTableViewControllerDelegate
 extension TunnelsListTableViewController: UIDocumentPickerDelegate {
     func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
         if let url = urls.first {
-            openForEditing(configFileURL: url)
+            if (url.pathExtension == "conf") {
+                openForEditing(configFileURL: url)
+            } else if (url.pathExtension == "zip") {
+                var unarchivedFiles: [(fileName: String, contents: Data)] = []
+                do {
+                    unarchivedFiles = try ZipArchive.unarchive(url: url, requiredFileExtensions: ["conf"])
+                } catch ZipArchiveError.cantOpenInputZipFile {
+                    showErrorAlert(title: "Cannot read zip archive", message: "The zip file couldn't be read")
+                } catch ZipArchiveError.badArchive {
+                    showErrorAlert(title: "Cannot read zip archive", message: "Bad archive")
+                } catch (let error) {
+                    print("Error opening zip archive: \(error)")
+                }
+                for unarchivedFile in unarchivedFiles {
+                    if let fileBaseName = URL(string: unarchivedFile.fileName)?.deletingPathExtension().lastPathComponent,
+                        let fileContents = String(data: unarchivedFile.contents, encoding: .utf8),
+                        let tunnelConfiguration = try? WgQuickConfigFileParser.parse(fileContents, name: fileBaseName) {
+                        tunnelsManager?.add(tunnelConfiguration: tunnelConfiguration) { (tunnel, error) in
+                            if (error != nil) {
+                                print("Error adding configuration: \(tunnelConfiguration.interface.name)")
+                            }
+                        }
+                    }
+                }
+            }
         }
     }
 }