summaryrefslogtreecommitdiffhomepage
path: root/android/lib
diff options
context:
space:
mode:
authorAlbin <albin@mullvad.net>2024-08-26 15:48:37 +0200
committerAlbin <albin@mullvad.net>2024-09-06 14:59:55 +0200
commit3847c1eb82a324a4b5fff2a5e076750ebf4449c4 (patch)
tree55c45a4a75e56503e675fdad5418cbeafb850854 /android/lib
parentd464325f98bc488f091ef18b4ba04e0d7dbe2605 (diff)
downloadmullvadvpn-3847c1eb82a324a4b5fff2a5e076750ebf4449c4.tar.xz
mullvadvpn-3847c1eb82a324a4b5fff2a5e076750ebf4449c4.zip
Add daita grpc and ui
Diffstat (limited to 'android/lib')
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt10
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt14
-rw-r--r--android/lib/daemon-grpc/src/test/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/RelayNameComparatorTest.kt20
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/FeatureIndicator.kt2
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItem.kt1
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetDaitaSettingsError.kt5
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Settings.kt2
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelEndpoint.kt1
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelState.kt8
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardRelayEndpointData.kt3
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardTunnelOptions.kt6
-rw-r--r--android/lib/resource/src/main/res/values/strings.xml6
-rw-r--r--android/lib/resource/src/main/res/values/strings_non_translatable.xml2
13 files changed, 77 insertions, 3 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 b51fd7eb2f..f444edce39 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
@@ -104,6 +104,7 @@ import net.mullvad.mullvadvpn.lib.model.SelectedObfuscation
import net.mullvad.mullvadvpn.lib.model.SetAllowLanError
import net.mullvad.mullvadvpn.lib.model.SetApiAccessMethodError
import net.mullvad.mullvadvpn.lib.model.SetAutoConnectError
+import net.mullvad.mullvadvpn.lib.model.SetDaitaSettingsError
import net.mullvad.mullvadvpn.lib.model.SetDnsOptionsError
import net.mullvad.mullvadvpn.lib.model.SetObfuscationOptionsError
import net.mullvad.mullvadvpn.lib.model.SetRelayLocationError
@@ -501,6 +502,15 @@ class ManagementService(
.mapLeft(SetAllowLanError::Unknown)
.mapEmpty()
+ suspend fun setDaitaEnabled(enabled: Boolean): Either<SetDaitaSettingsError, Unit> =
+ Either.catch {
+ val daitaSettings =
+ ManagementInterface.DaitaSettings.newBuilder().setEnabled(enabled).build()
+ grpc.setDaitaSettings(daitaSettings)
+ }
+ .mapLeft(SetDaitaSettingsError::Unknown)
+ .mapEmpty()
+
suspend fun setRelayLocation(location: ModelRelayItemId): Either<SetRelayLocationError, Unit> =
Either.catch {
val currentRelaySettings = getSettings().relaySettings
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 5e8df1edc4..1ff297312b 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
@@ -68,6 +68,7 @@ import net.mullvad.mullvadvpn.lib.model.TunnelState
import net.mullvad.mullvadvpn.lib.model.Udp2TcpObfuscationSettings
import net.mullvad.mullvadvpn.lib.model.WireguardConstraints
import net.mullvad.mullvadvpn.lib.model.WireguardEndpointData
+import net.mullvad.mullvadvpn.lib.model.WireguardRelayEndpointData
import net.mullvad.mullvadvpn.lib.model.WireguardTunnelOptions
import org.joda.time.Instant
@@ -158,6 +159,7 @@ internal fun ManagementInterface.TunnelEndpoint.toDomain(): TunnelEndpoint =
} else {
null
},
+ daita = daita,
)
internal fun ManagementInterface.ObfuscationEndpoint.toDomain(): ObfuscationEndpoint =
@@ -370,6 +372,7 @@ internal fun ManagementInterface.TunnelOptions.WireguardOptions.toDomain(): Wire
WireguardTunnelOptions(
mtu = if (hasMtu()) Mtu(mtu) else null,
quantumResistant = quantumResistant.toDomain(),
+ daita = daita.enabled,
)
internal fun ManagementInterface.QuantumResistantState.toDomain(): QuantumResistantState =
@@ -442,6 +445,9 @@ internal fun ManagementInterface.RelayList.toDomain(): RelayList =
internal fun ManagementInterface.WireguardEndpointData.toDomain(): WireguardEndpointData =
WireguardEndpointData(portRangesList.map { it.toDomain() })
+internal fun ManagementInterface.WireguardRelayEndpointData.toDomain(): WireguardRelayEndpointData =
+ WireguardRelayEndpointData(daita)
+
internal fun ManagementInterface.PortRange.toDomain(): PortRange = PortRange(first..last)
/**
@@ -493,6 +499,12 @@ internal fun ManagementInterface.Relay.toDomain(
ProviderId(provider),
ownership = if (owned) Ownership.MullvadOwned else Ownership.Rented,
),
+ daita =
+ if (
+ hasEndpointData() && endpointType == ManagementInterface.Relay.RelayType.WIREGUARD
+ ) {
+ ManagementInterface.WireguardRelayEndpointData.parseFrom(endpointData.value).daita
+ } else false,
)
internal fun ManagementInterface.Device.toDomain(): Device =
@@ -596,11 +608,11 @@ internal fun ManagementInterface.FeatureIndicator.toDomain() =
ManagementInterface.FeatureIndicator.SERVER_IP_OVERRIDE ->
FeatureIndicator.SERVER_IP_OVERRIDE
ManagementInterface.FeatureIndicator.CUSTOM_MTU -> FeatureIndicator.CUSTOM_MTU
+ ManagementInterface.FeatureIndicator.DAITA -> FeatureIndicator.DAITA
ManagementInterface.FeatureIndicator.LOCKDOWN_MODE,
ManagementInterface.FeatureIndicator.SHADOWSOCKS,
ManagementInterface.FeatureIndicator.MULTIHOP,
ManagementInterface.FeatureIndicator.BRIDGE_MODE,
ManagementInterface.FeatureIndicator.CUSTOM_MSS_FIX,
- ManagementInterface.FeatureIndicator.DAITA,
ManagementInterface.FeatureIndicator.UNRECOGNIZED -> error("Feature not supported")
}
diff --git a/android/lib/daemon-grpc/src/test/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/RelayNameComparatorTest.kt b/android/lib/daemon-grpc/src/test/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/RelayNameComparatorTest.kt
index 1494851bcb..e496c6d5aa 100644
--- a/android/lib/daemon-grpc/src/test/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/RelayNameComparatorTest.kt
+++ b/android/lib/daemon-grpc/src/test/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/RelayNameComparatorTest.kt
@@ -29,6 +29,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
val relay10 =
RelayItem.Location.Relay(
@@ -39,6 +40,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
relay9 assertOrderBothDirection relay10
@@ -55,6 +57,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
val relay9b =
RelayItem.Location.Relay(
@@ -65,6 +68,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
assertTrue(RelayNameComparator.compare(relay9a, relay9b) == 0)
@@ -82,6 +86,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
val relay1 =
RelayItem.Location.Relay(
@@ -92,6 +97,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
val relay3 =
RelayItem.Location.Relay(
@@ -102,6 +108,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
val relay100 =
RelayItem.Location.Relay(
@@ -112,6 +119,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
relay001 assertOrderBothDirection relay1
@@ -131,6 +139,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
val relay9b =
RelayItem.Location.Relay(
@@ -141,6 +150,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
assertTrue(RelayNameComparator.compare(relay9a, relay9b) == 0)
@@ -158,6 +168,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
val relay005 =
RelayItem.Location.Relay(
@@ -168,6 +179,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
relay001 assertOrderBothDirection relay005
@@ -184,6 +196,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
val relayAr8 =
RelayItem.Location.Relay(
@@ -194,6 +207,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
val relaySe5 =
RelayItem.Location.Relay(
@@ -204,6 +218,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
val relaySe10 =
RelayItem.Location.Relay(
@@ -214,6 +229,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
relayAr2 assertOrderBothDirection relayAr8
@@ -232,6 +248,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
val relay2w =
RelayItem.Location.Relay(
@@ -242,6 +259,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
relay2c assertOrderBothDirection relay2w
@@ -258,6 +276,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
val relay22b =
RelayItem.Location.Relay(
@@ -268,6 +287,7 @@ class RelayNameComparatorTest {
providerId = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
),
+ daita = false,
)
relay22a assertOrderBothDirection relay22b
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/FeatureIndicator.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/FeatureIndicator.kt
index 7ad0b3ab69..d11f405869 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/FeatureIndicator.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/FeatureIndicator.kt
@@ -9,12 +9,12 @@ enum class FeatureIndicator {
CUSTOM_DNS,
SERVER_IP_OVERRIDE,
CUSTOM_MTU,
+ DAITA,
// Currently not supported
// LOCKDOWN_MODE,
// SHADOWSOCKS,
// MULTIHOP,
// BRIDGE_MODE,
// CUSTOM_MSS_FIX,
- // DAITA,
// UNRECOGNIZED,
}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItem.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItem.kt
index edf00d4cb4..af96c4d94d 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItem.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItem.kt
@@ -58,6 +58,7 @@ sealed interface RelayItem {
override val id: GeoLocationId.Hostname,
val provider: Provider,
override val active: Boolean,
+ val daita: Boolean,
) : Location {
override val name: String = id.code
override val hasChildren: Boolean = false
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetDaitaSettingsError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetDaitaSettingsError.kt
new file mode 100644
index 0000000000..f636267c09
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/SetDaitaSettingsError.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface SetDaitaSettingsError {
+ data class Unknown(val throwable: Throwable) : SetDaitaSettingsError
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Settings.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Settings.kt
index 0c15202bee..f59d85184c 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Settings.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Settings.kt
@@ -15,5 +15,7 @@ data class Settings(
val splitTunnelSettings: SplitTunnelSettings,
val apiAccessMethodSettings: List<ApiAccessMethodSetting>,
) {
+ fun isDaitaEnabled() = tunnelOptions.wireguard.daita
+
companion object
}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelEndpoint.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelEndpoint.kt
index 1465997cc5..3902e5c965 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelEndpoint.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelEndpoint.kt
@@ -4,4 +4,5 @@ data class TunnelEndpoint(
val endpoint: Endpoint,
val quantumResistant: Boolean,
val obfuscation: ObfuscationEndpoint?,
+ val daita: Boolean,
)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelState.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelState.kt
index 53d468c01e..1849c5abf9 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelState.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/TunnelState.kt
@@ -38,4 +38,12 @@ sealed class TunnelState {
is Error -> this.errorState.isBlocking
}
}
+
+ fun isUsingDaita(): Boolean {
+ return when (this) {
+ is Connected -> endpoint.daita
+ is Connecting -> endpoint?.daita ?: false
+ else -> false
+ }
+ }
}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardRelayEndpointData.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardRelayEndpointData.kt
new file mode 100644
index 0000000000..9e328b92e6
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardRelayEndpointData.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.lib.model
+
+data class WireguardRelayEndpointData(val daita: Boolean)
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardTunnelOptions.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardTunnelOptions.kt
index 573f08213e..70b1599c55 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardTunnelOptions.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardTunnelOptions.kt
@@ -1,3 +1,7 @@
package net.mullvad.mullvadvpn.lib.model
-data class WireguardTunnelOptions(val mtu: Mtu?, val quantumResistant: QuantumResistantState)
+data class WireguardTunnelOptions(
+ val mtu: Mtu?,
+ val quantumResistant: QuantumResistantState,
+ val daita: Boolean,
+)
diff --git a/android/lib/resource/src/main/res/values/strings.xml b/android/lib/resource/src/main/res/values/strings.xml
index 071f45ae23..b72902897f 100644
--- a/android/lib/resource/src/main/res/values/strings.xml
+++ b/android/lib/resource/src/main/res/values/strings.xml
@@ -385,4 +385,10 @@
<string name="failed_to_set_current_unknown_error">Failed to set to current - Unknown reason</string>
<string name="location_was_removed_from_list">%s was removed from \"%s\"</string>
<string name="create_custom_list_message">\"%s\" was created</string>
+ <string name="daita_info">%s (%s) hides patterns in your encrypted VPN traffic. If anyone is monitoring your connection, this makes it significantly harder for them to identify what websites you are visiting. It does this by carefully adding network noise and making all network packets the same size.</string>
+ <string name="daita_warning">Attention: Since this increases your total network traffic, be cautious if you have a limited data plan. It can also negatively impact your network speed. Please consider this if you want to enable %s.</string>
+ <string name="connected_using_daita">%s using %s</string>
+ <string name="setting_chip">Setting: %s</string>
+ <string name="enable_anyway">Enable anyway</string>
+ <string name="daita_relay_subset_warning">This feature isn’t available on all servers. You might need to change location after enabling.</string>
</resources>
diff --git a/android/lib/resource/src/main/res/values/strings_non_translatable.xml b/android/lib/resource/src/main/res/values/strings_non_translatable.xml
index 110e112e99..9cf571171a 100644
--- a/android/lib/resource/src/main/res/values/strings_non_translatable.xml
+++ b/android/lib/resource/src/main/res/values/strings_non_translatable.xml
@@ -14,4 +14,6 @@
<string name="local_network_sharing_ip_ranges">
<![CDATA[<ul><li>10.0.0.0/8</li><li>172.16.0.0/12</li><li>192.168.0.0/16</li><li>169.254.0.0/16</li><li>fe80::/10</li><li>fc00::/7</li></ul>]]>
</string>
+ <string name="daita">DAITA</string>
+ <string name="daita_full">Defence against AI-guided Traffic Analysis</string>
</resources>