summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSteffen Ernst <steffen.ernst@mullvad.net>2025-05-14 11:33:15 +0200
committerSteffen Ernst <steffen.ernst@mullvad.net>2025-05-20 15:46:45 +0200
commit0e4a039d00562afdc30e92f2c3e2f769929a765b (patch)
tree608ffdbc31de6b467dcae617d82e1c86ce696650
parentf88e1464d8727b86bf0e36e25c6e1a2ad26e0230 (diff)
downloadmullvadvpn-0e4a039d00562afdc30e92f2c3e2f769929a765b.tar.xz
mullvadvpn-0e4a039d00562afdc30e92f2c3e2f769929a765b.zip
Fix duplicate call to cache to validate port
-rw-r--r--ios/MullvadREST/Relay/RelaySelectorWrapper.swift47
-rw-r--r--ios/MullvadVPNTests/MullvadREST/Relay/RelaySelectorTests.swift2
2 files changed, 29 insertions, 20 deletions
diff --git a/ios/MullvadREST/Relay/RelaySelectorWrapper.swift b/ios/MullvadREST/Relay/RelaySelectorWrapper.swift
index feb1d1e890..1a6487dca9 100644
--- a/ios/MullvadREST/Relay/RelaySelectorWrapper.swift
+++ b/ios/MullvadREST/Relay/RelaySelectorWrapper.swift
@@ -20,9 +20,14 @@ public final class RelaySelectorWrapper: RelaySelectorProtocol, Sendable {
tunnelSettings: LatestTunnelSettings,
connectionAttemptCount: UInt
) throws -> SelectedRelays {
- try validateWireguardPort(tunnelSettings)
+ let relays = try relayCache.read().relays
+ try validateWireguardPort(tunnelSettings, relays: relays)
- let obfuscation = try prepareObfuscation(for: tunnelSettings, connectionAttemptCount: connectionAttemptCount)
+ let obfuscation = try prepareObfuscation(
+ for: tunnelSettings,
+ connectionAttemptCount: connectionAttemptCount,
+ relays: relays
+ )
return switch tunnelSettings.tunnelMultihopState {
case .off:
@@ -43,7 +48,12 @@ public final class RelaySelectorWrapper: RelaySelectorProtocol, Sendable {
}
public func findCandidates(tunnelSettings: LatestTunnelSettings) throws -> RelayCandidates {
- let obfuscation = try prepareObfuscation(for: tunnelSettings, connectionAttemptCount: 0)
+ let relays = try relayCache.read().relays
+ let obfuscation = try prepareObfuscation(
+ for: tunnelSettings,
+ connectionAttemptCount: 0,
+ relays: relays
+ )
let findCandidates: (REST.ServerRelaysResponse, Bool) throws
-> [RelayWithLocation<REST.ServerRelay>] = { relays, daitaEnabled in
@@ -70,32 +80,31 @@ public final class RelaySelectorWrapper: RelaySelectorProtocol, Sendable {
private func prepareObfuscation(
for tunnelSettings: LatestTunnelSettings,
- connectionAttemptCount: UInt
+ connectionAttemptCount: UInt,
+ relays: REST.ServerRelaysResponse
) throws -> ObfuscatorPortSelection {
- let relays = try relayCache.read().relays
return try ObfuscatorPortSelector(relays: relays).obfuscate(
tunnelSettings: tunnelSettings,
connectionAttemptCount: connectionAttemptCount
)
}
- private func validateWireguardPort(_ tunnelSettings: LatestTunnelSettings) throws {
- func isPortWithinValidWireGuardRanges(_ port: UInt16) throws -> Bool {
- return try relayCache
- .read().relays.wireguard.portRanges
- .contains { range in
- if let minPort = range.first, let maxPort = range.last {
- return (minPort ... maxPort).contains(port)
- }
-
- return false
- }
- }
-
+ private func validateWireguardPort(
+ _ tunnelSettings: LatestTunnelSettings,
+ relays: REST.ServerRelaysResponse
+ ) throws {
switch tunnelSettings.wireGuardObfuscation.state {
case .automatic, .off:
if case let .only(port) = tunnelSettings.relayConstraints.port {
- guard try isPortWithinValidWireGuardRanges(port) else {
+ let isPortWithinValidWireGuardRanges: Bool =
+ relays.wireguard.portRanges
+ .contains { range in
+ if let minPort = range.first, let maxPort = range.last {
+ return (minPort ... maxPort).contains(port)
+ }
+ return false
+ }
+ guard isPortWithinValidWireGuardRanges else {
throw NoRelaysSatisfyingConstraintsError(.invalidPort)
}
}
diff --git a/ios/MullvadVPNTests/MullvadREST/Relay/RelaySelectorTests.swift b/ios/MullvadVPNTests/MullvadREST/Relay/RelaySelectorTests.swift
index 74afb1370a..fcc71b4653 100644
--- a/ios/MullvadVPNTests/MullvadREST/Relay/RelaySelectorTests.swift
+++ b/ios/MullvadVPNTests/MullvadREST/Relay/RelaySelectorTests.swift
@@ -119,7 +119,7 @@ class RelaySelectorTests: XCTestCase {
)
let allPorts = portRanges.flatMap { $0 }
- var result = try pickRelay(by: constraints, in: sampleRelays, failedAttemptCount: 0)
+ let result = try pickRelay(by: constraints, in: sampleRelays, failedAttemptCount: 0)
XCTAssertTrue(allPorts.contains(result.endpoint.ipv4Relay.port))
}