diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2022-07-26 14:08:31 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2022-07-27 15:42:01 +0200 |
| commit | f9b8734dfb15b265e1404d0427ed50f6de350142 (patch) | |
| tree | bf1b702e35fd1fde047f20674f2fc45ac463c553 | |
| parent | 8b1d56679d6e8cf0b5d193623842d7a32ce47058 (diff) | |
| download | mullvadvpn-f9b8734dfb15b265e1404d0427ed50f6de350142.tar.xz mullvadvpn-f9b8734dfb15b265e1404d0427ed50f6de350142.zip | |
Throw error when unable to satisfy relay constraints
| -rw-r--r-- | ios/MullvadVPN/RelaySelector.swift | 12 | ||||
| -rw-r--r-- | ios/MullvadVPN/SimulatorTunnelProviderHost.swift | 2 | ||||
| -rw-r--r-- | ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift | 6 | ||||
| -rw-r--r-- | ios/MullvadVPNTests/RelaySelectorTests.swift | 18 | ||||
| -rw-r--r-- | ios/PacketTunnel/PacketTunnelProvider.swift | 2 |
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 ) { |
