From 88b7dc2eb3dcbec8d1e637096867c15211818677 Mon Sep 17 00:00:00 2001 From: cyBerta Date: Fri, 5 Nov 2021 02:38:26 +0100 Subject: Ensure tor state is set to OFF after snowflake completely stopped. --- .../providersetup/ProviderApiManagerBase.java | 32 ++++++---------------- 1 file changed, 9 insertions(+), 23 deletions(-) (limited to 'app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerBase.java') diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerBase.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerBase.java index d646b4bb..074cc121 100644 --- a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerBase.java +++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderApiManagerBase.java @@ -48,11 +48,7 @@ import java.security.interfaces.RSAPrivateKey; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; -import java.util.Observer; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import java.util.concurrent.atomic.AtomicBoolean; import javax.net.ssl.SSLHandshakeException; import javax.net.ssl.SSLPeerUnverifiedException; @@ -150,7 +146,7 @@ public abstract class ProviderApiManagerBase { public interface ProviderApiServiceCallback { void broadcastEvent(Intent intent); - void startTorService(); + void startTorService() throws InterruptedException, IllegalStateException; int getTorHttpTunnelPort(); boolean isConnectedToWifi(); } @@ -190,10 +186,9 @@ public abstract class ProviderApiManagerBase { return; } - // uncomment for testing --v try { startTorProxy(); - } catch (InterruptedException | TimeoutException e) { + } catch (InterruptedException | IllegalStateException | TimeoutException e) { e.printStackTrace(); return; } @@ -295,7 +290,7 @@ public abstract class ProviderApiManagerBase { } } - protected boolean startTorProxy() throws InterruptedException, TimeoutException { + protected boolean startTorProxy() throws InterruptedException, IllegalStateException, TimeoutException { if (PreferenceHelper.getUseBridges(preferences) && EipStatus.getInstance().isDisconnected() && serviceCallback.isConnectedToWifi() @@ -303,7 +298,7 @@ public abstract class ProviderApiManagerBase { serviceCallback.startTorService(); waitForTorCircuits(); if (TorStatusObservable.isCancelled()) { - throw new InterruptedException("cancelled Tor setup"); + throw new InterruptedException("Cancelled Tor setup."); } int port = serviceCallback.getTorHttpTunnelPort(); TorStatusObservable.setProxyPort(port); @@ -316,20 +311,11 @@ public abstract class ProviderApiManagerBase { if (TorStatusObservable.getStatus() == ON) { return; } - CountDownLatch countDownLatch = new CountDownLatch(1); - AtomicBoolean stopWaiting = new AtomicBoolean(false); - Observer observer = (o, arg) -> { - if (TorStatusObservable.getStatus() == ON || TorStatusObservable.isCancelled()) { - stopWaiting.set(true); - countDownLatch.countDown(); - } - }; - TorStatusObservable.getInstance().addObserver(observer); - countDownLatch.await(180, TimeUnit.SECONDS); - TorStatusObservable.getInstance().deleteObserver(observer); - if (!stopWaiting.get()) { - throw new TimeoutException("Timeout reached"); - } + TorStatusObservable.waitUntil(this::isTorOnOrCancelled, 180); + } + + private boolean isTorOnOrCancelled() { + return TorStatusObservable.getStatus() == ON || TorStatusObservable.isCancelled(); } void resetProviderDetails(Provider provider) { -- cgit v1.2.3