]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
QR code: Integrate Eric's QR code scanner
authorRoopesh Chander <roop@roopc.net>
Sun, 28 Oct 2018 16:52:27 +0000 (22:22 +0530)
committerRoopesh Chander <roop@roopc.net>
Sun, 28 Oct 2018 16:52:32 +0000 (22:22 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard.xcodeproj/project.pbxproj
WireGuard/WireGuard/UI/iOS/QRScanViewController.swift
WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift

index ea3bd32a842b75265c038f8a20e9b147333f516a..d1707803995e4b56afe4be40b286889e527e7c85 100644 (file)
@@ -29,6 +29,7 @@
                6F7774EF21722D97006A79B3 /* TunnelsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7774EE21722D97006A79B3 /* TunnelsManager.swift */; };
                6F7774F321774263006A79B3 /* TunnelEditTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7774F221774263006A79B3 /* TunnelEditTableViewController.swift */; };
                6FDEF7E421846C1A00D8FBF6 /* libwg-go.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FDEF7E321846C1A00D8FBF6 /* libwg-go.a */; };
+               6FDEF7E62185EFB200D8FBF6 /* QRScanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FDEF7E52185EFAF00D8FBF6 /* QRScanViewController.swift */; };
                6FF4AC1F211EC472002C96EB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6FF4AC1E211EC472002C96EB /* Assets.xcassets */; };
                6FF4AC22211EC472002C96EB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6FF4AC20211EC472002C96EB /* LaunchScreen.storyboard */; };
                6FF4AC472120B9E0002C96EB /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FF4AC462120B9E0002C96EB /* NetworkExtension.framework */; };
