summaryrefslogtreecommitdiffhomepage
path: root/android/service/src
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2024-03-19 15:03:06 +0100
committerDavid Göransson <david.goransson@mullvad.net>2024-03-19 16:15:43 +0100
commitaa7eea3e75288e2b0bea9eb55d46e11c558eebee (patch)
tree64fb67699c3fe87b89d068b7c28b4ea509de5cd3 /android/service/src
parenta1ab31eebd96846514fa67af99c6af091ed68208 (diff)
downloadmullvadvpn-aa7eea3e75288e2b0bea9eb55d46e11c558eebee.tar.xz
mullvadvpn-aa7eea3e75288e2b0bea9eb55d46e11c558eebee.zip
Add daemon support for Server IP overrides
Diffstat (limited to 'android/service/src')
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt25
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/JsonSettings.kt48
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/RelayOverrides.kt37
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt4
4 files changed, 114 insertions, 0 deletions
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt
index f99d36c679..1d87987cf3 100644
--- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt
+++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt
@@ -20,10 +20,12 @@ import net.mullvad.mullvadvpn.model.PlayPurchaseInitResult
import net.mullvad.mullvadvpn.model.PlayPurchaseVerifyResult
import net.mullvad.mullvadvpn.model.QuantumResistantState
import net.mullvad.mullvadvpn.model.RelayList
+import net.mullvad.mullvadvpn.model.RelayOverride
import net.mullvad.mullvadvpn.model.RelaySettings
import net.mullvad.mullvadvpn.model.RemoveDeviceEvent
import net.mullvad.mullvadvpn.model.RemoveDeviceResult
import net.mullvad.mullvadvpn.model.Settings
+import net.mullvad.mullvadvpn.model.SettingsPatchError
import net.mullvad.mullvadvpn.model.TunnelState
import net.mullvad.mullvadvpn.model.UpdateCustomListResult
import net.mullvad.mullvadvpn.model.VoucherSubmissionResult
@@ -202,6 +204,15 @@ class MullvadDaemon(
fun updateCustomList(customList: CustomList): UpdateCustomListResult =
updateCustomList(daemonInterfaceAddress, customList)
+ fun clearAllRelayOverrides() = clearAllRelayOverrides(daemonInterfaceAddress)
+
+ fun applyJsonSettings(json: String) = applyJsonSettings(daemonInterfaceAddress, json)
+
+ fun exportJsonSettings(): String = exportJsonSettings(daemonInterfaceAddress)
+
+ fun setRelayOverride(relayOverride: RelayOverride) =
+ setRelayOverride(daemonInterfaceAddress, relayOverride)
+
fun onDestroy() {
onSettingsChange.unsubscribeAll()
onTunnelStateChange.unsubscribeAll()
@@ -323,6 +334,20 @@ class MullvadDaemon(
customList: CustomList
): UpdateCustomListResult
+ private external fun clearAllRelayOverrides(daemonInterfaceAddress: Long)
+
+ private external fun applyJsonSettings(
+ daemonInterfaceAddress: Long,
+ json: String
+ ): SettingsPatchError
+
+ private external fun exportJsonSettings(daemonInterfaceAddress: Long): String
+
+ private external fun setRelayOverride(
+ daemonInterfaceAddress: Long,
+ relayOverride: RelayOverride
+ )
+
@Suppress("unused")
private fun notifyAppVersionInfoEvent(appVersionInfo: AppVersionInfo) {
onAppVersionInfoChange?.invoke(appVersionInfo)
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/JsonSettings.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/JsonSettings.kt
new file mode 100644
index 0000000000..65d7b6cff0
--- /dev/null
+++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/JsonSettings.kt
@@ -0,0 +1,48 @@
+package net.mullvad.mullvadvpn.service.endpoint
+
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.flow.filterIsInstance
+import kotlinx.coroutines.launch
+import net.mullvad.mullvadvpn.lib.ipc.Event
+import net.mullvad.mullvadvpn.lib.ipc.Request
+
+class JsonSettings(
+ private val endpoint: ServiceEndpoint,
+ dispatcher: CoroutineDispatcher = Dispatchers.IO
+) {
+ private val scope: CoroutineScope = CoroutineScope(SupervisorJob() + dispatcher)
+ private val daemon
+ get() = endpoint.intermittentDaemon
+
+ init {
+ scope.launch {
+ endpoint.dispatcher.parsedMessages
+ .filterIsInstance<Request.ApplyJsonSettings>()
+ .collect { applyJsonSettings(it.json) }
+ }
+
+ scope.launch {
+ endpoint.dispatcher.parsedMessages
+ .filterIsInstance<Request.ExportJsonSettings>()
+ .collect { exportJsonSettings() }
+ }
+ }
+
+ private suspend fun applyJsonSettings(json: String) {
+ val result = daemon.await().applyJsonSettings(json)
+ endpoint.sendEvent(Event.ApplyJsonSettingsResult(result))
+ }
+
+ private suspend fun exportJsonSettings() {
+ val json = daemon.await().exportJsonSettings()
+ endpoint.sendEvent(Event.ExportJsonSettingsResult(json))
+ }
+
+ fun onDestroy() {
+ scope.cancel()
+ }
+}
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/RelayOverrides.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/RelayOverrides.kt
new file mode 100644
index 0000000000..cda7a5b94b
--- /dev/null
+++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/RelayOverrides.kt
@@ -0,0 +1,37 @@
+package net.mullvad.mullvadvpn.service.endpoint
+
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.flow.filterIsInstance
+import kotlinx.coroutines.launch
+import net.mullvad.mullvadvpn.lib.ipc.Request
+
+class RelayOverrides(
+ private val endpoint: ServiceEndpoint,
+ dispatcher: CoroutineDispatcher = Dispatchers.IO
+) {
+ private val scope: CoroutineScope = CoroutineScope(SupervisorJob() + dispatcher)
+ private val daemon
+ get() = endpoint.intermittentDaemon
+
+ init {
+ scope.launch {
+ endpoint.dispatcher.parsedMessages
+ .filterIsInstance<Request.SetRelayOverride>()
+ .collect { daemon.await().setRelayOverride(it.override) }
+ }
+
+ scope.launch {
+ endpoint.dispatcher.parsedMessages
+ .filterIsInstance<Request.ClearAllRelayOverrides>()
+ .collect { daemon.await().clearAllRelayOverrides() }
+ }
+ }
+
+ fun onDestroy() {
+ scope.cancel()
+ }
+}
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt
index 5485c528b0..f8fc6aaf64 100644
--- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt
+++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt
@@ -46,6 +46,8 @@ class ServiceEndpoint(
val appVersionInfoCache = AppVersionInfoCache(this)
val authTokenCache = AuthTokenCache(this)
val customDns = CustomDns(this)
+ val relayOverrides = RelayOverrides(this)
+ val jsonSettings = JsonSettings(this)
val relayListListener = RelayListListener(this)
val splitTunneling = SplitTunneling(SplitTunnelingPersistence(context), this)
val voucherRedeemer = VoucherRedeemer(this, accountCache)
@@ -83,6 +85,8 @@ class ServiceEndpoint(
voucherRedeemer.onDestroy()
playPurchaseHandler.onDestroy()
customLists.onDestroy()
+ relayOverrides.onDestroy()
+ jsonSettings.onDestroy()
}
internal fun sendEvent(event: Event) {