diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2023-05-29 16:39:41 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2023-06-07 17:51:06 +0200 |
| commit | 07f1ecbeb787ce59812b59c0b7974cfc40e73071 (patch) | |
| tree | 98c846b2c943a1459a36fdbc37ea1b6e156990ac /android/app | |
| parent | 32812d48d4a72417642f1d487f9b2f8571ce7eea (diff) | |
| download | mullvadvpn-07f1ecbeb787ce59812b59c0b7974cfc40e73071.tar.xz mullvadvpn-07f1ecbeb787ce59812b59c0b7974cfc40e73071.zip | |
Add android support for quantum tunneling in the daemon
Diffstat (limited to 'android/app')
11 files changed, 58 insertions, 23 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt index 9ac2a761ff..805801946d 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt @@ -156,7 +156,7 @@ fun VpnSettingsScreen( toastMessagesSharedFlow: SharedFlow<String>, onSelectObfuscationSetting: (selectedObfuscation: SelectedObfuscation) -> Unit = {}, onObfuscationInfoClick: () -> Unit = {}, - onSelectQuantumResistanceSetting: (quantumResistant: Boolean?) -> Unit = {}, + onSelectQuantumResistanceSetting: (quantumResistant: QuantumResistantState) -> Unit = {}, onQuantumResistanceInfoClicked: () -> Unit = {} ) { val cellVerticalSpacing = dimensionResource(id = R.dimen.cell_label_vertical_padding) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt index c2c7d074fd..1515b2d19a 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt @@ -1,6 +1,7 @@ package net.mullvad.mullvadvpn.compose.state import net.mullvad.mullvadvpn.model.DefaultDnsOptions +import net.mullvad.mullvadvpn.model.QuantumResistantState import net.mullvad.mullvadvpn.model.SelectedObfuscation import net.mullvad.mullvadvpn.viewmodel.CustomDnsItem import net.mullvad.mullvadvpn.viewmodel.StagedDns @@ -14,7 +15,7 @@ sealed interface VpnSettingsUiState { val contentBlockersOptions: DefaultDnsOptions val isAllowLanEnabled: Boolean val selectedObfuscation: SelectedObfuscation - val quantumResistant: Boolean? + val quantumResistant: QuantumResistantState data class DefaultUiState( override val mtu: String = "", @@ -25,7 +26,7 @@ sealed interface VpnSettingsUiState { override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class MtuDialogUiState( @@ -38,7 +39,7 @@ sealed interface VpnSettingsUiState { override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), val mtuEditValue: String, override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class DnsDialogUiState( @@ -51,7 +52,7 @@ sealed interface VpnSettingsUiState { override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), val stagedDns: StagedDns, override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class LocalNetworkSharingInfoDialogUiState( @@ -63,7 +64,7 @@ sealed interface VpnSettingsUiState { override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class ContentBlockersInfoDialogUiState( @@ -75,7 +76,7 @@ sealed interface VpnSettingsUiState { override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class CustomDnsInfoDialogUiState( @@ -87,7 +88,7 @@ sealed interface VpnSettingsUiState { override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class MalwareInfoDialogUiState( @@ -99,7 +100,7 @@ sealed interface VpnSettingsUiState { override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class ObfuscationInfoDialogUiState( @@ -111,7 +112,7 @@ sealed interface VpnSettingsUiState { override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState data class QuantumResistanceInfoDialogUiState( @@ -123,6 +124,6 @@ sealed interface VpnSettingsUiState { override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, - override val quantumResistant: Boolean? = null + override val quantumResistant: QuantumResistantState = QuantumResistantState.Off ) : VpnSettingsUiState } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Request.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Request.kt index c9bd699c12..7ff4a63ff4 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Request.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Request.kt @@ -7,6 +7,7 @@ import kotlinx.parcelize.Parcelize import net.mullvad.mullvadvpn.model.DnsOptions import net.mullvad.mullvadvpn.model.LocationConstraint import net.mullvad.mullvadvpn.model.ObfuscationSettings +import net.mullvad.mullvadvpn.model.QuantumResistantState // Requests that the service can handle sealed class Request : Message.RequestMessage() { @@ -85,7 +86,9 @@ sealed class Request : Message.RequestMessage() { @Parcelize data class SetObfuscationSettings(val settings: ObfuscationSettings?) : Request() - @Parcelize data class SetWireGuardQuantumResistant(val quantumResistant: Boolean?) : Request() + @Parcelize + data class SetWireGuardQuantumResistant(val quantumResistant: QuantumResistantState) : + Request() companion object { private const val MESSAGE_KEY = "request" diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/QuantumResistantState.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/QuantumResistantState.kt new file mode 100644 index 0000000000..a19267388a --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/QuantumResistantState.kt @@ -0,0 +1,11 @@ +package net.mullvad.mullvadvpn.model + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +enum class QuantumResistantState : Parcelable { + Auto, + On, + Off +} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardTunnelOptions.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardTunnelOptions.kt index 47c8c54a57..f4a869a4ea 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardTunnelOptions.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardTunnelOptions.kt @@ -4,4 +4,5 @@ import android.os.Parcelable import kotlinx.parcelize.Parcelize @Parcelize -data class WireguardTunnelOptions(val mtu: Int?, val quantumResistant: Boolean?) : Parcelable +data class WireguardTunnelOptions(val mtu: Int?, val quantumResistant: QuantumResistantState) : + Parcelable diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/SettingsRepository.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/SettingsRepository.kt index cde1c698ca..ac9637c683 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/SettingsRepository.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/SettingsRepository.kt @@ -14,6 +14,7 @@ import net.mullvad.mullvadvpn.model.DefaultDnsOptions import net.mullvad.mullvadvpn.model.DnsOptions import net.mullvad.mullvadvpn.model.DnsState import net.mullvad.mullvadvpn.model.ObfuscationSettings +import net.mullvad.mullvadvpn.model.QuantumResistantState import net.mullvad.mullvadvpn.model.Settings import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager import net.mullvad.mullvadvpn.ui.serviceconnection.customDns @@ -54,7 +55,7 @@ class SettingsRepository( serviceConnectionManager.settingsListener()?.wireguardMtu = value } - fun setWireguardQuantumResistant(value: Boolean?) { + fun setWireguardQuantumResistant(value: QuantumResistantState) { serviceConnectionManager.settingsListener()?.wireguardQuantumResistant = value } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt index d46a71d805..089e13ef31 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt @@ -14,6 +14,7 @@ import net.mullvad.mullvadvpn.model.GeoIpLocation import net.mullvad.mullvadvpn.model.GetAccountDataResult import net.mullvad.mullvadvpn.model.LoginResult import net.mullvad.mullvadvpn.model.ObfuscationSettings +import net.mullvad.mullvadvpn.model.QuantumResistantState import net.mullvad.mullvadvpn.model.RelayList import net.mullvad.mullvadvpn.model.RelaySettingsUpdate import net.mullvad.mullvadvpn.model.RemoveDeviceEvent @@ -178,6 +179,10 @@ class MullvadDaemon( setObfuscationSettings(daemonInterfaceAddress, settings) } + fun setQuantumResistant(quantumResistant: QuantumResistantState) { + setQuantumResistantTunnel(daemonInterfaceAddress, quantumResistant) + } + fun onDestroy() { onSettingsChange.unsubscribeAll() onTunnelStateChange.unsubscribeAll() @@ -255,6 +260,11 @@ class MullvadDaemon( settings: ObfuscationSettings? ) + private external fun setQuantumResistantTunnel( + daemonInterfaceAddress: Long, + quantumResistant: QuantumResistantState + ) + private fun notifyAppVersionInfoEvent(appVersionInfo: AppVersionInfo) { onAppVersionInfoChange?.invoke(appVersionInfo) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/SettingsListener.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/SettingsListener.kt index cd0da7a3fc..fec7578a05 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/SettingsListener.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/SettingsListener.kt @@ -1,6 +1,5 @@ package net.mullvad.mullvadvpn.service.endpoint -import android.util.Log import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.channels.Channel @@ -19,6 +18,7 @@ class SettingsListener(endpoint: ServiceEndpoint) { class SetAutoConnect(val autoConnect: Boolean) : Command() class SetWireGuardMtu(val mtu: Int?) : Command() class SetObfuscationSettings(val settings: ObfuscationSettings?) : Command() + class SetQuantumResistant(val quantumResistant: QuantumResistantState) : Command() } private val commandChannel = spawnActor() @@ -62,8 +62,9 @@ class SettingsListener(endpoint: ServiceEndpoint) { } registerHandler(Request.SetWireGuardQuantumResistant::class) { request -> - // TODO - Log.d("Remove this", "Set quantum resistant ${request.quantumResistant}") + commandChannel.trySendBlocking( + Command.SetQuantumResistant(request.quantumResistant) + ) } } } @@ -127,6 +128,8 @@ class SettingsListener(endpoint: ServiceEndpoint) { is Command.SetWireGuardMtu -> daemon.await().setWireguardMtu(command.mtu) is Command.SetObfuscationSettings -> daemon.await().setObfuscationSettings(command.settings) + is Command.SetQuantumResistant -> + daemon.await().setQuantumResistant(command.quantumResistant) } } } catch (exception: ClosedReceiveChannelException) { diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/SettingsListener.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/SettingsListener.kt index 5cfb4f1f0b..4146c66ce8 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/SettingsListener.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/SettingsListener.kt @@ -6,6 +6,7 @@ import net.mullvad.mullvadvpn.ipc.EventDispatcher import net.mullvad.mullvadvpn.ipc.Request import net.mullvad.mullvadvpn.model.DnsOptions import net.mullvad.mullvadvpn.model.ObfuscationSettings +import net.mullvad.mullvadvpn.model.QuantumResistantState import net.mullvad.mullvadvpn.model.RelaySettings import net.mullvad.mullvadvpn.model.Settings import net.mullvad.talpid.util.EventNotifier @@ -35,8 +36,10 @@ class SettingsListener(private val connection: Messenger, eventDispatcher: Event connection.send(Request.SetWireGuardMtu(value).message) } - var wireguardQuantumResistant: Boolean? - get() = settingsNotifier.latestEvent?.tunnelOptions?.wireguard?.quantumResistant + var wireguardQuantumResistant: QuantumResistantState + get() = + settingsNotifier.latestEvent?.tunnelOptions?.wireguard?.quantumResistant + ?: QuantumResistantState.Off set(value) { connection.send(Request.SetWireGuardQuantumResistant(value).message) } 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 b8ff734287..81811722c7 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 @@ -22,6 +22,7 @@ import net.mullvad.mullvadvpn.model.Constraint import net.mullvad.mullvadvpn.model.DefaultDnsOptions import net.mullvad.mullvadvpn.model.DnsState import net.mullvad.mullvadvpn.model.ObfuscationSettings +import net.mullvad.mullvadvpn.model.QuantumResistantState import net.mullvad.mullvadvpn.model.SelectedObfuscation import net.mullvad.mullvadvpn.model.Settings import net.mullvad.mullvadvpn.model.Udp2TcpObfuscationSettings @@ -56,7 +57,7 @@ class VpnSettingsViewModel( selectedObfuscation = settings?.selectedObfuscationSettings() ?: SelectedObfuscation.Off, dialogState = dialogState, - quantumResistant = settings?.quantumResistant() + quantumResistant = settings?.quantumResistant() ?: QuantumResistantState.Off ) } .stateIn( @@ -306,7 +307,7 @@ class VpnSettingsViewModel( dialogState.update { VpnSettingsDialogState.ObfuscationInfoDialog } } - fun onSelectQuantumResistanceSetting(quantumResistant: Boolean?) { + fun onSelectQuantumResistanceSetting(quantumResistant: QuantumResistantState) { viewModelScope.launch(dispatcher) { repository.setWireguardQuantumResistant(quantumResistant) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelState.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelState.kt index 86f0c980eb..520296784a 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelState.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelState.kt @@ -2,6 +2,7 @@ package net.mullvad.mullvadvpn.viewmodel import net.mullvad.mullvadvpn.compose.state.VpnSettingsUiState import net.mullvad.mullvadvpn.model.DefaultDnsOptions +import net.mullvad.mullvadvpn.model.QuantumResistantState import net.mullvad.mullvadvpn.model.SelectedObfuscation data class VpnSettingsViewModelState( @@ -14,7 +15,7 @@ data class VpnSettingsViewModelState( val contentBlockersOptions: DefaultDnsOptions, val selectedObfuscation: SelectedObfuscation, val dialogState: VpnSettingsDialogState, - val quantumResistant: Boolean? + val quantumResistant: QuantumResistantState ) { fun toUiState(): VpnSettingsUiState { return when (dialogState) { @@ -140,7 +141,7 @@ data class VpnSettingsViewModelState( isAllowLanEnabled = false, dialogState = VpnSettingsDialogState.NoDialog, selectedObfuscation = SelectedObfuscation.Auto, - quantumResistant = null + quantumResistant = QuantumResistantState.Off ) } } |
