aboutsummaryrefslogtreecommitdiffstats
path: root/WireGuard/WireGuard
diff options
context:
space:
mode:
authorRoopesh Chander <roop@roopc.net>2018-12-03 18:51:51 +0530
committerRoopesh Chander <roop@roopc.net>2018-12-03 18:51:51 +0530
commit046d1413ec83670bb9fb2de5a461c6e4b5d6e400 (patch)
treeb3bfac80ace79a05e99003c6900485f326b4a07a /WireGuard/WireGuard
parentVPN: Error out when tunnel activation fails because there's no internet (diff)
downloadwireguard-apple-046d1413ec83670bb9fb2de5a461c6e4b5d6e400.tar.xz
wireguard-apple-046d1413ec83670bb9fb2de5a461c6e4b5d6e400.zip
Refactor out VPN-handling stuff from tunnels list VC to the main VC
Signed-off-by: Roopesh Chander <roop@roopc.net>
Diffstat (limited to 'WireGuard/WireGuard')
-rw-r--r--WireGuard/WireGuard/UI/iOS/AppDelegate.swift2
-rw-r--r--WireGuard/WireGuard/UI/iOS/MainViewController.swift36
-rw-r--r--WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift112
-rw-r--r--WireGuard/WireGuard/VPN/TunnelsManager.swift16
4 files changed, 94 insertions, 72 deletions
diff --git a/WireGuard/WireGuard/UI/iOS/AppDelegate.swift b/WireGuard/WireGuard/UI/iOS/AppDelegate.swift
index fabdae9..7ba77e4 100644
--- a/WireGuard/WireGuard/UI/iOS/AppDelegate.swift
+++ b/WireGuard/WireGuard/UI/iOS/AppDelegate.swift
@@ -39,6 +39,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
}
func applicationDidBecomeActive(_ application: UIApplication) {
- mainVC?.tunnelsListVC?.refreshTunnelConnectionStatuses()
+ mainVC?.refreshTunnelConnectionStatuses()
}
}
diff --git a/WireGuard/WireGuard/UI/iOS/MainViewController.swift b/WireGuard/WireGuard/UI/iOS/MainViewController.swift
index 359fcfe..18853d9 100644
--- a/WireGuard/WireGuard/UI/iOS/MainViewController.swift
+++ b/WireGuard/WireGuard/UI/iOS/MainViewController.swift
@@ -4,6 +4,10 @@
import UIKit
class MainViewController: UISplitViewController {
+
+ var tunnelsManager: TunnelsManager?
+ var onTunnelsManagerReady: ((TunnelsManager) -> Void)?
+
var tunnelsListVC: TunnelsListTableViewController?
init() {
@@ -30,6 +34,38 @@ class MainViewController: UISplitViewController {
// On iPad, always show both masterVC and detailVC, even in portrait mode, like the Settings app
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 }
+ guard let s = self else { return }
+
+ s.tunnelsManager = tunnelsManager
+ s.tunnelsListVC?.setTunnelsManager(tunnelsManager: tunnelsManager)
+
+ tunnelsManager.activationDelegate = s
+
+ s.onTunnelsManagerReady?(tunnelsManager)
+ s.onTunnelsManagerReady = nil
+ }
+ }
+}
+
+extension MainViewController: TunnelsManagerActivationDelegate {
+ func tunnelActivationFailed(tunnel: TunnelContainer, error: TunnelActivationError) {
+ ErrorPresenter.showErrorAlert(error: error, from: self)
+ }
+}
+
+extension MainViewController {
+ func refreshTunnelConnectionStatuses() {
+ if let tunnelsManager = tunnelsManager {
+ tunnelsManager.refreshStatuses()
+ } else {
+ onTunnelsManagerReady = { tunnelsManager in
+ tunnelsManager.refreshStatuses()
+ }
+ }
}
}
diff --git a/WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift b/WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift
index c2c7b58..3cc3fa1 100644
--- a/WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift
+++ b/WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift
@@ -8,7 +8,6 @@ import UserNotifications
class TunnelsListTableViewController: UIViewController {
var tunnelsManager: TunnelsManager?
- var onTunnelsManagerReady: ((TunnelsManager) -> Void)?
var busyIndicator: UIActivityIndicatorView?
var centeredAddButton: BorderedTextButton?
@@ -38,53 +37,58 @@ class TunnelsListTableViewController: UIViewController {
])
busyIndicator.startAnimating()
self.busyIndicator = busyIndicator
+ }
- // Create the tunnels manager, and when it's ready, create the tableView
- TunnelsManager.create { [weak self] tunnelsManager in
- guard let tunnelsManager = tunnelsManager else { return }
- guard let s = self else { return }
-
- let tableView = UITableView(frame: CGRect.zero, style: .plain)
- tableView.rowHeight = 60
- tableView.separatorStyle = .none
- tableView.register(TunnelsListTableViewCell.self, forCellReuseIdentifier: TunnelsListTableViewCell.id)
-
- s.view.addSubview(tableView)
- tableView.translatesAutoresizingMaskIntoConstraints = false
- NSLayoutConstraint.activate([
- tableView.leftAnchor.constraint(equalTo: s.view.leftAnchor),
- tableView.rightAnchor.constraint(equalTo: s.view.rightAnchor),
- tableView.topAnchor.constraint(equalTo: s.view.topAnchor),
- tableView.bottomAnchor.constraint(equalTo: s.view.bottomAnchor)
- ])
- tableView.dataSource = s
- tableView.delegate = s
- s.tableView = tableView
-
- // Add an add button, centered
- let centeredAddButton = BorderedTextButton()
- centeredAddButton.title = "Add a tunnel"
- centeredAddButton.isHidden = true
- s.view.addSubview(centeredAddButton)
- centeredAddButton.translatesAutoresizingMaskIntoConstraints = false
- NSLayoutConstraint.activate([
- centeredAddButton.centerXAnchor.constraint(equalTo: s.view.centerXAnchor),
- centeredAddButton.centerYAnchor.constraint(equalTo: s.view.centerYAnchor)
- ])
- centeredAddButton.onTapped = { [weak self] in
- self?.addButtonTapped(sender: centeredAddButton)
- }
- s.centeredAddButton = centeredAddButton
+ func setTunnelsManager(tunnelsManager: TunnelsManager) {
+ if (self.tunnelsManager != nil) {
+ // If a tunnels manager is already set, do nothing
+ return
+ }
+
+ // Create the table view
+
+ let tableView = UITableView(frame: CGRect.zero, style: .plain)
+ tableView.rowHeight = 60
+ tableView.separatorStyle = .none
+ tableView.register(TunnelsListTableViewCell.self, forCellReuseIdentifier: TunnelsListTableViewCell.id)
- centeredAddButton.isHidden = (tunnelsManager.numberOfTunnels() > 0)
- busyIndicator.stopAnimating()
+ self.view.addSubview(tableView)
+ tableView.translatesAutoresizingMaskIntoConstraints = false
+ NSLayoutConstraint.activate([
+ tableView.leftAnchor.constraint(equalTo: self.view.leftAnchor),
+ tableView.rightAnchor.constraint(equalTo: self.view.rightAnchor),
+ tableView.topAnchor.constraint(equalTo: self.view.topAnchor),
+ tableView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor)
+ ])
+ tableView.dataSource = self
+ tableView.delegate = self
+ self.tableView = tableView
+
+ // Add button at the center
- tunnelsManager.delegate = s
- tunnelsManager.activationDelegate = s
- s.tunnelsManager = tunnelsManager
- s.onTunnelsManagerReady?(tunnelsManager)
- s.onTunnelsManagerReady = nil
+ let centeredAddButton = BorderedTextButton()
+ centeredAddButton.title = "Add a tunnel"
+ centeredAddButton.isHidden = true
+ self.view.addSubview(centeredAddButton)
+ centeredAddButton.translatesAutoresizingMaskIntoConstraints = false
+ NSLayoutConstraint.activate([
+ centeredAddButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
+ centeredAddButton.centerYAnchor.constraint(equalTo: self.view.centerYAnchor)
+ ])
+ centeredAddButton.onTapped = { [weak self] in
+ self?.addButtonTapped(sender: centeredAddButton)
}
+ centeredAddButton.isHidden = (tunnelsManager.numberOfTunnels() > 0)
+ self.centeredAddButton = centeredAddButton
+
+ // Hide the busy indicator
+
+ self.busyIndicator?.stopAnimating()
+
+ // Keep track of the tunnels manager
+
+ self.tunnelsManager = tunnelsManager
+ tunnelsManager.tunnelsListDelegate = self
}
@objc func addButtonTapped(sender: AnyObject) {
@@ -188,16 +192,6 @@ class TunnelsListTableViewController: UIViewController {
}
}
}
-
- func refreshTunnelConnectionStatuses() {
- if let tunnelsManager = tunnelsManager {
- tunnelsManager.refreshStatuses()
- } else {
- onTunnelsManagerReady = { tunnelsManager in
- tunnelsManager.refreshStatuses()
- }
- }
- }
}
// MARK: UIDocumentPickerDelegate
@@ -293,7 +287,7 @@ extension TunnelsListTableViewController: UITableViewDelegate {
// MARK: TunnelsManagerDelegate
-extension TunnelsListTableViewController: TunnelsManagerDelegate {
+extension TunnelsListTableViewController: TunnelsManagerListDelegate {
func tunnelAdded(at index: Int) {
tableView?.insertRows(at: [IndexPath(row: index, section: 0)], with: .automatic)
centeredAddButton?.isHidden = (tunnelsManager?.numberOfTunnels() ?? 0 > 0)
@@ -313,14 +307,6 @@ extension TunnelsListTableViewController: TunnelsManagerDelegate {
}
}
-// MARK: TunnelActivationDelegate
-
-extension TunnelsListTableViewController: TunnelActivationDelegate {
- func tunnelActivationFailed(tunnel: TunnelContainer, error: TunnelActivationError) {
- ErrorPresenter.showErrorAlert(error: error, from: self)
- }
-}
-
class TunnelsListTableViewCell: UITableViewCell {
static let id: String = "TunnelsListTableViewCell"
var tunnel: TunnelContainer? {
diff --git a/WireGuard/WireGuard/VPN/TunnelsManager.swift b/WireGuard/WireGuard/VPN/TunnelsManager.swift
index 4306fd1..3e6c9c2 100644
--- a/WireGuard/WireGuard/VPN/TunnelsManager.swift
+++ b/WireGuard/WireGuard/VPN/TunnelsManager.swift
@@ -5,14 +5,14 @@ import Foundation
import NetworkExtension
import os.log
-protocol TunnelsManagerDelegate: class {
+protocol TunnelsManagerListDelegate: class {
func tunnelAdded(at: Int)
func tunnelModified(at: Int)
func tunnelMoved(at oldIndex: Int, to newIndex: Int)
func tunnelRemoved(at: Int)
}
-protocol TunnelActivationDelegate: class {
+protocol TunnelsManagerActivationDelegate: class {
func tunnelActivationFailed(tunnel: TunnelContainer, error: TunnelActivationError)
}
@@ -35,8 +35,8 @@ enum TunnelManagementError: Error {
class TunnelsManager {
private var tunnels: [TunnelContainer]
- weak var delegate: TunnelsManagerDelegate?
- weak var activationDelegate: TunnelActivationDelegate?
+ weak var tunnelsListDelegate: TunnelsManagerListDelegate?
+ weak var activationDelegate: TunnelsManagerActivationDelegate?
private var isAddingTunnel: Bool = false
private var isModifyingTunnel: Bool = false
@@ -94,7 +94,7 @@ class TunnelsManager {
let tunnel = TunnelContainer(tunnel: tunnelProviderManager)
s.tunnels.append(tunnel)
s.tunnels.sort { $0.name < $1.name }
- s.delegate?.tunnelAdded(at: s.tunnels.firstIndex(of: tunnel)!)
+ s.tunnelsListDelegate?.tunnelAdded(at: s.tunnels.firstIndex(of: tunnel)!)
completionHandler(tunnel, nil)
}
}
@@ -157,9 +157,9 @@ class TunnelsManager {
let oldIndex = s.tunnels.firstIndex(of: tunnel)!
s.tunnels.sort { $0.name < $1.name }
let newIndex = s.tunnels.firstIndex(of: tunnel)!
- s.delegate?.tunnelMoved(at: oldIndex, to: newIndex)
+ s.tunnelsListDelegate?.tunnelMoved(at: oldIndex, to: newIndex)
}
- s.delegate?.tunnelModified(at: s.tunnels.firstIndex(of: tunnel)!)
+ s.tunnelsListDelegate?.tunnelModified(at: s.tunnels.firstIndex(of: tunnel)!)
if (tunnel.status == .active || tunnel.status == .activating || tunnel.status == .reasserting) {
// Turn off the tunnel, and then turn it back on, so the changes are made effective
@@ -200,7 +200,7 @@ class TunnelsManager {
if let s = self {
let index = s.tunnels.firstIndex(of: tunnel)!
s.tunnels.remove(at: index)
- s.delegate?.tunnelRemoved(at: index)
+ s.tunnelsListDelegate?.tunnelRemoved(at: index)
}
completionHandler(nil)
}