]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
TunnelsManager: Support for on-demand rules
authorRoopesh Chander <roop@roopc.net>
Sat, 10 Nov 2018 20:01:38 +0000 (01:31 +0530)
committerRoopesh Chander <roop@roopc.net>
Sat, 10 Nov 2018 20:01:38 +0000 (01:31 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/VPN/TunnelsManager.swift

index 8827ea382aaf13b6f5944f132cb7bf30bf0ebfab..8eb21123ca1c2702c50195c864153ed958fe8f36 100644 (file)
@@ -72,6 +72,14 @@ class TunnelsManager {
         tunnelProviderManager.localizedDescription = tunnelName
         tunnelProviderManager.isEnabled = true
 
+        if (tunnelConfiguration.activationType == .activateManually) {
+            tunnelProviderManager.onDemandRules = []
+            tunnelProviderManager.isOnDemandEnabled = false
+        } else {
+            tunnelProviderManager.onDemandRules = onDemandRules(for: tunnelConfiguration.activationType)
+            tunnelProviderManager.isOnDemandEnabled = true
+        }
+
         tunnelProviderManager.saveToPreferences { [weak self] (error) in
             defer { self?.isAddingTunnel = false }
             guard (error == nil) else {
@@ -130,6 +138,14 @@ class TunnelsManager {
         tunnelProviderManager.localizedDescription = tunnelName
         tunnelProviderManager.isEnabled = true
 
+        if (tunnelConfiguration.activationType == .activateManually) {
+            tunnelProviderManager.onDemandRules = []
+            tunnelProviderManager.isOnDemandEnabled = false
+        } else {
+            tunnelProviderManager.onDemandRules = onDemandRules(for: tunnelConfiguration.activationType)
+            tunnelProviderManager.isOnDemandEnabled = true
+        }
+
         tunnelProviderManager.saveToPreferences { [weak self] (error) in
             defer { self?.isModifyingTunnel = false }
             guard (error == nil) else {
@@ -213,6 +229,26 @@ class TunnelsManager {
             t.refreshConnectionStatus()
         }
     }
+
+    func onDemandRules(for activationType: ActivationType) -> [NEOnDemandRule] {
+        switch (activationType) {
+        case .activateManually: return []
+        case .useOnDemandOverWifiAndCellular:
+            return [NEOnDemandRuleConnect()]
+        case .useOnDemandOverWifiOnly:
+            let connectOnWifiRule = NEOnDemandRuleConnect()
+            connectOnWifiRule.interfaceTypeMatch = .wiFi
+            let disconnectOnCellularRule = NEOnDemandRuleDisconnect()
+            disconnectOnCellularRule.interfaceTypeMatch = .cellular
+            return [connectOnWifiRule, disconnectOnCellularRule]
+        case .useOnDemandOverCellularOnly:
+            let connectOnCellularRule = NEOnDemandRuleConnect()
+            connectOnCellularRule.interfaceTypeMatch = .cellular
+            let disconnectOnWifiRule = NEOnDemandRuleDisconnect()
+            disconnectOnWifiRule.interfaceTypeMatch = .wiFi
+            return [connectOnCellularRule, disconnectOnWifiRule]
+        }
+    }
 }
 
 class TunnelContainer: NSObject {