diff options
| author | Jon Petersson <jon.petersson@mullvad.net> | 2025-10-02 12:16:20 +0200 |
|---|---|---|
| committer | Jon Petersson <jon.petersson@mullvad.net> | 2025-10-02 12:16:20 +0200 |
| commit | 4f18258ccf9a2e438ce3728a98bdf95a5401de2b (patch) | |
| tree | 2c9a859373fbe705670ac027ff5bcb811d6bfc62 | |
| parent | cca266369fb93a32e1b46ef03cbb1487994610ae (diff) | |
| parent | e7c498f14be4892d0ded5ced574283b5a9c4fe14 (diff) | |
| download | mullvadvpn-4f18258ccf9a2e438ce3728a98bdf95a5401de2b.tar.xz mullvadvpn-4f18258ccf9a2e438ce3728a98bdf95a5401de2b.zip | |
Merge branch 'automatic-obfuscation-uses-incorrect-tcp-port-ios-1333'
| -rw-r--r-- | ios/MullvadREST/Relay/RelayPicking/MultihopPicker.swift | 2 | ||||
| -rw-r--r-- | ios/MullvadREST/Relay/RelayPicking/SinglehopPicker.swift | 53 |
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 ) } } |
