From 9d55978063947d5865bb3fa4e0c2ebef78f78812 Mon Sep 17 00:00:00 2001 From: Guillaume Jacquart Date: Mon, 6 Nov 2023 08:14:27 +0000 Subject: epic18: Manage VPN services for Tor or Tracker control --- .../advancedprivacy/trackers/service/DNSBlocker.kt | 104 --------------------- .../trackers/service/TrackersService.kt | 58 ------------ .../service/TrackersServiceSupervisorImpl.kt | 53 ----------- 3 files changed, 215 deletions(-) delete mode 100644 trackersservicee/src/main/java/foundation/e/advancedprivacy/trackers/service/DNSBlocker.kt delete mode 100644 trackersservicee/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersService.kt delete mode 100644 trackersservicee/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersServiceSupervisorImpl.kt (limited to 'trackersservicee/src/main/java/foundation/e/advancedprivacy') diff --git a/trackersservicee/src/main/java/foundation/e/advancedprivacy/trackers/service/DNSBlocker.kt b/trackersservicee/src/main/java/foundation/e/advancedprivacy/trackers/service/DNSBlocker.kt deleted file mode 100644 index 6a2b218..0000000 --- a/trackersservicee/src/main/java/foundation/e/advancedprivacy/trackers/service/DNSBlocker.kt +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2023 MURENA SAS - * Copyright (C) 2022 E FOUNDATION - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package foundation.e.advancedprivacy.trackers.service - -import android.net.LocalServerSocket -import android.system.ErrnoException -import android.system.Os -import android.system.OsConstants -import foundation.e.advancedprivacy.core.utils.runSuspendCatching -import foundation.e.advancedprivacy.trackers.domain.usecases.FilterHostnameUseCase -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job -import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch -import timber.log.Timber -import java.io.BufferedReader -import java.io.InputStreamReader -import java.io.PrintWriter - -class DNSBlocker( - val filterHostnameUseCase: FilterHostnameUseCase -) { - private var resolverReceiver: LocalServerSocket? = null - - companion object { - private const val SOCKET_NAME = "foundation.e.advancedprivacy" - } - - private fun closeSocket() { - // Known bug and workaround that LocalServerSocket::close is not working well - // https://issuetracker.google.com/issues/36945762 - if (resolverReceiver != null) { - try { - Os.shutdown(resolverReceiver!!.fileDescriptor, OsConstants.SHUT_RDWR) - resolverReceiver!!.close() - resolverReceiver = null - } catch (e: ErrnoException) { - if (e.errno != OsConstants.EBADF) { - Timber.w("Socket already closed") - } else { - Timber.e(e, "Exception: cannot close DNS port on stop $SOCKET_NAME !") - } - } catch (e: Exception) { - Timber.e(e, "Exception: cannot close DNS port on stop $SOCKET_NAME !") - } - } - } - - fun listenJob(scope: CoroutineScope): Job = scope.launch(Dispatchers.IO) { - val resolverReceiver = runSuspendCatching { - LocalServerSocket(SOCKET_NAME) - }.getOrElse { - Timber.e(it, "Exception: cannot open DNS port on $SOCKET_NAME") - return@launch - } - - this@DNSBlocker.resolverReceiver = resolverReceiver - Timber.d("DNSFilterProxy running on port $SOCKET_NAME") - - while (isActive) { - runSuspendCatching { - val socket = resolverReceiver.accept() - val reader = BufferedReader(InputStreamReader(socket.inputStream)) - val line = reader.readLine() - val params = line.split(",").toTypedArray() - val output = socket.outputStream - val writer = PrintWriter(output, true) - val domainName = params[0] - val appUid = params[1].toInt() - if (filterHostnameUseCase.shouldBlock(domainName, appUid)) { - writer.println("block") - } else { - writer.println("pass") - } - socket.close() - }.onFailure { - if (it is CancellationException) { - closeSocket() - throw it - } else { - Timber.w(it, "Exception while listening DNS resolver") - } - } - } - } -} diff --git a/trackersservicee/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersService.kt b/trackersservicee/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersService.kt deleted file mode 100644 index 5f573b0..0000000 --- a/trackersservicee/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersService.kt +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2023 MURENA SAS - * Copyright (C) 2021 E FOUNDATION - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package foundation.e.advancedprivacy.trackers.service - -import android.app.Service -import android.content.Intent -import android.os.IBinder -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.cancel -import org.koin.java.KoinJavaComponent.get - -class TrackersService : Service() { - companion object { - const val ACTION_START = "foundation.e.privacymodules.trackers.intent.action.START" - - var coroutineScope = CoroutineScope(Dispatchers.IO) - } - - override fun onBind(intent: Intent): IBinder? { - throw UnsupportedOperationException("Not yet implemented") - } - - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - if (ACTION_START == intent?.action) { - stop() - start() - } - return START_REDELIVER_INTENT - } - - private fun start() { - coroutineScope = CoroutineScope(Dispatchers.IO) - get(DNSBlocker::class.java).apply { - filterHostnameUseCase.writeLogJob(coroutineScope) - listenJob(coroutineScope) - } - } - - private fun stop() { - kotlin.runCatching { coroutineScope.cancel() } - } -} diff --git a/trackersservicee/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersServiceSupervisorImpl.kt b/trackersservicee/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersServiceSupervisorImpl.kt deleted file mode 100644 index dcdf0d4..0000000 --- a/trackersservicee/src/main/java/foundation/e/advancedprivacy/trackers/service/TrackersServiceSupervisorImpl.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2023 MURENA SAS - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package foundation.e.advancedprivacy.trackers.service - -import android.content.Context -import android.content.Intent -import foundation.e.advancedprivacy.trackers.domain.externalinterfaces.TrackersServiceSupervisor -import foundation.e.advancedprivacy.trackers.service.TrackersService.Companion.ACTION_START -import kotlinx.coroutines.isActive -import org.koin.core.module.dsl.bind -import org.koin.core.module.dsl.factoryOf -import org.koin.core.module.dsl.singleOf -import org.koin.dsl.module - -class TrackersServiceSupervisorImpl(private val context: Context) : TrackersServiceSupervisor { - - override fun start(): Boolean { - val intent = Intent(context, TrackersService::class.java) - intent.action = ACTION_START - return context.startService(intent) != null - } - - override fun stop(): Boolean { - return context.stopService(Intent(context, TrackersService::class.java)) - } - - override fun isRunning(): Boolean { - return TrackersService.coroutineScope.isActive - } - - override val dnsFilterForIpScrambling = null -} - -val trackerServiceModule = module { - factoryOf(::DNSBlocker) - singleOf(::TrackersServiceSupervisorImpl) { - bind() - } -} -- cgit v1.2.1