@@ -92,6 +93,7 @@
                6F7774EE21722D97006A79B3 /* TunnelsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelsManager.swift; sourceTree = "<group>"; };
                6F7774F221774263006A79B3 /* TunnelEditTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelEditTableViewController.swift; sourceTree = "<group>"; };
                6FDEF7E321846C1A00D8FBF6 /* libwg-go.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libwg-go.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+               6FDEF7E52185EFAF00D8FBF6 /* QRScanViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRScanViewController.swift; sourceTree = "<group>"; };
                6FF4AC14211EC46F002C96EB /* WireGuard.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WireGuard.app; sourceTree = BUILT_PRODUCTS_DIR; };
                6FF4AC1E211EC472002C96EB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
                6FF4AC21211EC472002C96EB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
                6F7774DE217181B1006A79B3 /* iOS */ = {
                        isa = PBXGroup;
                        children = (
+                               6FDEF7E52185EFAF00D8FBF6 /* QRScanViewController.swift */,
                                6F7774E0217181B1006A79B3 /* AppDelegate.swift */,
                                6F7774DF217181B1006A79B3 /* MainViewController.swift */,
                                6F7774E321718281006A79B3 /* TunnelsListTableViewController.swift */,
                                6F5D0C1521832391000F85AD /* DNSResolver.swift in Sources */,
                                6F5D0C482183C6A3000F85AD /* PacketTunnelOptionsGenerator.swift in Sources */,
                                6F693A562179E556008551C1 /* Endpoint.swift in Sources */,
+                               6FDEF7E62185EFB200D8FBF6 /* QRScanViewController.swift in Sources */,
                                6F6899A62180447E0012E523 /* x25519.c in Sources */,
                                6F5D0C452183BCDA000F85AD /* PacketTunnelOptionKey.swift in Sources */,
                                6F7774E2217181B1006A79B3 /* AppDelegate.swift in Sources */,
index f15d30bcac64e23f081d163bf310d3aadee12e34..e95ff08f2eae6c81c43f12b940b53f0afc1aa570 100644 (file)
@@ -11,25 +11,21 @@ import CoreData
 import UIKit
 
 protocol QRScanViewControllerDelegate: class {
-    func didSave(tunnel: Tunnel, qrScanViewController: QRScanViewController)
+    func scannedQRCode(tunnelConfiguration: TunnelConfiguration, qrScanViewController: QRScanViewController)
 }
 
 class QRScanViewController: UIViewController {
-
-    private var viewContext: NSManagedObjectContext!
-    private weak var delegate: QRScanViewControllerDelegate?
+    weak var delegate: QRScanViewControllerDelegate?
     var captureSession: AVCaptureSession? = AVCaptureSession()
     let metadataOutput = AVCaptureMetadataOutput()
     var previewLayer: AVCaptureVideoPreviewLayer!
 
-    func configure(context: NSManagedObjectContext, delegate: QRScanViewControllerDelegate? = nil) {
-        viewContext = context
-        self.delegate = delegate
-    }
-
     override func viewDidLoad() {
         super.viewDidLoad()
 
+        self.title = "Scan QR code"
+        self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelTapped))
+
         guard let videoCaptureDevice = AVCaptureDevice.default(for: .video),
             let videoInput = try? AVCaptureDeviceInput(device: videoCaptureDevice),
             let captureSession = captureSession,
@@ -69,8 +65,9 @@ class QRScanViewController: UIViewController {
 
     func scanDidComplete(withCode code: String) {
         do {
-            let tunnel = try Tunnel.fromConfig(code, context: viewContext)
-            delegate?.didSave(tunnel: tunnel, qrScanViewController: self)
+            let tunnelConfiguration = try WgQuickConfigFileParser.parse(code, name: "Scanned")
+            delegate?.scannedQRCode(tunnelConfiguration: tunnelConfiguration, qrScanViewController: self)
+            dismiss(animated: true, completion: nil)
         } catch {
             scanDidEncounterError(title: "Invalid Code", message: "The scanned code is not a valid WireGuard config file.")
         }
@@ -85,6 +82,9 @@ class QRScanViewController: UIViewController {
         captureSession = nil
     }
 
+    @objc func cancelTapped() {
+        dismiss(animated: true, completion: nil)
+    }
 }
 
 extension QRScanViewController: AVCaptureMetadataOutputObjectsDelegate {
@@ -101,7 +101,4 @@ extension QRScanViewController: AVCaptureMetadataOutputObjectsDelegate {
         AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
         scanDidComplete(withCode: stringValue)
     }
-
 }
-
-extension QRScanViewController: Identifyable {}
index 884c4a91a0ef3a2aaf7567a18e810ce728f294a3..6aaf8db3497fc8b98945810bfe9111e8999cd926 100644 (file)
@@ -47,6 +47,11 @@ class TunnelsListTableViewController: UITableViewController {
         }
         alert.addAction(importFileAction)
 
+        let scanQRCodeAction = UIAlertAction(title: "Scan QR code", style: .default) { [weak self] (action) in
+            self?.presentViewControllerForScanningQRCode()
+        }
+        alert.addAction(scanQRCodeAction)
+
         let createFromScratchAction = UIAlertAction(title: "Create from scratch", style: .default) { [weak self] (action) in
             if let s = self, let tunnelsManager = s.tunnelsManager {
                 s.presentViewControllerForTunnelCreation(tunnelsManager: tunnelsManager, tunnelConfiguration: nil)
@@ -96,6 +101,14 @@ class TunnelsListTableViewController: UITableViewController {
         self.present(filePicker, animated: true)
     }
 
+    func presentViewControllerForScanningQRCode() {
+        let scanQRCodeVC = QRScanViewController()
+        scanQRCodeVC.delegate = self
+        let scanQRCodeNC = UINavigationController(rootViewController: scanQRCodeVC)
+        scanQRCodeNC.modalPresentationStyle = .fullScreen
+        self.present(scanQRCodeNC, animated: true)
+    }
+
     func showErrorAlert(title: String, message: String) {
         let okAction = UIAlertAction(title: "Ok", style: .default)
         let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
@@ -130,6 +143,14 @@ extension TunnelsListTableViewController: UIDocumentPickerDelegate {
     }
 }
 
+// MARK: QRScanViewControllerDelegate
+
+extension TunnelsListTableViewController: QRScanViewControllerDelegate {
+    func scannedQRCode(tunnelConfiguration: TunnelConfiguration, qrScanViewController: QRScanViewController) {
+        print("Scanned QR code") // TODO
+    }
+}
+
 // MARK: UITableViewDataSource
 
 extension TunnelsListTableViewController {