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 2d22e8f4e9706b43b0129aafd374c6cd44a68404..0714b8d478ed87e7e001681e6c51c9a9f91ad3f9 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 e68a0e1f9fd2545b6c7ea8f798f0fcb8676b162c..b0ccdab86f64b112fd95441562117dfdbcecef48 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 4ad1e8f3ac6255b55ac8b7a357a93001b5b7d04d..1f24300b50c840bf4bd7df5342c4f68eed9d2cf0 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 3418299af1321ed2a4ae4199e346f441ce1d73c3..a97cfc4fa1473741fdecade239633ae21a31bf00 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 1d671525ff649c02d2acb827dd683157ebeda6fb..9ef25b5f5811e77b0095b066c1866c4270d495f0 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 367e7785f06f264896d024a89b9798a5b9b6bd16..6ef1af577e1e0b6906f77a903bddb3acd741dccd 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 f4ece8bd4903288608ac5b8cf3594de90bfa5340..07bc14eea22b5f93e68734cacd3bf778a9912148 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 c4e2bad64c76adcd5eacedfd7e42324c2f144f51..aac2391e4c3ac6c35843cc1586436fef6a7bda08 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 1996ea86b7371cead85901be4f2d215ec35fd296..cf3389402931f344a0f68b8013d9a457ff514a77 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 16c340e70f0998effa8475efd5b9e31ea338c40a..f8fdf0dfa23e4555c83985935dbaf1ecf1bace06 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 69654f983ea993bd87659546e759c532110881a1..e5d62cdd8a8fca3007396e9d3b187306a21995f5 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 20a59f21a1f4cb0a0aea7a4f82c00025da6e869d..108f4884967f809278a1ebfd0d26ca0defbc4c39 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 9d86e58d97f841cf01cd1339f8749bc71eeb448f..a3b74d4c25ce56f3e83f69de5e79d95b39b51999 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;