From dd18767b98f4650ae130492db71e70cf8556b805 Mon Sep 17 00:00:00 2001 From: Jon Petersson Date: Mon, 16 Oct 2023 13:30:11 +0200 Subject: [PATCH] Put app in blocked state on tunnel start if relay constraints cannot be satisfied Signed-off-by: Bug Magnet --- .../TunnelManager/StartTunnelOperation.swift | 32 +++++++------------ .../TunnelManager/TunnelManager.swift | 10 +----- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift b/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift index 86dce49a3a9e..525dade2cd84 100644 --- a/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift +++ b/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift @@ -50,14 +50,8 @@ class StartTunnelOperation: ResultOperation { finish(result: .success(())) case .disconnected, .pendingReconnect: - do { - let selectedRelay = try interactor.selectRelay() - - makeTunnelProviderAndStartTunnel(selectedRelay: selectedRelay) { error in - self.finish(result: error.map { .failure($0) } ?? .success(())) - } - } catch { - finish(result: .failure(error)) + makeTunnelProviderAndStartTunnel { error in + self.finish(result: error.map { .failure($0) } ?? .success(())) } default: @@ -65,18 +59,11 @@ class StartTunnelOperation: ResultOperation { } } - private func makeTunnelProviderAndStartTunnel( - selectedRelay: SelectedRelay, - completionHandler: @escaping (Error?) -> Void - ) { + private func makeTunnelProviderAndStartTunnel(completionHandler: @escaping (Error?) -> Void) { makeTunnelProvider { result in self.dispatchQueue.async { do { - try self.startTunnel( - tunnel: try result.get(), - selectedRelay: selectedRelay - ) - + try self.startTunnel(tunnel: result.get()) completionHandler(nil) } catch { completionHandler(error) @@ -85,11 +72,14 @@ class StartTunnelOperation: ResultOperation { } } - private func startTunnel(tunnel: any TunnelProtocol, selectedRelay: SelectedRelay) throws { + private func startTunnel(tunnel: any TunnelProtocol) throws { + let selectedRelay = try? interactor.selectRelay() var tunnelOptions = PacketTunnelOptions() do { - try tunnelOptions.setSelectedRelay(selectedRelay) + if let selectedRelay { + try tunnelOptions.setSelectedRelay(selectedRelay) + } } catch { logger.error( error: error, @@ -101,8 +91,8 @@ class StartTunnelOperation: ResultOperation { interactor.updateTunnelStatus { tunnelStatus in tunnelStatus = TunnelStatus() - tunnelStatus.packetTunnelStatus.tunnelRelay = selectedRelay.packetTunnelRelay - tunnelStatus.state = .connecting(selectedRelay.packetTunnelRelay) + tunnelStatus.packetTunnelStatus.tunnelRelay = selectedRelay?.packetTunnelRelay + tunnelStatus.state = .connecting(selectedRelay?.packetTunnelRelay) } try tunnel.start(options: tunnelOptions.rawOptions()) diff --git a/ios/MullvadVPN/TunnelManager/TunnelManager.swift b/ios/MullvadVPN/TunnelManager/TunnelManager.swift index ab178dba380d..e35827e114c4 100644 --- a/ios/MullvadVPN/TunnelManager/TunnelManager.swift +++ b/ios/MullvadVPN/TunnelManager/TunnelManager.swift @@ -283,18 +283,10 @@ final class TunnelManager: StorePaymentObserver { throw UnsetTunnelError() } - let nextRelay: NextRelay = selectNewRelay ? .preSelected(try self.selectRelay()) : .current - - return tunnel.reconnectTunnel(to: nextRelay) { result in + return tunnel.reconnectTunnel(to: selectNewRelay ? .random : .current) { result in finish(result.error) } } catch { - if error is NoRelaysSatisfyingConstraintsError { - _ = self.setTunnelStatus { tunnelStatus in - tunnelStatus.state = .error(.noRelaysSatisfyingConstraints) - } - } - finish(error) return AnyCancellable()