From 8ed9d1d5e98ed3ca25b2aad4397f4e9408016cfc Mon Sep 17 00:00:00 2001 From: Oleksandr Garmatin Date: Tue, 18 Feb 2020 22:34:22 +0200 Subject: [PATCH 1/9] Remove unnecessary attributes. --- tordnscrypt/src/google_play/AndroidManifest.xml | 3 --- tordnscrypt/src/main/AndroidManifest.xml | 3 --- 2 files changed, 6 deletions(-) diff --git a/tordnscrypt/src/google_play/AndroidManifest.xml b/tordnscrypt/src/google_play/AndroidManifest.xml index 638f708a5..64b38bf16 100644 --- a/tordnscrypt/src/google_play/AndroidManifest.xml +++ b/tordnscrypt/src/google_play/AndroidManifest.xml @@ -99,11 +99,8 @@ - - - diff --git a/tordnscrypt/src/main/AndroidManifest.xml b/tordnscrypt/src/main/AndroidManifest.xml index add02d2de..1c9328fa4 100644 --- a/tordnscrypt/src/main/AndroidManifest.xml +++ b/tordnscrypt/src/main/AndroidManifest.xml @@ -94,11 +94,8 @@ - - - From 4858399b2f6a6c27f854a97ce23575c1b2b42c00 Mon Sep 17 00:00:00 2001 From: Oleksandr Garmatin Date: Tue, 18 Feb 2020 22:53:55 +0200 Subject: [PATCH 2/9] Fix the look of the main page button on some devices. --- .../main/res/drawable/button_main_border.xml | 11 ++ .../src/main/res/layout/main_fragment.xml | 112 ++++++++++-------- 2 files changed, 74 insertions(+), 49 deletions(-) create mode 100644 tordnscrypt/src/main/res/drawable/button_main_border.xml diff --git a/tordnscrypt/src/main/res/drawable/button_main_border.xml b/tordnscrypt/src/main/res/drawable/button_main_border.xml new file mode 100644 index 000000000..e4fa6d503 --- /dev/null +++ b/tordnscrypt/src/main/res/drawable/button_main_border.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/tordnscrypt/src/main/res/layout/main_fragment.xml b/tordnscrypt/src/main/res/layout/main_fragment.xml index 900f03100..aff261142 100644 --- a/tordnscrypt/src/main/res/layout/main_fragment.xml +++ b/tordnscrypt/src/main/res/layout/main_fragment.xml @@ -1,9 +1,10 @@ - + app:cardUseCompatPadding="true"> @@ -58,36 +59,49 @@ android:id="@+id/cardView5" android:layout_width="match_parent" android:layout_height="0dp" + android:layout_weight="1" app:cardBackgroundColor="@color/cardsColor" app:cardCornerRadius="5dp" app:cardUseCompatPadding="true" - app:contentPadding="8dp" - app:layout_constraintBottom_toTopOf="@+id/cardView4" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/cardView3"> - - - - + app:contentPadding="8dp"> + + + + + + + @@ -98,16 +112,13 @@ android:layout_marginBottom="4dp" app:cardBackgroundColor="@color/cardsColor" app:cardCornerRadius="5dp" - app:cardUseCompatPadding="true" - app:contentPadding="8dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent"> + app:cardUseCompatPadding="true"> @@ -115,6 +126,7 @@ @@ -122,7 +134,6 @@ android:id="@+id/tvTorMainFragment" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_margin="4dp" android:layout_weight="1" android:gravity="center" android:text="@string/tvTorStop" /> @@ -131,12 +142,14 @@ android:id="@+id/pbTorMainFragment" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" - android:layout_height="wrap_content" /> + android:layout_height="wrap_content" + android:layout_weight="1" /> @@ -144,7 +157,6 @@ android:id="@+id/tvDNSMainFragment" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_margin="4dp" android:layout_weight="1" android:gravity="center" android:text="@string/tvDNSStop" /> @@ -153,13 +165,15 @@ android:id="@+id/pbDNSMainFragment" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" - android:layout_height="wrap_content" /> + android:layout_height="wrap_content" + android:layout_weight="1" /> @@ -167,7 +181,6 @@ android:id="@+id/tvITPDMainFragment" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_margin="4dp" android:layout_weight="1" android:gravity="center" android:text="@string/tvITPDStop" /> @@ -176,11 +189,12 @@ android:id="@+id/pbITPDMainFragment" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" - android:layout_height="wrap_content" /> + android:layout_height="wrap_content" + android:layout_weight="1" /> - \ No newline at end of file + \ No newline at end of file From 974703b2b8fac6e62f0c1ea65b0085cbee4875c6 Mon Sep 17 00:00:00 2001 From: Oleksandr Garmatin Date: Tue, 18 Feb 2020 22:55:17 +0200 Subject: [PATCH 3/9] Add a log entry for the boot comlete. --- .../java/pan/alexander/tordnscrypt/BootCompleteReceiver.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/BootCompleteReceiver.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/BootCompleteReceiver.java index ff798dc04..09e7b3ac9 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/BootCompleteReceiver.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/BootCompleteReceiver.java @@ -58,6 +58,8 @@ public class BootCompleteReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, Intent intent) { + Log.i(LOG_TAG, "Receive Boot Completed"); + final String BOOT_COMPLETE = "android.intent.action.BOOT_COMPLETED"; this.context = context.getApplicationContext(); From edd9cba094ca2b358ab6b24d9c63921b0c4b0121 Mon Sep 17 00:00:00 2001 From: Oleksandr Garmatin Date: Tue, 18 Feb 2020 23:03:22 +0200 Subject: [PATCH 4/9] Replace the clean log file methods with one centralized. --- .../dnscrypt_fragment/DNSCryptFragmentPresenter.java | 2 +- .../tordnscrypt/itpd_fragment/ITPDFragmentPresenter.java | 2 +- .../tordnscrypt/tor_fragment/TorFragmentPresenter.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dnscrypt_fragment/DNSCryptFragmentPresenter.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dnscrypt_fragment/DNSCryptFragmentPresenter.java index 9aaddd2a0..faa0a17ca 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dnscrypt_fragment/DNSCryptFragmentPresenter.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dnscrypt_fragment/DNSCryptFragmentPresenter.java @@ -618,7 +618,7 @@ public void startButtonOnClick(Context context) { view.setDNSCryptStartButtonEnabled(false); - cleanLogFileNoRootMethod(context); + //cleanLogFileNoRootMethod(context); if (new PrefManager(context).getBoolPref("Tor Running") diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/itpd_fragment/ITPDFragmentPresenter.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/itpd_fragment/ITPDFragmentPresenter.java index e8ced64f5..38713eb07 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/itpd_fragment/ITPDFragmentPresenter.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/itpd_fragment/ITPDFragmentPresenter.java @@ -453,7 +453,7 @@ public void startButtonOnClick(Context context) { view.setITPDStartButtonEnabled(false); - cleanLogFileNoRootMethod(); + //cleanLogFileNoRootMethod(); if (!new PrefManager(Objects.requireNonNull(context)).getBoolPref("I2PD Running") && new PrefManager(Objects.requireNonNull(context)).getBoolPref("Tor Running") diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorFragmentPresenter.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorFragmentPresenter.java index 0e271b4e6..658d7d0d4 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorFragmentPresenter.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorFragmentPresenter.java @@ -549,7 +549,7 @@ public void startButtonOnClick(Context context) { view.setTorStartButtonEnabled(false); - cleanLogFileNoRootMethod(context); + //cleanLogFileNoRootMethod(context); Thread thread = new Thread(() -> { From 1ddee250267ff500e1bd410a3061d26259e82781 Mon Sep 17 00:00:00 2001 From: Oleksandr Garmatin Date: Tue, 18 Feb 2020 23:04:52 +0200 Subject: [PATCH 5/9] Stop the modules when app service is stopped. --- .../alexander/tordnscrypt/utils/AppExitDetectService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/AppExitDetectService.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/AppExitDetectService.java index 60d82e135..3f59df802 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/AppExitDetectService.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/AppExitDetectService.java @@ -24,6 +24,8 @@ import android.os.IBinder; import android.util.Log; +import pan.alexander.tordnscrypt.modules.ModulesAux; +import pan.alexander.tordnscrypt.modules.ModulesStatus; import pan.alexander.tordnscrypt.utils.file_operations.FileOperations; import static pan.alexander.tordnscrypt.utils.RootExecService.LOG_TAG; @@ -50,6 +52,10 @@ public void onDestroy() { FileOperations.removeAllOnFileOperationsListeners(); + if (!ModulesStatus.getInstance().isUseModulesWithRoot()) { + ModulesAux.stopModulesIfRunning(this); + } + Log.i(LOG_TAG, "App Exit"); } } From a1e1970bed8846b1cceec9315567f606ff736d7b Mon Sep 17 00:00:00 2001 From: Oleksandr Garmatin Date: Tue, 18 Feb 2020 23:10:38 +0200 Subject: [PATCH 6/9] Stop modules when device is shutting down or rebooting. --- .../modules/ModulesBroadcastReceiver.java | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesBroadcastReceiver.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesBroadcastReceiver.java index eb7cdac43..15570956b 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesBroadcastReceiver.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesBroadcastReceiver.java @@ -62,6 +62,8 @@ public class ModulesBroadcastReceiver extends BroadcastReceiver { private int currentNetworkHash = 0; private static final String apStateFilterAction = "android.net.wifi.WIFI_AP_STATE_CHANGED"; private static final String tetherStateFilterAction = "android.net.conn.TETHER_STATE_CHANGED"; + private static final String shutdownFilterAction = "android.intent.action.ACTION_SHUTDOWN"; + private static final String powerOFFFilterAction = "android.intent.action.QUICKBOOT_POWEROFF"; public ModulesBroadcastReceiver(Context context) { this.context = context; @@ -69,23 +71,27 @@ public ModulesBroadcastReceiver(Context context) { @Override public void onReceive(Context context, Intent intent) { - if (intent.getAction() == null) { + String action = intent.getAction(); + + if (action == null) { return; } - if (intent.getAction().equals(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED) + if (action.equalsIgnoreCase(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Log.i(LOG_TAG, "ModulesBroadcastReceiver Received " + intent); idleStateChanged(context); - } else if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { + } else if (action.equalsIgnoreCase(ConnectivityManager.CONNECTIVITY_ACTION)) { connectivityStateChanged(intent); - } else if (intent.getAction().equals(apStateFilterAction)) { + } else if (action.equalsIgnoreCase(apStateFilterAction)) { apStateChanged(); - } else if (intent.getAction().equals(tetherStateFilterAction)) { + } else if (action.equalsIgnoreCase(tetherStateFilterAction)) { tetherStateChanged(); + } else if (action.equalsIgnoreCase(powerOFFFilterAction) || action.equalsIgnoreCase(shutdownFilterAction)) { + powerOFFDetected(); } } @@ -94,6 +100,7 @@ void registerReceivers() { registerConnectivityChanges(); registerAPisOn(); registerUSBModemIsOn(); + registerPowerOFF(); } void unregisterReceivers() { @@ -148,6 +155,14 @@ private void registerUSBModemIsOn() { receiverRegistered = true; } + private void registerPowerOFF() { + IntentFilter powerOFF = new IntentFilter(); + powerOFF.addAction(shutdownFilterAction); + powerOFF.addAction(powerOFFFilterAction); + context.registerReceiver(this, powerOFF); + receiverRegistered = true; + } + @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void listenNetworkChanges() { // Listen for network changes @@ -281,6 +296,14 @@ private void tetherStateChanged() { Log.i(LOG_TAG, "ModulesBroadcastReceiver USB modem state is " + (Tethering.usbTetherOn ? "ON" : "OFF")); } + private void powerOFFDetected() { + new PrefManager(context).setBoolPref("DNSCrypt Running", false); + new PrefManager(context).setBoolPref("Tor Running", false); + new PrefManager(context).setBoolPref("I2PD Running", false); + + ModulesAux.stopModulesIfRunning(context); + } + @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void unlistenNetworkChanges() { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); From 5d368e49ac3b1cc762d0bb1460eeea5a50ace1c1 Mon Sep 17 00:00:00 2001 From: Oleksandr Garmatin Date: Tue, 18 Feb 2020 23:18:54 +0200 Subject: [PATCH 7/9] Improve start/stop modules method --- .../tordnscrypt/modules/ModulesService.java | 348 +++++++++++++----- 1 file changed, 249 insertions(+), 99 deletions(-) diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesService.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesService.java index 201f9e92b..e9ea0eb48 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesService.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesService.java @@ -33,6 +33,11 @@ import androidx.preference.PreferenceManager; +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.net.DatagramSocket; +import java.net.ServerSocket; import java.util.Objects; import java.util.Timer; import java.util.concurrent.TimeUnit; @@ -43,6 +48,8 @@ import pan.alexander.tordnscrypt.utils.enums.OperationMode; import pan.alexander.tordnscrypt.vpn.service.ServiceVPNHelper; +import static pan.alexander.tordnscrypt.TopFragment.DNSCryptVersion; +import static pan.alexander.tordnscrypt.TopFragment.TorVersion; import static pan.alexander.tordnscrypt.utils.RootExecService.LOG_TAG; import static pan.alexander.tordnscrypt.utils.enums.ModuleState.RESTARTING; import static pan.alexander.tordnscrypt.utils.enums.ModuleState.RUNNING; @@ -177,33 +184,33 @@ private void startDNSCrypt() { if (!modulesStatus.isUseModulesWithRoot()) { Thread previousDnsCryptThread = modulesKiller.getDnsCryptThread(); - try { - if (previousDnsCryptThread != null && previousDnsCryptThread.isAlive()) { - Log.w(LOG_TAG, "ModulesService previous DNSCrypt thread is alive! Try stop!"); - previousDnsCryptThread.interrupt(); - ModulesKiller.stopDNSCrypt(this); - Toast.makeText(this, getText(R.string.please_wait), Toast.LENGTH_LONG).show(); - return; - } - } catch (Exception e) { - Log.e(LOG_TAG, "ModulesService previous DNSCrypt thread interrupt exception " - + e.getMessage() + e.getCause() + "\nStop service"); - System.exit(0); + if (previousDnsCryptThread != null && previousDnsCryptThread.isAlive()) { + changeDNSCryptStatus(previousDnsCryptThread); + return; } - } new Thread(() -> { try { + Thread previousDnsCryptThread = checkPreviouslyRunningDNSCryptModule(); - if (!stopPreviouslyRunningDNSCryptModule()) { + if (previousDnsCryptThread != null && previousDnsCryptThread.isAlive()) { + changeDNSCryptStatus(previousDnsCryptThread); return; } + if (stopDNSCryptIfPortIsBusy()) { + changeDNSCryptStatus(modulesKiller.getDnsCryptThread()); + return; + } + + cleanLogFileNoRootMethod(pathVars.getAppDataDir() + "/logs/DnsCrypt.log", + ModulesService.this.getResources().getString(R.string.tvDNSDefaultLog) + " " + DNSCryptVersion); ModulesStarterHelper modulesStarterHelper = new ModulesStarterHelper(ModulesService.this, mHandler, pathVars); Thread dnsCryptThread = new Thread(modulesStarterHelper.getDNSCryptStarterRunnable()); + dnsCryptThread.setName("DNSCryptThread"); dnsCryptThread.setDaemon(false); try { dnsCryptThread.setPriority(Thread.NORM_PRIORITY); @@ -222,30 +229,20 @@ private void startDNSCrypt() { }).start(); } - private boolean stopPreviouslyRunningDNSCryptModule() { - boolean result = false; - - try { - if (isDnsCryptSavedStateRunning() && modulesStatus.getDnsCryptState() != RESTARTING) { - - Thread killerThread = new Thread(modulesKiller.getDNSCryptKillerRunnable()); - killerThread.start(); + private Thread checkPreviouslyRunningDNSCryptModule() { - while (killerThread.isAlive()) { - killerThread.join(); - } + if (modulesStatus.isUseModulesWithRoot()) { + return null; + } - makeDelay(5); + Thread result = null; - if (modulesStatus.getDnsCryptState() != RUNNING) { - result = true; - } - - } else { - result = true; + try { + if (modulesStatus.getDnsCryptState() != RESTARTING) { + result = findThreadByName("DNSCryptThread"); } } catch (Exception e) { - Log.e(LOG_TAG, "DnsCrypt was unable to stop previously running module " + e.getMessage()); + Log.e(LOG_TAG, "checkPreviouslyRunningDNSCryptModule exception " + e.getMessage()); } return result; @@ -274,6 +271,31 @@ private void changeDNSCryptStatus(final Thread dnsCryptThread) { } } + private boolean stopDNSCryptIfPortIsBusy() { + if (!isAvailable(pathVars.getDNSCryptPort())) { + try { + modulesStatus.setDnsCryptState(RESTARTING); + + Thread killerThread = new Thread(modulesKiller.getDNSCryptKillerRunnable()); + killerThread.start(); + + while (killerThread.isAlive()) { + killerThread.join(); + } + + makeDelay(5); + + if (modulesStatus.getDnsCryptState() == RUNNING) { + return true; + } + + } catch (InterruptedException e) { + Log.e(LOG_TAG, "ModulesService restartDNSCrypt join interrupted!"); + } + } + return false; + } + private void startTor() { if (modulesStatus.getTorState() == STOPPED) { @@ -283,30 +305,32 @@ private void startTor() { if (!modulesStatus.isUseModulesWithRoot()) { Thread previousTorThread = modulesKiller.getTorThread(); - try { - if (previousTorThread != null && previousTorThread.isAlive()) { - Log.w(LOG_TAG, "ModulesService previous Tor thread is alive! Try stop!"); - previousTorThread.interrupt(); - ModulesKiller.stopTor(this); - Toast.makeText(this, getText(R.string.please_wait), Toast.LENGTH_LONG).show(); - return; - } - } catch (Exception e) { - Log.e(LOG_TAG, "ModulesService previous Tor thread interrupt exception " - + e.getMessage() + e.getCause() + "\nStop service"); - System.exit(0); + if (previousTorThread != null && previousTorThread.isAlive()) { + changeTorStatus(previousTorThread); + return; } - } new Thread(() -> { try { - if (!stopPreviouslyRunningTorModule()) { + Thread previousTorThread = checkPreviouslyRunningTorModule(); + + if (previousTorThread != null && previousTorThread.isAlive()) { + changeTorStatus(previousTorThread); + return; + } + + if (stopTorIfPortsIsBusy()) { + changeTorStatus(modulesKiller.getTorThread()); return; } + cleanLogFileNoRootMethod(pathVars.getAppDataDir() + "/logs/Tor.log", + ModulesService.this.getResources().getString(R.string.tvTorDefaultLog) + " " + TorVersion); + ModulesStarterHelper modulesStarterHelper = new ModulesStarterHelper(ModulesService.this, mHandler, pathVars); Thread torThread = new Thread(modulesStarterHelper.getTorStarterRunnable()); + torThread.setName("TorThread"); torThread.setDaemon(false); try { torThread.setPriority(Thread.NORM_PRIORITY); @@ -325,30 +349,20 @@ private void startTor() { } - private boolean stopPreviouslyRunningTorModule() { - boolean result = false; - - try { - if (isTorSavedStateRunning() && modulesStatus.getTorState() != RESTARTING) { - - Thread killerThread = new Thread(modulesKiller.getTorKillerRunnable()); - killerThread.start(); - - while (killerThread.isAlive()) { - killerThread.join(); - } + private Thread checkPreviouslyRunningTorModule() { - makeDelay(5); + if (modulesStatus.isUseModulesWithRoot()) { + return null; + } - if (modulesStatus.getTorState() != RUNNING) { - result = true; - } + Thread result = null; - } else { - result = true; + try { + if (modulesStatus.getTorState() != RESTARTING) { + result = findThreadByName("TorThread"); } } catch (Exception e) { - Log.e(LOG_TAG, "Tor was unable to stop previously running module " + e.getMessage()); + Log.e(LOG_TAG, "checkPreviouslyRunningTorModule exception " + e.getMessage()); } return result; @@ -377,6 +391,36 @@ private void changeTorStatus(final Thread torThread) { } } + private boolean stopTorIfPortsIsBusy() { + boolean stopRequired = !isAvailable(pathVars.getTorDNSPort()) + || !isAvailable(pathVars.getTorSOCKSPort()) + || !isAvailable(pathVars.getTorTransPort() ) + || !isAvailable(pathVars.getTorHTTPTunnelPort()); + + if (stopRequired) { + try { + modulesStatus.setTorState(RESTARTING); + + Thread killerThread = new Thread(modulesKiller.getTorKillerRunnable()); + killerThread.start(); + + while (killerThread.isAlive()) { + killerThread.join(); + } + + makeDelay(5); + + if (modulesStatus.getTorState() == RUNNING) { + return true; + } + + } catch (InterruptedException e) { + Log.e(LOG_TAG, "ModulesService restartTor join interrupted!"); + } + } + return false; + } + private void startITPD() { if (modulesStatus.getItpdState() == STOPPED) { @@ -386,30 +430,31 @@ private void startITPD() { if (!modulesStatus.isUseModulesWithRoot()) { Thread previousITPDThread = modulesKiller.getItpdThread(); - try { - if (previousITPDThread != null && previousITPDThread.isAlive()) { - Log.w(LOG_TAG, "ModulesService previous ITPD thread is alive! Try stop!"); - previousITPDThread.interrupt(); - ModulesKiller.stopITPD(this); - Toast.makeText(this, getText(R.string.please_wait), Toast.LENGTH_LONG).show(); - return; - } - } catch (Exception e) { - Log.e(LOG_TAG, "ModulesService previous ITPD thread interrupt exception " - + e.getMessage() + e.getCause() + "\nStop service"); - System.exit(0); + if (previousITPDThread != null && previousITPDThread.isAlive()) { + changeITPDStatus(previousITPDThread); + return; } - } new Thread(() -> { try { - if (!stopPreviouslyRunningITPDModule()) { + Thread previousITPDThread = checkPreviouslyRunningITPDModule(); + + if (previousITPDThread != null && previousITPDThread.isAlive()) { + changeITPDStatus(previousITPDThread); return; } + if (stopITPDIfPortsIsBusy()) { + changeITPDStatus(modulesKiller.getItpdThread()); + return; + } + + cleanLogFileNoRootMethod(pathVars.getAppDataDir() + "/logs/i2pd.log", ""); + ModulesStarterHelper modulesStarterHelper = new ModulesStarterHelper(ModulesService.this, mHandler, pathVars); Thread itpdThread = new Thread(modulesStarterHelper.getITPDStarterRunnable()); + itpdThread.setName("ITPDThread"); itpdThread.setDaemon(false); try { itpdThread.setPriority(Thread.NORM_PRIORITY); @@ -427,30 +472,20 @@ private void startITPD() { }).start(); } - private boolean stopPreviouslyRunningITPDModule() { - boolean result = false; - - try { - if (isITPDSavedStateRunning() && modulesStatus.getItpdState() != RESTARTING) { + private Thread checkPreviouslyRunningITPDModule() { - Thread killerThread = new Thread(modulesKiller.getITPDKillerRunnable()); - killerThread.start(); - - while (killerThread.isAlive()) { - killerThread.join(); - } - - makeDelay(5); + if (modulesStatus.isUseModulesWithRoot()) { + return null; + } - if (modulesStatus.getItpdState() != RUNNING) { - result = true; - } + Thread result = null; - } else { - result = true; + try { + if (modulesStatus.getItpdState() != RESTARTING) { + result = findThreadByName("ITPDThread"); } } catch (Exception e) { - Log.e(LOG_TAG, "I2PD was unable to stop previously running module " + e.getMessage()); + Log.e(LOG_TAG, "checkPreviouslyRunningITPDModule exception " + e.getMessage()); } return result; @@ -479,6 +514,37 @@ private void changeITPDStatus(final Thread itpdThread) { } } + private boolean stopITPDIfPortsIsBusy() { + boolean stopRequired = !isAvailable(pathVars.getITPDSOCKSPort()) + || !isAvailable(pathVars.getITPDHttpProxyPort()) + || !isAvailable(pathVars.getITPDTeleSocksProxyPort1()) + || !isAvailable(pathVars.getITPDTeleSocksProxyPort2()) + || !isAvailable(pathVars.getITPDTeleSocksProxyPort3()); + + if (stopRequired) { + try { + modulesStatus.setItpdState(RESTARTING); + + Thread killerThread = new Thread(modulesKiller.getITPDKillerRunnable()); + killerThread.start(); + + while (killerThread.isAlive()) { + killerThread.join(); + } + + makeDelay(5); + + if (modulesStatus.getItpdState() == RUNNING) { + return true; + } + + } catch (InterruptedException e) { + Log.e(LOG_TAG, "ModulesService restartITPD join interrupted!"); + } + } + return false; + } + private void stopDNSCrypt() { new Thread(modulesKiller.getDNSCryptKillerRunnable()).start(); } @@ -708,4 +774,88 @@ private void makeDelay(int sec) { } } + public Thread findThreadByName(String threadName) { + Thread currentThread = Thread.currentThread(); + ThreadGroup threadGroup = getRootThreadGroup(currentThread); + int allActiveThreads = threadGroup.activeCount(); + Thread[] allThreads = new Thread[allActiveThreads]; + threadGroup.enumerate(allThreads); + + for (Thread thread : allThreads) { + String name = thread.getName(); + //Log.i(LOG_TAG, "Current threads " + name); + if (name.equals(threadName)) { + Log.i(LOG_TAG, "Found old module thread " + name); + return thread; + } + } + + return null; + } + + private ThreadGroup getRootThreadGroup(Thread thread) { + ThreadGroup rootGroup = thread.getThreadGroup(); + while (rootGroup != null) { + ThreadGroup parentGroup = rootGroup.getParent(); + if (parentGroup == null) { + break; + } + rootGroup = parentGroup; + } + return rootGroup; + } + + @Override + protected void finalize() throws Throwable { + + if (!modulesStatus.isUseModulesWithRoot()) { + ModulesAux.stopModulesIfRunning(this); + } + + super.finalize(); + } + + private boolean isAvailable(String portStr) { + + int port = Integer.parseInt(portStr); + + ServerSocket ss = null; + DatagramSocket ds = null; + try { + ss = new ServerSocket(port); + ss.setReuseAddress(true); + ds = new DatagramSocket(port); + ds.setReuseAddress(true); + return true; + } catch (IOException ignored) { + } finally { + if (ds != null) { + ds.close(); + } + + if (ss != null) { + try { + ss.close(); + } catch (IOException ignored) { + } + } + } + + return false; + } + + private void cleanLogFileNoRootMethod(String logFilePath, String text) { + try { + File f = new File(pathVars.getAppDataDir() + "/logs"); + + if (f.mkdirs() && f.setReadable(true) && f.setWritable(true)) + Log.i(LOG_TAG, "log dir created"); + + PrintWriter writer = new PrintWriter(logFilePath, "UTF-8"); + writer.println(text); + writer.close(); + } catch (IOException e) { + Log.e(LOG_TAG, "Unable to create dnsCrypt log file " + e.getMessage()); + } + } } From 45c1e375fcfe6494987095e9a315d8f5ed222b0c Mon Sep 17 00:00:00 2001 From: Oleksandr Garmatin Date: Tue, 18 Feb 2020 23:24:37 +0200 Subject: [PATCH 8/9] Update changelog --- ChangeLog.md | 3 +++ fastlane/metadata/android/en-US/changelogs/100064.txt | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/100064.txt diff --git a/ChangeLog.md b/ChangeLog.md index 5f278e31c..1fb921b4e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -124,3 +124,6 @@ **InviZible Pro beta 0.6.3** * Implemented Fix TTL option based on the local VPN (root is still required). * Fixes. + +**InviZible Pro beta 0.6.4** +* Bug fixes and stability improvements. diff --git a/fastlane/metadata/android/en-US/changelogs/100064.txt b/fastlane/metadata/android/en-US/changelogs/100064.txt new file mode 100644 index 000000000..f1cb5d951 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/100064.txt @@ -0,0 +1,2 @@ +**InviZible Pro beta 0.6.4** +* Bug fixes and stability improvements. \ No newline at end of file From 4350037e89ffb5d2579bc19166dc0ea06d17b65d Mon Sep 17 00:00:00 2001 From: Oleksandr Garmatin Date: Tue, 18 Feb 2020 23:25:21 +0200 Subject: [PATCH 9/9] Update beta version --- tordnscrypt/build.gradle | 4 ++-- tordnscrypt/owner.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tordnscrypt/build.gradle b/tordnscrypt/build.gradle index 60bf68bc2..59b240d0d 100644 --- a/tordnscrypt/build.gradle +++ b/tordnscrypt/build.gradle @@ -10,7 +10,7 @@ android { fdroid{ applicationId "pan.alexander.tordnscrypt" - versionName "0.6.3-beta" + versionName "0.6.4-beta" dimension = 'version' resValue 'string', 'package_name', applicationId } @@ -40,7 +40,7 @@ android { defaultConfig { minSdkVersion 19 targetSdkVersion 29 - versionCode 63 + versionCode 64 resConfigs "en", "ru-rRU" , "ru-rUA", "pl" diff --git a/tordnscrypt/owner.gradle b/tordnscrypt/owner.gradle index e4346fd3d..ac3a8f7cf 100644 --- a/tordnscrypt/owner.gradle +++ b/tordnscrypt/owner.gradle @@ -45,7 +45,7 @@ android { beta { applicationId "pan.alexander.tordnscrypt" - versionName "0.6.3" + versionName "0.6.4" dimension = 'version' signingConfig signingConfigs.betasign resValue 'string', 'package_name', applicationId @@ -86,7 +86,7 @@ android { defaultConfig { minSdkVersion 19 targetSdkVersion 29 - versionCode 63 + versionCode 64 resConfigs "en", "ru-rRU", "ru-rUA", "pl"