summaryrefslogtreecommitdiffhomepage
path: root/android/lib
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2024-06-03 13:48:17 +0200
committerDavid Göransson <david.goransson@mullvad.net>2024-06-04 08:27:03 +0200
commit270c44a7a5e0f427d2fb4efc3de7a2dda178cb30 (patch)
treed6dfc363ad439b0284100ff6a2500844082c8109 /android/lib
parent3ac0f264402e42a16f0bd6c76e1a6a67e01ed4ef (diff)
downloadmullvadvpn-270c44a7a5e0f427d2fb4efc3de7a2dda178cb30.tar.xz
mullvadvpn-270c44a7a5e0f427d2fb4efc3de7a2dda178cb30.zip
Add support for UDP-over-TCP port
Diffstat (limited to 'android/lib')
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt19
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt26
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt19
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Port.kt24
-rw-r--r--android/lib/resource/src/main/res/values-da/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-de/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-es/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-fi/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-fr/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-it/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-ja/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-ko/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-my/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-nb/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-nl/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-pl/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-pt/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-ru/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-sv/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-th/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-tr/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-zh-rCN/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values-zh-rTW/strings.xml1
-rw-r--r--android/lib/resource/src/main/res/values/strings.xml2
24 files changed, 87 insertions, 22 deletions
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>