diff --git a/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java b/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java index 94346424f0e306d8e733e8f9f53e861b9d1a6bd8..0fcf4a87e61bcafa900ee59931d29f93396e41ab 100644 --- a/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java +++ b/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java @@ -27,6 +27,7 @@ import org.briarproject.api.event.SettingsUpdatedEvent; import org.briarproject.api.keyagreement.KeyAgreementListener; import org.briarproject.api.keyagreement.TransportDescriptor; import org.briarproject.api.plugins.Backoff; +import org.briarproject.api.plugins.TorConstants; import org.briarproject.api.plugins.duplex.DuplexPlugin; import org.briarproject.api.plugins.duplex.DuplexPluginCallback; import org.briarproject.api.plugins.duplex.DuplexTransportConnection; @@ -72,18 +73,17 @@ import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import static net.freehaven.tor.control.TorControlCommands.HS_ADDRESS; import static net.freehaven.tor.control.TorControlCommands.HS_PRIVKEY; +import static org.briarproject.api.plugins.TorConstants.CONTROL_PORT; +import static org.briarproject.api.plugins.TorConstants.SOCKS_PORT; import static org.briarproject.util.PrivacyUtils.scrubOnion; class TorPlugin implements DuplexPlugin, EventHandler, EventListener { - static final TransportId ID = new TransportId("tor"); - private static final String PROP_ONION = "onion"; private static final String[] EVENTS = { "CIRC", "ORCONN", "HS_DESC", "NOTICE", "WARN", "ERR" }; private static final String OWNER = "__OwningControllerProcess"; - private static final int SOCKS_PORT = 59050, CONTROL_PORT = 59051; private static final int COOKIE_TIMEOUT = 3000; // Milliseconds private static final Pattern ONION = Pattern.compile("[a-z2-7]{16}"); private static final Logger LOG = @@ -140,7 +140,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener { @Override public TransportId getId() { - return ID; + return TorConstants.ID; } @Override diff --git a/briar-android/src/org/briarproject/plugins/tor/TorPluginFactory.java b/briar-android/src/org/briarproject/plugins/tor/TorPluginFactory.java index 9cfabc3cb5a42e1833948920b752ce18107cccf0..ae1b9e856a6cbac77de5b85ecb4860d21db00ca6 100644 --- a/briar-android/src/org/briarproject/plugins/tor/TorPluginFactory.java +++ b/briar-android/src/org/briarproject/plugins/tor/TorPluginFactory.java @@ -8,6 +8,7 @@ import org.briarproject.api.TransportId; import org.briarproject.api.event.EventBus; import org.briarproject.api.plugins.Backoff; import org.briarproject.api.plugins.BackoffFactory; +import org.briarproject.api.plugins.TorConstants; import org.briarproject.api.plugins.duplex.DuplexPlugin; import org.briarproject.api.plugins.duplex.DuplexPluginCallback; import org.briarproject.api.plugins.duplex.DuplexPluginFactory; @@ -48,7 +49,7 @@ public class TorPluginFactory implements DuplexPluginFactory { @Override public TransportId getId() { - return TorPlugin.ID; + return TorConstants.ID; } @Override diff --git a/briar-api/src/org/briarproject/api/plugins/TorConstants.java b/briar-api/src/org/briarproject/api/plugins/TorConstants.java new file mode 100644 index 0000000000000000000000000000000000000000..3eec84e08c7b71d53ea51ff831daaca4202757b1 --- /dev/null +++ b/briar-api/src/org/briarproject/api/plugins/TorConstants.java @@ -0,0 +1,12 @@ +package org.briarproject.api.plugins; + +import org.briarproject.api.TransportId; + +public interface TorConstants { + + TransportId ID = new TransportId("tor"); + + int SOCKS_PORT = 59050; + int CONTROL_PORT = 59051; + +} diff --git a/briar-core/src/org/briarproject/feed/FeedManagerImpl.java b/briar-core/src/org/briarproject/feed/FeedManagerImpl.java index 344165b32f23ee4e0d1237f85fc34c84e1410362..496c28403dae49e02578fe1fcb56c4657d7f85fe 100644 --- a/briar-core/src/org/briarproject/feed/FeedManagerImpl.java +++ b/briar-core/src/org/briarproject/feed/FeedManagerImpl.java @@ -8,6 +8,7 @@ import com.rometools.rome.io.SyndFeedInput; import com.rometools.rome.io.XmlReader; import org.briarproject.api.FormatException; +import org.briarproject.api.TransportId; import org.briarproject.api.blogs.Blog; import org.briarproject.api.blogs.BlogManager; import org.briarproject.api.blogs.BlogPost; @@ -21,14 +22,16 @@ import org.briarproject.api.data.BdfList; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; import org.briarproject.api.db.Transaction; +import org.briarproject.api.event.Event; +import org.briarproject.api.event.EventListener; +import org.briarproject.api.event.TransportEnabledEvent; import org.briarproject.api.feed.Feed; import org.briarproject.api.feed.FeedManager; import org.briarproject.api.identity.AuthorId; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.lifecycle.IoExecutor; -import org.briarproject.api.lifecycle.Service; -import org.briarproject.api.lifecycle.ServiceException; +import org.briarproject.api.plugins.TorConstants; import org.briarproject.api.sync.ClientId; import org.briarproject.api.sync.Group; import org.briarproject.api.sync.GroupId; @@ -39,6 +42,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.InetSocketAddress; import java.net.Proxy; +import java.net.SocketAddress; import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.Collections; @@ -47,6 +51,7 @@ import java.util.Date; import java.util.List; import java.util.concurrent.Executor; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; import javax.inject.Inject; @@ -62,8 +67,9 @@ import static org.briarproject.api.feed.FeedConstants.FETCH_DELAY_INITIAL; import static org.briarproject.api.feed.FeedConstants.FETCH_INTERVAL; import static org.briarproject.api.feed.FeedConstants.FETCH_UNIT; import static org.briarproject.api.feed.FeedConstants.KEY_FEEDS; +import static org.briarproject.api.plugins.TorConstants.SOCKS_PORT; -class FeedManagerImpl implements FeedManager, Service, Client { +class FeedManagerImpl implements FeedManager, Client, EventListener { private static final Logger LOG = Logger.getLogger(FeedManagerImpl.class.getName()); @@ -78,8 +84,9 @@ class FeedManagerImpl implements FeedManager, Service, Client { private final DatabaseComponent db; private final PrivateGroupFactory privateGroupFactory; private final ClientHelper clientHelper; - private IdentityManager identityManager; + private final IdentityManager identityManager; private final BlogManager blogManager; + private final AtomicBoolean fetcherStarted = new AtomicBoolean(false); @Inject @SuppressWarnings("WeakerAccess") @@ -109,8 +116,20 @@ class FeedManagerImpl implements FeedManager, Service, Client { } @Override - public void startService() throws ServiceException { + public void eventOccurred(Event e) { + if (e instanceof TransportEnabledEvent) { + TransportId t = ((TransportEnabledEvent) e).getTransportId(); + if (t.equals(TorConstants.ID)) { + startFeedExecutor(); + } + } + } + + private void startFeedExecutor() { + if (fetcherStarted.getAndSet(true)) return; + LOG.info("Tor started, scheduling RSS feed fetcher"); Runnable fetcher = new Runnable() { + @Override public void run() { ioExecutor.execute(new Runnable() { @Override @@ -124,11 +143,6 @@ class FeedManagerImpl implements FeedManager, Service, Client { FETCH_INTERVAL, FETCH_UNIT); } - @Override - public void stopService() throws ServiceException { - // feedExecutor will be stopped by LifecycleManager - } - @Override public void createLocalState(Transaction txn) throws DbException { Group g = getLocalGroup(); @@ -341,11 +355,9 @@ class FeedManagerImpl implements FeedManager, Service, Client { private InputStream getFeedInputStream(String url) throws IOException { // Set proxy - // TODO verify and use local Tor proxy address/port - String proxyHost = "localhost"; - int proxyPort = 59050; - Proxy proxy = new Proxy(Proxy.Type.SOCKS, - new InetSocketAddress(proxyHost, proxyPort)); + SocketAddress socketAddress = + new InetSocketAddress("127.0.0.1", SOCKS_PORT); + Proxy proxy = new Proxy(Proxy.Type.SOCKS, socketAddress); // Build HTTP Client OkHttpClient client = new OkHttpClient.Builder() diff --git a/briar-core/src/org/briarproject/feed/FeedModule.java b/briar-core/src/org/briarproject/feed/FeedModule.java index aad3bab22fb0b2d43d67c50663905a1b8c68beb8..2845370a4b17a8e08b3af691c0848fa9ae348c4f 100644 --- a/briar-core/src/org/briarproject/feed/FeedModule.java +++ b/briar-core/src/org/briarproject/feed/FeedModule.java @@ -1,5 +1,6 @@ package org.briarproject.feed; +import org.briarproject.api.event.EventBus; import org.briarproject.api.feed.FeedManager; import org.briarproject.api.lifecycle.LifecycleManager; @@ -20,10 +21,10 @@ public class FeedModule { @Provides @Singleton FeedManager provideFeedManager(FeedManagerImpl feedManager, - LifecycleManager lifecycleManager) { + LifecycleManager lifecycleManager, EventBus eventBus) { lifecycleManager.registerClient(feedManager); - lifecycleManager.registerService(feedManager); + eventBus.addListener(feedManager); return feedManager; }