From de63a50662a5a392a01c8f693d14a70cc68f28f3 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 31 May 2022 17:05:35 +0100 Subject: [PATCH] Add mailbox plugin. --- .../bramble/api/mailbox/MailboxConstants.java | 7 ++ .../file/AbstractRemovableDrivePlugin.java | 1 + .../bramble/plugin/file/FilePlugin.java | 15 ++-- .../plugin/file/FileTransportReader.java | 39 ---------- .../plugin/file/FileTransportWriter.java | 54 -------------- .../bramble/plugin/file/MailboxPlugin.java | 73 +++++++++++++++++++ .../plugin/file/MailboxPluginFactory.java | 39 ++++++++++ .../briarproject/briar/android/AppModule.java | 11 ++- 8 files changed, 132 insertions(+), 107 deletions(-) delete mode 100644 bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FileTransportReader.java delete mode 100644 bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FileTransportWriter.java create mode 100644 bramble-core/src/main/java/org/briarproject/bramble/plugin/file/MailboxPlugin.java create mode 100644 bramble-core/src/main/java/org/briarproject/bramble/plugin/file/MailboxPluginFactory.java diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxConstants.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxConstants.java index 8cc6b5fc0..51d7f0a7c 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxConstants.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxConstants.java @@ -1,5 +1,7 @@ package org.briarproject.bramble.api.mailbox; +import org.briarproject.bramble.api.plugin.TransportId; + import static java.util.concurrent.TimeUnit.HOURS; import static org.briarproject.bramble.api.transport.TransportConstants.MAX_FRAME_LENGTH; import static org.briarproject.bramble.api.transport.TransportConstants.MAX_PAYLOAD_LENGTH; @@ -8,6 +10,11 @@ import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENG public interface MailboxConstants { + /** + * The transport ID of the mailbox plugin. + */ + TransportId ID = new TransportId("org.briarproject.bramble.mailbox"); + /** * The maximum length of a file that can be uploaded to or downloaded from * a mailbox. diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/AbstractRemovableDrivePlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/AbstractRemovableDrivePlugin.java index ff4b9c048..ccdf7f56b 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/AbstractRemovableDrivePlugin.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/AbstractRemovableDrivePlugin.java @@ -67,6 +67,7 @@ abstract class AbstractRemovableDrivePlugin implements SimplexPlugin { public void start() { callback.mergeLocalProperties( new TransportProperties(singletonMap(PROP_SUPPORTED, "true"))); + callback.pluginStateChanged(ACTIVE); } @Override diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FilePlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FilePlugin.java index 69b368a55..54587dc9c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FilePlugin.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FilePlugin.java @@ -11,6 +11,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.util.logging.Logger; import static java.util.logging.Level.WARNING; @@ -29,11 +30,6 @@ abstract class FilePlugin implements SimplexPlugin { protected final PluginCallback callback; protected final long maxLatency; - protected abstract void writerFinished(File f, boolean exception); - - protected abstract void readerFinished(File f, boolean exception, - boolean recognised); - FilePlugin(PluginCallback callback, long maxLatency) { this.callback = callback; this.maxLatency = maxLatency; @@ -50,9 +46,8 @@ abstract class FilePlugin implements SimplexPlugin { String path = p.get(PROP_PATH); if (isNullOrEmpty(path)) return null; try { - File file = new File(path); - FileInputStream in = new FileInputStream(file); - return new FileTransportReader(file, in, this); + FileInputStream in = new FileInputStream(path); + return new TransportInputStreamReader(in); } catch (IOException e) { logException(LOG, WARNING, e); return null; @@ -70,8 +65,8 @@ abstract class FilePlugin implements SimplexPlugin { LOG.info("Failed to create file"); return null; } - FileOutputStream out = new FileOutputStream(file); - return new FileTransportWriter(file, out, this); + OutputStream out = new FileOutputStream(file); + return new TransportOutputStreamWriter(this, out); } catch (IOException e) { logException(LOG, WARNING, e); return null; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FileTransportReader.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FileTransportReader.java deleted file mode 100644 index 07a84d294..000000000 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FileTransportReader.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.briarproject.bramble.plugin.file; - -import org.briarproject.bramble.api.nullsafety.NotNullByDefault; -import org.briarproject.bramble.api.plugin.TransportConnectionReader; - -import java.io.File; -import java.io.InputStream; -import java.util.logging.Logger; - -import static java.util.logging.Level.WARNING; -import static org.briarproject.bramble.util.IoUtils.tryToClose; - -@NotNullByDefault -class FileTransportReader implements TransportConnectionReader { - - private static final Logger LOG = - Logger.getLogger(FileTransportReader.class.getName()); - - private final File file; - private final InputStream in; - private final FilePlugin plugin; - - FileTransportReader(File file, InputStream in, FilePlugin plugin) { - this.file = file; - this.in = in; - this.plugin = plugin; - } - - @Override - public InputStream getInputStream() { - return in; - } - - @Override - public void dispose(boolean exception, boolean recognised) { - tryToClose(in, LOG, WARNING); - plugin.readerFinished(file, exception, recognised); - } -} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FileTransportWriter.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FileTransportWriter.java deleted file mode 100644 index 3dc6fc428..000000000 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/FileTransportWriter.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.briarproject.bramble.plugin.file; - -import org.briarproject.bramble.api.nullsafety.NotNullByDefault; -import org.briarproject.bramble.api.plugin.TransportConnectionWriter; - -import java.io.File; -import java.io.OutputStream; -import java.util.logging.Logger; - -import static java.util.logging.Level.WARNING; -import static org.briarproject.bramble.util.IoUtils.tryToClose; - -@NotNullByDefault -class FileTransportWriter implements TransportConnectionWriter { - - private static final Logger LOG = - Logger.getLogger(FileTransportWriter.class.getName()); - - private final File file; - private final OutputStream out; - private final FilePlugin plugin; - - FileTransportWriter(File file, OutputStream out, FilePlugin plugin) { - this.file = file; - this.out = out; - this.plugin = plugin; - } - - @Override - public long getMaxLatency() { - return plugin.getMaxLatency(); - } - - @Override - public int getMaxIdleTime() { - return plugin.getMaxIdleTime(); - } - - @Override - public boolean isLossyAndCheap() { - return plugin.isLossyAndCheap(); - } - - @Override - public OutputStream getOutputStream() { - return out; - } - - @Override - public void dispose(boolean exception) { - tryToClose(out, LOG, WARNING); - plugin.writerFinished(file, exception); - } -} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/MailboxPlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/MailboxPlugin.java new file mode 100644 index 000000000..a70e65708 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/MailboxPlugin.java @@ -0,0 +1,73 @@ +package org.briarproject.bramble.plugin.file; + +import org.briarproject.bramble.api.Pair; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.plugin.ConnectionHandler; +import org.briarproject.bramble.api.plugin.PluginCallback; +import org.briarproject.bramble.api.plugin.PluginException; +import org.briarproject.bramble.api.plugin.TransportId; +import org.briarproject.bramble.api.properties.TransportProperties; + +import java.util.Collection; + +import static org.briarproject.bramble.api.mailbox.MailboxConstants.ID; +import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; + +@NotNullByDefault +class MailboxPlugin extends FilePlugin { + + MailboxPlugin(PluginCallback callback, long maxLatency) { + super(callback, maxLatency); + } + + @Override + public TransportId getId() { + return ID; + } + + @Override + public int getMaxIdleTime() { + // Unused for simplex transports + throw new UnsupportedOperationException(); + } + + @Override + public void start() throws PluginException { + callback.pluginStateChanged(ACTIVE); + } + + @Override + public void stop() throws PluginException { + } + + @Override + public State getState() { + return ACTIVE; + } + + @Override + public int getReasonsDisabled() { + return 0; + } + + @Override + public boolean shouldPoll() { + return false; + } + + @Override + public int getPollingInterval() { + throw new UnsupportedOperationException(); + } + + @Override + public void poll( + Collection> properties) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isLossyAndCheap() { + return false; + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/MailboxPluginFactory.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/MailboxPluginFactory.java new file mode 100644 index 000000000..98bf72441 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/MailboxPluginFactory.java @@ -0,0 +1,39 @@ +package org.briarproject.bramble.plugin.file; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.plugin.PluginCallback; +import org.briarproject.bramble.api.plugin.TransportId; +import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin; +import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; + +import javax.annotation.Nullable; +import javax.inject.Inject; + +import static java.util.concurrent.TimeUnit.DAYS; +import static org.briarproject.bramble.api.mailbox.MailboxConstants.ID; + +@NotNullByDefault +public class MailboxPluginFactory implements SimplexPluginFactory { + + private static final long MAX_LATENCY = DAYS.toMillis(14); + + @Inject + MailboxPluginFactory() { + } + + @Override + public TransportId getId() { + return ID; + } + + @Override + public long getMaxLatency() { + return MAX_LATENCY; + } + + @Nullable + @Override + public SimplexPlugin createPlugin(PluginCallback callback) { + return new MailboxPlugin(callback, MAX_LATENCY); + } +} 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 e6682a751..e661cc290 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 @@ -27,6 +27,7 @@ import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; import org.briarproject.bramble.api.reporting.DevConfig; import org.briarproject.bramble.plugin.bluetooth.AndroidBluetoothPluginFactory; import org.briarproject.bramble.plugin.file.AndroidRemovableDrivePluginFactory; +import org.briarproject.bramble.plugin.file.MailboxPluginFactory; import org.briarproject.bramble.plugin.tcp.AndroidLanTcpPluginFactory; import org.briarproject.bramble.plugin.tor.AndroidTorPluginFactory; import org.briarproject.bramble.util.AndroidUtils; @@ -63,6 +64,7 @@ import org.briarproject.briar.api.test.TestAvatarCreator; import java.io.File; import java.security.GeneralSecurityException; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; @@ -76,7 +78,6 @@ import dagger.Provides; import static android.content.Context.MODE_PRIVATE; import static android.os.Build.VERSION.SDK_INT; import static java.util.Arrays.asList; -import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_CONTROL_PORT; @@ -190,7 +191,7 @@ public class AppModule { PluginConfig providePluginConfig(AndroidBluetoothPluginFactory bluetooth, AndroidTorPluginFactory tor, AndroidLanTcpPluginFactory lan, AndroidRemovableDrivePluginFactory drive, - FeatureFlags featureFlags) { + MailboxPluginFactory mailbox, FeatureFlags featureFlags) { @NotNullByDefault PluginConfig pluginConfig = new PluginConfig() { @@ -201,8 +202,10 @@ public class AppModule { @Override public Collection getSimplexFactories() { - if (SDK_INT >= 19) return singletonList(drive); - else return emptyList(); + List simplex = new ArrayList<>(); + if (featureFlags.shouldEnableMailbox()) simplex.add(mailbox); + if (SDK_INT >= 19) simplex.add(drive); + return simplex; } @Override