summaryrefslogtreecommitdiffhomepage
path: root/ios/RelaySelector
diff options
context:
space:
mode:
authorJon Petersson <jon.petersson@kvadrat.se>2023-06-07 13:08:40 +0200
committerBug Magnet <marco.nikic@mullvad.net>2023-10-17 14:18:42 +0200
commita08809bb3b3900d8cfaae1a4c01cbb20b081fe39 (patch)
tree1a1a851c8c30e1ba3f2ed24dcd24c078e79847a0 /ios/RelaySelector
parent88463387e9d83e3366fb8c087605dc4c052f4981 (diff)
downloadmullvadvpn-a08809bb3b3900d8cfaae1a4c01cbb20b081fe39.tar.xz
mullvadvpn-a08809bb3b3900d8cfaae1a4c01cbb20b081fe39.zip
Add filtering to location selection
Diffstat (limited to 'ios/RelaySelector')
-rw-r--r--ios/RelaySelector/RelaySelector.swift31
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 }