diff options
Diffstat (limited to 'android/service')
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) { |
