From 09d7a5229ae026f004eb38295679bb9c044d2da7 Mon Sep 17 00:00:00 2001 From: Roopesh Chander Date: Sat, 22 Dec 2018 18:59:23 +0530 Subject: On-Demand: Add support for macOS-specific values Signed-off-by: Roopesh Chander --- WireGuard/WireGuard/Base.lproj/Localizable.strings | 4 ++- .../WireGuard/Tunnel/ActivateOnDemandSetting.swift | 38 +++++++++++++++++++--- WireGuard/WireGuard/UI/TunnelViewModel.swift | 15 +++++++-- 3 files changed, 49 insertions(+), 8 deletions(-) (limited to 'WireGuard') diff --git a/WireGuard/WireGuard/Base.lproj/Localizable.strings b/WireGuard/WireGuard/Base.lproj/Localizable.strings index a2249b3..e69b6b6 100644 --- a/WireGuard/WireGuard/Base.lproj/Localizable.strings +++ b/WireGuard/WireGuard/Base.lproj/Localizable.strings @@ -68,9 +68,11 @@ "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"; diff --git a/WireGuard/WireGuard/Tunnel/ActivateOnDemandSetting.swift b/WireGuard/WireGuard/Tunnel/ActivateOnDemandSetting.swift index ffc0624..c89cce3 100644 --- a/WireGuard/WireGuard/Tunnel/ActivateOnDemandSetting.swift +++ b/WireGuard/WireGuard/Tunnel/ActivateOnDemandSetting.swift @@ -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 diff --git a/WireGuard/WireGuard/UI/TunnelViewModel.swift b/WireGuard/WireGuard/UI/TunnelViewModel.swift index 096be76..50d97c3 100644 --- a/WireGuard/WireGuard/UI/TunnelViewModel.swift +++ b/WireGuard/WireGuard/UI/TunnelViewModel.swift @@ -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 } } -- cgit v1.2.3-59-g8ed1b