From 066285b86a24b6164366bca7ebd3076accffd093 Mon Sep 17 00:00:00 2001 From: akwizgran <akwizgran@users.sourceforge.net> Date: Fri, 12 Feb 2016 14:13:50 +0000 Subject: [PATCH] New polling logic for Tor. #250 Poll for outgoing connections each time the network is enabled, then disable polling once our hidden service descriptor has been published. --- .../briarproject/plugins/tor/TorPlugin.java | 20 +++++++++++++++++-- .../briarproject/plugins/tcp/TcpPlugin.java | 1 + 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java b/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java index b0cc91746d..4831a0f7ca 100644 --- a/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java +++ b/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java @@ -44,6 +44,7 @@ import java.util.Scanner; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import java.util.regex.Pattern; import java.util.zip.ZipInputStream; @@ -63,7 +64,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, static final TransportId ID = new TransportId("tor"); private static final String[] EVENTS = { - "CIRC", "ORCONN", "NOTICE", "WARN", "ERR" + "CIRC", "ORCONN", "HS_DESC", "NOTICE", "WARN", "ERR" }; private static final String OWNER = "__OwningControllerProcess"; private static final int SOCKS_PORT = 59050, CONTROL_PORT = 59051; @@ -71,6 +72,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, private static final int HOSTNAME_TIMEOUT = 30 * 1000; // Milliseconds private static final Pattern ONION = Pattern.compile("[a-z2-7]{16}\\.onion"); + private static final int DESCRIPTOR_THRESHOLD = 3; private static final Logger LOG = Logger.getLogger(TorPlugin.class.getName()); @@ -83,6 +85,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, private final File torDirectory, torFile, geoIpFile, configFile, doneFile; private final File cookieFile, hostnameFile; private final AtomicBoolean circuitBuilt; + private final AtomicInteger descriptorsPublished; private volatile boolean running = false, networkEnabled = false; private volatile boolean bootstrapped = false; @@ -117,6 +120,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, cookieFile = new File(torDirectory, ".tor/control_auth_cookie"); hostnameFile = new File(torDirectory, "hs/hostname"); circuitBuilt = new AtomicBoolean(false); + descriptorsPublished = new AtomicInteger(0); } public TransportId getId() { @@ -462,6 +466,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, if (LOG.isLoggable(INFO)) LOG.info("Enabling network: " + enable); if (!enable) { circuitBuilt.set(false); + descriptorsPublished.set(0); callback.transportDisabled(); } networkEnabled = enable; @@ -503,6 +508,11 @@ class TorPlugin implements DuplexPlugin, EventHandler, public void poll(Collection<ContactId> connected) { if (!isRunning()) return; + if (descriptorsPublished.get() >= DESCRIPTOR_THRESHOLD) { + LOG.info("Hidden service descriptor published, not polling"); + return; + } + // TODO: Pass properties to connectAndCallBack() for (ContactId c : callback.getRemoteProperties().keySet()) if (!connected.contains(c)) connectAndCallBack(c); } @@ -576,7 +586,13 @@ class TorPlugin implements DuplexPlugin, EventHandler, } } - public void unrecognized(String type, String msg) {} + public void unrecognized(String type, String msg) { + if (type.equals("HS_DESC") && msg.startsWith("UPLOADED")) { + int descriptors = descriptorsPublished.incrementAndGet(); + if (descriptors == DESCRIPTOR_THRESHOLD) + LOG.info("Hidden service descriptor published"); + } + } private static class WriteObserver extends FileObserver { diff --git a/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java b/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java index 03263bd776..64f91c4d1a 100644 --- a/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java +++ b/briar-core/src/org/briarproject/plugins/tcp/TcpPlugin.java @@ -176,6 +176,7 @@ abstract class TcpPlugin implements DuplexPlugin { public void poll(Collection<ContactId> connected) { if (!isRunning()) return; backoff.increment(); + // TODO: Pass properties to connectAndCallBack() for (ContactId c : callback.getRemoteProperties().keySet()) if (!connected.contains(c)) connectAndCallBack(c); } -- GitLab