From 75bd7927ac94e47f7c85e523d561913c8382d820 Mon Sep 17 00:00:00 2001 From: akwizgran <michael@briarproject.org> Date: Wed, 16 May 2018 17:34:21 +0100 Subject: [PATCH] Decouple DevReportSender from TorPlugin. --- .../bramble/plugin/AndroidPluginModule.java | 8 ++--- .../bramble/plugin/tor/TorPlugin.java | 28 ++++-------------- .../bramble/plugin/tor/TorPluginFactory.java | 10 ++----- .../bramble/api/reporting/DevConfig.java | 4 +++ .../bramble/api/reporting/DevReporter.java | 4 +-- .../bramble/BrambleCoreEagerSingletons.java | 3 ++ .../bramble/BrambleCoreModule.java | 1 + .../bramble/reporting/DevReporterImpl.java | 29 ++++++++++++++++--- .../bramble/reporting/ReportingModule.java | 19 ++++++++---- .../briarproject/briar/android/AppModule.java | 8 ++++- .../android/reporting/BriarReportSender.java | 4 +-- .../IntroductionIntegrationTestComponent.java | 5 ++++ .../test/BriarIntegrationTestComponent.java | 3 -- 13 files changed, 72 insertions(+), 54 deletions(-) diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/AndroidPluginModule.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/AndroidPluginModule.java index 2d22e8f4e9..0714b8d478 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/AndroidPluginModule.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/AndroidPluginModule.java @@ -10,7 +10,6 @@ import org.briarproject.bramble.api.plugin.BackoffFactory; import org.briarproject.bramble.api.plugin.PluginConfig; import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; -import org.briarproject.bramble.api.reporting.DevReporter; import org.briarproject.bramble.api.system.AndroidExecutor; import org.briarproject.bramble.api.system.LocationUtils; import org.briarproject.bramble.api.system.Scheduler; @@ -38,15 +37,14 @@ public class AndroidPluginModule { @Scheduler ScheduledExecutorService scheduler, AndroidExecutor androidExecutor, SecureRandom random, SocketFactory torSocketFactory, BackoffFactory backoffFactory, - Application app, LocationUtils locationUtils, DevReporter reporter, - EventBus eventBus) { + Application app, LocationUtils locationUtils, EventBus eventBus) { Context appContext = app.getApplicationContext(); DuplexPluginFactory bluetooth = new AndroidBluetoothPluginFactory(ioExecutor, androidExecutor, appContext, random, eventBus, backoffFactory); DuplexPluginFactory tor = new TorPluginFactory(ioExecutor, scheduler, - appContext, locationUtils, reporter, eventBus, - torSocketFactory, backoffFactory); + appContext, locationUtils, eventBus, torSocketFactory, + backoffFactory); DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor, scheduler, backoffFactory, appContext); Collection<DuplexPluginFactory> duplex = diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java index e68a0e1f9f..b0ccdab86f 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java @@ -32,11 +32,9 @@ import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin; import org.briarproject.bramble.api.plugin.duplex.DuplexPluginCallback; import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection; import org.briarproject.bramble.api.properties.TransportProperties; -import org.briarproject.bramble.api.reporting.DevReporter; import org.briarproject.bramble.api.settings.Settings; import org.briarproject.bramble.api.settings.event.SettingsUpdatedEvent; import org.briarproject.bramble.api.system.LocationUtils; -import org.briarproject.bramble.util.AndroidUtils; import org.briarproject.bramble.util.IoUtils; import org.briarproject.bramble.util.StringUtils; @@ -114,7 +112,6 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener { private final ScheduledExecutorService scheduler; private final Context appContext; private final LocationUtils locationUtils; - private final DevReporter reporter; private final SocketFactory torSocketFactory; private final Backoff backoff; private final DuplexPluginCallback callback; @@ -136,14 +133,13 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener { TorPlugin(Executor ioExecutor, ScheduledExecutorService scheduler, Context appContext, LocationUtils locationUtils, - DevReporter reporter, SocketFactory torSocketFactory, - Backoff backoff, DuplexPluginCallback callback, - String architecture, int maxLatency, int maxIdleTime) { + SocketFactory torSocketFactory, Backoff backoff, + DuplexPluginCallback callback, String architecture, + int maxLatency, int maxIdleTime) { this.ioExecutor = ioExecutor; this.scheduler = scheduler; this.appContext = appContext; this.locationUtils = locationUtils; - this.reporter = reporter; this.torSocketFactory = torSocketFactory; this.backoff = backoff; this.callback = callback; @@ -389,14 +385,6 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener { } } - private void sendDevReports() { - ioExecutor.execute(() -> { - // TODO: Trigger this with a TransportEnabledEvent - File reportDir = AndroidUtils.getReportDir(appContext); - reporter.sendReports(reportDir); - }); - } - private void bind() { ioExecutor.execute(() -> { // If there's already a port number stored in config, reuse it @@ -624,10 +612,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener { connectionStatus.getAndSetCircuitBuilt()) { LOG.info("First circuit built"); backoff.reset(); - if (isRunning()) { - sendDevReports(); - callback.transportEnabled(); - } + if (isRunning()) callback.transportEnabled(); } } @@ -656,10 +641,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener { if (severity.equals("NOTICE") && msg.startsWith("Bootstrapped 100%")) { connectionStatus.setBootstrapped(); backoff.reset(); - if (isRunning()) { - sendDevReports(); - callback.transportEnabled(); - } + if (isRunning()) callback.transportEnabled(); } } diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPluginFactory.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPluginFactory.java index 4ad1e8f3ac..1f24300b50 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPluginFactory.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPluginFactory.java @@ -12,7 +12,6 @@ import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin; import org.briarproject.bramble.api.plugin.duplex.DuplexPluginCallback; import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; -import org.briarproject.bramble.api.reporting.DevReporter; import org.briarproject.bramble.api.system.LocationUtils; import org.briarproject.bramble.util.AndroidUtils; @@ -40,21 +39,18 @@ public class TorPluginFactory implements DuplexPluginFactory { private final ScheduledExecutorService scheduler; private final Context appContext; private final LocationUtils locationUtils; - private final DevReporter reporter; private final EventBus eventBus; private final SocketFactory torSocketFactory; private final BackoffFactory backoffFactory; public TorPluginFactory(Executor ioExecutor, ScheduledExecutorService scheduler, Context appContext, - LocationUtils locationUtils, DevReporter reporter, - EventBus eventBus, SocketFactory torSocketFactory, - BackoffFactory backoffFactory) { + LocationUtils locationUtils, EventBus eventBus, + SocketFactory torSocketFactory, BackoffFactory backoffFactory) { this.ioExecutor = ioExecutor; this.scheduler = scheduler; this.appContext = appContext; this.locationUtils = locationUtils; - this.reporter = reporter; this.eventBus = eventBus; this.torSocketFactory = torSocketFactory; this.backoffFactory = backoffFactory; @@ -94,7 +90,7 @@ public class TorPluginFactory implements DuplexPluginFactory { Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL, MAX_POLLING_INTERVAL, BACKOFF_BASE); TorPlugin plugin = new TorPlugin(ioExecutor, scheduler, appContext, - locationUtils, reporter, torSocketFactory, backoff, callback, + locationUtils, torSocketFactory, backoff, callback, architecture, MAX_LATENCY, MAX_IDLE_TIME); eventBus.addListener(plugin); return plugin; diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevConfig.java b/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevConfig.java index 3418299af1..a97cfc4fa1 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevConfig.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevConfig.java @@ -3,10 +3,14 @@ package org.briarproject.bramble.api.reporting; import org.briarproject.bramble.api.crypto.PublicKey; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import java.io.File; + @NotNullByDefault public interface DevConfig { PublicKey getDevPublicKey(); String getDevOnionAddress(); + + File getReportDir(); } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevReporter.java b/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevReporter.java index 1d671525ff..9ef25b5f58 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevReporter.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/reporting/DevReporter.java @@ -23,8 +23,6 @@ public interface DevReporter { /** * Sends any reports previously stored on disk. - * - * @param reportDir the directory where reports are stored. */ - void sendReports(File reportDir); + void sendReports(); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java index 367e7785f0..6ef1af577e 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java @@ -7,6 +7,7 @@ import org.briarproject.bramble.identity.IdentityModule; import org.briarproject.bramble.lifecycle.LifecycleModule; import org.briarproject.bramble.plugin.PluginModule; import org.briarproject.bramble.properties.PropertiesModule; +import org.briarproject.bramble.reporting.ReportingModule; import org.briarproject.bramble.sync.SyncModule; import org.briarproject.bramble.system.SystemModule; import org.briarproject.bramble.transport.TransportModule; @@ -28,6 +29,8 @@ public interface BrambleCoreEagerSingletons { void inject(PropertiesModule.EagerSingletons init); + void inject(ReportingModule.EagerSingletons init); + void inject(SyncModule.EagerSingletons init); void inject(SystemModule.EagerSingletons init); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java index f4ece8bd49..07bc14eea2 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java @@ -59,6 +59,7 @@ public class BrambleCoreModule { c.inject(new LifecycleModule.EagerSingletons()); c.inject(new PluginModule.EagerSingletons()); c.inject(new PropertiesModule.EagerSingletons()); + c.inject(new ReportingModule.EagerSingletons()); c.inject(new SyncModule.EagerSingletons()); c.inject(new SystemModule.EagerSingletons()); c.inject(new TransportModule.EagerSingletons()); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReporterImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReporterImpl.java index c4e2bad64c..aac2391e4c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReporterImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReporterImpl.java @@ -1,7 +1,12 @@ package org.briarproject.bramble.reporting; import org.briarproject.bramble.api.crypto.CryptoComponent; +import org.briarproject.bramble.api.event.Event; +import org.briarproject.bramble.api.event.EventListener; +import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.plugin.TorConstants; +import org.briarproject.bramble.api.plugin.event.TransportEnabledEvent; import org.briarproject.bramble.api.reporting.DevConfig; import org.briarproject.bramble.api.reporting.DevReporter; import org.briarproject.bramble.util.IoUtils; @@ -18,17 +23,19 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; +import java.util.concurrent.Executor; import java.util.logging.Logger; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; +import javax.inject.Inject; import javax.net.SocketFactory; import static java.util.logging.Level.WARNING; @Immutable @NotNullByDefault -class DevReporterImpl implements DevReporter { +class DevReporterImpl implements DevReporter, EventListener { private static final Logger LOG = Logger.getLogger(DevReporterImpl.class.getName()); @@ -36,12 +43,15 @@ class DevReporterImpl implements DevReporter { private static final int SOCKET_TIMEOUT = 30 * 1000; // 30 seconds private static final int LINE_LENGTH = 70; + private final Executor ioExecutor; private final CryptoComponent crypto; private final DevConfig devConfig; private final SocketFactory torSocketFactory; - DevReporterImpl(CryptoComponent crypto, DevConfig devConfig, - SocketFactory torSocketFactory) { + @Inject + DevReporterImpl(@IoExecutor Executor ioExecutor, CryptoComponent crypto, + DevConfig devConfig, SocketFactory torSocketFactory) { + this.ioExecutor = ioExecutor; this.crypto = crypto; this.devConfig = devConfig; this.torSocketFactory = torSocketFactory; @@ -63,6 +73,7 @@ class DevReporterImpl implements DevReporter { @Override public void encryptReportToFile(File reportDir, String filename, String report) throws FileNotFoundException { + LOG.info("Encrypting report to file"); byte[] plaintext = StringUtils.toUtf8(report); byte[] ciphertext = crypto.encryptToKey(devConfig.getDevPublicKey(), plaintext); @@ -82,7 +93,17 @@ class DevReporterImpl implements DevReporter { } @Override - public void sendReports(File reportDir) { + public void eventOccurred(Event e) { + if (e instanceof TransportEnabledEvent) { + TransportEnabledEvent t = (TransportEnabledEvent) e; + if (t.getTransportId().equals(TorConstants.ID)) + ioExecutor.execute(this::sendReports); + } + } + + @Override + public void sendReports() { + File reportDir = devConfig.getReportDir(); File[] reports = reportDir.listFiles(); if (reports == null || reports.length == 0) return; // No reports to send diff --git a/bramble-core/src/main/java/org/briarproject/bramble/reporting/ReportingModule.java b/bramble-core/src/main/java/org/briarproject/bramble/reporting/ReportingModule.java index 1996ea86b7..cf33894029 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/reporting/ReportingModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/reporting/ReportingModule.java @@ -1,10 +1,10 @@ package org.briarproject.bramble.reporting; -import org.briarproject.bramble.api.crypto.CryptoComponent; -import org.briarproject.bramble.api.reporting.DevConfig; +import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.reporting.DevReporter; -import javax.net.SocketFactory; +import javax.inject.Inject; +import javax.inject.Singleton; import dagger.Module; import dagger.Provides; @@ -12,9 +12,16 @@ import dagger.Provides; @Module public class ReportingModule { + public static class EagerSingletons { + @Inject + DevReporter devReporter; + } + @Provides - DevReporter provideDevReporter(CryptoComponent crypto, - DevConfig devConfig, SocketFactory torSocketFactory) { - return new DevReporterImpl(crypto, devConfig, torSocketFactory); + @Singleton + DevReporter provideDevReporter(DevReporterImpl devReporter, + EventBus eventBus) { + eventBus.addListener(devReporter); + return devReporter; } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java index 16c340e70f..f8fdf0dfa2 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java @@ -14,6 +14,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.reporting.DevConfig; import org.briarproject.bramble.api.ui.UiCallback; +import org.briarproject.bramble.util.AndroidUtils; import org.briarproject.bramble.util.StringUtils; import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.android.DozeWatchdog; @@ -96,7 +97,7 @@ public class AppModule { @Provides @Singleton - DevConfig provideDevConfig(CryptoComponent crypto) { + DevConfig provideDevConfig(Application app, CryptoComponent crypto) { @NotNullByDefault DevConfig devConfig = new DevConfig() { @@ -114,6 +115,11 @@ public class AppModule { public String getDevOnionAddress() { return DEV_ONION_ADDRESS; } + + @Override + public File getReportDir() { + return AndroidUtils.getReportDir(app.getApplicationContext()); + } }; return devConfig; } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportSender.java b/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportSender.java index 69654f983e..e5d62cdd8a 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportSender.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportSender.java @@ -6,7 +6,7 @@ import android.support.annotation.NonNull; import org.acra.collector.CrashReportData; import org.acra.sender.ReportSender; import org.acra.sender.ReportSenderException; -import org.acra.util.JSONReportBuilder; +import org.acra.util.JSONReportBuilder.JSONReportException; import org.briarproject.bramble.api.reporting.DevReporter; import org.briarproject.bramble.util.AndroidUtils; import org.briarproject.briar.android.AndroidComponent; @@ -37,7 +37,7 @@ public class BriarReportSender implements ReportSender { String crashReport; try { crashReport = errorContent.toJSON().toString(); - } catch (JSONReportBuilder.JSONReportException e) { + } catch (JSONReportException e) { throw new ReportSenderException("Couldn't create JSON", e); } try { diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java index 20a59f21a1..108f488496 100644 --- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java @@ -66,12 +66,17 @@ interface IntroductionIntegrationTestComponent void inject(IntroductionIntegrationTest init); void inject(MessageEncoderParserIntegrationTest init); + void inject(SessionEncoderParserIntegrationTest init); + void inject(IntroductionCryptoIntegrationTest init); MessageEncoder getMessageEncoder(); + MessageParser getMessageParser(); + SessionParser getSessionParser(); + IntroductionCrypto getIntroductionCrypto(); } diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java index 9d86e58d97..a3b74d4c25 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java @@ -39,10 +39,7 @@ import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager import org.briarproject.briar.blog.BlogModule; import org.briarproject.briar.client.BriarClientModule; import org.briarproject.briar.forum.ForumModule; -import org.briarproject.briar.introduction.IntroductionCryptoIntegrationTest; import org.briarproject.briar.introduction.IntroductionModule; -import org.briarproject.briar.introduction.MessageEncoderParserIntegrationTest; -import org.briarproject.briar.introduction.SessionEncoderParserIntegrationTest; import org.briarproject.briar.messaging.MessagingModule; import org.briarproject.briar.privategroup.PrivateGroupModule; import org.briarproject.briar.privategroup.invitation.GroupInvitationModule; -- GitLab