Tunnel view model: Support for exclude private IPs
This commit is contained in:
parent
7f69cb6118
commit
eb61152fe0
|
@ -179,6 +179,13 @@ class TunnelViewModel {
|
||||||
var fieldsWithError: Set<PeerField> = []
|
var fieldsWithError: Set<PeerField> = []
|
||||||
var validatedConfiguration: PeerConfiguration? = nil
|
var validatedConfiguration: PeerConfiguration? = nil
|
||||||
|
|
||||||
|
// For exclude private IPs
|
||||||
|
var shouldAllowExcludePrivateIPsControl: Bool = false
|
||||||
|
var excludePrivateIPsValue: Bool = false
|
||||||
|
var numberOfPeers: Int = 0 {
|
||||||
|
didSet { updateExcludePrivateIPsFieldState() }
|
||||||
|
}
|
||||||
|
|
||||||
init(index: Int) {
|
init(index: Int) {
|
||||||
self.index = index
|
self.index = index
|
||||||
}
|
}
|
||||||
|
@ -204,6 +211,9 @@ class TunnelViewModel {
|
||||||
} else {
|
} else {
|
||||||
scratchpad[field] = stringValue
|
scratchpad[field] = stringValue
|
||||||
}
|
}
|
||||||
|
if (field == .allowedIPs) {
|
||||||
|
updateExcludePrivateIPsFieldState()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,6 +233,7 @@ class TunnelViewModel {
|
||||||
if let persistentKeepAlive = config.persistentKeepAlive {
|
if let persistentKeepAlive = config.persistentKeepAlive {
|
||||||
scratchpad[.persistentKeepAlive] = String(persistentKeepAlive)
|
scratchpad[.persistentKeepAlive] = String(persistentKeepAlive)
|
||||||
}
|
}
|
||||||
|
updateExcludePrivateIPsFieldState()
|
||||||
}
|
}
|
||||||
|
|
||||||
func save() -> SaveResult<PeerConfiguration> {
|
func save() -> SaveResult<PeerConfiguration> {
|
||||||
|
@ -291,6 +302,59 @@ class TunnelViewModel {
|
||||||
}
|
}
|
||||||
// TODO: Cache this to avoid recomputing
|
// TODO: Cache this to avoid recomputing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static let ipv4DefaultRouteString = "0.0.0.0/0"
|
||||||
|
static let ipv4DefaultRouteModRFC1918String = [ // Set of all non-private IPv4 IPs
|
||||||
|
"0.0.0.0/5", "8.0.0.0/7", "11.0.0.0/8", "12.0.0.0/6", "16.0.0.0/4", "32.0.0.0/3",
|
||||||
|
"64.0.0.0/2", "128.0.0.0/3", "160.0.0.0/5", "168.0.0.0/6", "172.0.0.0/12",
|
||||||
|
"172.32.0.0/11", "172.64.0.0/10", "172.128.0.0/9", "173.0.0.0/8", "174.0.0.0/7",
|
||||||
|
"176.0.0.0/4", "192.0.0.0/9", "192.128.0.0/11", "192.160.0.0/13", "192.169.0.0/16",
|
||||||
|
"192.170.0.0/15", "192.172.0.0/14", "192.176.0.0/12", "192.192.0.0/10",
|
||||||
|
"193.0.0.0/8", "194.0.0.0/7", "196.0.0.0/6", "200.0.0.0/5", "208.0.0.0/4"
|
||||||
|
]
|
||||||
|
|
||||||
|
func updateExcludePrivateIPsFieldState() {
|
||||||
|
guard (numberOfPeers == 1) else {
|
||||||
|
shouldAllowExcludePrivateIPsControl = false
|
||||||
|
excludePrivateIPsValue = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let allowedIPStrings = Set<String>(
|
||||||
|
(scratchpad[.allowedIPs] ?? "")
|
||||||
|
.split(separator: ",")
|
||||||
|
.map { $0.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) }
|
||||||
|
)
|
||||||
|
if (allowedIPStrings.contains(TunnelViewModel.PeerData.ipv4DefaultRouteString)) {
|
||||||
|
shouldAllowExcludePrivateIPsControl = true
|
||||||
|
excludePrivateIPsValue = false
|
||||||
|
} else if (allowedIPStrings.isSuperset(of: TunnelViewModel.PeerData.ipv4DefaultRouteModRFC1918String)) {
|
||||||
|
shouldAllowExcludePrivateIPsControl = true
|
||||||
|
excludePrivateIPsValue = true
|
||||||
|
} else {
|
||||||
|
shouldAllowExcludePrivateIPsControl = false
|
||||||
|
excludePrivateIPsValue = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func excludePrivateIPsValueChanged(isOn: Bool, dnsServers: String) {
|
||||||
|
let allowedIPStrings = (scratchpad[.allowedIPs] ?? "")
|
||||||
|
.split(separator: ",")
|
||||||
|
.map { $0.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) }
|
||||||
|
let dnsServerStrings = dnsServers
|
||||||
|
.split(separator: ",")
|
||||||
|
.map { $0.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) }
|
||||||
|
let ipv6Addresses = allowedIPStrings.filter { $0.contains(":") }
|
||||||
|
let modifiedAllowedIPStrings: [String]
|
||||||
|
if (isOn) {
|
||||||
|
modifiedAllowedIPStrings = ipv6Addresses +
|
||||||
|
TunnelViewModel.PeerData.ipv4DefaultRouteModRFC1918String + dnsServerStrings
|
||||||
|
} else {
|
||||||
|
modifiedAllowedIPStrings = ipv6Addresses +
|
||||||
|
[TunnelViewModel.PeerData.ipv4DefaultRouteString]
|
||||||
|
}
|
||||||
|
scratchpad[.allowedIPs] = modifiedAllowedIPStrings.joined(separator: ", ")
|
||||||
|
excludePrivateIPsValue = isOn
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum SaveResult<Configuration> {
|
enum SaveResult<Configuration> {
|
||||||
|
@ -317,6 +381,9 @@ class TunnelViewModel {
|
||||||
func appendEmptyPeer() {
|
func appendEmptyPeer() {
|
||||||
let peer = PeerData(index: peersData.count)
|
let peer = PeerData(index: peersData.count)
|
||||||
peersData.append(peer)
|
peersData.append(peer)
|
||||||
|
for p in peersData {
|
||||||
|
p.numberOfPeers = peersData.count
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func deletePeer(peer: PeerData) {
|
func deletePeer(peer: PeerData) {
|
||||||
|
@ -326,6 +393,9 @@ class TunnelViewModel {
|
||||||
assert(p.index > 0)
|
assert(p.index > 0)
|
||||||
p.index = p.index - 1
|
p.index = p.index - 1
|
||||||
}
|
}
|
||||||
|
for p in peersData {
|
||||||
|
p.numberOfPeers = peersData.count
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func save() -> SaveResult<TunnelConfiguration> {
|
func save() -> SaveResult<TunnelConfiguration> {
|
||||||
|
|
Loading…
Reference in New Issue