From 8d26a3c5360a89605b2ecf6c5ad8edadd8eea590 Mon Sep 17 00:00:00 2001 From: Roopesh Chander Date: Thu, 6 Dec 2018 15:58:27 +0530 Subject: Error handling: Cleanup Tunnels Manager errors Signed-off-by: Roopesh Chander --- WireGuard/WireGuard/UI/iOS/ErrorPresenter.swift | 49 +++++++++++++--------- .../WireGuard/UI/iOS/MainViewController.swift | 10 +++-- .../UI/iOS/TunnelEditTableViewController.swift | 9 ++-- .../UI/iOS/TunnelsListTableViewController.swift | 8 ++-- 4 files changed, 45 insertions(+), 31 deletions(-) (limited to 'WireGuard/WireGuard/UI') diff --git a/WireGuard/WireGuard/UI/iOS/ErrorPresenter.swift b/WireGuard/WireGuard/UI/iOS/ErrorPresenter.swift index 2ae0cf0..35bbdec 100644 --- a/WireGuard/WireGuard/UI/iOS/ErrorPresenter.swift +++ b/WireGuard/WireGuard/UI/iOS/ErrorPresenter.swift @@ -6,27 +6,12 @@ import os.log class ErrorPresenter { static func errorMessage(for error: Error) -> (String, String) { - switch (error) { - // TunnelManagementError - case TunnelManagementError.tunnelAlreadyExistsWithThatName: - return ("Name already exists", "A tunnel with that name already exists") - case TunnelManagementError.tunnelInvalidName: - return ("Name already exists", "The tunnel name is invalid") - case TunnelManagementError.vpnSystemErrorOnAddTunnel: - return ("Unable to create tunnel", "Internal error") - case TunnelManagementError.vpnSystemErrorOnModifyTunnel: - return ("Unable to modify tunnel", "Internal error") - case TunnelManagementError.vpnSystemErrorOnRemoveTunnel: - return ("Unable to remove tunnel", "Internal error") + if let tunnelsManagerError = error as? TunnelsManagerError { + return errorMessage(forTunnelsManagerError: tunnelsManagerError) + } - // TunnelActivationError - case TunnelActivationError.tunnelActivationAttemptFailed: - return ("Activation failure", "The tunnel could not be activated due to an internal error") - case TunnelActivationError.tunnelActivationFailedInternalError: - return ("Activation failure", "The tunnel could not be activated due to an internal error") - case TunnelActivationError.tunnelActivationFailedNoInternetConnection: - return ("Activation failure", "No internet connection") + switch (error) { // Importing a zip file case ZipArchiveError.cantOpenInputZipFile: @@ -47,6 +32,32 @@ class ErrorPresenter { } } + private static func errorMessage(forTunnelsManagerError error: TunnelsManagerError) -> (String, String) { + switch (error) { + // Tunnels list management + case TunnelsManagerError.tunnelNameEmpty: + return ("No name provided", "Can't create tunnel with an empty name") + case TunnelsManagerError.tunnelAlreadyExistsWithThatName: + return ("Name already exists", "A tunnel with that name already exists") + case TunnelsManagerError.vpnSystemErrorOnListingTunnels: + return ("Unable to list tunnels", "Internal error") + case TunnelsManagerError.vpnSystemErrorOnAddTunnel: + return ("Unable to create tunnel", "Internal error") + case TunnelsManagerError.vpnSystemErrorOnModifyTunnel: + return ("Unable to modify tunnel", "Internal error") + case TunnelsManagerError.vpnSystemErrorOnRemoveTunnel: + return ("Unable to remove tunnel", "Internal error") + + // Tunnel activation + case TunnelsManagerError.tunnelActivationAttemptFailed: + return ("Activation failure", "The tunnel could not be activated due to an internal error") + case TunnelsManagerError.tunnelActivationFailedInternalError: + return ("Activation failure", "The tunnel could not be activated due to an internal error") + case TunnelsManagerError.tunnelActivationFailedNoInternetConnection: + return ("Activation failure", "No internet connection") + } + } + static func showErrorAlert(error: Error, from sourceVC: UIViewController?, onDismissal: (() -> Void)? = nil, onPresented: (() -> Void)? = nil) { guard let sourceVC = sourceVC else { return } diff --git a/WireGuard/WireGuard/UI/iOS/MainViewController.swift b/WireGuard/WireGuard/UI/iOS/MainViewController.swift index 18853d9..0d2d681 100644 --- a/WireGuard/WireGuard/UI/iOS/MainViewController.swift +++ b/WireGuard/WireGuard/UI/iOS/MainViewController.swift @@ -36,8 +36,12 @@ class MainViewController: UISplitViewController { self.preferredDisplayMode = .allVisible // Create the tunnels manager, and when it's ready, inform tunnelsListVC - TunnelsManager.create { [weak self] tunnelsManager in - guard let tunnelsManager = tunnelsManager else { return } + TunnelsManager.create { [weak self] result in + if let error = result.error { + ErrorPresenter.showErrorAlert(error: error, from: self) + return + } + let tunnelsManager: TunnelsManager = result.value! guard let s = self else { return } s.tunnelsManager = tunnelsManager @@ -52,7 +56,7 @@ class MainViewController: UISplitViewController { } extension MainViewController: TunnelsManagerActivationDelegate { - func tunnelActivationFailed(tunnel: TunnelContainer, error: TunnelActivationError) { + func tunnelActivationFailed(tunnel: TunnelContainer, error: TunnelsManagerError) { ErrorPresenter.showErrorAlert(error: error, from: self) } } diff --git a/WireGuard/WireGuard/UI/iOS/TunnelEditTableViewController.swift b/WireGuard/WireGuard/UI/iOS/TunnelEditTableViewController.swift index 74c6e57..ca5e6a8 100644 --- a/WireGuard/WireGuard/UI/iOS/TunnelEditTableViewController.swift +++ b/WireGuard/WireGuard/UI/iOS/TunnelEditTableViewController.swift @@ -99,14 +99,13 @@ class TunnelEditTableViewController: UITableViewController { } else { // We're adding a new tunnel tunnelsManager.add(tunnelConfiguration: tunnelConfiguration, - activateOnDemandSetting: activateOnDemandSetting) { [weak self] (tunnel, error) in - if let error = error { + activateOnDemandSetting: activateOnDemandSetting) { [weak self] result in + if let error = result.error { ErrorPresenter.showErrorAlert(error: error, from: self) } else { + let tunnel: TunnelContainer = result.value! self?.dismiss(animated: true, completion: nil) - if let tunnel = tunnel { - self?.delegate?.tunnelSaved(tunnel: tunnel) - } + self?.delegate?.tunnelSaved(tunnel: tunnel) } } } diff --git a/WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift b/WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift index 3cc3fa1..ae39587 100644 --- a/WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift +++ b/WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift @@ -182,8 +182,8 @@ class TunnelsListTableViewController: UIViewController { let fileBaseName = url.deletingPathExtension().lastPathComponent.trimmingCharacters(in: .whitespacesAndNewlines) if let fileContents = try? String(contentsOf: url), let tunnelConfiguration = try? WgQuickConfigFileParser.parse(fileContents, name: fileBaseName) { - tunnelsManager.add(tunnelConfiguration: tunnelConfiguration) { (_, error) in - if let error = error { + tunnelsManager.add(tunnelConfiguration: tunnelConfiguration) { [weak self] result in + if let error = result.error { ErrorPresenter.showErrorAlert(error: error, from: self) } } @@ -207,8 +207,8 @@ extension TunnelsListTableViewController: UIDocumentPickerDelegate { extension TunnelsListTableViewController: QRScanViewControllerDelegate { func addScannedQRCode(tunnelConfiguration: TunnelConfiguration, qrScanViewController: QRScanViewController, completionHandler: (() -> Void)?) { - tunnelsManager?.add(tunnelConfiguration: tunnelConfiguration) { (_, error) in - if let error = error { + tunnelsManager?.add(tunnelConfiguration: tunnelConfiguration) { result in + if let error = result.error { ErrorPresenter.showErrorAlert(error: error, from: qrScanViewController, onDismissal: completionHandler) } else { completionHandler?() -- cgit v1.2.3-59-g8ed1b