diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/DiscoveryHandler.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/DiscoveryHandler.java new file mode 100644 index 000000000..3c8dda96c --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/DiscoveryHandler.java @@ -0,0 +1,18 @@ +package org.briarproject.bramble.api.plugin; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.properties.TransportProperties; + +/** + * An interface for handling peers discovered by transport plugins. + */ +@NotNullByDefault +public interface DiscoveryHandler { + + /** + * Handles a peer discovered by a transport plugin. + * + * @param p A set of properties describing the discovered peer. + */ + void handleDevice(TransportProperties p); +} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/Plugin.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/Plugin.java index 9d2d50600..65566c2b8 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/Plugin.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/Plugin.java @@ -5,7 +5,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.settings.SettingsManager; -import java.util.Collection; +import java.util.List; @NotNullByDefault public interface Plugin { @@ -106,6 +106,5 @@ public interface Plugin { * Attempts to create connections using the given transport properties, * passing any created connections to the corresponding handlers. */ - void poll(Collection> - properties); + void poll(List> properties); } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/duplex/DuplexPlugin.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/duplex/DuplexPlugin.java index ce0e5787e..9522469b6 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/duplex/DuplexPlugin.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/duplex/DuplexPlugin.java @@ -1,14 +1,18 @@ package org.briarproject.bramble.api.plugin.duplex; +import org.briarproject.bramble.api.Pair; import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.keyagreement.KeyAgreementListener; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.ConnectionHandler; +import org.briarproject.bramble.api.plugin.DiscoveryHandler; import org.briarproject.bramble.api.plugin.Plugin; import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.rendezvous.KeyMaterialSource; import org.briarproject.bramble.api.rendezvous.RendezvousEndpoint; +import java.util.List; + import javax.annotation.Nullable; /** @@ -58,4 +62,16 @@ public interface DuplexPlugin extends Plugin { @Nullable RendezvousEndpoint createRendezvousEndpoint(KeyMaterialSource k, boolean alice, ConnectionHandler incoming); + + /** + * Returns true if the plugin supports peer discovery. + */ + boolean supportsDiscovery(); + + /** + * Attempts to discover peers using the given transport properties, passing + * any discovered peers to the corresponding handlers. + */ + void discoverPeers(List> + properties); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/PollerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/PollerImpl.java index 3a4f51c8d..3d13f6e75 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/PollerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/PollerImpl.java @@ -32,6 +32,7 @@ import java.security.SecureRandom; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.Executor; @@ -216,8 +217,8 @@ class PollerImpl implements Poller, EventListener { transportPropertyManager.getRemoteProperties(t); Collection connected = connectionRegistry.getConnectedContacts(t); - Collection> - properties = new ArrayList<>(); + List> properties = + new ArrayList<>(); for (Entry e : remote.entrySet()) { ContactId c = e.getKey(); if (!connected.contains(c)) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java index e42294f2b..1924b6771 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java @@ -15,6 +15,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.plugin.Backoff; import org.briarproject.bramble.api.plugin.ConnectionHandler; +import org.briarproject.bramble.api.plugin.DiscoveryHandler; import org.briarproject.bramble.api.plugin.PluginCallback; import org.briarproject.bramble.api.plugin.PluginException; import org.briarproject.bramble.api.plugin.TransportId; @@ -31,7 +32,7 @@ import org.briarproject.bramble.api.settings.event.SettingsUpdatedEvent; import java.io.IOException; import java.security.SecureRandom; -import java.util.Collection; +import java.util.List; import java.util.UUID; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; @@ -266,8 +267,8 @@ abstract class BluetoothPlugin implements DuplexPlugin, EventListener { } @Override - public void poll(Collection> - properties) { + public void poll( + List> properties) { if (getState() != ACTIVE) return; backoff.increment(); for (Pair p : properties) { @@ -411,6 +412,17 @@ abstract class BluetoothPlugin implements DuplexPlugin, EventListener { throw new UnsupportedOperationException(); } + @Override + public boolean supportsDiscovery() { + return false; + } + + @Override + public void discoverPeers( + List> properties) { + throw new UnsupportedOperationException(); + } + @Override public void eventOccurred(Event e) { if (e instanceof EnableBluetoothEvent) { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/TcpPlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/TcpPlugin.java index 4a8ea8753..ee0e61910 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/TcpPlugin.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/TcpPlugin.java @@ -2,16 +2,15 @@ package org.briarproject.bramble.plugin.tcp; import org.briarproject.bramble.PoliteExecutor; import org.briarproject.bramble.api.Pair; -import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.EventListener; -import org.briarproject.bramble.api.keyagreement.KeyAgreementListener; import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.plugin.Backoff; import org.briarproject.bramble.api.plugin.ConnectionHandler; +import org.briarproject.bramble.api.plugin.DiscoveryHandler; import org.briarproject.bramble.api.plugin.PluginCallback; import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin; import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection; @@ -221,8 +220,8 @@ abstract class TcpPlugin implements DuplexPlugin, EventListener { } @Override - public void poll(Collection> - properties) { + public void poll( + List> properties) { if (getState() != ACTIVE) return; backoff.increment(); for (Pair p : properties) { @@ -323,22 +322,6 @@ abstract class TcpPlugin implements DuplexPlugin, EventListener { } } - @Override - public boolean supportsKeyAgreement() { - return false; - } - - @Override - public KeyAgreementListener createKeyAgreementListener(byte[] commitment) { - throw new UnsupportedOperationException(); - } - - @Override - public DuplexTransportConnection createKeyAgreementConnection( - byte[] commitment, BdfList descriptor) { - throw new UnsupportedOperationException(); - } - @Override public boolean supportsRendezvous() { return false; @@ -350,6 +333,17 @@ abstract class TcpPlugin implements DuplexPlugin, EventListener { throw new UnsupportedOperationException(); } + @Override + public boolean supportsDiscovery() { + return false; + } + + @Override + public void discoverPeers( + List> properties) { + throw new UnsupportedOperationException(); + } + List getLocalInterfaceAddresses() { List addrs = new ArrayList<>(); for (NetworkInterface iface : getNetworkInterfaces()) { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/WanTcpPlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/WanTcpPlugin.java index 0f4643cf1..ba10d5781 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/WanTcpPlugin.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/WanTcpPlugin.java @@ -1,10 +1,13 @@ package org.briarproject.bramble.plugin.tcp; +import org.briarproject.bramble.api.data.BdfList; +import org.briarproject.bramble.api.keyagreement.KeyAgreementListener; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.plugin.Backoff; import org.briarproject.bramble.api.plugin.PluginCallback; import org.briarproject.bramble.api.plugin.TransportId; +import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection; import org.briarproject.bramble.api.properties.TransportProperties; import java.net.Inet4Address; @@ -42,6 +45,22 @@ class WanTcpPlugin extends TcpPlugin { return ID; } + @Override + public boolean supportsKeyAgreement() { + return false; + } + + @Override + public KeyAgreementListener createKeyAgreementListener(byte[] commitment) { + throw new UnsupportedOperationException(); + } + + @Override + public DuplexTransportConnection createKeyAgreementConnection( + byte[] commitment, BdfList descriptor) { + throw new UnsupportedOperationException(); + } + @Override protected List getLocalSocketAddresses() { // Use the same address and port as last time if available diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java index 66a869d0c..f5132b9ab 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java @@ -19,6 +19,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.plugin.Backoff; import org.briarproject.bramble.api.plugin.ConnectionHandler; +import org.briarproject.bramble.api.plugin.DiscoveryHandler; import org.briarproject.bramble.api.plugin.PluginCallback; import org.briarproject.bramble.api.plugin.PluginException; import org.briarproject.bramble.api.plugin.TorConstants; @@ -549,8 +550,8 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { } @Override - public void poll(Collection> - properties) { + public void poll( + List> properties) { if (getState() != ACTIVE) return; backoff.increment(); for (Pair p : properties) { @@ -684,6 +685,17 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { } } + @Override + public boolean supportsDiscovery() { + return false; + } + + @Override + public void discoverPeers( + List> properties) { + throw new UnsupportedOperationException(); + } + @Override public void circuitStatus(String status, String id, String path) { if (status.equals("BUILT") && diff --git a/bramble-core/src/test/java/org/briarproject/bramble/plugin/PollerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/plugin/PollerImplTest.java index 2cca5be44..90c1cf512 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/plugin/PollerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/plugin/PollerImplTest.java @@ -38,7 +38,7 @@ import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static org.briarproject.bramble.test.CollectionMatcher.collectionOf; +import static org.briarproject.bramble.test.ListMatcher.listOf; import static org.briarproject.bramble.test.PairMatcher.pairOf; import static org.briarproject.bramble.test.TestUtils.getContactId; import static org.briarproject.bramble.test.TestUtils.getTransportId; @@ -357,8 +357,8 @@ public class PollerImplTest extends BrambleMockTestCase { oneOf(connectionRegistry).getConnectedContacts(transportId); will(returnValue(emptyList())); // Poll the plugin - oneOf(plugin).poll(with(collectionOf( - pairOf(equal(properties), any(ConnectionHandler.class))))); + oneOf(plugin).poll(with(listOf(pairOf( + equal(properties), any(ConnectionHandler.class))))); }}); poller.eventOccurred(new TransportActiveEvent(transportId)); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/rendezvous/RendezvousPollerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/rendezvous/RendezvousPollerImplTest.java index 2232b7c0e..b602822e1 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/rendezvous/RendezvousPollerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/rendezvous/RendezvousPollerImplTest.java @@ -49,7 +49,7 @@ import static org.briarproject.bramble.api.contact.PendingContactState.OFFLINE; import static org.briarproject.bramble.api.contact.PendingContactState.WAITING_FOR_CONNECTION; import static org.briarproject.bramble.rendezvous.RendezvousConstants.POLLING_INTERVAL_MS; import static org.briarproject.bramble.rendezvous.RendezvousConstants.RENDEZVOUS_TIMEOUT_MS; -import static org.briarproject.bramble.test.CollectionMatcher.collectionOf; +import static org.briarproject.bramble.test.ListMatcher.listOf; import static org.briarproject.bramble.test.PairMatcher.pairOf; import static org.briarproject.bramble.test.TestUtils.getAgreementPrivateKey; import static org.briarproject.bramble.test.TestUtils.getAgreementPublicKey; @@ -196,7 +196,7 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase { oneOf(clock).currentTimeMillis(); will(returnValue(beforeExpiry)); oneOf(eventBus).broadcast(with(any(RendezvousPollEvent.class))); - oneOf(plugin).poll(with(collectionOf(pairOf( + oneOf(plugin).poll(with(listOf(pairOf( equal(transportProperties), any(ConnectionHandler.class))))); }}); @@ -248,7 +248,7 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase { oneOf(clock).currentTimeMillis(); will(returnValue(beforeExpiry)); oneOf(eventBus).broadcast(with(any(RendezvousPollEvent.class))); - oneOf(plugin).poll(with(collectionOf(pairOf( + oneOf(plugin).poll(with(listOf(pairOf( equal(transportProperties), any(ConnectionHandler.class))))); }}); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/CollectionMatcher.java b/bramble-core/src/test/java/org/briarproject/bramble/test/ListMatcher.java similarity index 60% rename from bramble-core/src/test/java/org/briarproject/bramble/test/CollectionMatcher.java rename to bramble-core/src/test/java/org/briarproject/bramble/test/ListMatcher.java index 365878217..a1f169f6e 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/test/CollectionMatcher.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/test/ListMatcher.java @@ -5,24 +5,24 @@ import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.Matcher; -import java.util.Collection; +import java.util.List; import javax.annotation.Nullable; @NotNullByDefault -public class CollectionMatcher extends BaseMatcher> { +public class ListMatcher extends BaseMatcher> { private final Matcher elementMatcher; - public CollectionMatcher(Matcher elementMatcher) { + public ListMatcher(Matcher elementMatcher) { this.elementMatcher = elementMatcher; } @Override public boolean matches(@Nullable Object item) { - if (!(item instanceof Collection)) return false; - Collection collection = (Collection) item; - for (Object element : collection) { + if (!(item instanceof List)) return false; + List list = (List) item; + for (Object element : list) { if (!elementMatcher.matches(element)) return false; } return true; @@ -33,7 +33,7 @@ public class CollectionMatcher extends BaseMatcher> { description.appendText("matches a collection"); } - public static CollectionMatcher collectionOf(Matcher t) { - return new CollectionMatcher<>(t); + public static ListMatcher listOf(Matcher t) { + return new ListMatcher<>(t); } } diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/modem/ModemPlugin.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/modem/ModemPlugin.java index 53a668f20..9f224a9d6 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/modem/ModemPlugin.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/modem/ModemPlugin.java @@ -7,6 +7,7 @@ import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.plugin.ConnectionHandler; +import org.briarproject.bramble.api.plugin.DiscoveryHandler; import org.briarproject.bramble.api.plugin.PluginCallback; import org.briarproject.bramble.api.plugin.PluginException; import org.briarproject.bramble.api.plugin.TransportId; @@ -20,7 +21,7 @@ import org.briarproject.bramble.api.rendezvous.RendezvousEndpoint; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.Collection; +import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; @@ -136,8 +137,8 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback { } @Override - public void poll(Collection> - properties) { + public void poll( + List> properties) { throw new UnsupportedOperationException(); } @@ -213,6 +214,17 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback { throw new UnsupportedOperationException(); } + @Override + public boolean supportsDiscovery() { + return false; + } + + @Override + public void discoverPeers( + List> properties) { + throw new UnsupportedOperationException(); + } + @Override public void incomingCallConnected() { LOG.info("Incoming call connected");