diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPluginFactory.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPluginFactory.java index 96f094d72..b7c7e5731 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPluginFactory.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPluginFactory.java @@ -47,7 +47,7 @@ public class AndroidBluetoothPluginFactory implements DuplexPluginFactory { private final BackoffFactory backoffFactory; @Inject - public AndroidBluetoothPluginFactory(@IoExecutor Executor ioExecutor, + AndroidBluetoothPluginFactory(@IoExecutor Executor ioExecutor, @WakefulIoExecutor Executor wakefulIoExecutor, AndroidExecutor androidExecutor, AndroidWakeLockManager wakeLockManager, diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPluginFactory.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPluginFactory.java index beedd97a4..01922de50 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPluginFactory.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPluginFactory.java @@ -37,7 +37,7 @@ public class AndroidLanTcpPluginFactory implements DuplexPluginFactory { private final Application app; @Inject - public AndroidLanTcpPluginFactory(@IoExecutor Executor ioExecutor, + AndroidLanTcpPluginFactory(@IoExecutor Executor ioExecutor, @WakefulIoExecutor Executor wakefulIoExecutor, EventBus eventBus, BackoffFactory backoffFactory, diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPluginFactory.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPluginFactory.java index 2a8bedfff..87552ed73 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPluginFactory.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPluginFactory.java @@ -58,7 +58,7 @@ public class AndroidTorPluginFactory implements DuplexPluginFactory { private final File torDirectory; @Inject - public AndroidTorPluginFactory(@IoExecutor Executor ioExecutor, + AndroidTorPluginFactory(@IoExecutor Executor ioExecutor, @WakefulIoExecutor Executor wakefulIoExecutor, Application app, NetworkManager networkManager, diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/RemovableDriveConstants.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/RemovableDriveConstants.java new file mode 100644 index 000000000..d9798721e --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/RemovableDriveConstants.java @@ -0,0 +1,6 @@ +package org.briarproject.bramble.api.plugin; + +public interface RemovableDriveConstants { + + TransportId ID = new TransportId("org.briarproject.bramble.drive"); +} 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 new file mode 100644 index 000000000..3fdc9c908 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/AbstractRemovableDrivePlugin.java @@ -0,0 +1,114 @@ +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.TransportConnectionReader; +import org.briarproject.bramble.api.plugin.TransportConnectionWriter; +import org.briarproject.bramble.api.plugin.TransportId; +import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin; +import org.briarproject.bramble.api.properties.TransportProperties; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Collection; +import java.util.logging.Logger; + +import javax.annotation.concurrent.Immutable; + +import static java.util.logging.Level.WARNING; +import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; +import static org.briarproject.bramble.api.plugin.RemovableDriveConstants.ID; +import static org.briarproject.bramble.util.LogUtils.logException; + +@Immutable +@NotNullByDefault +abstract class AbstractRemovableDrivePlugin implements SimplexPlugin { + + private static final Logger LOG = + getLogger(AbstractRemovableDrivePlugin.class.getName()); + + private final int maxLatency; + + abstract InputStream openInputStream(TransportProperties p) + throws IOException; + + abstract OutputStream openOutputStream(TransportProperties p) + throws IOException; + + AbstractRemovableDrivePlugin(int maxLatency) { + this.maxLatency = maxLatency; + } + + @Override + public TransportId getId() { + return ID; + } + + @Override + public int getMaxLatency() { + return maxLatency; + } + + @Override + public int getMaxIdleTime() { + // Unused for simplex transports + throw new UnsupportedOperationException(); + } + + @Override + public void start() { + } + + @Override + public void stop() { + } + + @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 TransportConnectionReader createReader(TransportProperties p) { + try { + return new TransportInputStreamReader(openInputStream(p)); + } catch (IOException e) { + logException(LOG, WARNING, e); + return null; + } + } + + @Override + public TransportConnectionWriter createWriter(TransportProperties p) { + try { + return new TransportOutputStreamWriter(this, openOutputStream(p)); + } catch (IOException e) { + logException(LOG, WARNING, e); + return null; + } + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDrivePlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDrivePlugin.java new file mode 100644 index 000000000..b59f4f85f --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDrivePlugin.java @@ -0,0 +1,38 @@ +package org.briarproject.bramble.plugin.file; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.properties.TransportProperties; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import javax.annotation.concurrent.Immutable; + +import static org.briarproject.bramble.api.plugin.FileConstants.PROP_PATH; +import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty; + +@Immutable +@NotNullByDefault +class RemovableDrivePlugin extends AbstractRemovableDrivePlugin { + + RemovableDrivePlugin(int maxLatency) { + super(maxLatency); + } + + @Override + InputStream openInputStream(TransportProperties p) throws IOException { + String path = p.get(PROP_PATH); + if (isNullOrEmpty(path)) throw new IllegalArgumentException(); + return new FileInputStream(path); + } + + @Override + OutputStream openOutputStream(TransportProperties p) throws IOException { + String path = p.get(PROP_PATH); + if (isNullOrEmpty(path)) throw new IllegalArgumentException(); + return new FileOutputStream(path); + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDrivePluginFactory.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDrivePluginFactory.java new file mode 100644 index 000000000..5d833805d --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDrivePluginFactory.java @@ -0,0 +1,41 @@ +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.annotation.concurrent.Immutable; +import javax.inject.Inject; + +import static java.util.concurrent.TimeUnit.DAYS; +import static org.briarproject.bramble.api.plugin.RemovableDriveConstants.ID; + +@Immutable +@NotNullByDefault +public class RemovableDrivePluginFactory implements SimplexPluginFactory { + + private final int MAX_LATENCY = (int) DAYS.toMillis(14); + + @Inject + RemovableDrivePluginFactory() { + } + + @Override + public TransportId getId() { + return ID; + } + + @Override + public int getMaxLatency() { + return MAX_LATENCY; + } + + @Nullable + @Override + public SimplexPlugin createPlugin(PluginCallback callback) { + return new RemovableDrivePlugin(MAX_LATENCY); + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportInputStreamReader.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportInputStreamReader.java new file mode 100644 index 000000000..8971136c9 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportInputStreamReader.java @@ -0,0 +1,34 @@ +package org.briarproject.bramble.plugin.file; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.plugin.TransportConnectionReader; + +import java.io.InputStream; +import java.util.logging.Logger; + +import static java.util.logging.Level.WARNING; +import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.util.IoUtils.tryToClose; + +@NotNullByDefault +class TransportInputStreamReader implements TransportConnectionReader { + + private static final Logger LOG = + getLogger(TransportInputStreamReader.class.getName()); + + private final InputStream in; + + TransportInputStreamReader(InputStream in) { + this.in = in; + } + + @Override + public InputStream getInputStream() { + return in; + } + + @Override + public void dispose(boolean exception, boolean recognised) { + tryToClose(in, LOG, WARNING); + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportOutputStreamWriter.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportOutputStreamWriter.java new file mode 100644 index 000000000..be40fbca0 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/TransportOutputStreamWriter.java @@ -0,0 +1,47 @@ +package org.briarproject.bramble.plugin.file; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.plugin.Plugin; +import org.briarproject.bramble.api.plugin.TransportConnectionWriter; + +import java.io.OutputStream; +import java.util.logging.Logger; + +import static java.util.logging.Level.WARNING; +import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.util.IoUtils.tryToClose; + +@NotNullByDefault +class TransportOutputStreamWriter implements TransportConnectionWriter { + + private static final Logger LOG = + getLogger(TransportOutputStreamWriter.class.getName()); + + private final Plugin plugin; + private final OutputStream out; + + TransportOutputStreamWriter(Plugin plugin, OutputStream out) { + this.plugin = plugin; + this.out = out; + } + + @Override + public int getMaxLatency() { + return plugin.getMaxLatency(); + } + + @Override + public int getMaxIdleTime() { + return plugin.getMaxIdleTime(); + } + + @Override + public OutputStream getOutputStream() { + return out; + } + + @Override + public void dispose(boolean exception) { + tryToClose(out, LOG, WARNING); + } +} diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/DesktopPluginModule.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/DesktopPluginModule.java deleted file mode 100644 index 6a33b933a..000000000 --- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/DesktopPluginModule.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.briarproject.bramble.plugin; - -import org.briarproject.bramble.api.nullsafety.NotNullByDefault; -import org.briarproject.bramble.api.plugin.BluetoothConstants; -import org.briarproject.bramble.api.plugin.LanTcpConstants; -import org.briarproject.bramble.api.plugin.PluginConfig; -import org.briarproject.bramble.api.plugin.TransportId; -import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; -import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; -import org.briarproject.bramble.plugin.bluetooth.JavaBluetoothPluginFactory; -import org.briarproject.bramble.plugin.modem.ModemPluginFactory; -import org.briarproject.bramble.plugin.tcp.LanTcpPluginFactory; -import org.briarproject.bramble.plugin.tcp.WanTcpPluginFactory; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import dagger.Module; -import dagger.Provides; - -import static java.util.Arrays.asList; -import static java.util.Collections.emptyList; -import static java.util.Collections.singletonList; -import static java.util.Collections.singletonMap; - -@Module -public class DesktopPluginModule extends PluginModule { - - @Provides - PluginConfig getPluginConfig(JavaBluetoothPluginFactory bluetooth, - ModemPluginFactory modem, LanTcpPluginFactory lan, - WanTcpPluginFactory wan) { - @NotNullByDefault - PluginConfig pluginConfig = new PluginConfig() { - - @Override - public Collection getDuplexFactories() { - return asList(bluetooth, modem, lan, wan); - } - - @Override - public Collection getSimplexFactories() { - return emptyList(); - } - - @Override - public boolean shouldPoll() { - return true; - } - - @Override - public Map> getTransportPreferences() { - // Prefer LAN to Bluetooth - return singletonMap(BluetoothConstants.ID, - singletonList(LanTcpConstants.ID)); - } - }; - return pluginConfig; - } -} diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java index d5efba41c..e621ad1dd 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java @@ -55,7 +55,7 @@ public class UnixTorPluginFactory implements DuplexPluginFactory { private final File torDirectory; @Inject - public UnixTorPluginFactory(@IoExecutor Executor ioExecutor, + UnixTorPluginFactory(@IoExecutor Executor ioExecutor, @IoExecutor Executor wakefulIoExecutor, NetworkManager networkManager, LocationUtils locationUtils, 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 1eeded75f..634c984b8 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 @@ -149,6 +149,7 @@ public class AppModule { } @Provides + @Singleton PluginConfig providePluginConfig(AndroidBluetoothPluginFactory bluetooth, AndroidTorPluginFactory tor, AndroidLanTcpPluginFactory lan) { @NotNullByDefault diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt index 58c217d4a..90afe01c5 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt @@ -74,6 +74,7 @@ internal class HeadlessModule(private val appDir: File) { } @Provides + @Singleton internal fun providePluginConfig(tor: UnixTorPluginFactory): PluginConfig { val duplex: List = if (isLinux() || isMac()) listOf(tor) else emptyList() diff --git a/briar-headless/src/test/java/org/briarproject/briar/headless/HeadlessTestModule.kt b/briar-headless/src/test/java/org/briarproject/briar/headless/HeadlessTestModule.kt index c76212827..f31caf2e3 100644 --- a/briar-headless/src/test/java/org/briarproject/briar/headless/HeadlessTestModule.kt +++ b/briar-headless/src/test/java/org/briarproject/briar/headless/HeadlessTestModule.kt @@ -64,6 +64,7 @@ internal class HeadlessTestModule(private val appDir: File) { } @Provides + @Singleton internal fun providePluginConfig(): PluginConfig { return object : PluginConfig { override fun getDuplexFactories(): Collection = emptyList()