summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJon Petersson <jon.petersson@mullvad.net>2025-10-02 12:16:20 +0200
committerJon Petersson <jon.petersson@mullvad.net>2025-10-02 12:16:20 +0200
commit4f18258ccf9a2e438ce3728a98bdf95a5401de2b (patch)
tree2c9a859373fbe705670ac027ff5bcb811d6bfc62
parentcca266369fb93a32e1b46ef03cbb1487994610ae (diff)
parente7c498f14be4892d0ded5ced574283b5a9c4fe14 (diff)
downloadmullvadvpn-4f18258ccf9a2e438ce3728a98bdf95a5401de2b.tar.xz
mullvadvpn-4f18258ccf9a2e438ce3728a98bdf95a5401de2b.zip
Merge branch 'automatic-obfuscation-uses-incorrect-tcp-port-ios-1333'
-rw-r--r--ios/MullvadREST/Relay/RelayPicking/MultihopPicker.swift2
-rw-r--r--ios/MullvadREST/Relay/RelayPicking/SinglehopPicker.swift53
2 files changed, 31 insertions, 24 deletions
diff --git a/ios/MullvadREST/Relay/RelayPicking/MultihopPicker.swift b/ios/MullvadREST/Relay/RelayPicking/MultihopPicker.swift
index f63bc25ba3..b254ff785f 100644
--- a/ios/MullvadREST/Relay/RelayPicking/MultihopPicker.swift
+++ b/ios/MullvadREST/Relay/RelayPicking/MultihopPicker.swift
@@ -47,11 +47,13 @@ struct MultihopPicker: RelayPicking {
daitaEnabled: false
)
+ // Create a new picker so that it can use the new obfuscation object.
let picker = MultihopPicker(
obfuscation: supportedObfuscation,
tunnelSettings: tunnelSettings,
connectionAttemptCount: connectionAttemptCount
)
+
/*
Relay selection is prioritised in the following order:
1. Both entry and exit constraints match only a single relay. Both relays are selected.
diff --git a/ios/MullvadREST/Relay/RelayPicking/SinglehopPicker.swift b/ios/MullvadREST/Relay/RelayPicking/SinglehopPicker.swift
index 144a1bb50c..d8972ecf7f 100644
--- a/ios/MullvadREST/Relay/RelayPicking/SinglehopPicker.swift
+++ b/ios/MullvadREST/Relay/RelayPicking/SinglehopPicker.swift
@@ -15,8 +15,30 @@ struct SinglehopPicker: RelayPicking {
let connectionAttemptCount: UInt
func pick() throws -> SelectedRelays {
+ // Guarantee that the chosen relay supports selected obfuscation
+ let obfuscationBypass = UnsupportedObfuscationProvider(
+ relayConstraint: tunnelSettings.relayConstraints.exitLocations,
+ relays: obfuscation.obfuscatedRelays,
+ filterConstraint: tunnelSettings.relayConstraints.filter,
+ daitaEnabled: tunnelSettings.daita.daitaState.isEnabled
+ )
+
+ let supportedObfuscation = RelayObfuscator(
+ relays: obfuscation.allRelays,
+ tunnelSettings: tunnelSettings,
+ connectionAttemptCount: connectionAttemptCount,
+ obfuscationBypass: obfuscationBypass
+ ).obfuscate()
+
+ // Create a new picker so that it can use the new obfuscation object.
+ let picker = SinglehopPicker(
+ obfuscation: supportedObfuscation,
+ tunnelSettings: tunnelSettings,
+ connectionAttemptCount: connectionAttemptCount
+ )
+
do {
- return try pick(from: obfuscation.obfuscatedRelays)
+ return try picker.pickRelays()
} catch let error as NoRelaysSatisfyingConstraintsError where error.reason == .noDaitaRelaysFound {
// If DAITA is on, Direct only is off and obfuscation has been ruled out, and no supported relays are found,
// we should try to find the nearest available relay that supports DAITA and use it as entry in a multihop selection.
@@ -32,38 +54,21 @@ struct SinglehopPicker: RelayPicking {
}
}
- private func pick(from obfuscatedRelays: REST.ServerRelaysResponse) throws -> SelectedRelays {
- let constraints = tunnelSettings.relayConstraints
- let daitaSettings = tunnelSettings.daita
-
- // Guarantee that the chosen relay supports selected obfuscation
- let obfuscationBypass = UnsupportedObfuscationProvider(
- relayConstraint: constraints.exitLocations,
- relays: obfuscatedRelays,
- filterConstraint: constraints.filter,
- daitaEnabled: daitaSettings.daitaState.isEnabled
- )
-
- let supportedObfuscation = RelayObfuscator(
- relays: obfuscation.allRelays,
- tunnelSettings: tunnelSettings,
- connectionAttemptCount: connectionAttemptCount,
- obfuscationBypass: obfuscationBypass
- ).obfuscate()
-
+ private func pickRelays() throws -> SelectedRelays {
let exitCandidates = try RelaySelector.WireGuard.findCandidates(
by: tunnelSettings.relayConstraints.exitLocations,
- in: supportedObfuscation.obfuscatedRelays,
- filterConstraint: constraints.filter,
- daitaEnabled: daitaSettings.daitaState.isEnabled
+ in: obfuscation.obfuscatedRelays,
+ filterConstraint: tunnelSettings.relayConstraints.filter,
+ daitaEnabled: tunnelSettings.daita.daitaState.isEnabled
)
let match = try findBestMatch(from: exitCandidates, useObfuscatedPortIfAvailable: true)
+
return SelectedRelays(
entry: nil,
exit: match,
retryAttempt: connectionAttemptCount,
- obfuscation: supportedObfuscation.method
+ obfuscation: obfuscation.method
)
}
}