]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
NE: When there's an error starting the tunnel, show it to the user using displayMessage()
authorRoopesh Chander <roop@roopc.net>
Fri, 9 Nov 2018 11:23:52 +0000 (16:53 +0530)
committerRoopesh Chander <roop@roopc.net>
Fri, 9 Nov 2018 11:37:42 +0000 (17:07 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard.xcodeproj/project.pbxproj
WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift
WireGuard/WireGuardNetworkExtension/ErrorNotifier.swift [new file with mode: 0644]
WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift

index 667b110d987b0d18a846eaed07d26c97caf2687b..f2b7a2eab710894ae7b8f99a842fa1c952a7f05b 100644 (file)
@@ -48,6 +48,7 @@
                6FFA5D9321943BC90001E2F7 /* DNSResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F5D0C1421832391000F85AD /* DNSResolver.swift */; };
                6FFA5D952194454A0001E2F7 /* NETunnelProviderProtocol+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FFA5D942194454A0001E2F7 /* NETunnelProviderProtocol+Extension.swift */; };
                6FFA5D96219446380001E2F7 /* NETunnelProviderProtocol+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FFA5D942194454A0001E2F7 /* NETunnelProviderProtocol+Extension.swift */; };
+               6FFA5DA021958ECC0001E2F7 /* ErrorNotifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FFA5D9F21958ECC0001E2F7 /* ErrorNotifier.swift */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
                6FF4AC462120B9E0002C96EB /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; };
                6FF4AC482120B9E0002C96EB /* WireGuard.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WireGuard.entitlements; sourceTree = "<group>"; };
                6FFA5D942194454A0001E2F7 /* NETunnelProviderProtocol+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NETunnelProviderProtocol+Extension.swift"; sourceTree = "<group>"; };
+               6FFA5D9F21958ECC0001E2F7 /* ErrorNotifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorNotifier.swift; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
                                6F5D0C1E218352EF000F85AD /* Info.plist */,
                                6F5D0C1F218352EF000F85AD /* WireGuardNetworkExtension.entitlements */,
                                6F5D0C3421839E37000F85AD /* WireGuardNetworkExtension-Bridging-Header.h */,
+                               6FFA5D9F21958ECC0001E2F7 /* ErrorNotifier.swift */,
                        );
                        path = WireGuardNetworkExtension;
                        sourceTree = "<group>";
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               6FFA5DA021958ECC0001E2F7 /* ErrorNotifier.swift in Sources */,
                                6FFA5D96219446380001E2F7 /* NETunnelProviderProtocol+Extension.swift in Sources */,
                                6FFA5D8E2194370D0001E2F7 /* Configuration.swift in Sources */,
                                6FFA5D8F2194370D0001E2F7 /* IPAddressRange.swift in Sources */,
index b78c27951bb44d662f0ed4f477b7daf5f3fda561..7ce2be99ccf523e29b1b693d67ac74e306f700c9 100644 (file)
@@ -3,6 +3,7 @@
 
 import UIKit
 import MobileCoreServices
+import UserNotifications
 
 class TunnelsListTableViewController: UIViewController {
 
diff --git a/WireGuard/WireGuardNetworkExtension/ErrorNotifier.swift b/WireGuard/WireGuardNetworkExtension/ErrorNotifier.swift
new file mode 100644 (file)
index 0000000..4087fe7
--- /dev/null
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: MIT
+// Copyright © 2018 WireGuard LLC. All Rights Reserved.
+
+import NetworkExtension
+
+class ErrorNotifier {
+    static func errorMessage(for error: PacketTunnelProviderError) -> (String, String)? {
+        switch (error) {
+        case .savedProtocolConfigurationIsInvalid:
+            return ("Activation failure", "Could not retrieve tunnel information from the saved configuration")
+        case .dnsResolutionFailure(_):
+            return ("DNS resolution failure", "One or more endpoint domains could not be resolved")
+        case .couldNotStartWireGuard:
+            return ("Activation failure", "WireGuard backend could not be started")
+        case .coultNotSetNetworkSettings:
+            return ("Activation failure", "Error applying network settings on the tunnel")
+        }
+    }
+
+    static func notify(_ error: PacketTunnelProviderError, from tunnelProvider: NEPacketTunnelProvider) {
+        guard let (title, message) = ErrorNotifier.errorMessage(for: error) else { return }
+        // displayMessage() is deprecated, but there's no better alternative to show the error to the user
+        tunnelProvider.displayMessage("\(title): \(message)", completionHandler: { (_) in })
+    }
+}
index 02c087d965317f6363a97d14146a0c3741704e0c..e131e74ef9a1c261337f394f361d80f38109542c 100644 (file)
@@ -5,7 +5,6 @@ import NetworkExtension
 import os.log
 
 enum PacketTunnelProviderError: Error {
-    case invalidOptions
     case savedProtocolConfigurationIsInvalid
     case dnsResolutionFailure(hostnames: [String])
     case couldNotStartWireGuard
@@ -28,6 +27,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
 
         guard let tunnelProviderProtocol = self.protocolConfiguration as? NETunnelProviderProtocol,
             let tunnelConfiguration = tunnelProviderProtocol.tunnelConfiguration() else {
+                ErrorNotifier.notify(PacketTunnelProviderError.savedProtocolConfigurationIsInvalid, from: self)
                 startTunnelCompletionHandler(PacketTunnelProviderError.savedProtocolConfigurationIsInvalid)
                 return
         }
@@ -41,6 +41,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
         } catch DNSResolverError.dnsResolutionFailed(let hostnames) {
             os_log("Starting tunnel failed: DNS resolution failure for %{public}d hostnames (%{public}s)", log: OSLog.default,
                    type: .error, hostnames.count, hostnames.joined(separator: ", "))
+            ErrorNotifier.notify(PacketTunnelProviderError.dnsResolutionFailure(hostnames: hostnames), from: self)
             startTunnelCompletionHandler(PacketTunnelProviderError.dnsResolutionFailure(hostnames: hostnames))
             return
         } catch {
@@ -61,6 +62,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
         let fd = packetFlow.value(forKeyPath: "socket.fileDescriptor") as! Int32
         if fd < 0 {
             os_log("Starting tunnel failed: Could not determine file descriptor", log: OSLog.default, type: .error)
+            ErrorNotifier.notify(PacketTunnelProviderError.couldNotStartWireGuard, from: self)
             startTunnelCompletionHandler(PacketTunnelProviderError.couldNotStartWireGuard)
             return
         }
@@ -70,6 +72,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
 
         if handle < 0 {
             os_log("Starting tunnel failed: Could not start WireGuard", log: OSLog.default, type: .error)
+            ErrorNotifier.notify(PacketTunnelProviderError.couldNotStartWireGuard, from: self)
             startTunnelCompletionHandler(PacketTunnelProviderError.couldNotStartWireGuard)
             return
         }
@@ -82,6 +85,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
         setTunnelNetworkSettings(networkSettings) { (error) in
             if let error = error {
                 os_log("Starting tunnel failed: Error setting network settings: %s", log: OSLog.default, type: .error, error.localizedDescription)
+                ErrorNotifier.notify(PacketTunnelProviderError.coultNotSetNetworkSettings, from: self)
                 startTunnelCompletionHandler(PacketTunnelProviderError.coultNotSetNetworkSettings)
             } else {
                 startTunnelCompletionHandler(nil /* No errors */)