summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-10-03 15:06:03 +0200
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-10-09 16:20:54 +0200
commit892da35cbc36db7b733fb4416b5c16189571896e (patch)
tree358e2ad6f688943568010fe221f8199413c421c0
parent0962150429d7fce47c33e6dafe3a195e890eab7f (diff)
downloadmullvadvpn-892da35cbc36db7b733fb4416b5c16189571896e.tar.xz
mullvadvpn-892da35cbc36db7b733fb4416b5c16189571896e.zip
Add support for mutlihop communication with daemon
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/ConnectUiStatePreviewParameterProvider.kt1
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/TunnelStatePreviewData.kt1
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt4
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/RelayListRepository.kt4
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/WireguardConstraintsRepository.kt11
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt13
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt46
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt18
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/GeoIpLocation.kt1
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt6
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
}