From 94f8f683360067bfc23bc0e2df3236daa8a74264 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Thu, 23 Jan 2020 17:07:09 +0000 Subject: [PATCH] Keep track of connected OR connections. --- .../bramble/plugin/tor/TorPlugin.java | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java index 35c0c8032..a80e90eaa 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java @@ -45,9 +45,11 @@ import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Scanner; +import java.util.Set; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; @@ -747,8 +749,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { @Override public void circuitStatus(String status, String id, String path) { - if (status.equals("BUILT") && - state.getAndSetCircuitBuilt()) { + if (status.equals("BUILT") && state.getAndSetCircuitBuilt()) { LOG.info("First circuit built"); } } @@ -759,8 +760,8 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { @Override public void orConnStatus(String status, String orName) { - if (LOG.isLoggable(INFO)) - LOG.info("OR connection " + status + " " + orName); + if (LOG.isLoggable(INFO)) LOG.info("OR connection " + status); + state.setOrConnectionStatus(orName, status); if (status.equals("CLOSED") || status.equals("FAILED")) { // Check whether we've lost connectivity updateConnectionStatus(networkManager.getNetworkStatus(), @@ -949,6 +950,9 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { @Nullable private ServerSocket serverSocket = null; + @GuardedBy("this") + private final Set orConnections = new HashSet<>(); + synchronized void setStarted() { started = true; callback.pluginStateChanged(getState()); @@ -992,6 +996,20 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { callback.pluginStateChanged(getState()); } + synchronized void setOrConnectionStatus(String orName, String status) { + if (status.equals("CONNECTED")) { + if (!orConnections.add(orName)) { + LOG.warning("Duplicate OR connection"); + } + } else { + orConnections.remove(orName); + } + if (LOG.isLoggable(INFO)) { + LOG.info(orConnections.size() + " OR connections"); + } + callback.pluginStateChanged(getState()); + } + // Doesn't affect getState() synchronized boolean setServerSocket(ServerSocket ss) { if (stopped || serverSocket != null) return false; @@ -1011,7 +1029,8 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { if (reasonsDisabled != 0) return DISABLED; if (!networkInitialised) return ENABLING; if (!networkEnabled) return INACTIVE; - return bootstrapped && circuitBuilt ? ACTIVE : ENABLING; + return bootstrapped && circuitBuilt && !orConnections.isEmpty() + ? ACTIVE : ENABLING; } synchronized int getReasonsDisabled() {