On-Demand: Add support for macOS-specific values

This commit is contained in:
Roopesh Chander 2018-12-22 18:59:23 +05:30
parent 7a85358998
commit 1d5b04c822
3 changed files with 49 additions and 8 deletions

View File

@ -68,9 +68,11 @@
"tunnelOnDemandKey" = "Activate on demand"; "tunnelOnDemandKey" = "Activate on demand";
"tunnelOnDemandOptionOff" = "Off"; "tunnelOnDemandOptionOff" = "Off";
"tunnelOnDemandOptionWiFiOrCellular" = "Wi-Fi or cellular";
"tunnelOnDemandOptionWiFiOnly" = "Wi-Fi only"; "tunnelOnDemandOptionWiFiOnly" = "Wi-Fi only";
"tunnelOnDemandOptionWiFiOrCellular" = "Wi-Fi or cellular";
"tunnelOnDemandOptionCellularOnly" = "Cellular only"; "tunnelOnDemandOptionCellularOnly" = "Cellular only";
"tunnelOnDemandOptionWiFiOrEthernet" = "Wi-Fi or ethernet";
"tunnelOnDemandOptionEthernetOnly" = "Ethernet only";
"addPeerButtonTitle" = "Add peer"; "addPeerButtonTitle" = "Add peer";

View File

@ -10,9 +10,14 @@ struct ActivateOnDemandSetting {
enum ActivateOnDemandOption { enum ActivateOnDemandOption {
case none // Valid only when isActivateOnDemandEnabled is false case none // Valid only when isActivateOnDemandEnabled is false
case useOnDemandOverWiFiOrCellular
case useOnDemandOverWiFiOnly case useOnDemandOverWiFiOnly
#if os(iOS)
case useOnDemandOverWiFiOrCellular
case useOnDemandOverCellularOnly case useOnDemandOverCellularOnly
#elseif os(OSX)
case useOnDemandOverWiFiOrEthernet
case useOnDemandOverEthernetOnly
#endif
} }
extension ActivateOnDemandSetting { extension ActivateOnDemandSetting {
@ -24,6 +29,7 @@ extension ActivateOnDemandSetting {
switch activateOnDemandOption { switch activateOnDemandOption {
case .none: case .none:
rules = nil rules = nil
#if os(iOS)
case .useOnDemandOverWiFiOrCellular: case .useOnDemandOverWiFiOrCellular:
rules = [connectRule] rules = [connectRule]
case .useOnDemandOverWiFiOnly: case .useOnDemandOverWiFiOnly:
@ -34,12 +40,33 @@ extension ActivateOnDemandSetting {
connectRule.interfaceTypeMatch = .cellular connectRule.interfaceTypeMatch = .cellular
disconnectRule.interfaceTypeMatch = .wiFi disconnectRule.interfaceTypeMatch = .wiFi
rules = [connectRule, disconnectRule] 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 tunnelProviderManager.onDemandRules = rules
} }
init(from tunnelProviderManager: NETunnelProviderManager) { init(from tunnelProviderManager: NETunnelProviderManager) {
let rules = tunnelProviderManager.onDemandRules ?? [] 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 let activateOnDemandOption: ActivateOnDemandOption
switch rules.count { switch rules.count {
case 0: case 0:
@ -47,20 +74,21 @@ extension ActivateOnDemandSetting {
case 1: case 1:
let rule = rules[0] let rule = rules[0]
precondition(rule.action == .connect) precondition(rule.action == .connect)
activateOnDemandOption = .useOnDemandOverWiFiOrCellular activateOnDemandOption = useWiFiOrOtherOption
case 2: case 2:
let connectRule = rules.first(where: { $0.action == .connect })! let connectRule = rules.first(where: { $0.action == .connect })!
let disconnectRule = rules.first(where: { $0.action == .disconnect })! let disconnectRule = rules.first(where: { $0.action == .disconnect })!
if connectRule.interfaceTypeMatch == .wiFi && disconnectRule.interfaceTypeMatch == .cellular { if connectRule.interfaceTypeMatch == .wiFi && disconnectRule.interfaceTypeMatch == otherInterfaceType {
activateOnDemandOption = .useOnDemandOverWiFiOnly activateOnDemandOption = .useOnDemandOverWiFiOnly
} else if connectRule.interfaceTypeMatch == .cellular && disconnectRule.interfaceTypeMatch == .wiFi { } else if connectRule.interfaceTypeMatch == otherInterfaceType && disconnectRule.interfaceTypeMatch == .wiFi {
activateOnDemandOption = .useOnDemandOverCellularOnly activateOnDemandOption = useOtherOnlyOption
} else { } else {
fatalError("Unexpected onDemandRules set on tunnel provider manager") fatalError("Unexpected onDemandRules set on tunnel provider manager")
} }
default: default:
fatalError("Unexpected number of onDemandRules set on tunnel provider manager") fatalError("Unexpected number of onDemandRules set on tunnel provider manager")
} }
self.activateOnDemandOption = activateOnDemandOption self.activateOnDemandOption = activateOnDemandOption
if activateOnDemandOption == .none { if activateOnDemandOption == .none {
isActivateOnDemandEnabled = false isActivateOnDemandEnabled = false

View File

@ -454,12 +454,19 @@ extension TunnelViewModel {
switch activateOnDemandOption { switch activateOnDemandOption {
case .none: case .none:
return tr("tunnelOnDemandOptionOff") return tr("tunnelOnDemandOptionOff")
case .useOnDemandOverWiFiOrCellular:
return tr("tunnelOnDemandOptionWiFiOrCellular")
case .useOnDemandOverWiFiOnly: case .useOnDemandOverWiFiOnly:
return tr("tunnelOnDemandOptionWiFiOnly") return tr("tunnelOnDemandOptionWiFiOnly")
#if os(iOS)
case .useOnDemandOverWiFiOrCellular:
return tr("tunnelOnDemandOptionWiFiOrCellular")
case .useOnDemandOverCellularOnly: case .useOnDemandOverCellularOnly:
return tr("tunnelOnDemandOptionCellularOnly") 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 { static func defaultActivateOnDemandOption() -> ActivateOnDemandOption {
#if os(iOS)
return .useOnDemandOverWiFiOrCellular return .useOnDemandOverWiFiOrCellular
#elseif os(OSX)
return .useOnDemandOverWiFiOrEthernet
#endif
} }
} }