diff options
| author | Jon Petersson <jon.petersson@kvadrat.se> | 2023-06-07 13:08:40 +0200 |
|---|---|---|
| committer | Bug Magnet <marco.nikic@mullvad.net> | 2023-10-17 14:18:42 +0200 |
| commit | a08809bb3b3900d8cfaae1a4c01cbb20b081fe39 (patch) | |
| tree | 1a1a851c8c30e1ba3f2ed24dcd24c078e79847a0 /ios/RelaySelector | |
| parent | 88463387e9d83e3366fb8c087605dc4c052f4981 (diff) | |
| download | mullvadvpn-a08809bb3b3900d8cfaae1a4c01cbb20b081fe39.tar.xz mullvadvpn-a08809bb3b3900d8cfaae1a4c01cbb20b081fe39.zip | |
Add filtering to location selection
Diffstat (limited to 'ios/RelaySelector')
| -rw-r--r-- | ios/RelaySelector/RelaySelector.swift | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/ios/RelaySelector/RelaySelector.swift b/ios/RelaySelector/RelaySelector.swift index bb25c1c960..20a8496d0d 100644 --- a/ios/RelaySelector/RelaySelector.swift +++ b/ios/RelaySelector/RelaySelector.swift @@ -120,12 +120,37 @@ public enum RelaySelector { ) } + /// Determines whether a `REST.ServerRelay` satisfies the given relay filter. + public static func relayMatchesFilter(_ relay: AnyRelay, filter: RelayFilter) -> Bool { + if case let .only(providers) = filter.providers, providers.contains(relay.provider) == false { + return false + } + + switch filter.ownership { + case .any: + return true + case .owned: + return relay.owned + case .rented: + return !relay.owned + } + } + /// Produce a list of `RelayWithLocation` items satisfying the given constraints private static func applyConstraints<T: AnyRelay>( _ constraints: RelayConstraints, relays: [RelayWithLocation<T>] ) -> [RelayWithLocation<T>] { - relays.filter { relayWithLocation -> Bool in + return relays.filter { relayWithLocation -> Bool in + switch constraints.filter { + case .any: + break + case let .only(filter): + if !relayMatchesFilter(relayWithLocation.relay, filter: filter) { + return false + } + } + switch constraints.location { case .any: return true @@ -282,9 +307,11 @@ public struct RelaySelectorResult: Codable, Equatable { public var location: Location } -protocol AnyRelay { +public protocol AnyRelay { var hostname: String { get } + var owned: Bool { get } var location: String { get } + var provider: String { get } var weight: UInt64 { get } var active: Bool { get } var includeInCountry: Bool { get } |
