summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2022-07-26 14:08:31 +0200
committerAndrej Mihajlov <and@mullvad.net>2022-07-27 15:42:01 +0200
commitf9b8734dfb15b265e1404d0427ed50f6de350142 (patch)
treebf1b702e35fd1fde047f20674f2fc45ac463c553
parent8b1d56679d6e8cf0b5d193623842d7a32ce47058 (diff)
downloadmullvadvpn-f9b8734dfb15b265e1404d0427ed50f6de350142.tar.xz
mullvadvpn-f9b8734dfb15b265e1404d0427ed50f6de350142.zip
Throw error when unable to satisfy relay constraints
-rw-r--r--ios/MullvadVPN/RelaySelector.swift12
-rw-r--r--ios/MullvadVPN/SimulatorTunnelProviderHost.swift2
-rw-r--r--ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift6
-rw-r--r--ios/MullvadVPNTests/RelaySelectorTests.swift18
-rw-r--r--ios/PacketTunnel/PacketTunnelProvider.swift2
5 files changed, 22 insertions, 18 deletions
diff --git a/ios/MullvadVPN/RelaySelector.swift b/ios/MullvadVPN/RelaySelector.swift
index 5e7492ca16..c29c8ccef5 100644
--- a/ios/MullvadVPN/RelaySelector.swift
+++ b/ios/MullvadVPN/RelaySelector.swift
@@ -32,17 +32,23 @@ extension RelaySelectorResult {
}
}
+struct NoRelaysSatisfyingConstraintsError: LocalizedError {
+ var errorDescription: String? {
+ return "No relays satisfying constraints."
+ }
+}
+
enum RelaySelector {}
extension RelaySelector {
- static func evaluate(relays: REST.ServerRelaysResponse, constraints: RelayConstraints) -> RelaySelectorResult? {
+ static func evaluate(relays: REST.ServerRelaysResponse, constraints: RelayConstraints) throws -> RelaySelectorResult {
let filteredRelays = applyConstraints(constraints, relays: Self.parseRelaysResponse(relays))
guard let relayWithLocation = pickRandomRelay(relays: filteredRelays),
let port = pickRandomPort(rawPortRanges: relays.wireguard.portRanges) else {
- return nil
- }
+ throw NoRelaysSatisfyingConstraintsError()
+ }
let endpoint = MullvadEndpoint(
ipv4Relay: IPv4Endpoint(
diff --git a/ios/MullvadVPN/SimulatorTunnelProviderHost.swift b/ios/MullvadVPN/SimulatorTunnelProviderHost.swift
index 400aba003c..d523e499fb 100644
--- a/ios/MullvadVPN/SimulatorTunnelProviderHost.swift
+++ b/ios/MullvadVPN/SimulatorTunnelProviderHost.swift
@@ -91,7 +91,7 @@ class SimulatorTunnelProviderHost: SimulatorTunnelProviderDelegate {
do {
let tunnelSettings = try SettingsManager.readSettings()
- return RelaySelector.evaluate(
+ return try RelaySelector.evaluate(
relays: cachedRelays.relays,
constraints: tunnelSettings.relayConstraints
)
diff --git a/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift b/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift
index 081663517d..2ffa3cb9d6 100644
--- a/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift
+++ b/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift
@@ -62,12 +62,10 @@ class StartTunnelOperation: ResultOperation<(), TunnelManager.Error> {
}
private func didReceiveRelays(tunnelSettings: TunnelSettingsV2, cachedRelays: RelayCache.CachedRelays) {
- let selectorResult = RelaySelector.evaluate(
+ guard let selectorResult = try? RelaySelector.evaluate(
relays: cachedRelays.relays,
constraints: tunnelSettings.relayConstraints
- )
-
- guard let selectorResult = selectorResult else {
+ ) else {
finish(completion: .failure(.cannotSatisfyRelayConstraints))
return
}
diff --git a/ios/MullvadVPNTests/RelaySelectorTests.swift b/ios/MullvadVPNTests/RelaySelectorTests.swift
index 10dcb8502e..8f997289db 100644
--- a/ios/MullvadVPNTests/RelaySelectorTests.swift
+++ b/ios/MullvadVPNTests/RelaySelectorTests.swift
@@ -11,27 +11,27 @@ import Network
class RelaySelectorTests: XCTestCase {
- func testCountryConstraint() {
+ func testCountryConstraint() throws {
let constraints = RelayConstraints(location: .only(.country("es")))
- let result = RelaySelector.evaluate(relays: sampleRelays, constraints: constraints)
+ let result = try RelaySelector.evaluate(relays: sampleRelays, constraints: constraints)
- XCTAssertEqual(result?.relay.hostname, "es1-wireguard")
+ XCTAssertEqual(result.relay.hostname, "es1-wireguard")
}
- func testCityConstraint() {
+ func testCityConstraint() throws {
let constraints = RelayConstraints(location: .only(.city("se", "got")))
- let result = RelaySelector.evaluate(relays: sampleRelays, constraints: constraints)
+ let result = try RelaySelector.evaluate(relays: sampleRelays, constraints: constraints)
- XCTAssertEqual(result?.relay.hostname, "se10-wireguard")
+ XCTAssertEqual(result.relay.hostname, "se10-wireguard")
}
- func testHostnameConstraint() {
+ func testHostnameConstraint() throws {
let constraints = RelayConstraints(location: .only(.hostname("se", "sto", "se6-wireguard")))
- let result = RelaySelector.evaluate(relays: sampleRelays, constraints: constraints)
+ let result = try RelaySelector.evaluate(relays: sampleRelays, constraints: constraints)
- XCTAssertEqual(result?.relay.hostname, "se6-wireguard")
+ XCTAssertEqual(result.relay.hostname, "se6-wireguard")
}
}
diff --git a/ios/PacketTunnel/PacketTunnelProvider.swift b/ios/PacketTunnel/PacketTunnelProvider.swift
index 2e917eb5b1..126ed7b6ae 100644
--- a/ios/PacketTunnel/PacketTunnelProvider.swift
+++ b/ios/PacketTunnel/PacketTunnelProvider.swift
@@ -420,7 +420,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider, TunnelMonitorDelegate {
throw PacketTunnelProviderError.readRelayCache(error)
}
- if let selectorResult = RelaySelector.evaluate(
+ if let selectorResult = try? RelaySelector.evaluate(
relays: cachedRelayList.relays,
constraints: relayConstraints
) {