diff --git a/ChangeLog.md b/ChangeLog.md index 8593b551..f91afb4c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1217,3 +1217,33 @@ * Fixed detection of whether a cellular network interface can provide an internet connection. * Fixed I2PD subscriptions option. * Updated German, Spanish, Greek, Chinese, Portuguese (Brazil), Persian and Bulgarian translations. + +**InviZible Pro stable 6.9.0** +* Updated Tor to version 4.8.13. +* Updated Purple I2P to version 2.54.0. +* Added a stop button to the notification. +* Added an option for quick access to Always-on VPN settings. +* Implemented the ability to use the firewall when other modules are stopped. +* Tor apps isolation is enabled by default. +* Fixed requesting Tor bridges via the app. +* Updated translations. + +**InviZible Pro beta 2.3.8** +* Updated default Tor bridges. +* Fixed LAN rules handling for firewall in root mode. +* Attempt to fix obfs4 protocol blocking in some countries. +* Updated Polish and French translations. + +**InviZible Pro beta 2.3.9** +* Updated Tor Snowflake bridge to version 2.10.1. +* Fixed downloading DNSCrypt rules when Block connections without VPN is enabled. +* The app switches to VPN mode from Root mode if root becomes unavailable. +* Fixes related to root detection and root commands execution. +* Other minor fixes. + +**InviZible Pro stable 6.9.1** +* Updated default Tor bridges. +* Updated Tor Obfs4 obfuscation bridge. +* Updated Tor Snowflake bridge to version 2.10.1. +* Fixed LAN rules handling for firewall. +* Updated translations. diff --git a/fastlane/metadata/android/en-US/changelogs/100238.txt b/fastlane/metadata/android/en-US/changelogs/100238.txt new file mode 100644 index 00000000..d437a09c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/100238.txt @@ -0,0 +1,5 @@ +**InviZible Pro beta 2.3.8** +* Updated default Tor bridges. +* Fixed LAN rules handling for firewall in root mode. +* Attempt to fix obfs4 protocol blocking in some countries. +* Updated Polish and French translations. diff --git a/fastlane/metadata/android/en-US/changelogs/100239.txt b/fastlane/metadata/android/en-US/changelogs/100239.txt new file mode 100644 index 00000000..00fcd13a --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/100239.txt @@ -0,0 +1,6 @@ +**InviZible Pro beta 2.3.9** +* Updated Tor Snowflake bridge to version 2.10.1. +* Fixed downloading DNSCrypt rules when Block connections without VPN is enabled. +* The app switches to VPN mode from Root mode if root becomes unavailable. +* Fixes related to root detection and root commands execution. +* Other minor fixes. diff --git a/tordnscrypt/build.gradle b/tordnscrypt/build.gradle index 7f49cb52..cdeb7a81 100644 --- a/tordnscrypt/build.gradle +++ b/tordnscrypt/build.gradle @@ -16,7 +16,7 @@ android { fdroid{ applicationId "pan.alexander.tordnscrypt.stable" - versionName "6.9.0" + versionName "6.9.1" dimension = 'version' resValue 'string', 'package_name', applicationId } @@ -56,7 +56,7 @@ android { defaultConfig { minSdkVersion 19 targetSdkVersion 34 - versionCode 237 + versionCode 239 resConfigs "en", "ru", "pl", "de", "fa", "fi", "in", "fr", "ja", "zh", "es", "pt", "pt-rBR", "el", "tr", "it", "uk", "bg", "ar" diff --git a/tordnscrypt/libs/arm64-v8a/libobfs4proxy.so b/tordnscrypt/libs/arm64-v8a/libobfs4proxy.so index fa8fb54d..37864920 100755 Binary files a/tordnscrypt/libs/arm64-v8a/libobfs4proxy.so and b/tordnscrypt/libs/arm64-v8a/libobfs4proxy.so differ diff --git a/tordnscrypt/libs/arm64-v8a/libsnowflake.so b/tordnscrypt/libs/arm64-v8a/libsnowflake.so index e5339900..fa3066d4 100755 Binary files a/tordnscrypt/libs/arm64-v8a/libsnowflake.so and b/tordnscrypt/libs/arm64-v8a/libsnowflake.so differ diff --git a/tordnscrypt/libs/armeabi-v7a/libobfs4proxy.so b/tordnscrypt/libs/armeabi-v7a/libobfs4proxy.so index e9cca1e0..2ea93450 100755 Binary files a/tordnscrypt/libs/armeabi-v7a/libobfs4proxy.so and b/tordnscrypt/libs/armeabi-v7a/libobfs4proxy.so differ diff --git a/tordnscrypt/libs/armeabi-v7a/libsnowflake.so b/tordnscrypt/libs/armeabi-v7a/libsnowflake.so index 65954c46..9066827e 100755 Binary files a/tordnscrypt/libs/armeabi-v7a/libsnowflake.so and b/tordnscrypt/libs/armeabi-v7a/libsnowflake.so differ diff --git a/tordnscrypt/owner.gradle b/tordnscrypt/owner.gradle index db8f28d3..f6cf3154 100644 --- a/tordnscrypt/owner.gradle +++ b/tordnscrypt/owner.gradle @@ -35,7 +35,7 @@ android { productFlavors { lite { applicationId "pan.alexander.tordnscrypt.stable" - versionName "6.9.0" + versionName "6.9.1" dimension = 'version' signingConfig signingConfigs.stablesign resValue 'string', 'package_name', applicationId @@ -43,7 +43,7 @@ android { pro { applicationId "pan.alexander.tordnscrypt.stable" - versionName "6.9.0" + versionName "6.9.1" dimension = 'version' signingConfig signingConfigs.stablesign resValue 'string', 'package_name', applicationId @@ -51,7 +51,7 @@ android { beta { applicationId "pan.alexander.tordnscrypt" - versionName "2.3.7" + versionName "2.3.9" dimension = 'version' signingConfig signingConfigs.betasign resValue 'string', 'package_name', applicationId @@ -60,7 +60,7 @@ android { google_play { minSdkVersion 22 applicationId "pan.alexander.tordnscrypt.gp" - versionName "6.9.0" + versionName "6.9.1" dimension = 'version' signingConfig signingConfigs.stablesign resValue 'string', 'package_name', applicationId @@ -92,7 +92,7 @@ android { defaultConfig { minSdkVersion 19 targetSdkVersion 34 - versionCode 237 + versionCode 239 resConfigs "en", "ru", "pl", "de", "fa", "fi", "in", "fr", "ja", "zh", "es", "pt", "pt-rBR", "el", "tr", "it", "uk", "bg", "ar" diff --git a/tordnscrypt/src/main/assets/tor.mp3 b/tordnscrypt/src/main/assets/tor.mp3 index ee19830e..0ae0153e 100644 Binary files a/tordnscrypt/src/main/assets/tor.mp3 and b/tordnscrypt/src/main/assets/tor.mp3 differ diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/TopFragment.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/TopFragment.java index 8afd6026..efcd0dec 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/TopFragment.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/TopFragment.java @@ -362,6 +362,11 @@ private void observeRootState() { setSUInfo(suResult, suVersion); setBBinfo(bbResult); + } else if (rootState instanceof RootState.RootNotAvailable) { + rootIsAvailable = false; + PreferenceRepository preferences = preferenceRepository.get(); + preferences.setBoolPreference(ROOT_IS_AVAILABLE, false); + preferences.setBoolPreference("bbOK", false); } performInitTasksBackgroundWork(); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/TopFragmentViewModel.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/TopFragmentViewModel.kt index 853ea946..842daa39 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/TopFragmentViewModel.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/TopFragmentViewModel.kt @@ -22,7 +22,6 @@ package pan.alexander.tordnscrypt import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.viewModelScope import eu.chainfire.libsuperuser.Shell import kotlinx.coroutines.CoroutineDispatcher diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/iptables/IptablesFirewall.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/iptables/IptablesFirewall.kt index 5d462e7a..537af1dd 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/iptables/IptablesFirewall.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/iptables/IptablesFirewall.kt @@ -166,6 +166,27 @@ class IptablesFirewall @Inject constructor( ).plus( "$iptables -A $FILTER_OUTPUT_FIREWALL -m mark --mark $FIREWALL_RETURN_MARK -j RETURN" ).plus( + listOf( + //These sources should not be managed as LAN + "$iptables -A $FILTER_FIREWALL_LAN -p udp --sport 53 -j RETURN", + "$iptables -A $FILTER_FIREWALL_LAN -p tcp --sport 53 -j RETURN" + ) + ).let { + if (modulesStatus.torState == ModuleState.RUNNING) { + //This destination should not be managed as LAN + it.plus("$iptables -A $FILTER_FIREWALL_LAN -p tcp --dport ${pathVars.torTransPort} -j RETURN") + } else { + it + } + }.let { + if (modulesStatus.itpdState == ModuleState.RUNNING) { + //These destinations should not be managed as LAN + it.plus("$iptables -A $FILTER_FIREWALL_LAN -p tcp --dport ${pathVars.itpdHttpProxyPort} -j RETURN") + .plus("$iptables -A $FILTER_FIREWALL_LAN -p udp --dport ${pathVars.itpdHttpProxyPort} -j RETURN") + } else { + it + } + }.plus( getAppLanRules(iptables, uidLanAllowed) ).plus( "$iptables -A $FILTER_FIREWALL_LAN -m mark --mark $FIREWALL_RETURN_MARK -j RETURN" diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesReceiver.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesReceiver.java index e6c5676e..f7f98329 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesReceiver.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesReceiver.java @@ -22,6 +22,7 @@ import static pan.alexander.tordnscrypt.di.SharedPreferencesModule.DEFAULT_PREFERENCES_NAME; import static pan.alexander.tordnscrypt.utils.Constants.IPv6_REGEX_NO_BOUNDS; import static pan.alexander.tordnscrypt.utils.enums.ModuleState.RUNNING; +import static pan.alexander.tordnscrypt.utils.enums.ModuleState.STARTING; import static pan.alexander.tordnscrypt.utils.enums.OperationMode.PROXY_MODE; import static pan.alexander.tordnscrypt.utils.enums.OperationMode.ROOT_MODE; import static pan.alexander.tordnscrypt.utils.enums.OperationMode.UNDEFINED; @@ -1089,7 +1090,11 @@ private void startVPNService() { } if (!defaultPreferences.get().getBoolean(VPN_SERVICE_ENABLED, false) - && (modulesStatus.getDnsCryptState() == RUNNING || modulesStatus.getTorState() == RUNNING)) { + && (modulesStatus.getDnsCryptState() == RUNNING + || modulesStatus.getTorState() == RUNNING + || modulesStatus.getFirewallState() == STARTING + || modulesStatus.getFirewallState() == RUNNING) + ) { defaultPreferences.get().edit().putBoolean(VPN_SERVICE_ENABLED, true).apply(); ServiceVPNHelper.start( "ModulesReceiver start VPN service after revoke", diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_rules/remote/DownloadRemoteRulesManager.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_rules/remote/DownloadRemoteRulesManager.kt index 5fbd55c2..48a7ef86 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_rules/remote/DownloadRemoteRulesManager.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_rules/remote/DownloadRemoteRulesManager.kt @@ -69,14 +69,12 @@ class DownloadRemoteRulesManager @Inject constructor( if (oldFile.isFile) { oldFile.delete() } - outputFile = File(path).apply { - createNewFile() - } do { attempts++ try { outputFile = tryDownload(ruleName, url, path) } catch (e: IOException) { + outputFile = null error = e.message ?: "" logw( "DownloadRulesManager failed to download file $url, attempt $attempts", diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_rules/remote/UpdateRemoteDnsRulesWorker.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_rules/remote/UpdateRemoteDnsRulesWorker.kt index 63e1df99..854b21a1 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_rules/remote/UpdateRemoteDnsRulesWorker.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_rules/remote/UpdateRemoteDnsRulesWorker.kt @@ -89,9 +89,9 @@ class UpdateRemoteDnsRulesWorker(private val appContext: Context, workerParams: if (it.length() > 0) { importRulesFromFile(it, ruleType, url, ruleName) } else { - return Result.retry() + return Result.failure() } - } ?: return Result.failure() + } ?: return Result.retry() return Result.success() } catch (e: Exception) { loge("UpdateRemoteDnsRulesWorker doWork", e) diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_rules/remote/UpdateRemoteRulesWorkManager.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_rules/remote/UpdateRemoteRulesWorkManager.kt index 2faf4892..0bd135ae 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_rules/remote/UpdateRemoteRulesWorkManager.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_rules/remote/UpdateRemoteRulesWorkManager.kt @@ -153,7 +153,6 @@ class UpdateRemoteRulesWorkManager @Inject constructor( private fun getConstraints() = Constraints.Builder() .setRequiresBatteryNotLow(true) .setRequiresStorageNotLow(true) - .setRequiredNetworkType(NetworkType.CONNECTED) .build() private fun getWorkName(type: DnsRuleType) = diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/root/RootExecService.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/root/RootExecService.java index 7951e4f1..17d89a7c 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/root/RootExecService.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/root/RootExecService.java @@ -20,9 +20,13 @@ package pan.alexander.tordnscrypt.utils.root; import static pan.alexander.tordnscrypt.utils.AppExtension.getApp; +import static pan.alexander.tordnscrypt.utils.enums.ModuleState.RUNNING; +import static pan.alexander.tordnscrypt.utils.enums.ModuleState.STARTING; import static pan.alexander.tordnscrypt.utils.logger.Logger.loge; import static pan.alexander.tordnscrypt.utils.logger.Logger.logi; +import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.OPERATION_MODE; import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.ROOT_IS_AVAILABLE; +import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.VPN_SERVICE_ENABLED; import static pan.alexander.tordnscrypt.utils.root.RootCommandsMark.NULL_MARK; import static pan.alexander.tordnscrypt.utils.root.RootServiceNotificationManager.DEFAULT_NOTIFICATION_ID; @@ -31,20 +35,29 @@ import android.app.Service; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; +import android.net.VpnService; import android.os.Build; import android.os.IBinder; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import java.util.List; import java.util.Objects; import javax.inject.Inject; +import javax.inject.Named; +import dagger.Lazy; import pan.alexander.tordnscrypt.App; import pan.alexander.tordnscrypt.R; +import pan.alexander.tordnscrypt.di.SharedPreferencesModule; import pan.alexander.tordnscrypt.domain.preferences.PreferenceRepository; +import pan.alexander.tordnscrypt.modules.ModulesStatus; +import pan.alexander.tordnscrypt.utils.enums.OperationMode; +import pan.alexander.tordnscrypt.vpn.service.ServiceVPNHelper; @SuppressLint("UnsafeOptInUsageWarning") public class RootExecService extends Service @@ -59,6 +72,11 @@ public RootExecService() { @Inject RootExecutor rootExecutor; + @Inject + @Named(SharedPreferencesModule.DEFAULT_PREFERENCES_NAME) + Lazy defaultPreferences; + @Inject + Lazy preferenceRepository; private NotificationManager systemNotificationManager; private RootServiceNotificationManager serviceNotificationManager; @@ -134,10 +152,12 @@ public int onStartCommand(Intent intent, int flags, int startId) { RootCommands rootCommands = (RootCommands) intent.getSerializableExtra("Commands"); int mark = intent.getIntExtra("Mark", 0); - rootExecutor.execute( - rootCommands.getCommands(), - mark - ); + if (rootCommands != null && rootCommands.getCommands() != null) { + rootExecutor.execute( + rootCommands.getCommands(), + mark + ); + } } return START_NOT_STICKY; @@ -149,6 +169,11 @@ private void sendResult(List commandsResult, int mark) { return; } + if (!commandsResult.isEmpty() + && commandsResult.get(0).equals(RootConsoleClosedException.message)) { + switchToVpnMode(); + } + RootCommands comResult = new RootCommands(commandsResult); Intent intent = new Intent(COMMAND_RESULT); intent.putExtra("CommandsResult", comResult); @@ -211,4 +236,42 @@ public void onTimeout(int startId) { moveServiceToBackground(); super.onTimeout(startId); } + + private void switchToVpnMode() { + + final Intent prepareIntent = VpnService.prepare(this); + final boolean vpnServiceEnabled = defaultPreferences.get().getBoolean(VPN_SERVICE_ENABLED, false); + if (prepareIntent != null || vpnServiceEnabled) { + return; + } + + ModulesStatus modulesStatus = ModulesStatus.getInstance(); + modulesStatus.setMode(OperationMode.VPN_MODE); + preferenceRepository.get() + .setStringPreference(OPERATION_MODE, OperationMode.VPN_MODE.toString()); + logi("VPN mode enabled"); + + + if (modulesStatus.getDnsCryptState() == RUNNING + || modulesStatus.getTorState() == RUNNING + || modulesStatus.getFirewallState() == STARTING + || modulesStatus.getFirewallState() == RUNNING) { + defaultPreferences.get().edit().putBoolean(VPN_SERVICE_ENABLED, true).apply(); + ServiceVPNHelper.start( + "Root exec service start VPN service after root console failed", + this + ); + } + } + + static class RootConsoleClosedException extends IllegalStateException { + + private static final String message = "Root is not available!"; + + @Nullable + @Override + public String getMessage() { + return message; + } + } } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/root/RootExecutor.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/root/RootExecutor.kt index e75f0891..3869e523 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/root/RootExecutor.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/root/RootExecutor.kt @@ -31,6 +31,7 @@ import pan.alexander.tordnscrypt.settings.PathVars import pan.alexander.tordnscrypt.utils.logger.Logger.loge import pan.alexander.tordnscrypt.utils.logger.Logger.logw import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.AUTO_START_DELAY +import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.ROOT_IS_AVAILABLE import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.SAVE_ROOT_LOGS import pan.alexander.tordnscrypt.utils.root.RootCommandsMark.BOOT_BROADCAST_MARK import pan.alexander.tordnscrypt.utils.root.RootCommandsMark.IPTABLES_MARK @@ -38,12 +39,11 @@ import java.io.File import java.io.FileOutputStream import java.io.IOException import java.lang.Exception -import java.lang.IllegalStateException import javax.inject.Inject import javax.inject.Named import kotlin.math.roundToInt -private const val ATTEMPTS_TO_OPEN_ROOT_CONSOLE = 3 +private const val ATTEMPTS_TO_OPEN_ROOT_CONSOLE = 5 private const val ATTEMPTS_TO_EXECUTE_COMMAND = 3 private const val NOTIFICATION_UPDATE_INTERVAL_MSEC = 200L private const val MAX_EXECUTION_TIME_SEC = 300 @@ -74,6 +74,9 @@ class RootExecutor @Inject constructor( } ) + @Volatile + private var console: Shell.Console? = null + private val commandsInProgress = MutableSharedFlow( 10, 0, @@ -96,15 +99,15 @@ class RootExecutor @Inject constructor( listOf(e.message ?: ""), it.mark ) + if (e is RootExecService.RootConsoleClosedException) { + preferenceRepository.get().setBoolPreference(ROOT_IS_AVAILABLE, false) + } } }.catch { loge("RootExecutor collect exception", it, true) }.launchIn(coroutineScope) } - @Volatile - private var console: Shell.Console? = null - fun execute( commands: List, @RootCommandsMark mark: Int @@ -211,12 +214,12 @@ class RootExecutor @Inject constructor( openCommandShell() } - val console = console ?: return null + val console = console + if (console?.isClosed != false) { + throw RootExecService.RootConsoleClosedException() + } return try { - if (console.isClosed) { - throw IllegalStateException("Root console is closed") - } val commandResult = console.run(command) @@ -240,12 +243,13 @@ class RootExecutor @Inject constructor( runCatching { if (attempts > 0) { - delay(attempts * 100L) + delay(attempts * 1000L) } + attempts++ + console = Shell.SU.getConsole() - attempts++ }.onFailure { loge("RootExecutor openCommandShell", it) } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/vpn/service/ServiceVPNHandler.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/vpn/service/ServiceVPNHandler.java index 8e508883..0bfaa706 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/vpn/service/ServiceVPNHandler.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/vpn/service/ServiceVPNHandler.java @@ -136,7 +136,7 @@ private void handleIntent(Intent intent) { return; } - final SharedPreferences prefs = serviceVPN.defaultPreferences.get(); + final SharedPreferences prefs = defaultSharedPreferences.get(); VPNCommand cmd = (VPNCommand) intent.getSerializableExtra(EXTRA_COMMAND); String reason = intent.getStringExtra(EXTRA_REASON); @@ -271,7 +271,7 @@ private void reload() { } else { last_builder = builder; - SharedPreferences prefs = serviceVPN.defaultPreferences.get(); + SharedPreferences prefs = defaultSharedPreferences.get(); boolean handover = prefs.getBoolean("VPN handover", true); logi("VPN Handler restart handover=" + handover); @@ -346,12 +346,20 @@ private void reload() { } private void stop() { + + //This prevents the ModulesService from sending a stop signal when the service is already stopping + defaultSharedPreferences.get().edit().putBoolean(VPN_SERVICE_ENABLED, false).apply(); + if (serviceVPN != null && serviceVPN.vpn != null) { - serviceVPN.stopNative(); - stopVPN(serviceVPN.vpn); - serviceVPN.vpn = null; - serviceVPN.vpnRulesHolder.get().unPrepare(); - listRule.clear(); + try { + serviceVPN.stopNative(); + stopVPN(serviceVPN.vpn); + serviceVPN.vpn = null; + serviceVPN.vpnRulesHolder.get().unPrepare(); + listRule.clear(); + } catch (Exception e) { + loge("ServiceVPNHandler stop()", e); + } } stopServiceVPN(); @@ -461,8 +469,7 @@ private void stopServiceVPN() { } } - SharedPreferences prefs = serviceVPN.defaultPreferences.get(); - prefs.edit().putBoolean(VPN_SERVICE_ENABLED, false).apply(); + defaultSharedPreferences.get().edit().putBoolean(VPN_SERVICE_ENABLED, false).apply(); serviceVPN.stopSelf(); diff --git a/tordnscrypt/src/main/res/values-fr/strings.xml b/tordnscrypt/src/main/res/values-fr/strings.xml index e9738fae..0dfed5f3 100644 --- a/tordnscrypt/src/main/res/values-fr/strings.xml +++ b/tordnscrypt/src/main/res/values-fr/strings.xml @@ -13,7 +13,7 @@ "Lancement au démarrage du système" "Vérifier si les Privilèges Administrateur sont disponible…" "Veuillez patienter…" - Ne plus afficher + Ne pas afficher "DNSCrypt est arrêté" "DNSCrypt est installé" "Installation de DNSCrypt" @@ -62,24 +62,24 @@ Lancer Tor automatiquement Lancer I2P automatiquement "Délai" - "Utiliser un délai (en secondes) uniquement si le démarrage automatique ne fonctionne pas correctement" + Utiliser un délai (en secondes) uniquement si le démarrage automatique ne fonctionne pas correctement "Serveurs DNSCrypt" "Sélectionner les serveurs DNSCrypt" "Paramètres de Tor" "Paramètres de Routage" "Acheminer tout le trafic via Tor" "Acheminer tout le trafic via InviZible" - Sélectionner les sites web - Liste des Sites Web à ouvrir avec Tor. Cette fonctionnalité est inutilisable pour les sites situés derrière un CDN + Sélectionner les sites + Liste des Sites à ouvrir avec Tor. Cette fonctionnalité est inutilisable pour les sites situés derrière un CDN Sélectionner les applications "Liste des applications à utiliser avec Tor" "Liste des applications à utiliser avec InviZible" Exclure des sites web - Liste des sites web à ouvrir directement. Cette option ne fonctionne pas pour les sites utilisant des CDN + Liste des sites à ouvrir directement. Cette option ne fonctionne pas pour les sites utilisant des CDN Exclure des applications "Liste d'applications à ouvrir directement" Intervalle de rafraîchissement - Durée en heures entre chaque actualisation des adresses IP des sites Web. Pour Android 5.1 et supérieur. Mettez 0 pour empêcher le rafraîchissement. + Durée en heures entre chaque actualisation des adresses IP des sites. Pour Android 5.1 et ultérieur. Mettez 0 pour empêcher le rafraîchissement. "Passerelles" "Utilisez-le si vous ne pouvez pas vous connecter au réseau Tor" "Ne pas utiliser de passerelles" @@ -119,83 +119,83 @@ "Mettre à jour les règles à chaque changement de connectivité" "Afficher la notification" "Empêcher la mise en veille de l'appareil" - Protection additionnel du mode sans Privilèges pour éviter que l\'application ne soit tuée par le système. Peut décharger la batterie + Ne pas laisser l\'appareil passer en mode veille. Peut être utile lors de l\'utilisation de HOTSPOT. Peut décharger la batterie "Messages d'aide" - Toujours afficher les messages d\'aide + Afficher tous les messages qui ont été marqués comme non autorisés à être affichés "Veuillez exclure InviZible Pro de l\'optimisation de la batterie d\'Android. Sinon, le système tuera les services DNSCrypt, Tor ou I2P à n\'importe quel moment. Sur les systèmes spécifiques, comme MIUI, cela nécessite quelques mesures supplémentaires" "Sélectionnez BusyBox" "POINT D'ACCÈS-Expérimental" - Commencer le partage de connexion au démarrage - Autoriser l\'utilisation du partage de connexion par Tor + Démarrer le partage au démarrage + Autoriser le partage Tor "Acheminer tout via Tor" "Acheminer tout le trafic entrant via Tor" - Sélectionner les Sites Web - Liste des sites web à ouvrir avec Tor via un POINT D\'ACCÈS - Exclure les Sites Web - Liste des sites web à ouvrir directement via un POINT D\'ACCÈS - Autoriser le partage de connexion I2P + Sélectionner les sites + Liste des sites à ouvrir avec Tor pour un POINT D\'ACCÈS + Exclure les sites + Liste des sites à ouvrir directement via un POINT D\'ACCÈS + Autoriser le partage via I2P "Fixer la DDV" "La DDV sera fixé à 64 en utilisant un VPN local. Le support du noyau n'est pas nécessaire. Il ne peut être utilisé qu'en \"mode administrateur\" avec l'option \"Exécuter les modules avec les Privilèges Administrateurs\" désactivée. Pour modifier la DDV, veuillez lancer DNSCrypt et/ou Tor." - Ouvrir la configuration du Partage de connexion + Ouvrir la configuration du partage de connexion "Veuillez redémarrer DNSCrypt" "Veuillez redémarrer Tor" "Veuillez redémarrer I2P" - "Sélectionner Iptables" + Sélectionner iptables "Enregistrer les commandes Administrateurs dans le Journal" "DNSCrypt, Tor, I2P sont protégés. Ne vous cachez pas." "Exécution des commandes Administrateurs…" "S'il vous plaît, patientez..." "Paramètres sauvegardés" - "PARAMÈTRES GLOBAUX" + Paramètres globaux " Pour les utilisateurs expérimentés uniquement!" "Sélectionner au moins un serveur!" "Port local à écouter." - "Exiger des serveurs (de sources statiques + distantes) pour satisfaire à des propriétés spécifiques." + Exiger des serveurs (de sources statiques + distantes) pour satisfaire à des propriétés spécifiques. "Utiliser des serveurs mettant en œuvre le protocole DNSCrypt." "Utiliser des serveurs mettant en œuvre le protocole DNS-sur-HTTPS." - "Exiger des serveurs définis par des sources distantes pour satisfaire à des propriétés spécifiques." + Exiger des serveurs définis par des sources distantes qu\'ils satisfassent à des propriétés spécifiques. "Le serveur doit prendre en charge les extensions de sécurité DNS (DNSSEC)." "Le serveur ne doit pas enregistrer les requêtes des utilisateurs (déclaratif)." "Le serveur ne doit pas appliquer sa propre liste noire (pour le contrôle parental, le blocage des publicités...)." - "Utilisez toujours le protocole TCP pour vous connecter aux serveurs en amont." + Utilisez toujours le protocole TCP pour vous connecter aux serveurs en amont " Cela peut être utile si vous avez besoin de tout faire passer par Tor. Sinon, laissez cela sur faux (false), car cela n'améliore pas la sécurité (dnscrypt-proxy chiffrera toujours tout, même en utilisant l'UDP), et ne peut qu'augmenter la latence." - "Mandataire SOCKS." - "Activer le mandataire" + Mandataire SOCKS + Mandataire sortant "Router toutes les connexions TCP vers un noeud Tor local. Tor ne supporte pas l'UDP, donc réglez force_tcp sur vrai (true) également." - "port_proxy" - "Autres Réglages." + Port mandataire + Autres Réglages "Résolveur de secours. Il s'agit d'un résolveur DNS normal, non chiffré, qui ne sera utilisé que pour des requêtes ponctuelles lors de la récupération de la liste initiale des résolveurs, et seulement si la configuration DNS du système ne fonctionne pas. Il ne sera jamais utilisé si les listes ont déjà été mises en cache." - "Ne laissez jamais dnscrypt-proxy essayer d'utiliser les paramètres DNS du système. Utilisez sans condition le résolveur de secours.." - "FILTRES" + Ne pas laissez DNSCrypt essayer d\'utiliser les paramètres DNS du système. Utilisez sans condition les résolveurs Bootstrap. + Filtres "Règles de Réacheminement" "Acheminez les requêtes de domaines spécifiques vers un ensemble de serveurs dédié." "Règles de Masquage" "Le masquage (cloaking) renvoie une adresse prédéfinie pour un nom spécifique. En plus d'agir comme un fichier HOSTS, il peut également renvoyer l'adresse IP d'un nom différent. Il fera également l'aplatissement CNAME.." - "Journalisation des requêtes." + Journalisation des requêtes "Enregistrer les requêtes des clients dans un fichier." - "Activer la journalisation des requêtes" + Journalisation des requêtes "Ne pas enregistrez ces types de requêtes afin de réduire la verbosité. Gardez les champs vides pour tout enregistrer." "Ouvrir le Journal des Requêtes" - "Journalisation des requêtes suspectes." + Journalisation des requêtes suspectes "Journaliser les requêtes pour les zones inexistantes. Ces requêtes peuvent révéler la présence de logiciels malveillants, d'applications endommagées/obsolètes et d'appareils signalant leur présence à des tiers." - "Activer la journalisation de donnée suspecte" + Journalisation suspecte "Ouvrir le journal de suspicion" - "Blocage basé sur un modèle (liste noire)." + Blocage basé sur un modèle (liste noire) "Liste Noire" "Les listes noires sont composées d'un modèle par ligne." - "Blocage d'IP basé sur un modèle (liste noire d'IP)." + Blocage d\'IP basé sur un modèle (liste noire d\'IP) "Liste Noire d'IP" "Les listes noires d'IP sont composées d'un modèle par ligne." - "Liste blanche basée sur des modèles (contournement des listes noires)." + Liste blanche basée sur des modèles (contournement des listes noires) "Liste Blanche" "Les listes blanches soutiennent les mêmes modèles que les listes noires. Si un nom correspond à une entrée de la liste blanche, la session correspondante contournera les noms et filtres IP." "Serveurs" "Sources" "Listes distante de serveurs disponibles." - "Liste des sources expirant après les heures défini par refresh_delay." + La liste des serveurs sera mise à jour après le délai spécifié en heures. "Relais" "Sources" - "Liste des relais expirant après les heures défini par refresh_delay." + La liste de relais sera mise à jour après le délai spécifié en heures. "Relais DNSCrypt" "La préférence n'existe pas dans dnscrypt-proxy.toml!" "Supprimer le journal" @@ -217,13 +217,13 @@ "Toutes les NUM secondes, envisagez de construire un nouveau circuit." "Réutilisation possible d'un circuit qui a été utilisé pour la première fois il y a tout au plus NUM secondes, mais n'attachez jamais un nouveau flux à un circuit trop ancien." "Si activé, Tor ne placera pas deux serveurs dont les adresses IP sont trop proches sur le même circuit. Actuellement, deux adresses sont trop proches si elles se trouvent dans la même plage /16." - "Activer le mandataire SOCKS" + Mandataire SOCKS "Ouvrez ce port pour écouter les connexions des applications parlant au SOCKS." - "Activer HTTPTunnel" + Tunnel HTTP "Ouvrez ce port pour écouter les connexions au mandataire en utilisant le protocole HTTP CONNECT au lieu de SOCKS." - "Activer le mandataire Transparent" + Mandataire Transparent "Ouvrez ce port pour écouter les connexions aux mandataire transparent." - "Activer le DNS" + Résolveur DNS "Ouvrez ce port pour écouter les requêtes DNS UDP et les résoudre de manière anonyme." "Si désactivée, Tor évitera de se connecter aux serveurs de répertoire ou à des nœuds d'entrée via l'IPv4." "Si activé, Tor pourra se connecter à des serveurs de répertoire ou à des nœuds d'entrée via l'IPv6." @@ -232,15 +232,15 @@ "Hôte ou IP pour le contournement" "Éditer l'hôte ou l'IP" "Désactivé" - "Nettoyer le dossier module" + Vider le cache "Apps à utiliser avec InviZible" "Apps contournant InviZible" "Tout Sélectionner" "Supprimer la Sélection" - Paramètres Communs - Autoriser les connexions entrantes - Port pour l\'écoute des connexions entrantes. - IP externe du routeur pour les connexions entrantes. + Paramètres communs + Connexions entrantes + Port pour l\'écoute des connexions entrantes (par défaut: auto (aléatoire)). + IP externe du routeur pour les connexions entrantes (par défaut : auto si SSU2 est activé). "Activez la communication via l'IPv4." "Activez la communication via l'IPv6." "Le routeur n'acceptera pas les tunnels de transit, ce qui désactivera complètement le trafic de transit." @@ -249,7 +249,7 @@ "Limite en % le maximum de la bande passante pour le transit. 0–100." "Activer le protocole de transport SSU (utiliser l'UDP)." "Activer le protocole de transport NTCP2 (utiliser TCP)." - Activer ntcpproxy + Mandataire sortant "Spécifiez le serveur mandataire pour NTCP. Doit être http://adresse:port ou socks://adresse:port." "Mandataire HTTP" "Mandataire HTTP" @@ -306,12 +306,12 @@ "Une mise à jour de DNSCrypt est disponible. Voulez-vous la télécharger et l'effectuer? La mise à jour se poursuivra en arrière-plan." "Une mise à jour de Tor est disponible. Voulez-vous la télécharger et l'effectuer? La mise à jour se poursuivra en arrière-plan." "Une mise à jour de Purple I2P est disponible. Voulez-vous la télécharger et l'effectuer? La mise à jour se poursuivra en arrière-plan." - Vérification des Mises à Jour + Vérification des mises à Jour Veuillez patienter pendant la vérification des mises à jour. "Le serveur de mise à jour est temporairement indisponible. Veuillez réessayer ultérieurement." "Le serveur de mise à jour est indisponible." "Erreur de mise à jour." - Aucune Mise à Jour n\'a été Trouvée. + Aucune mise à jour n\'a été trouvée. "Dernière vérification:" "Des mises à jour ont été trouvées." "Des mises à jour ont été installées." @@ -321,7 +321,7 @@ "On dirait une version non officielle d'InviZible. Veuillez faire attention avec!" "Uniquement pour la version PRO" "Contribuer" - "Le Projet InviZible Pro a besoin de votre aide. Veuillez visiter la page de don ou entrer le code d'inscription reçu." + Le projet InviZible Pro cherche de l\'aide. Veuillez visiter la page de don ou saisir le code premium que vous avez déjà reçu. "Visiter" "Entrez le code" "Entrez le Code" @@ -333,13 +333,13 @@ "Erreur du mode VPN!" "Veuillez configurer l'utilisation du serveur mandataire (proxy) dans les paramètres de l'appareil connecté. Valeurs par défaut: IP:10.1.10.1 Port:8118" "Masquer l'IP avec TOR" - "Protection du DNS avec DNSCRYPT" - "Accès aux sites I2P avec Purple I2P" + Se défendre avec DNSCRYPT + Accès aux réseaux I2P avec Purple I2P "Attention" "Ajouter un serveur personnalisé" "Configuration du serveur personnalisée non valide. Veuillez vérifier le champ SDNS." "Veuillez noter que vous avez un achat en attente:" - "Le Projet InviZible Pro a besoin de votre aide. Appuyez sur OK pour acheter les fonctionnalités premium." + Le Projet InviZible Pro cherche de l\'aide. Appuyez sur OK pour acheter les fonctionnalités premium. "Désolé, mais il est impossible de confirmer votre achat. Vous serez remboursé au bout de 3 jours." "Malheureusement, cette fonctionnalité n'est disponible que dans la version premium." @@ -402,14 +402,14 @@ "Utiliser un mandataire socks5" "InviZible Pro établira toutes les connexions via le mandataire SOCKS5" "Mode compatibilité" - Activer si votre appareil utilisant une ROM personnalisée perd sa connexion lorsque vous appuyez sur le bouton DÉMARRER + Activer si votre appareil utilisant une rom personnalisée perd sa connexion lorsque vous appuyez sur le bouton DÉMARRER "Activer le contrôle de script" "Utiliser la commande suivante pour gérer les modules d'application: \"am broadcast -a pan.alexander.tordnscrypt.SHELL_SCRIPT_CONTROL --ei dnscrypt 1 --ei tor 1 --ei i2p 1 %s\". Où 1 - démarre, 0 - arrête le module." "Adresse IP du périphérique LAN" "Activez Fixer la DDV et configurez le périphérique LAN pour qu'il se connecte à InviZible. Utilisez la passerelle par défaut: %1$s, serveur DNS: %2$s." "Support multi-utilisateurs" - Soutien des applications doubles, MIUI, Island, Shelter et utilisant le Profil Professionnel - "Activer le mandataire SOCKS de sortie" + Soutien des applications doubles, MIUI, Island, Shelter et utilisant le Profil Professionnel. Peut être inefficace en mode VPN + Mandataire SOCKS de sortie "Tor établira toutes les connexions OR via le mandataire SOCKS 5." "Services en cours d'exécution" "Notifications de mise à jour" @@ -513,13 +513,45 @@ "Activer le protocole de transport SSU2 (utilise l'UDP)." "Demandez plus tard" "Les notifications sont essentielles pour afficher des informations importantes sur le fonctionnement de l'application, son contrôle et les attaques détectées. Voulez-vous autoriser les notifications pour InviZible?" - "Activate this option if you are on an ipv6-only network and ipv4 sites become unavailable. Don't enable it otherwise, or you won't be able to connect to anything at all." + Activez cette option si vous êtes sur un réseau IPv6 uniquement et que les sites IPv4 ne sont plus disponibles. Ne l\'activez pas dans le cas contraire, sinon vous ne pourrez plus vous connecter à quoi que ce soit. "Set of used static IPv6 prefixes." "IPv6 bridges" - Relais anonymes + Anonymat des relais Exclure de Tor Exclure UDP de Tor Exclure entièrement Presser pour éditer. Presser longtemps pour éditer. + Les relais d\'anonymisation ne sont pas utilisés. + Paramètres d’isolation + Ne pas partager de circuits avec des flux provenant de différentes applications. + Le blocage de cette application système peut entraîner une connexion Internet instable ! + usurpé le SNI + Arrêter d\'optimiser l\'utilisation de la batterie ? + Désactiver l’économiseur de données réseau ? + Appui long pour ajouter. + Utilisez des serveurs exécutant le protocole Oblivious DNS-over-HTTPS. + Tor suivra les connexions récentes aux hôtes et tentera de réutiliser le même nœud de sortie pour chacun. Cette option peut aider à éviter un captcha sans fin. + Activez le VPN permanent et bloquez les connexions sans VPN pour InviZible Pro afin de bloquer Internet lorsque l\'application n\'est pas en cours d\'exécution + Les règles seront mises à jour après le délai spécifié en heures. + Impossible de démarrer InviZible Pro %1$s ! Veuillez essayer de réinitialiser les paramètres de %2$s. Si cela ne résout pas le problème, veuillez redémarrer votre appareil. + Pressez pour ajouter. + Passerelle vers Internet régulier + Proxy HTTP en amont sur l\'URL du proxy (comme http://false.i2p) + Adresse du mandataire externe (IP ou local). Les requêtes en dehors d\'I2P y seront envoyées. + Veuillez autoriser l\'utilisation des données en arrière-plan et autoriser l\'utilisation des données lorsque l\'économiseur de données est activé. Ceci est essentiel pour une expérience en ligne fluide. + Router vers Tor + Tor entre dans un état dormant s\'il ne détecte aucune activité client pendant une durée spécifiée. Doit être d\'au moins 10 minutes + Réinitialisation + Pour activer cette option, vous devez désactiver les ponts ou utiliser uniquement des ponts avec les ports 80 et 443. + Remplacer la liste distante + Remplacer la liste locale + Ajouter une liste distante + Ajouter une règle + règles + Total : %d règles + Ajouter une URL + Ajouter une liste locale + ↓ Tirer pour rafraîchir ↓ + Nœuds diff --git a/tordnscrypt/src/main/res/values-pl/strings.xml b/tordnscrypt/src/main/res/values-pl/strings.xml index cdb40756..cba484c3 100644 --- a/tordnscrypt/src/main/res/values-pl/strings.xml +++ b/tordnscrypt/src/main/res/values-pl/strings.xml @@ -543,4 +543,11 @@ Adres URL wyjściowego serwera proxy HTTP (jak np. http://false.i2p) Nie udostępniaj obwodów strumieniom z różnych aplikacji. Adres serwera wyjściowego proxy (IP lub lokalny). Żądania spoza I2P będą tam kierowane. + Włącz Always-on VPN i Blokuj połączenia bez VPN dla InviZible Pro, aby blokować Internet, gdy aplikacja nie jest uruchomiona + Zasady zostaną zaktualizowane po określonym opóźnieniu w godzinach. + Dodaj listę lokalną + Zastąp listę lokalną + Dodaj regułę + Razem: %d reguł + Dodaj adres URL diff --git a/tordnscrypt/src/main/res/values/array.xml b/tordnscrypt/src/main/res/values/array.xml index 608b599b..9f4635ef 100644 --- a/tordnscrypt/src/main/res/values/array.xml +++ b/tordnscrypt/src/main/res/values/array.xml @@ -505,11 +505,8 @@ - stun.l.google.com:19302 stun.nextcloud.com:443 stun.sipgate.net:10000 - stun.bluesip.net:3479 - stun.dus.net:3478 stun.epygi.com:3478 stun.sonetel.com:3479 stun.uls.co.za:3478