Skip to content

Commit

Permalink
wip filter relays
Browse files Browse the repository at this point in the history
  • Loading branch information
albin-mullvad committed Aug 26, 2024
1 parent 74168db commit f91454e
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ private fun generateRelayItemRelay(
cityCode: GeoLocationId.City,
hostName: String,
active: Boolean = true,
daita: Boolean = true,
) =
RelayItem.Location.Relay(
id =
Expand All @@ -60,6 +61,7 @@ private fun generateRelayItemRelay(
),
active = active,
provider = Provider(ProviderId("Provider"), Ownership.MullvadOwned),
daita = daita
)

private fun String.generateCountryCode() =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ val uiModule = module {
single { FilterCustomListsRelayItemUseCase(get(), get()) }
single { CustomListsRelayItemUseCase(get(), get()) }
single { CustomListRelayItemsUseCase(get(), get()) }
single { FilteredRelayListUseCase(get(), get()) }
single { FilteredRelayListUseCase(get(), get(), get()) }
single { LastKnownLocationUseCase(get()) }

single { InAppNotificationController(get(), get(), get(), get(), MainScope()) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,51 +53,57 @@ private fun RelayItem.Location.hasProvider(providersConstraint: Constraint<Provi
true
}

fun RelayItem.CustomList.filterOnOwnershipAndProvider(
fun RelayItem.CustomList.applyFilters(
ownership: Constraint<Ownership>,
providers: Constraint<Providers>
providers: Constraint<Providers>,
isDaitaEnabled: Boolean
): RelayItem.CustomList {
val newLocations =
locations.mapNotNull {
when (it) {
is RelayItem.Location.Country ->
it.filterOnOwnershipAndProvider(ownership, providers)
is RelayItem.Location.City -> it.filterOnOwnershipAndProvider(ownership, providers)
is RelayItem.Location.Relay -> it.filterOnOwnershipAndProvider(ownership, providers)
it.applyFilters(ownership, providers, isDaitaEnabled)
is RelayItem.Location.City -> it.applyFilters(ownership, providers, isDaitaEnabled)
is RelayItem.Location.Relay -> it.applyFilters(ownership, providers, isDaitaEnabled)
}
}
return copy(locations = newLocations)
}

fun RelayItem.Location.Country.filterOnOwnershipAndProvider(
fun RelayItem.Location.Country.applyFilters(
ownership: Constraint<Ownership>,
providers: Constraint<Providers>
providers: Constraint<Providers>,
isDaitaEnabled: Boolean
): RelayItem.Location.Country? {
val cities = cities.mapNotNull { it.filterOnOwnershipAndProvider(ownership, providers) }
val cities = cities.mapNotNull { it.applyFilters(ownership, providers, isDaitaEnabled) }
return if (cities.isNotEmpty()) {
this.copy(cities = cities)
} else {
null
}
}

private fun RelayItem.Location.City.filterOnOwnershipAndProvider(
private fun RelayItem.Location.City.applyFilters(
ownership: Constraint<Ownership>,
providers: Constraint<Providers>
providers: Constraint<Providers>,
isDaitaEnabled: Boolean
): RelayItem.Location.City? {
val relays = relays.mapNotNull { it.filterOnOwnershipAndProvider(ownership, providers) }
val relays = relays.mapNotNull { it.applyFilters(ownership, providers, isDaitaEnabled) }
return if (relays.isNotEmpty()) {
this.copy(relays = relays)
} else {
null
}
}

private fun RelayItem.Location.Relay.filterOnOwnershipAndProvider(
private fun RelayItem.Location.Relay.applyFilters(
ownership: Constraint<Ownership>,
providers: Constraint<Providers>
providers: Constraint<Providers>,
isDaitaEnabled: Boolean
): RelayItem.Location.Relay? {
return if (hasOwnership(ownership) && hasProvider(providers)) {
// TODO: Rename and move to separate function.
val isValid = if (isDaitaEnabled) daita else true
return if (isValid && hasOwnership(ownership) && hasProvider(providers)) {
this
} else {
null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,34 @@ import net.mullvad.mullvadvpn.lib.model.Constraint
import net.mullvad.mullvadvpn.lib.model.Ownership
import net.mullvad.mullvadvpn.lib.model.Providers
import net.mullvad.mullvadvpn.lib.model.RelayItem
import net.mullvad.mullvadvpn.relaylist.filterOnOwnershipAndProvider
import net.mullvad.mullvadvpn.relaylist.applyFilters
import net.mullvad.mullvadvpn.repository.RelayListFilterRepository
import net.mullvad.mullvadvpn.repository.RelayListRepository
import net.mullvad.mullvadvpn.repository.SettingsRepository

class FilteredRelayListUseCase(
private val relayListRepository: RelayListRepository,
private val relayListFilterRepository: RelayListFilterRepository
private val relayListFilterRepository: RelayListFilterRepository,
private val settingsRepository: SettingsRepository
) {
operator fun invoke() =
combine(
relayListRepository.relayList,
relayListFilterRepository.selectedOwnership,
relayListFilterRepository.selectedProviders,
) { relayList, selectedOwnership, selectedProviders ->
relayList.filterOnOwnershipAndProvider(
settingsRepository.settingsUpdates
) { relayList, selectedOwnership, selectedProviders, settings ->
relayList.applyFilters(
selectedOwnership,
selectedProviders,
// TODO: How to handle this default value?
settings?.tunnelOptions?.wireguard?.daita ?: false
)
}

private fun List<RelayItem.Location.Country>.filterOnOwnershipAndProvider(
private fun List<RelayItem.Location.Country>.applyFilters(
ownership: Constraint<Ownership>,
providers: Constraint<Providers>
) = mapNotNull { it.filterOnOwnershipAndProvider(ownership, providers) }
providers: Constraint<Providers>,
isDaitaEnabled: Boolean
) = mapNotNull { it.applyFilters(ownership, providers, isDaitaEnabled) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import net.mullvad.mullvadvpn.lib.model.Constraint
import net.mullvad.mullvadvpn.lib.model.Ownership
import net.mullvad.mullvadvpn.lib.model.Providers
import net.mullvad.mullvadvpn.lib.model.RelayItem
import net.mullvad.mullvadvpn.relaylist.filterOnOwnershipAndProvider
import net.mullvad.mullvadvpn.relaylist.applyFilters
import net.mullvad.mullvadvpn.repository.RelayListFilterRepository

class FilterCustomListsRelayItemUseCase(
Expand All @@ -26,5 +26,5 @@ class FilterCustomListsRelayItemUseCase(
private fun List<RelayItem.CustomList>.filterOnOwnershipAndProvider(
ownership: Constraint<Ownership>,
providers: Constraint<Providers>
) = mapNotNull { it.filterOnOwnershipAndProvider(ownership, providers) }
) = mapNotNull { it.applyFilters(ownership, providers, isDaitaEnabled = false) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import java.net.InetAddress
import java.net.InetSocketAddress
import java.util.UUID
import mullvad_daemon.management_interface.ManagementInterface
import mullvad_daemon.management_interface.endpointDataOrNull
import net.mullvad.mullvadvpn.lib.daemon.grpc.GrpcConnectivityState
import net.mullvad.mullvadvpn.lib.daemon.grpc.RelayNameComparator
import net.mullvad.mullvadvpn.lib.model.AccountData
Expand Down Expand Up @@ -512,7 +513,10 @@ internal fun ManagementInterface.Relay.toDomain(
Provider(
ProviderId(provider),
ownership = if (owned) Ownership.MullvadOwned else Ownership.Rented
)
),
daita = if (hasEndpointData() && endpointType == ManagementInterface.Relay.RelayType.WIREGUARD) {
ManagementInterface.WireguardRelayEndpointData.parseFrom (endpointData.value).daita
} else false
)

internal fun ManagementInterface.Device.toDomain(): Device =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ sealed interface RelayItem {
override val id: GeoLocationId.Hostname,
val provider: Provider,
override val active: Boolean,
val daita: Boolean
) : Location {
override val name: String = id.code
override val hasChildren: Boolean = false
Expand Down

0 comments on commit f91454e

Please sign in to comment.