Start RSS Feed Fetcher only after TransportEnabledEvent for Tor

This commit is contained in:
Torsten Grote
2016-08-18 15:19:51 -03:00
committed by akwizgran
parent 042050453a
commit e023e5d8fc
5 changed files with 48 additions and 22 deletions

View File

@@ -27,6 +27,7 @@ import org.briarproject.api.event.SettingsUpdatedEvent;
import org.briarproject.api.keyagreement.KeyAgreementListener; import org.briarproject.api.keyagreement.KeyAgreementListener;
import org.briarproject.api.keyagreement.TransportDescriptor; import org.briarproject.api.keyagreement.TransportDescriptor;
import org.briarproject.api.plugins.Backoff; 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.DuplexPlugin;
import org.briarproject.api.plugins.duplex.DuplexPluginCallback; import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
import org.briarproject.api.plugins.duplex.DuplexTransportConnection; 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 java.util.logging.Level.WARNING;
import static net.freehaven.tor.control.TorControlCommands.HS_ADDRESS; import static net.freehaven.tor.control.TorControlCommands.HS_ADDRESS;
import static net.freehaven.tor.control.TorControlCommands.HS_PRIVKEY; 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; import static org.briarproject.util.PrivacyUtils.scrubOnion;
class TorPlugin implements DuplexPlugin, EventHandler, EventListener { class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
static final TransportId ID = new TransportId("tor");
private static final String PROP_ONION = "onion"; private static final String PROP_ONION = "onion";
private static final String[] EVENTS = { private static final String[] EVENTS = {
"CIRC", "ORCONN", "HS_DESC", "NOTICE", "WARN", "ERR" "CIRC", "ORCONN", "HS_DESC", "NOTICE", "WARN", "ERR"
}; };
private static final String OWNER = "__OwningControllerProcess"; 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 int COOKIE_TIMEOUT = 3000; // Milliseconds
private static final Pattern ONION = Pattern.compile("[a-z2-7]{16}"); private static final Pattern ONION = Pattern.compile("[a-z2-7]{16}");
private static final Logger LOG = private static final Logger LOG =
@@ -140,7 +140,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
@Override @Override
public TransportId getId() { public TransportId getId() {
return ID; return TorConstants.ID;
} }
@Override @Override

View File

@@ -8,6 +8,7 @@ import org.briarproject.api.TransportId;
import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventBus;
import org.briarproject.api.plugins.Backoff; import org.briarproject.api.plugins.Backoff;
import org.briarproject.api.plugins.BackoffFactory; 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.DuplexPlugin;
import org.briarproject.api.plugins.duplex.DuplexPluginCallback; import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
import org.briarproject.api.plugins.duplex.DuplexPluginFactory; import org.briarproject.api.plugins.duplex.DuplexPluginFactory;
@@ -48,7 +49,7 @@ public class TorPluginFactory implements DuplexPluginFactory {
@Override @Override
public TransportId getId() { public TransportId getId() {
return TorPlugin.ID; return TorConstants.ID;
} }
@Override @Override

View File

@@ -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;
}

View File

@@ -8,6 +8,7 @@ import com.rometools.rome.io.SyndFeedInput;
import com.rometools.rome.io.XmlReader; import com.rometools.rome.io.XmlReader;
import org.briarproject.api.FormatException; import org.briarproject.api.FormatException;
import org.briarproject.api.TransportId;
import org.briarproject.api.blogs.Blog; import org.briarproject.api.blogs.Blog;
import org.briarproject.api.blogs.BlogManager; import org.briarproject.api.blogs.BlogManager;
import org.briarproject.api.blogs.BlogPost; 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.DatabaseComponent;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
import org.briarproject.api.db.Transaction; 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.Feed;
import org.briarproject.api.feed.FeedManager; import org.briarproject.api.feed.FeedManager;
import org.briarproject.api.identity.AuthorId; import org.briarproject.api.identity.AuthorId;
import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.IdentityManager;
import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.identity.LocalAuthor;
import org.briarproject.api.lifecycle.IoExecutor; import org.briarproject.api.lifecycle.IoExecutor;
import org.briarproject.api.lifecycle.Service; import org.briarproject.api.plugins.TorConstants;
import org.briarproject.api.lifecycle.ServiceException;
import org.briarproject.api.sync.ClientId; import org.briarproject.api.sync.ClientId;
import org.briarproject.api.sync.Group; import org.briarproject.api.sync.Group;
import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.GroupId;
@@ -39,6 +42,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.Proxy; import java.net.Proxy;
import java.net.SocketAddress;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -47,6 +51,7 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.inject.Inject; 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_INTERVAL;
import static org.briarproject.api.feed.FeedConstants.FETCH_UNIT; import static org.briarproject.api.feed.FeedConstants.FETCH_UNIT;
import static org.briarproject.api.feed.FeedConstants.KEY_FEEDS; 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 = private static final Logger LOG =
Logger.getLogger(FeedManagerImpl.class.getName()); Logger.getLogger(FeedManagerImpl.class.getName());
@@ -78,8 +84,9 @@ class FeedManagerImpl implements FeedManager, Service, Client {
private final DatabaseComponent db; private final DatabaseComponent db;
private final PrivateGroupFactory privateGroupFactory; private final PrivateGroupFactory privateGroupFactory;
private final ClientHelper clientHelper; private final ClientHelper clientHelper;
private IdentityManager identityManager; private final IdentityManager identityManager;
private final BlogManager blogManager; private final BlogManager blogManager;
private final AtomicBoolean fetcherStarted = new AtomicBoolean(false);
@Inject @Inject
@SuppressWarnings("WeakerAccess") @SuppressWarnings("WeakerAccess")
@@ -109,8 +116,20 @@ class FeedManagerImpl implements FeedManager, Service, Client {
} }
@Override @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() { Runnable fetcher = new Runnable() {
@Override
public void run() { public void run() {
ioExecutor.execute(new Runnable() { ioExecutor.execute(new Runnable() {
@Override @Override
@@ -124,11 +143,6 @@ class FeedManagerImpl implements FeedManager, Service, Client {
FETCH_INTERVAL, FETCH_UNIT); FETCH_INTERVAL, FETCH_UNIT);
} }
@Override
public void stopService() throws ServiceException {
// feedExecutor will be stopped by LifecycleManager
}
@Override @Override
public void createLocalState(Transaction txn) throws DbException { public void createLocalState(Transaction txn) throws DbException {
Group g = getLocalGroup(); Group g = getLocalGroup();
@@ -341,11 +355,9 @@ class FeedManagerImpl implements FeedManager, Service, Client {
private InputStream getFeedInputStream(String url) throws IOException { private InputStream getFeedInputStream(String url) throws IOException {
// Set proxy // Set proxy
// TODO verify and use local Tor proxy address/port SocketAddress socketAddress =
String proxyHost = "localhost"; new InetSocketAddress("127.0.0.1", SOCKS_PORT);
int proxyPort = 59050; Proxy proxy = new Proxy(Proxy.Type.SOCKS, socketAddress);
Proxy proxy = new Proxy(Proxy.Type.SOCKS,
new InetSocketAddress(proxyHost, proxyPort));
// Build HTTP Client // Build HTTP Client
OkHttpClient client = new OkHttpClient.Builder() OkHttpClient client = new OkHttpClient.Builder()

View File

@@ -1,5 +1,6 @@
package org.briarproject.feed; package org.briarproject.feed;
import org.briarproject.api.event.EventBus;
import org.briarproject.api.feed.FeedManager; import org.briarproject.api.feed.FeedManager;
import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.LifecycleManager;
@@ -20,10 +21,10 @@ public class FeedModule {
@Provides @Provides
@Singleton @Singleton
FeedManager provideFeedManager(FeedManagerImpl feedManager, FeedManager provideFeedManager(FeedManagerImpl feedManager,
LifecycleManager lifecycleManager) { LifecycleManager lifecycleManager, EventBus eventBus) {
lifecycleManager.registerClient(feedManager); lifecycleManager.registerClient(feedManager);
lifecycleManager.registerService(feedManager); eventBus.addListener(feedManager);
return feedManager; return feedManager;
} }