diff options
| author | David Göransson <david.goransson@mullvad.net> | 2024-06-03 13:48:17 +0200 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2024-06-04 08:27:03 +0200 |
| commit | 270c44a7a5e0f427d2fb4efc3de7a2dda178cb30 (patch) | |
| tree | d6dfc363ad439b0284100ff6a2500844082c8109 /android/app/src | |
| parent | 3ac0f264402e42a16f0bd6c76e1a6a67e01ed4ef (diff) | |
| download | mullvadvpn-270c44a7a5e0f427d2fb4efc3de7a2dda178cb30.tar.xz mullvadvpn-270c44a7a5e0f427d2fb4efc3de7a2dda178cb30.zip | |
Add support for UDP-over-TCP port
Diffstat (limited to 'android/app/src')
6 files changed, 58 insertions, 4 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 7eee7c1398..46420583c3 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 @@ -84,6 +84,7 @@ import net.mullvad.mullvadvpn.compose.transitions.SlideInFromRightTransition import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect import net.mullvad.mullvadvpn.compose.util.OnNavResultValue import net.mullvad.mullvadvpn.compose.util.showSnackbarImmediately +import net.mullvad.mullvadvpn.constant.UDP2TCP_PRESET_PORTS import net.mullvad.mullvadvpn.constant.WIREGUARD_PRESET_PORTS import net.mullvad.mullvadvpn.lib.model.Constraint import net.mullvad.mullvadvpn.lib.model.Mtu @@ -258,6 +259,7 @@ fun VpnSettings( onSelectObfuscationSetting = vm::onSelectObfuscationSetting, onSelectQuantumResistanceSetting = vm::onSelectQuantumResistanceSetting, onWireguardPortSelected = vm::onWireguardPortSelected, + onObfuscationPortSelected = vm::onObfuscationPortSelected, ) } @@ -293,8 +295,10 @@ fun VpnSettingsScreen( onSelectObfuscationSetting: (selectedObfuscation: SelectedObfuscation) -> Unit = {}, onSelectQuantumResistanceSetting: (quantumResistant: QuantumResistantState) -> Unit = {}, onWireguardPortSelected: (port: Constraint<Port>) -> Unit = {}, + onObfuscationPortSelected: (port: Constraint<Port>) -> Unit = {}, ) { var expandContentBlockersState by rememberSaveable { mutableStateOf(false) } + var expandUdp2TcpPortSettings by rememberSaveable { mutableStateOf(false) } val biggerPadding = 54.dp val topPadding = 6.dp @@ -583,6 +587,37 @@ fun VpnSettingsScreen( } itemWithDivider { + ExpandableComposeCell( + title = stringResource(R.string.udp_over_tcp_port_title), + isExpanded = expandUdp2TcpPortSettings, + onInfoClicked = navigateUdp2TcpInfo, + onCellClicked = { expandUdp2TcpPortSettings = !expandUdp2TcpPortSettings } + ) + } + + if (expandUdp2TcpPortSettings) { + itemWithDivider { + SelectableCell( + title = stringResource(id = R.string.automatic), + isSelected = state.selectedObfuscationPort is Constraint.Any, + onCellClicked = { onObfuscationPortSelected(Constraint.Any) } + ) + } + + UDP2TCP_PRESET_PORTS.forEach { port -> + itemWithDivider { + SelectableCell( + title = port.toString(), + isSelected = state.selectedObfuscationPort.hasValue(port), + onCellClicked = { + onObfuscationPortSelected(Constraint.Only(Port(port))) + } + ) + } + } + } + + itemWithDivider { Spacer(modifier = Modifier.height(Dimens.cellLabelVerticalPadding)) InformationComposeCell( title = stringResource(R.string.quantum_resistant_title), 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 dd9802db2c..cefc5edb7a 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 @@ -17,6 +17,7 @@ data class VpnSettingsUiState( val customDnsItems: List<CustomDnsItem>, val contentBlockersOptions: DefaultDnsOptions, val selectedObfuscation: SelectedObfuscation, + val selectedObfuscationPort: Constraint<Port>, val quantumResistant: QuantumResistantState, val selectedWireguardPort: Constraint<Port>, val customWireguardPort: Constraint<Port>?, @@ -33,6 +34,7 @@ data class VpnSettingsUiState( customDnsItems: List<CustomDnsItem> = emptyList(), contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, + selectedObfuscationPort: Constraint<Port> = Constraint.Any, quantumResistant: QuantumResistantState = QuantumResistantState.Off, selectedWireguardPort: Constraint<Port> = Constraint.Any, customWireguardPort: Constraint.Only<Port>? = null, @@ -47,6 +49,7 @@ data class VpnSettingsUiState( customDnsItems, contentBlockersOptions, selectedObfuscation, + selectedObfuscationPort, quantumResistant, selectedWireguardPort, customWireguardPort, diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/constant/WireguardConstant.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/constant/WireguardConstant.kt index b4ed1e29a9..6f6cb5a79b 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/constant/WireguardConstant.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/constant/WireguardConstant.kt @@ -1,3 +1,4 @@ package net.mullvad.mullvadvpn.constant val WIREGUARD_PRESET_PORTS = listOf(51820, 53) +val UDP2TCP_PRESET_PORTS = listOf(80, 5001) 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 b721442197..a1a1ed007a 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 @@ -8,12 +8,14 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.stateIn import net.mullvad.mullvadvpn.lib.daemon.grpc.ManagementService +import net.mullvad.mullvadvpn.lib.model.Constraint import net.mullvad.mullvadvpn.lib.model.CustomDnsOptions import net.mullvad.mullvadvpn.lib.model.DefaultDnsOptions import net.mullvad.mullvadvpn.lib.model.DnsOptions import net.mullvad.mullvadvpn.lib.model.DnsState import net.mullvad.mullvadvpn.lib.model.Mtu import net.mullvad.mullvadvpn.lib.model.ObfuscationSettings +import net.mullvad.mullvadvpn.lib.model.Port import net.mullvad.mullvadvpn.lib.model.QuantumResistantState import net.mullvad.mullvadvpn.lib.model.Settings @@ -52,6 +54,9 @@ class SettingsRepository( suspend fun addCustomDns(address: InetAddress) = managementService.addCustomDns(address) + suspend fun setCustomObfuscationPort(constraint: Constraint<Port>) = + managementService.setObfuscationPort(constraint) + suspend fun setWireguardMtu(mtu: Mtu) = managementService.setWireguardMtu(mtu.value) suspend fun resetWireguardMtu() = managementService.resetWireguardMtu() 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 864d402fb3..0ad91af8cc 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 @@ -57,10 +57,11 @@ class VpnSettingsViewModel( private val customPort = MutableStateFlow<Constraint<Port>?>(null) private val vmState = - combine(repository.settingsUpdates, relayListRepository.portRanges, customPort) { - settings, - portRanges, - customWgPort -> + combine( + repository.settingsUpdates, + relayListRepository.portRanges, + customPort, + ) { settings, portRanges, customWgPort -> VpnSettingsViewModelState( mtuValue = settings?.tunnelOptions?.wireguard?.mtu, isAutoConnectEnabled = settings?.autoConnect ?: false, @@ -71,6 +72,8 @@ class VpnSettingsViewModel( settings?.contentBlockersSettings() ?: DefaultDnsOptions(), selectedObfuscation = settings?.selectedObfuscationSettings() ?: SelectedObfuscation.Off, + selectedObfuscationPort = + settings?.obfuscationSettings?.udp2tcp?.port ?: Constraint.Any, quantumResistant = settings?.quantumResistant() ?: QuantumResistantState.Off, selectedWireguardPort = settings?.getWireguardPort() ?: Constraint.Any, customWireguardPort = customWgPort, @@ -214,6 +217,10 @@ class VpnSettingsViewModel( } } + fun onObfuscationPortSelected(port: Constraint<Port>) { + viewModelScope.launch { repository.setCustomObfuscationPort(port) } + } + fun onSelectQuantumResistanceSetting(quantumResistant: QuantumResistantState) { viewModelScope.launch(dispatcher) { repository.setWireguardQuantumResistant(quantumResistant).onLeft { 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 f8e4f0b799..d8be8d1cf2 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 @@ -17,6 +17,7 @@ data class VpnSettingsViewModelState( val customDnsList: List<CustomDnsItem>, val contentBlockersOptions: DefaultDnsOptions, val selectedObfuscation: SelectedObfuscation, + val selectedObfuscationPort: Constraint<Port>, val quantumResistant: QuantumResistantState, val selectedWireguardPort: Constraint<Port>, val customWireguardPort: Constraint<Port>?, @@ -32,6 +33,7 @@ data class VpnSettingsViewModelState( customDnsList, contentBlockersOptions, selectedObfuscation, + selectedObfuscationPort, quantumResistant, selectedWireguardPort, customWireguardPort, @@ -49,6 +51,7 @@ data class VpnSettingsViewModelState( customDnsList = listOf(), contentBlockersOptions = DefaultDnsOptions(), selectedObfuscation = SelectedObfuscation.Auto, + selectedObfuscationPort = Constraint.Any, quantumResistant = QuantumResistantState.Off, selectedWireguardPort = Constraint.Any, customWireguardPort = null, |
