diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-10-03 15:06:03 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-10-09 16:20:54 +0200 |
| commit | 892da35cbc36db7b733fb4416b5c16189571896e (patch) | |
| tree | 358e2ad6f688943568010fe221f8199413c421c0 | |
| parent | 0962150429d7fce47c33e6dafe3a195e890eab7f (diff) | |
| download | mullvadvpn-892da35cbc36db7b733fb4416b5c16189571896e.tar.xz mullvadvpn-892da35cbc36db7b733fb4416b5c16189571896e.zip | |
Add support for mutlihop communication with daemon
11 files changed, 72 insertions, 38 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/ConnectUiStatePreviewParameterProvider.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/ConnectUiStatePreviewParameterProvider.kt index 50fe6244f7..1c08feb6f1 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/ConnectUiStatePreviewParameterProvider.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/ConnectUiStatePreviewParameterProvider.kt @@ -37,6 +37,7 @@ private fun generateOtherStates(): Sequence<ConnectUiState> = latitude = 23.3, longitude = 12.99, hostname = "Hostname", + entryHostname = "EntryHostname", ), selectedRelayItemTitle = "Relay Title", tunnelState = state, diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/TunnelStatePreviewData.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/TunnelStatePreviewData.kt index b6ca18c91a..ffb9117049 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/TunnelStatePreviewData.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/TunnelStatePreviewData.kt @@ -61,6 +61,7 @@ private fun generateLocation(): GeoIpLocation = country = "", city = "", hostname = "", + entryHostname = "", latitude = 0.0, longitude = 0.0, ) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt index 89c4e1e68d..e00b3d9b98 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt @@ -27,6 +27,7 @@ import net.mullvad.mullvadvpn.repository.RelayOverridesRepository import net.mullvad.mullvadvpn.repository.SettingsRepository import net.mullvad.mullvadvpn.repository.SplashCompleteRepository import net.mullvad.mullvadvpn.repository.SplitTunnelingRepository +import net.mullvad.mullvadvpn.repository.WireguardConstraintsRepository import net.mullvad.mullvadvpn.ui.MainActivity import net.mullvad.mullvadvpn.ui.serviceconnection.AppVersionInfoRepository import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager @@ -140,6 +141,7 @@ val uiModule = module { get(named(BOOT_COMPLETED_RECEIVER_COMPONENT_NAME)), ) } + single { WireguardConstraintsRepository(get()) } single { AccountExpiryInAppNotificationUseCase(get()) } single { TunnelStateNotificationUseCase(get()) } @@ -208,7 +210,7 @@ val uiModule = module { viewModel { SettingsViewModel(get(), get(), IS_PLAY_BUILD) } viewModel { SplashViewModel(get(), get(), get(), get()) } viewModel { VoucherDialogViewModel(get()) } - viewModel { VpnSettingsViewModel(get(), get(), get(), get()) } + viewModel { VpnSettingsViewModel(get(), get(), get(), get(), get()) } viewModel { WelcomeViewModel(get(), get(), get(), get(), isPlayBuild = IS_PLAY_BUILD) } viewModel { ReportProblemViewModel(get(), get()) } viewModel { ViewLogsViewModel(get()) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/RelayListRepository.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/RelayListRepository.kt index 4bdde9fec5..ed78ecb537 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/RelayListRepository.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/RelayListRepository.kt @@ -19,7 +19,6 @@ import net.mullvad.mullvadvpn.lib.model.GeoLocationId import net.mullvad.mullvadvpn.lib.model.PortRange import net.mullvad.mullvadvpn.lib.model.RelayItem import net.mullvad.mullvadvpn.lib.model.RelayItemId -import net.mullvad.mullvadvpn.lib.model.WireguardConstraints import net.mullvad.mullvadvpn.lib.model.WireguardEndpointData import net.mullvad.mullvadvpn.lib.model.cities import net.mullvad.mullvadvpn.lib.model.name @@ -82,9 +81,6 @@ class RelayListRepository( suspend fun updateSelectedRelayLocation(value: RelayItemId) = managementService.setRelayLocation(value) - suspend fun updateSelectedWireguardConstraints(value: WireguardConstraints) = - managementService.setWireguardConstraints(value) - fun find(geoLocationId: GeoLocationId) = relayList.value.findByGeoLocationId(geoLocationId) private fun defaultWireguardEndpointData() = WireguardEndpointData(emptyList(), emptyList()) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/WireguardConstraintsRepository.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/WireguardConstraintsRepository.kt new file mode 100644 index 0000000000..816b172ea5 --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/WireguardConstraintsRepository.kt @@ -0,0 +1,11 @@ +package net.mullvad.mullvadvpn.repository + +import net.mullvad.mullvadvpn.lib.daemon.grpc.ManagementService +import net.mullvad.mullvadvpn.lib.model.Constraint +import net.mullvad.mullvadvpn.lib.model.Port + +class WireguardConstraintsRepository(private val managementService: ManagementService) { + suspend fun setWireguardPort(port: Constraint<Port>) = managementService.setWireguardPort(port) + + suspend fun setMultihop(enabled: Boolean) = managementService.setMultihop(enabled) +} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt index 5ca136341e..e160776ee0 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt @@ -27,10 +27,10 @@ import net.mullvad.mullvadvpn.lib.model.ObfuscationMode import net.mullvad.mullvadvpn.lib.model.Port import net.mullvad.mullvadvpn.lib.model.QuantumResistantState import net.mullvad.mullvadvpn.lib.model.Settings -import net.mullvad.mullvadvpn.lib.model.WireguardConstraints import net.mullvad.mullvadvpn.repository.AutoStartAndConnectOnBootRepository import net.mullvad.mullvadvpn.repository.RelayListRepository import net.mullvad.mullvadvpn.repository.SettingsRepository +import net.mullvad.mullvadvpn.repository.WireguardConstraintsRepository import net.mullvad.mullvadvpn.usecase.SystemVpnSettingsAvailableUseCase sealed interface VpnSettingsSideEffect { @@ -49,6 +49,7 @@ class VpnSettingsViewModel( private val relayListRepository: RelayListRepository, private val systemVpnSettingsUseCase: SystemVpnSettingsAvailableUseCase, private val autoStartAndConnectOnBootRepository: AutoStartAndConnectOnBootRepository, + private val wireguardConstraintsRepository: WireguardConstraintsRepository, private val dispatcher: CoroutineDispatcher = Dispatchers.IO, ) : ViewModel() { @@ -231,11 +232,7 @@ class VpnSettingsViewModel( if (port is Constraint.Only && port.value !in WIREGUARD_PRESET_PORTS) { customPort.update { port.value } } - viewModelScope.launch { - relayListRepository.updateSelectedWireguardConstraints( - WireguardConstraints(port = port) - ) - } + viewModelScope.launch { wireguardConstraintsRepository.setWireguardPort(port = port) } } fun resetCustomPort() { @@ -244,9 +241,7 @@ class VpnSettingsViewModel( // If custom port was selected, update selection to be any. if (isCustom) { viewModelScope.launch { - relayListRepository.updateSelectedWireguardConstraints( - WireguardConstraints(port = Constraint.Any) - ) + wireguardConstraintsRepository.setWireguardPort(port = Constraint.Any) } } } diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt index 024091c9dc..42bdc56a6c 100644 --- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt +++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt @@ -120,18 +120,19 @@ import net.mullvad.mullvadvpn.lib.model.UpdateApiAccessMethodError import net.mullvad.mullvadvpn.lib.model.UpdateCustomListError import net.mullvad.mullvadvpn.lib.model.VoucherCode import net.mullvad.mullvadvpn.lib.model.WebsiteAuthToken -import net.mullvad.mullvadvpn.lib.model.WireguardConstraints as ModelWireguardConstraints import net.mullvad.mullvadvpn.lib.model.WireguardEndpointData as ModelWireguardEndpointData import net.mullvad.mullvadvpn.lib.model.addresses import net.mullvad.mullvadvpn.lib.model.customOptions import net.mullvad.mullvadvpn.lib.model.location import net.mullvad.mullvadvpn.lib.model.ownership +import net.mullvad.mullvadvpn.lib.model.port import net.mullvad.mullvadvpn.lib.model.providers import net.mullvad.mullvadvpn.lib.model.relayConstraints import net.mullvad.mullvadvpn.lib.model.selectedObfuscationMode import net.mullvad.mullvadvpn.lib.model.shadowsocks import net.mullvad.mullvadvpn.lib.model.state import net.mullvad.mullvadvpn.lib.model.udp2tcp +import net.mullvad.mullvadvpn.lib.model.useMultihop import net.mullvad.mullvadvpn.lib.model.wireguardConstraints @Suppress("TooManyFunctions") @@ -591,19 +592,6 @@ class ManagementService( } .mapEmpty() - suspend fun setWireguardConstraints( - value: ModelWireguardConstraints - ): Either<SetWireguardConstraintsError, Unit> = - Either.catch { - val relaySettings = getSettings().relaySettings - val updated = - RelaySettings.relayConstraints.wireguardConstraints.set(relaySettings, value) - grpc.setRelaySettings(updated.fromDomain()) - } - .onLeft { Logger.e("Set wireguard constraints error") } - .mapLeft(SetWireguardConstraintsError::Unknown) - .mapEmpty() - suspend fun setOwnershipAndProviders( ownershipConstraint: Constraint<ModelOwnership>, providersConstraint: Constraint<Providers>, @@ -754,6 +742,36 @@ class ManagementService( either { ensure(result.value) { TestApiAccessMethodError.CouldNotAccess } } } + suspend fun setWireguardPort( + port: Constraint<Port> + ): Either<SetWireguardConstraintsError, Unit> = + Either.catch { + val relaySettings = getSettings().relaySettings + val updated = + RelaySettings.relayConstraints.wireguardConstraints.port.set( + relaySettings, + port, + ) + grpc.setRelaySettings(updated.fromDomain()) + } + .onLeft { Logger.e("Set wireguard port error") } + .mapLeft(SetWireguardConstraintsError::Unknown) + .mapEmpty() + + suspend fun setMultihop(enabled: Boolean): Either<SetWireguardConstraintsError, Unit> = + Either.catch { + val relaySettings = getSettings().relaySettings + val updated = + RelaySettings.relayConstraints.wireguardConstraints.useMultihop.set( + relaySettings, + enabled, + ) + grpc.setRelaySettings(updated.fromDomain()) + } + .onLeft { Logger.e("Set multihop error") } + .mapLeft(SetWireguardConstraintsError::Unknown) + .mapEmpty() + private fun <A> Either<A, Empty>.mapEmpty() = map {} private inline fun <B, C> Either<Throwable, B>.mapLeftStatus( diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt index 84a826f104..817418e1fc 100644 --- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt +++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt @@ -18,7 +18,6 @@ import net.mullvad.mullvadvpn.lib.model.ObfuscationSettings import net.mullvad.mullvadvpn.lib.model.Ownership import net.mullvad.mullvadvpn.lib.model.PlayPurchase import net.mullvad.mullvadvpn.lib.model.PlayPurchasePaymentToken -import net.mullvad.mullvadvpn.lib.model.Port import net.mullvad.mullvadvpn.lib.model.Providers import net.mullvad.mullvadvpn.lib.model.RelayItemId import net.mullvad.mullvadvpn.lib.model.RelaySettings @@ -126,13 +125,16 @@ internal fun CustomList.fromDomain(): ManagementInterface.CustomList = .build() internal fun WireguardConstraints.fromDomain(): ManagementInterface.WireguardConstraints = - when (port) { - is Constraint.Any -> ManagementInterface.WireguardConstraints.newBuilder().build() - is Constraint.Only -> - ManagementInterface.WireguardConstraints.newBuilder() - .setPort((port as Constraint.Only<Port>).value.value) - .build() - } + ManagementInterface.WireguardConstraints.newBuilder() + .setUseMultihop(useMultihop) + .setEntryLocation(entryLocation.fromDomain()) + .apply { + when (val port = this@fromDomain.port) { + is Constraint.Any -> clearPort() + is Constraint.Only -> setPort(port.value.value) + } + } + .build() internal fun Ownership.fromDomain(): ManagementInterface.Ownership = when (this) { diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt index 2f6a08eede..bb7fb83fa6 100644 --- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt +++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt @@ -137,6 +137,7 @@ internal fun ManagementInterface.GeoIpLocation.toDomain(): GeoIpLocation = latitude = latitude, longitude = longitude, hostname = if (hasHostname()) hostname else null, + entryHostname = if (hasEntryHostname()) entryHostname else null, ) internal fun ManagementInterface.TunnelEndpoint.toDomain(): TunnelEndpoint = @@ -320,7 +321,9 @@ internal fun ManagementInterface.WireguardConstraints.toDomain(): WireguardConst Constraint.Only(Port(port)) } else { Constraint.Any - } + }, + useMultihop = useMultihop, + entryLocation = entryLocation.toDomain(), ) internal fun ManagementInterface.Ownership.toDomain(): Constraint<Ownership> = diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GeoIpLocation.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GeoIpLocation.kt index d312382a02..8bf50613ba 100644 --- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GeoIpLocation.kt +++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GeoIpLocation.kt @@ -12,6 +12,7 @@ data class GeoIpLocation( val latitude: Double, val longitude: Double, val hostname: String?, + val entryHostname: String?, ) { companion object } diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt index 8affb81077..7af0144cf4 100644 --- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt +++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt @@ -3,6 +3,10 @@ package net.mullvad.mullvadvpn.lib.model import arrow.optics.optics @optics -data class WireguardConstraints(val port: Constraint<Port>) { +data class WireguardConstraints( + val port: Constraint<Port>, + val useMultihop: Boolean, + val entryLocation: Constraint<RelayItemId>, +) { companion object } |
