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 | |
| parent | 3ac0f264402e42a16f0bd6c76e1a6a67e01ed4ef (diff) | |
| download | mullvadvpn-270c44a7a5e0f427d2fb4efc3de7a2dda178cb30.tar.xz mullvadvpn-270c44a7a5e0f427d2fb4efc3de7a2dda178cb30.zip | |
Add support for UDP-over-TCP port
Diffstat (limited to 'android')
30 files changed, 145 insertions, 26 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, 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 53aefe13db..268f664840 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 @@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.lib.daemon.grpc import android.net.LocalSocketAddress import android.util.Log import arrow.core.Either +import arrow.core.raise.either import arrow.optics.copy import arrow.optics.dsl.index import arrow.optics.typeclasses.Index @@ -68,11 +69,13 @@ import net.mullvad.mullvadvpn.lib.model.GetDeviceListError import net.mullvad.mullvadvpn.lib.model.GetDeviceStateError import net.mullvad.mullvadvpn.lib.model.LoginAccountError import net.mullvad.mullvadvpn.lib.model.ObfuscationSettings as ModelObfuscationSettings +import net.mullvad.mullvadvpn.lib.model.ObfuscationSettings import net.mullvad.mullvadvpn.lib.model.Ownership as ModelOwnership import net.mullvad.mullvadvpn.lib.model.PlayPurchase import net.mullvad.mullvadvpn.lib.model.PlayPurchaseInitError import net.mullvad.mullvadvpn.lib.model.PlayPurchasePaymentToken import net.mullvad.mullvadvpn.lib.model.PlayPurchaseVerifyError +import net.mullvad.mullvadvpn.lib.model.Port import net.mullvad.mullvadvpn.lib.model.Providers import net.mullvad.mullvadvpn.lib.model.QuantumResistantState as ModelQuantumResistantState import net.mullvad.mullvadvpn.lib.model.RedeemVoucherError @@ -107,6 +110,7 @@ import net.mullvad.mullvadvpn.lib.model.ownership import net.mullvad.mullvadvpn.lib.model.providers import net.mullvad.mullvadvpn.lib.model.relayConstraints import net.mullvad.mullvadvpn.lib.model.state +import net.mullvad.mullvadvpn.lib.model.udp2tcp import net.mullvad.mullvadvpn.lib.model.wireguardConstraints @Suppress("TooManyFunctions") @@ -386,6 +390,21 @@ class ManagementService( .mapLeft(SetObfuscationOptionsError::Unknown) .mapEmpty() + suspend fun setObfuscationPort( + portConstraint: Constraint<Port> + ): Either<SetObfuscationOptionsError, Unit> = either { + val updatedObfuscationSettings = + Either.catch { + val obfuscationSettings = getSettings().obfuscationSettings + ObfuscationSettings.udp2tcp.modify(obfuscationSettings) { + it.copy(port = portConstraint) + } + } + .mapLeft(SetObfuscationOptionsError::Unknown) + .bind() + setObfuscationOptions(updatedObfuscationSettings).bind() + } + suspend fun setAutoConnect(isEnabled: Boolean): Either<SetAutoConnectError, Unit> = Either.catch { grpc.setAutoConnect(BoolValue.of(isEnabled)) } .mapLeft(SetAutoConnectError::Unknown) 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 df4625228f..4efd8c452e 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 @@ -17,6 +17,8 @@ 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 +import net.mullvad.mullvadvpn.lib.model.SelectedObfuscation +import net.mullvad.mullvadvpn.lib.model.Udp2TcpObfuscationSettings import net.mullvad.mullvadvpn.lib.model.WireguardConstraints internal fun Constraint<RelayItemId>.fromDomain(): ManagementInterface.LocationConstraint = @@ -70,10 +72,30 @@ internal fun DefaultDnsOptions.fromDomain(): ManagementInterface.DefaultDnsOptio internal fun ObfuscationSettings.fromDomain(): ManagementInterface.ObfuscationSettings = ManagementInterface.ObfuscationSettings.newBuilder() - .setSelectedObfuscation(selectedObfuscation.toDomain()) - .setUdp2Tcp(udp2tcp.toDomain()) + .setSelectedObfuscation(selectedObfuscation.fromDomain()) + .setUdp2Tcp(udp2tcp.fromDomain()) .build() +internal fun SelectedObfuscation.fromDomain(): + ManagementInterface.ObfuscationSettings.SelectedObfuscation = + when (this) { + SelectedObfuscation.Udp2Tcp -> + ManagementInterface.ObfuscationSettings.SelectedObfuscation.UDP2TCP + SelectedObfuscation.Auto -> ManagementInterface.ObfuscationSettings.SelectedObfuscation.AUTO + SelectedObfuscation.Off -> ManagementInterface.ObfuscationSettings.SelectedObfuscation.OFF + } + +internal fun Udp2TcpObfuscationSettings.fromDomain(): + ManagementInterface.Udp2TcpObfuscationSettings = + when (val port = port) { + is Constraint.Any -> + ManagementInterface.Udp2TcpObfuscationSettings.newBuilder().clearPort().build() + is Constraint.Only -> + ManagementInterface.Udp2TcpObfuscationSettings.newBuilder() + .setPort(port.value.value) + .build() + } + internal fun GeoLocationId.fromDomain(): ManagementInterface.GeographicLocationConstraint = ManagementInterface.GeographicLocationConstraint.newBuilder() .apply { 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 636e6c5176..0fe64e09f2 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 @@ -409,25 +409,6 @@ internal fun QuantumResistantState.toDomain(): ManagementInterface.QuantumResist ) .build() -internal fun SelectedObfuscation.toDomain(): - ManagementInterface.ObfuscationSettings.SelectedObfuscation = - when (this) { - SelectedObfuscation.Udp2Tcp -> - ManagementInterface.ObfuscationSettings.SelectedObfuscation.UDP2TCP - SelectedObfuscation.Auto -> ManagementInterface.ObfuscationSettings.SelectedObfuscation.AUTO - SelectedObfuscation.Off -> ManagementInterface.ObfuscationSettings.SelectedObfuscation.OFF - } - -internal fun Udp2TcpObfuscationSettings.toDomain(): ManagementInterface.Udp2TcpObfuscationSettings = - when (val port = port) { - is Constraint.Any -> - ManagementInterface.Udp2TcpObfuscationSettings.newBuilder().clearPort().build() - is Constraint.Only -> - ManagementInterface.Udp2TcpObfuscationSettings.newBuilder() - .setPort(port.value.value) - .build() - } - internal fun ManagementInterface.AppVersionInfo.toDomain(): AppVersionInfo = AppVersionInfo( supported = supported, diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Port.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Port.kt index bcb5a8dd99..5ce44d0565 100644 --- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Port.kt +++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Port.kt @@ -1,6 +1,28 @@ package net.mullvad.mullvadvpn.lib.model import android.os.Parcelable +import arrow.core.Either +import arrow.core.raise.either +import arrow.core.raise.ensure import kotlinx.parcelize.Parcelize -@JvmInline @Parcelize value class Port(val value: Int) : Parcelable +@JvmInline +@Parcelize +value class Port(val value: Int) : Parcelable { + companion object { + fun fromString(value: String): Either<ParsePortError, Port> = either { + val number = value.toIntOrNull() ?: raise(ParsePortError.NotANumber(value)) + ensure(number in MIN_VALUE..MAX_VALUE) { ParsePortError.OutOfRange(number) } + Port(number) + } + + private const val MIN_VALUE = 0 + private const val MAX_VALUE = 65535 + } +} + +sealed interface ParsePortError { + data class NotANumber(val input: String) : ParsePortError + + data class OutOfRange(val value: Int) : ParsePortError +} diff --git a/android/lib/resource/src/main/res/values-da/strings.xml b/android/lib/resource/src/main/res/values-da/strings.xml index 41ed2fa2a1..1e76fbfeba 100644 --- a/android/lib/resource/src/main/res/values-da/strings.xml +++ b/android/lib/resource/src/main/res/values-da/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">Prøv igen</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">Hvilken TCP-port UDP-over-TCP tilsløringsprotokollen skal forbinde til på VPN-serveren.</string> + <string name="udp_over_tcp_port_title">UDP-over-TCP-port</string> <string name="undo">Fortryd</string> <string name="unsecured">Ikke sikret</string> <string name="unsecured_connection">IKKE-SIKRET FORBINDELSE</string> diff --git a/android/lib/resource/src/main/res/values-de/strings.xml b/android/lib/resource/src/main/res/values-de/strings.xml index 341fc25b7c..ab5c2afe0c 100644 --- a/android/lib/resource/src/main/res/values-de/strings.xml +++ b/android/lib/resource/src/main/res/values-de/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">Erneut versuchen</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">Mit welchem TCP-Port sich das UDP-über-TCP-Verschleierungsprotokoll auf dem VPN-Server verbinden soll.</string> + <string name="udp_over_tcp_port_title">Port für UDP über TCP</string> <string name="undo">Rückgängig</string> <string name="unsecured">Ungesichert</string> <string name="unsecured_connection">UNGESICHERTE VERBINDUNG</string> diff --git a/android/lib/resource/src/main/res/values-es/strings.xml b/android/lib/resource/src/main/res/values-es/strings.xml index 73cf8de683..6d9f920a49 100644 --- a/android/lib/resource/src/main/res/values-es/strings.xml +++ b/android/lib/resource/src/main/res/values-es/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">Volver a intentarlo</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">El puerto TCP al que se conectará el protocolo de ofuscación de UDP sobre TCP en el servidor VPN.</string> + <string name="udp_over_tcp_port_title">Puerto de UDP sobre TCP</string> <string name="undo">Deshacer</string> <string name="unsecured">No protegido</string> <string name="unsecured_connection">CONEXIÓN NO SEGURA</string> diff --git a/android/lib/resource/src/main/res/values-fi/strings.xml b/android/lib/resource/src/main/res/values-fi/strings.xml index f072605aa8..5d1270216d 100644 --- a/android/lib/resource/src/main/res/values-fi/strings.xml +++ b/android/lib/resource/src/main/res/values-fi/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">Yritä uudelleen</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">Määrittää, mihin VPN-palvelimen TCP-porttiin \"UDP TCP:n kautta\" -hämäysteknologia-protokollan tulee muodostaa yhteys.</string> + <string name="udp_over_tcp_port_title">Portti: UDP TPC:n kautta</string> <string name="undo">Kumoa</string> <string name="unsecured">Suojaamaton</string> <string name="unsecured_connection">SUOJAAMATON YHTEYS</string> diff --git a/android/lib/resource/src/main/res/values-fr/strings.xml b/android/lib/resource/src/main/res/values-fr/strings.xml index 15a4684019..6f6b9f6889 100644 --- a/android/lib/resource/src/main/res/values-fr/strings.xml +++ b/android/lib/resource/src/main/res/values-fr/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">Réessayer</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">Le port TCP auquel le protocole de dissimulation UDP sur TCP doit se connecter sur le serveur VPN.</string> + <string name="udp_over_tcp_port_title">Port UDP sur TCP</string> <string name="undo">Annuler</string> <string name="unsecured">Non sécurisé</string> <string name="unsecured_connection">CONNEXION NON SÉCURISÉE</string> diff --git a/android/lib/resource/src/main/res/values-it/strings.xml b/android/lib/resource/src/main/res/values-it/strings.xml index 460c4ce1fc..58f841db5a 100644 --- a/android/lib/resource/src/main/res/values-it/strings.xml +++ b/android/lib/resource/src/main/res/values-it/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">Riprova</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">A quale porta TCP deve connettersi il protocollo di offuscamento UDP-over-TCP sul server VPN.</string> + <string name="udp_over_tcp_port_title">Porta UDP-over-TCP</string> <string name="undo">Annulla</string> <string name="unsecured">Non protetto</string> <string name="unsecured_connection">CONNESSIONE NON PROTETTA</string> diff --git a/android/lib/resource/src/main/res/values-ja/strings.xml b/android/lib/resource/src/main/res/values-ja/strings.xml index 5f474ffbbd..422866e8c6 100644 --- a/android/lib/resource/src/main/res/values-ja/strings.xml +++ b/android/lib/resource/src/main/res/values-ja/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">再試行</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">UDP-over-TCP難読化プロトコルで接続する必要のあるVPNサーバーのTCPポートです。</string> + <string name="udp_over_tcp_port_title">UDP-over-TCPポート</string> <string name="undo">元に戻す</string> <string name="unsecured">セキュリティ保護されていません</string> <string name="unsecured_connection">セキュリティ保護されていない接続</string> diff --git a/android/lib/resource/src/main/res/values-ko/strings.xml b/android/lib/resource/src/main/res/values-ko/strings.xml index 5772dabea9..f7d4ef179c 100644 --- a/android/lib/resource/src/main/res/values-ko/strings.xml +++ b/android/lib/resource/src/main/res/values-ko/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">다시 시도</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">UDP-over-TCP 난독 처리 프로토콜이 VPN 서버에서 연결해야 하는 TCP 포트입니다.</string> + <string name="udp_over_tcp_port_title">UDP-over-TCP 포트</string> <string name="undo">실행 취소</string> <string name="unsecured">안전하지 않음</string> <string name="unsecured_connection">비보안 연결</string> diff --git a/android/lib/resource/src/main/res/values-my/strings.xml b/android/lib/resource/src/main/res/values-my/strings.xml index 2e5751db21..4f8dc1f810 100644 --- a/android/lib/resource/src/main/res/values-my/strings.xml +++ b/android/lib/resource/src/main/res/values-my/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">ထပ်ကြိုးစားရန်</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">VPN ဆာဗာကို ဖွင့်ရန် ၎င်း TCP ပေါ့တ် UDP-over-TCP Obfuscation ပရိုတိုကောလ်နှင့် ချိတ်ဆက်ထားသင့်ပါသည်။</string> + <string name="udp_over_tcp_port_title">UDP-over-TCP ပေါ့တ်</string> <string name="undo">မလုပ်တော့ပါ</string> <string name="unsecured">မလုံခြုံပါ</string> <string name="unsecured_connection">မလုံခြုံသည့် ချိတ်ဆက်မှု</string> diff --git a/android/lib/resource/src/main/res/values-nb/strings.xml b/android/lib/resource/src/main/res/values-nb/strings.xml index 3706286a79..94ff4cf8a6 100644 --- a/android/lib/resource/src/main/res/values-nb/strings.xml +++ b/android/lib/resource/src/main/res/values-nb/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">Prøv på nytt</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">TCP-porten som UDP-over-TCP-tilsløringen skal koble til på VPN-serveren.</string> + <string name="udp_over_tcp_port_title">UDP-over-TCP-port</string> <string name="undo">Angre</string> <string name="unsecured">Usikret</string> <string name="unsecured_connection">USIKKER TILKOBLING</string> diff --git a/android/lib/resource/src/main/res/values-nl/strings.xml b/android/lib/resource/src/main/res/values-nl/strings.xml index 0842a2c613..880fb2fdad 100644 --- a/android/lib/resource/src/main/res/values-nl/strings.xml +++ b/android/lib/resource/src/main/res/values-nl/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">Probeer het opnieuw</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">Met welke TCP-poort moet het UDP-over-TCP-obfuscatieprotocol verbinding maken op de VPN-server.</string> + <string name="udp_over_tcp_port_title">UDP-over-TCP-poort</string> <string name="undo">Ongedaan maken</string> <string name="unsecured">Niet beveiligd</string> <string name="unsecured_connection">NIET-BEVEILIGDE VERBINDING</string> diff --git a/android/lib/resource/src/main/res/values-pl/strings.xml b/android/lib/resource/src/main/res/values-pl/strings.xml index d000a6d685..b316190249 100644 --- a/android/lib/resource/src/main/res/values-pl/strings.xml +++ b/android/lib/resource/src/main/res/values-pl/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">Spróbuj ponownie</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">Port TCP, z którym powinien łączyć się protokół zaciemniania UDP-przez-TCP na serwerze VPN.</string> + <string name="udp_over_tcp_port_title">Port UDP-przez-TCP</string> <string name="undo">Cofnij</string> <string name="unsecured">Niezabezpieczone</string> <string name="unsecured_connection">NIEZABEZPIECZONE POŁĄCZENIE</string> diff --git a/android/lib/resource/src/main/res/values-pt/strings.xml b/android/lib/resource/src/main/res/values-pt/strings.xml index 165a7914e0..b0e381362b 100644 --- a/android/lib/resource/src/main/res/values-pt/strings.xml +++ b/android/lib/resource/src/main/res/values-pt/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">Tentar novamente</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">A que porta TCP o protocolo de ofuscação UDP sobre TCP deve ligar-se no servidor VPN.</string> + <string name="udp_over_tcp_port_title">Porta UDP sobre TCP</string> <string name="undo">Anular</string> <string name="unsecured">Inseguro</string> <string name="unsecured_connection">LIGAÇÃO INSEGURA</string> diff --git a/android/lib/resource/src/main/res/values-ru/strings.xml b/android/lib/resource/src/main/res/values-ru/strings.xml index 24c994a66c..6bb5bc7fe5 100644 --- a/android/lib/resource/src/main/res/values-ru/strings.xml +++ b/android/lib/resource/src/main/res/values-ru/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">Повторить попытку</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">TCP-порт, к которому должен подключаться протокол обфускации UDP через TCP на VPN-сервере.</string> + <string name="udp_over_tcp_port_title">Порт для UDP через TCP</string> <string name="undo">Отменить</string> <string name="unsecured">Подключение не защищено</string> <string name="unsecured_connection">НЕЗАЩИЩЕННОЕ ПОДКЛЮЧЕНИЕ</string> diff --git a/android/lib/resource/src/main/res/values-sv/strings.xml b/android/lib/resource/src/main/res/values-sv/strings.xml index 24830f24bc..0109096773 100644 --- a/android/lib/resource/src/main/res/values-sv/strings.xml +++ b/android/lib/resource/src/main/res/values-sv/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">Försök igen</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">Vilken TCP-port som UDP-över-TCP-obfuskeringsprotokoll bör ansluta till på VPN-servern.</string> + <string name="udp_over_tcp_port_title">UDP-över-TCP-port</string> <string name="undo">Ångra</string> <string name="unsecured">Oskyddad</string> <string name="unsecured_connection">OSÄKER ANSLUTNING</string> diff --git a/android/lib/resource/src/main/res/values-th/strings.xml b/android/lib/resource/src/main/res/values-th/strings.xml index 99fe95a491..a022a9d47f 100644 --- a/android/lib/resource/src/main/res/values-th/strings.xml +++ b/android/lib/resource/src/main/res/values-th/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">ลองอีกครั้ง</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">พอร์ต TCP ใดที่โพรโทคอลการทำให้ข้อมูลยุ่งเหยิง UDP-ผ่าน-TCP ควรเชื่อมต่อบนเซิร์ฟเวอร์ VPN</string> + <string name="udp_over_tcp_port_title">พอร์ต UDP-ผ่าน-TCP</string> <string name="undo">เลิกทำ</string> <string name="unsecured">ไม่ปลอดภัย</string> <string name="unsecured_connection">การเชื่อมต่อที่ไม่ปลอดภัย</string> diff --git a/android/lib/resource/src/main/res/values-tr/strings.xml b/android/lib/resource/src/main/res/values-tr/strings.xml index 0c212851ed..b9b1d704f0 100644 --- a/android/lib/resource/src/main/res/values-tr/strings.xml +++ b/android/lib/resource/src/main/res/values-tr/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">Tekrar dene</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">TCP üzerinden UDP gizleme protokolünün VPN sunucusunda hangi TCP portuna bağlanması gerekiyor.</string> + <string name="udp_over_tcp_port_title">TCP üzerinden UDP portu</string> <string name="undo">Geri al</string> <string name="unsecured">Güvenli değil</string> <string name="unsecured_connection">GÜVENLİ OLMAYAN BAĞLANTI</string> diff --git a/android/lib/resource/src/main/res/values-zh-rCN/strings.xml b/android/lib/resource/src/main/res/values-zh-rCN/strings.xml index 56fba1768b..e1f998fd21 100644 --- a/android/lib/resource/src/main/res/values-zh-rCN/strings.xml +++ b/android/lib/resource/src/main/res/values-zh-rCN/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">重试</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">UDP-over-TCP 混淆协议应连接到 VPN 服务器上的哪个 TCP 端口。</string> + <string name="udp_over_tcp_port_title">UDP-over-TCP 端口</string> <string name="undo">撤消</string> <string name="unsecured">未受保护</string> <string name="unsecured_connection">未受保护的连接</string> diff --git a/android/lib/resource/src/main/res/values-zh-rTW/strings.xml b/android/lib/resource/src/main/res/values-zh-rTW/strings.xml index 09a1e9baeb..bf91a4d183 100644 --- a/android/lib/resource/src/main/res/values-zh-rTW/strings.xml +++ b/android/lib/resource/src/main/res/values-zh-rTW/strings.xml @@ -288,6 +288,7 @@ <string name="try_again">再試一次</string> <string name="udp">UDP</string> <string name="udp_over_tcp_port_info">UDP-over-TCP 混淆通訊協定應連線到 VPN 伺服器上的哪個 TCP 連接埠。</string> + <string name="udp_over_tcp_port_title">UDP-over-TCP 連接埠</string> <string name="undo">復原</string> <string name="unsecured">不安全</string> <string name="unsecured_connection">不安全的連線</string> diff --git a/android/lib/resource/src/main/res/values/strings.xml b/android/lib/resource/src/main/res/values/strings.xml index f9acacb5d9..d869653c31 100644 --- a/android/lib/resource/src/main/res/values/strings.xml +++ b/android/lib/resource/src/main/res/values/strings.xml @@ -232,6 +232,8 @@ <string name="obfuscation_on_udp_over_tcp">On (UDP-over-TCP)</string> <string name="automatic">Automatic</string> <string name="off">Off</string> + + <string name="udp_over_tcp_port_title">UDP-over-TCP port</string> <string name="udp_over_tcp_port_info">Which TCP port the UDP-over-TCP obfuscation protocol should connect to on the VPN server.</string> <string name="created_x">Created: %s</string> <string name="local_network_sharing_info">This feature allows access to other devices on the local network, such as for sharing, printing, streaming, etc.</string> |
