aboutsummaryrefslogtreecommitdiffstats
path: root/WireGuard/WireGuard/VPN
diff options
context:
space:
mode:
authorRoopesh Chander <roop@roopc.net>2018-10-15 13:35:24 +0530
committerRoopesh Chander <roop@roopc.net>2018-10-27 15:13:01 +0530
commitb63abc65c3f83e871863bffbc714897d186b710c (patch)
treeb214c99c62878ff7d00751e316d15e1de0cdbaa0 /WireGuard/WireGuard/VPN
parentBump deployment target to iOS 12.0 (diff)
downloadwireguard-apple-b63abc65c3f83e871863bffbc714897d186b710c.tar.xz
wireguard-apple-b63abc65c3f83e871863bffbc714897d186b710c.zip
VPN: Add TunnelsManager to manage the tunnels in the app
Signed-off-by: Roopesh Chander <roop@roopc.net>
Diffstat (limited to 'WireGuard/WireGuard/VPN')
-rw-r--r--WireGuard/WireGuard/VPN/TunnelsManager.swift82
1 files changed, 82 insertions, 0 deletions
diff --git a/WireGuard/WireGuard/VPN/TunnelsManager.swift b/WireGuard/WireGuard/VPN/TunnelsManager.swift
new file mode 100644
index 0000000..ff1cf78
--- /dev/null
+++ b/WireGuard/WireGuard/VPN/TunnelsManager.swift
@@ -0,0 +1,82 @@
+//
+// TunnelsManager.swift
+// WireGuard
+//
+// Created by Roopesh Chander on 13/10/18.
+// Copyright © 2018 WireGuard LLC. All rights reserved.
+//
+
+import Foundation
+
+class TunnelProviderManager {
+ // Mock of NETunnelProviderManager
+ var name: String
+ var tunnelConfiguration: TunnelConfiguration
+ init(tunnelConfiguration: TunnelConfiguration) {
+ self.name = tunnelConfiguration.name
+ self.tunnelConfiguration = tunnelConfiguration
+ }
+}
+
+class TunnelContainer {
+ var name: String { return tunnelProvider.name }
+ let tunnelProvider: TunnelProviderManager
+ var index: Int
+ init(tunnel: TunnelProviderManager, index: Int) {
+ self.tunnelProvider = tunnel
+ self.index = index
+ }
+}
+
+class TunnelsManager {
+
+ var tunnels: [TunnelContainer]
+
+ enum TunnelsManagerError: Error {
+ case tunnelsUninitialized
+ }
+
+ init(tunnelProviders: [TunnelProviderManager]) {
+ var tunnels: [TunnelContainer] = []
+ for (i, tunnelProvider) in tunnelProviders.enumerated() {
+ let tunnel = TunnelContainer(tunnel: tunnelProvider, index: i)
+ tunnels.append(tunnel)
+ }
+ self.tunnels = tunnels
+ }
+
+ static func create(completionHandler: (TunnelsManager?) -> Void) {
+ completionHandler(TunnelsManager(tunnelProviders: []))
+ }
+
+ func add(tunnelConfiguration: TunnelConfiguration, completionHandler: @escaping (Error?) -> Void) {
+ let tunnelProvider = TunnelProviderManager(tunnelConfiguration: tunnelConfiguration)
+ for tunnel in tunnels {
+ tunnel.index = tunnel.index + 1
+ }
+ let tunnel = TunnelContainer(tunnel: tunnelProvider, index: 0)
+ tunnels.insert(tunnel, at: 0)
+ completionHandler(nil)
+ }
+
+ func modify(tunnel: TunnelContainer, with tunnelConfiguration: TunnelConfiguration, completionHandler: @escaping (Error?) -> Void) {
+ tunnel.tunnelProvider.tunnelConfiguration = tunnelConfiguration
+ completionHandler(nil)
+ }
+
+ func remove(tunnel: TunnelContainer, completionHandler: @escaping (Error?) -> Void) {
+ for i in ((tunnel.index + 1) ..< tunnels.count) {
+ tunnels[i].index = tunnels[i].index + 1
+ }
+ tunnels.remove(at: tunnel.index)
+ completionHandler(nil)
+ }
+
+ func numberOfTunnels() -> Int {
+ return tunnels.count
+ }
+
+ func tunnel(at index: Int) -> TunnelContainer {
+ return tunnels[index]
+ }
+}