diff options
| author | David Göransson <david.goransson@mullvad.net> | 2024-08-30 13:54:11 +0200 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2024-08-30 13:54:11 +0200 |
| commit | b0c1bcc5b49aa83c80dc125980f8ab745008397e (patch) | |
| tree | b324a4dfcb01d4206f773390809ec4fc8b3a5b2c /android/service/src | |
| parent | 2c8d4f1be088c7d55526c5d2dea6e65bc6f94193 (diff) | |
| parent | 7f1fcf7503b5f0a8556d067dcf6e1bab443c849f (diff) | |
| download | mullvadvpn-b0c1bcc5b49aa83c80dc125980f8ab745008397e.tar.xz mullvadvpn-b0c1bcc5b49aa83c80dc125980f8ab745008397e.zip | |
Merge branch 'managementservicestop-sometimes-crashes-droid-1284'
Diffstat (limited to 'android/service/src')
5 files changed, 66 insertions, 59 deletions
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/DaemonConfig.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/DaemonConfig.kt new file mode 100644 index 0000000000..06450a1583 --- /dev/null +++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/DaemonConfig.kt @@ -0,0 +1,11 @@ +package net.mullvad.mullvadvpn.service + +import java.io.File +import net.mullvad.mullvadvpn.lib.endpoint.ApiEndpointOverride + +data class DaemonConfig( + val rpcSocket: File, + val filesDir: File, + val cacheDir: File, + val apiEndpointOverride: ApiEndpointOverride?, +) 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 5bfae14383..d95892305b 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 @@ -1,6 +1,6 @@ package net.mullvad.mullvadvpn.service -import net.mullvad.mullvadvpn.lib.endpoint.ApiEndpoint +import net.mullvad.mullvadvpn.lib.endpoint.ApiEndpointOverride object MullvadDaemon { init { @@ -12,7 +12,7 @@ object MullvadDaemon { rpcSocketPath: String, filesDirectory: String, cacheDirectory: String, - apiEndpoint: ApiEndpoint?, + apiEndpointOverride: ApiEndpointOverride?, ) external fun shutdown() diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt index 5603392376..2b7833fb8d 100644 --- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt +++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt @@ -11,21 +11,17 @@ import androidx.lifecycle.lifecycleScope import arrow.atomic.AtomicInt import co.touchlab.kermit.Logger import java.io.File -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -import net.mullvad.mullvadvpn.lib.common.constant.GRPC_SOCKET_FILE_NAMED_ARGUMENT import net.mullvad.mullvadvpn.lib.common.constant.KEY_CONNECT_ACTION import net.mullvad.mullvadvpn.lib.common.constant.KEY_DISCONNECT_ACTION import net.mullvad.mullvadvpn.lib.daemon.grpc.ManagementService -import net.mullvad.mullvadvpn.lib.endpoint.ApiEndpointConfiguration import net.mullvad.mullvadvpn.lib.endpoint.getApiEndpointConfigurationExtras import net.mullvad.mullvadvpn.lib.intent.IntentProvider import net.mullvad.mullvadvpn.lib.model.TunnelState import net.mullvad.mullvadvpn.lib.shared.ConnectionProxy -import net.mullvad.mullvadvpn.service.di.apiEndpointModule import net.mullvad.mullvadvpn.service.di.vpnServiceModule import net.mullvad.mullvadvpn.service.migration.MigrateSplitTunneling import net.mullvad.mullvadvpn.service.notifications.ForegroundNotificationManager @@ -34,7 +30,6 @@ import net.mullvad.mullvadvpn.service.notifications.NotificationManager import net.mullvad.talpid.TalpidVpnService import org.koin.android.ext.android.getKoin import org.koin.core.context.loadKoinModules -import org.koin.core.qualifier.named private const val RELAYS_FILE = "relays.json" @@ -42,12 +37,11 @@ class MullvadVpnService : TalpidVpnService() { private lateinit var keyguardManager: KeyguardManager - private lateinit var apiEndpointConfiguration: ApiEndpointConfiguration private lateinit var managementService: ManagementService private lateinit var migrateSplitTunneling: MigrateSplitTunneling private lateinit var intentProvider: IntentProvider private lateinit var connectionProxy: ConnectionProxy - private lateinit var rpcSocketFile: File + private lateinit var daemonConfig: DaemonConfig private lateinit var foregroundNotificationHandler: ForegroundNotificationManager @@ -59,7 +53,7 @@ class MullvadVpnService : TalpidVpnService() { super.onCreate() Logger.i("MullvadVpnService: onCreate") - loadKoinModules(listOf(vpnServiceModule, apiEndpointModule)) + loadKoinModules(listOf(vpnServiceModule)) with(getKoin()) { // Needed to create all the notification channels get<NotificationChannelFactory>() @@ -70,27 +64,32 @@ class MullvadVpnService : TalpidVpnService() { ForegroundNotificationManager(this@MullvadVpnService, get()) get<NotificationManager>() - apiEndpointConfiguration = get() + daemonConfig = get() migrateSplitTunneling = get() intentProvider = get() connectionProxy = get() - rpcSocketFile = get(named(GRPC_SOCKET_FILE_NAMED_ARGUMENT)) } keyguardManager = getSystemService<KeyguardManager>()!! - // TODO We should avoid lifecycleScope.launch (current needed due to InetSocketAddress - // with intent from API) - lifecycleScope.launch(context = Dispatchers.IO) { - prepareFiles(this@MullvadVpnService) - migrateSplitTunneling.migrate() + prepareFiles(this@MullvadVpnService) + migrateSplitTunneling.migrate() - Logger.i("Start daemon") - startDaemon() + // If it is a debug build and we have an api override in the intent, use it + // This is for injecting hostname and port for our mock api tests + val intentApiOverride = + intentProvider.getLatestIntent()?.getApiEndpointConfigurationExtras() + val updatedConfig = + if (BuildConfig.DEBUG && intentApiOverride != null) { + daemonConfig.copy(apiEndpointOverride = intentApiOverride) + } else { + daemonConfig + } + Logger.i("Start daemon") + startDaemon(updatedConfig) - Logger.i("Start management service") - managementService.start() - } + Logger.i("Start management service") + managementService.start() } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { @@ -147,24 +146,17 @@ class MullvadVpnService : TalpidVpnService() { } } - private fun startDaemon() { - val apiEndpointConfiguration = - if (BuildConfig.DEBUG) { - intentProvider.getLatestIntent()?.getApiEndpointConfigurationExtras() - ?: apiEndpointConfiguration - } else { - apiEndpointConfiguration - } - - MullvadDaemon.initialize( - vpnService = this@MullvadVpnService, - rpcSocketPath = rpcSocketFile.absolutePath, - filesDirectory = filesDir.absolutePath, - cacheDirectory = cacheDir.absolutePath, - apiEndpoint = apiEndpointConfiguration.apiEndpoint(), - ) - Logger.i("MullvadVpnService: Daemon initialized") - } + private fun startDaemon(daemonConfig: DaemonConfig) = + with(daemonConfig) { + MullvadDaemon.initialize( + vpnService = this@MullvadVpnService, + rpcSocketPath = rpcSocket.absolutePath, + filesDirectory = filesDir.absolutePath, + cacheDirectory = cacheDir.absolutePath, + apiEndpointOverride = apiEndpointOverride, + ) + Logger.i("MullvadVpnService: Daemon initialized") + } private fun emptyBinder() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/ApiEndpointModule.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/ApiEndpointModule.kt deleted file mode 100644 index 4d86559bc6..0000000000 --- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/ApiEndpointModule.kt +++ /dev/null @@ -1,19 +0,0 @@ -package net.mullvad.mullvadvpn.service.di - -import net.mullvad.mullvadvpn.lib.endpoint.ApiEndpointConfiguration -import net.mullvad.mullvadvpn.lib.endpoint.CUSTOM_ENDPOINT_HTTPS_PORT -import net.mullvad.mullvadvpn.lib.endpoint.CustomApiEndpointConfiguration -import net.mullvad.mullvadvpn.lib.endpoint.DefaultApiEndpointConfiguration -import net.mullvad.mullvadvpn.service.BuildConfig -import org.koin.dsl.bind -import org.koin.dsl.module - -val apiEndpointModule = module { - single { - if (BuildConfig.FLAVOR_infrastructure != "prod") { - CustomApiEndpointConfiguration(BuildConfig.API_ENDPOINT, CUSTOM_ENDPOINT_HTTPS_PORT) - } else { - DefaultApiEndpointConfiguration() - } - } bind ApiEndpointConfiguration::class -} diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/VpnServiceModule.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/VpnServiceModule.kt index e229e0ed24..9d4636cf07 100644 --- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/VpnServiceModule.kt +++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/VpnServiceModule.kt @@ -2,7 +2,13 @@ package net.mullvad.mullvadvpn.service.di import androidx.core.app.NotificationManagerCompat import kotlinx.coroutines.MainScope +import net.mullvad.mullvadvpn.lib.common.constant.CACHE_DIR_NAMED_ARGUMENT +import net.mullvad.mullvadvpn.lib.common.constant.FILES_DIR_NAMED_ARGUMENT +import net.mullvad.mullvadvpn.lib.common.constant.GRPC_SOCKET_FILE_NAMED_ARGUMENT +import net.mullvad.mullvadvpn.lib.endpoint.ApiEndpointOverride import net.mullvad.mullvadvpn.lib.model.NotificationChannel +import net.mullvad.mullvadvpn.service.BuildConfig +import net.mullvad.mullvadvpn.service.DaemonConfig import net.mullvad.mullvadvpn.service.migration.MigrateSplitTunneling import net.mullvad.mullvadvpn.service.notifications.NotificationChannelFactory import net.mullvad.mullvadvpn.service.notifications.NotificationManager @@ -12,12 +18,15 @@ import net.mullvad.mullvadvpn.service.notifications.tunnelstate.TunnelStateNotif import org.koin.android.ext.koin.androidContext import org.koin.core.module.dsl.createdAtStart import org.koin.core.module.dsl.withOptions +import org.koin.core.qualifier.named import org.koin.dsl.bind import org.koin.dsl.module val vpnServiceModule = module { single { NotificationManagerCompat.from(androidContext()) } single { androidContext().resources } + single(named(FILES_DIR_NAMED_ARGUMENT)) { androidContext().filesDir } + single(named(CACHE_DIR_NAMED_ARGUMENT)) { androidContext().cacheDir } single { NotificationChannel.TunnelUpdates } bind NotificationChannel::class single { NotificationChannel.AccountUpdates } bind NotificationChannel::class @@ -46,4 +55,18 @@ val vpnServiceModule = module { } single { MigrateSplitTunneling(androidContext()) } + + single { + DaemonConfig( + rpcSocket = get(named(GRPC_SOCKET_FILE_NAMED_ARGUMENT)), + filesDir = get(named(FILES_DIR_NAMED_ARGUMENT)), + cacheDir = get(named(CACHE_DIR_NAMED_ARGUMENT)), + apiEndpointOverride = + if (BuildConfig.FLAVOR_infrastructure != "prod") { + ApiEndpointOverride(BuildConfig.API_ENDPOINT) + } else { + null + }, + ) + } } |
