]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
On-Demand: Add support for macOS-specific values
authorRoopesh Chander <roop@roopc.net>
Sat, 22 Dec 2018 13:29:23 +0000 (18:59 +0530)
committerRoopesh Chander <roop@roopc.net>
Mon, 14 Jan 2019 09:22:26 +0000 (14:52 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/Base.lproj/Localizable.strings
WireGuard/WireGuard/Tunnel/ActivateOnDemandSetting.swift
WireGuard/WireGuard/UI/TunnelViewModel.swift

index a2249b3d15ad4aa362fdb69d4db9a0d0ba84be8a..e69b6b6ef6bc9e9ea49882535c422f4cb2f673e2 100644 (file)
 
 "tunnelOnDemandKey" = "Activate on demand";
 "tunnelOnDemandOptionOff" = "Off";
-"tunnelOnDemandOptionWiFiOrCellular" = "Wi-Fi or cellular";
 "tunnelOnDemandOptionWiFiOnly" = "Wi-Fi only";
+"tunnelOnDemandOptionWiFiOrCellular" = "Wi-Fi or cellular";
 "tunnelOnDemandOptionCellularOnly" = "Cellular only";
+"tunnelOnDemandOptionWiFiOrEthernet" = "Wi-Fi or ethernet";
+"tunnelOnDemandOptionEthernetOnly" = "Ethernet only";
 
 "addPeerButtonTitle" = "Add peer";
 
index ffc06248872c3c6994bc5c30dad46b62b458dd5f..c89cce37dd6c75b7629c8b82e055d5b82637deb2 100644 (file)
@@ -10,9 +10,14 @@ struct ActivateOnDemandSetting {
 
 enum ActivateOnDemandOption {
     case none // Valid only when isActivateOnDemandEnabled is false
-    case useOnDemandOverWiFiOrCellular
     case useOnDemandOverWiFiOnly
+    #if os(iOS)
+    case useOnDemandOverWiFiOrCellular
     case useOnDemandOverCellularOnly
+    #elseif os(OSX)
+    case useOnDemandOverWiFiOrEthernet
+    case useOnDemandOverEthernetOnly
+    #endif
 }
 
 extension ActivateOnDemandSetting {
@@ -24,6 +29,7 @@ extension ActivateOnDemandSetting {
         switch activateOnDemandOption {
         case .none:
             rules = nil
+        #if os(iOS)
         case .useOnDemandOverWiFiOrCellular:
             rules = [connectRule]
         case .useOnDemandOverWiFiOnly:
@@ -34,12 +40,33 @@ extension ActivateOnDemandSetting {
             connectRule.interfaceTypeMatch = .cellular
             disconnectRule.interfaceTypeMatch = .wiFi
             rules = [connectRule, disconnectRule]
+        #elseif os(OSX)
+        case .useOnDemandOverWiFiOrEthernet:
+            rules = [connectRule]
+        case .useOnDemandOverWiFiOnly:
+            connectRule.interfaceTypeMatch = .wiFi
+            disconnectRule.interfaceTypeMatch = .ethernet
+            rules = [connectRule, disconnectRule]
+        case .useOnDemandOverEthernetOnly:
+            connectRule.interfaceTypeMatch = .ethernet
+            disconnectRule.interfaceTypeMatch = .wiFi
+            rules = [connectRule, disconnectRule]
+        #endif
         }
         tunnelProviderManager.onDemandRules = rules
     }
 
     init(from tunnelProviderManager: NETunnelProviderManager) {
         let rules = tunnelProviderManager.onDemandRules ?? []
+        #if os(iOS)
+        let otherInterfaceType: NEOnDemandRuleInterfaceType = .cellular
+        let useWiFiOrOtherOption: ActivateOnDemandOption = .useOnDemandOverWiFiOrCellular
+        let useOtherOnlyOption: ActivateOnDemandOption = .useOnDemandOverCellularOnly
+        #elseif os(OSX)
+        let otherInterfaceType: NEOnDemandRuleInterfaceType = .ethernet
+        let useWiFiOrOtherOption: ActivateOnDemandOption = .useOnDemandOverWiFiOrEthernet
+        let useOtherOnlyOption: ActivateOnDemandOption = .useOnDemandOverEthernetOnly
+        #endif
         let activateOnDemandOption: ActivateOnDemandOption
         switch rules.count {
         case 0:
@@ -47,20 +74,21 @@ extension ActivateOnDemandSetting {
         case 1:
             let rule = rules[0]
             precondition(rule.action == .connect)
-            activateOnDemandOption = .useOnDemandOverWiFiOrCellular
+            activateOnDemandOption = useWiFiOrOtherOption
         case 2:
             let connectRule = rules.first(where: { $0.action == .connect })!
             let disconnectRule = rules.first(where: { $0.action == .disconnect })!
-            if connectRule.interfaceTypeMatch == .wiFi && disconnectRule.interfaceTypeMatch == .cellular {
+            if connectRule.interfaceTypeMatch == .wiFi && disconnectRule.interfaceTypeMatch == otherInterfaceType {
                 activateOnDemandOption = .useOnDemandOverWiFiOnly
-            } else if connectRule.interfaceTypeMatch == .cellular && disconnectRule.interfaceTypeMatch == .wiFi {
-                activateOnDemandOption = .useOnDemandOverCellularOnly
+            } else if connectRule.interfaceTypeMatch == otherInterfaceType && disconnectRule.interfaceTypeMatch == .wiFi {
+                activateOnDemandOption = useOtherOnlyOption
             } else {
                 fatalError("Unexpected onDemandRules set on tunnel provider manager")
             }
         default:
             fatalError("Unexpected number of onDemandRules set on tunnel provider manager")
         }
+
         self.activateOnDemandOption = activateOnDemandOption
         if activateOnDemandOption == .none {
             isActivateOnDemandEnabled = false
index 096be76b30ab642b1efa6d4281143ce3e429085b..50d97c3949ba49bea4e5034625d0389163dc94df 100644 (file)
@@ -454,12 +454,19 @@ extension TunnelViewModel {
         switch activateOnDemandOption {
         case .none:
             return tr("tunnelOnDemandOptionOff")
-        case .useOnDemandOverWiFiOrCellular:
-            return tr("tunnelOnDemandOptionWiFiOrCellular")
         case .useOnDemandOverWiFiOnly:
             return tr("tunnelOnDemandOptionWiFiOnly")
+        #if os(iOS)
+        case .useOnDemandOverWiFiOrCellular:
+            return tr("tunnelOnDemandOptionWiFiOrCellular")
         case .useOnDemandOverCellularOnly:
             return tr("tunnelOnDemandOptionCellularOnly")
+        #elseif os(OSX)
+        case .useOnDemandOverWiFiOrEthernet:
+            return tr("tunnelOnDemandOptionWiFiOrEthernet")
+        case .useOnDemandOverEthernetOnly:
+            return tr("tunnelOnDemandOptionEthernetOnly")
+        #endif
         }
     }
 
@@ -476,6 +483,10 @@ extension TunnelViewModel {
     }
 
     static func defaultActivateOnDemandOption() -> ActivateOnDemandOption {
+        #if os(iOS)
         return .useOnDemandOverWiFiOrCellular
+        #elseif os(OSX)
+        return .useOnDemandOverWiFiOrEthernet
+        #endif
     }
 }