diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/Connection.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/Connection.java index e1dd8cf57..39a7d6226 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/Connection.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/Connection.java @@ -1,10 +1,13 @@ package org.briarproject.bramble.plugin; +import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.ConnectionRegistry; 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.transport.KeyManager; +import org.briarproject.bramble.api.transport.StreamContext; import org.briarproject.bramble.api.transport.StreamReaderFactory; import org.briarproject.bramble.api.transport.StreamWriterFactory; @@ -12,6 +15,8 @@ import java.io.IOException; import java.io.InputStream; import java.util.logging.Logger; +import javax.annotation.Nullable; + import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENGTH; @@ -37,7 +42,20 @@ abstract class Connection { this.streamWriterFactory = streamWriterFactory; } - byte[] readTag(InputStream in) throws IOException { + @Nullable + StreamContext recogniseTag(TransportConnectionReader reader, + TransportId transportId) { + StreamContext ctx; + try { + byte[] tag = readTag(reader.getInputStream()); + return keyManager.getStreamContext(transportId, tag); + } catch (IOException | DbException e) { + logException(LOG, WARNING, e); + return null; + } + } + + private byte[] readTag(InputStream in) throws IOException { byte[] tag = new byte[TAG_LENGTH]; read(in, tag); return tag; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/HandshakeConnection.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/HandshakeConnection.java index 1e3f672fa..15ddf644d 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/HandshakeConnection.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/HandshakeConnection.java @@ -3,6 +3,7 @@ package org.briarproject.bramble.plugin; import org.briarproject.bramble.api.contact.ContactExchangeManager; import org.briarproject.bramble.api.contact.HandshakeManager; import org.briarproject.bramble.api.contact.PendingContactId; +import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.plugin.ConnectionManager; import org.briarproject.bramble.api.plugin.ConnectionRegistry; import org.briarproject.bramble.api.plugin.TransportConnectionReader; @@ -10,9 +11,15 @@ import org.briarproject.bramble.api.plugin.TransportConnectionWriter; import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection; import org.briarproject.bramble.api.transport.KeyManager; +import org.briarproject.bramble.api.transport.StreamContext; import org.briarproject.bramble.api.transport.StreamReaderFactory; import org.briarproject.bramble.api.transport.StreamWriterFactory; +import javax.annotation.Nullable; + +import static java.util.logging.Level.WARNING; +import static org.briarproject.bramble.util.LogUtils.logException; + abstract class HandshakeConnection extends Connection { final HandshakeManager handshakeManager; @@ -45,6 +52,17 @@ abstract class HandshakeConnection extends Connection { writer = connection.getWriter(); } + @Nullable + StreamContext allocateStreamContext(PendingContactId pendingContactId, + TransportId transportId) { + try { + return keyManager.getStreamContext(pendingContactId, transportId); + } catch (DbException e) { + logException(LOG, WARNING, e); + return null; + } + } + void onError(boolean recognised) { disposeOnError(reader, recognised); disposeOnError(writer); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/IncomingDuplexSyncConnection.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/IncomingDuplexSyncConnection.java index 2a50ab151..62739b97c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/IncomingDuplexSyncConnection.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/IncomingDuplexSyncConnection.java @@ -38,15 +38,7 @@ class IncomingDuplexSyncConnection extends DuplexSyncConnection @Override public void run() { // Read and recognise the tag - StreamContext ctx; - try { - byte[] tag = readTag(reader.getInputStream()); - ctx = keyManager.getStreamContext(transportId, tag); - } catch (IOException | DbException e) { - logException(LOG, WARNING, e); - onReadError(false); - return; - } + StreamContext ctx = recogniseTag(reader, transportId); if (ctx == null) { LOG.info("Unrecognised tag"); onReadError(false); @@ -88,14 +80,7 @@ class IncomingDuplexSyncConnection extends DuplexSyncConnection private void runOutgoingSession(ContactId contactId) { // Allocate a stream context - StreamContext ctx; - try { - ctx = keyManager.getStreamContext(contactId, transportId); - } catch (DbException e) { - logException(LOG, WARNING, e); - onWriteError(); - return; - } + StreamContext ctx = allocateStreamContext(contactId, transportId); if (ctx == null) { LOG.warning("Could not allocate stream context"); onWriteError(); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/IncomingHandshakeConnection.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/IncomingHandshakeConnection.java index a0e4db535..0a500c69d 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/IncomingHandshakeConnection.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/IncomingHandshakeConnection.java @@ -41,15 +41,7 @@ class IncomingHandshakeConnection extends HandshakeConnection @Override public void run() { // Read and recognise the tag - StreamContext ctxIn; - try { - byte[] tag = readTag(reader.getInputStream()); - ctxIn = keyManager.getStreamContext(transportId, tag); - } catch (IOException | DbException e) { - logException(LOG, WARNING, e); - onError(false); - return; - } + StreamContext ctxIn = recogniseTag(reader, transportId); if (ctxIn == null) { LOG.info("Unrecognised tag"); onError(false); @@ -62,14 +54,8 @@ class IncomingHandshakeConnection extends HandshakeConnection return; } // Allocate the outgoing stream context - StreamContext ctxOut; - try { - ctxOut = keyManager.getStreamContext(pendingContactId, transportId); - } catch (DbException e) { - logException(LOG, WARNING, e); - onError(true); - return; - } + StreamContext ctxOut = + allocateStreamContext(pendingContactId, transportId); if (ctxOut == null) { LOG.warning("Could not allocate stream context"); onError(true); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/IncomingSimplexSyncConnection.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/IncomingSimplexSyncConnection.java index 2011412ae..c782595e7 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/IncomingSimplexSyncConnection.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/IncomingSimplexSyncConnection.java @@ -1,7 +1,6 @@ package org.briarproject.bramble.plugin; import org.briarproject.bramble.api.contact.ContactId; -import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.ConnectionRegistry; import org.briarproject.bramble.api.plugin.TransportConnectionReader; @@ -41,15 +40,7 @@ class IncomingSimplexSyncConnection extends SyncConnection implements Runnable { @Override public void run() { // Read and recognise the tag - StreamContext ctx; - try { - byte[] tag = readTag(reader.getInputStream()); - ctx = keyManager.getStreamContext(transportId, tag); - } catch (IOException | DbException e) { - logException(LOG, WARNING, e); - onError(false); - return; - } + StreamContext ctx = recogniseTag(reader, transportId); if (ctx == null) { LOG.info("Unrecognised tag"); onError(false); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/OutgoingDuplexSyncConnection.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/OutgoingDuplexSyncConnection.java index bc4aebcce..e0b3218b0 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/OutgoingDuplexSyncConnection.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/OutgoingDuplexSyncConnection.java @@ -41,14 +41,7 @@ class OutgoingDuplexSyncConnection extends DuplexSyncConnection @Override public void run() { // Allocate a stream context - StreamContext ctx; - try { - ctx = keyManager.getStreamContext(contactId, transportId); - } catch (DbException e) { - logException(LOG, WARNING, e); - onWriteError(); - return; - } + StreamContext ctx = allocateStreamContext(contactId, transportId); if (ctx == null) { LOG.warning("Could not allocate stream context"); onWriteError(); @@ -76,15 +69,7 @@ class OutgoingDuplexSyncConnection extends DuplexSyncConnection private void runIncomingSession() { // Read and recognise the tag - StreamContext ctx; - try { - byte[] tag = readTag(reader.getInputStream()); - ctx = keyManager.getStreamContext(transportId, tag); - } catch (IOException | DbException e) { - logException(LOG, WARNING, e); - onReadError(); - return; - } + StreamContext ctx = recogniseTag(reader, transportId); // Unrecognised tags are suspicious in this case if (ctx == null) { LOG.warning("Unrecognised tag for returning stream"); @@ -109,8 +94,7 @@ class OutgoingDuplexSyncConnection extends DuplexSyncConnection onReadError(); return; } - connectionRegistry.registerConnection(contactId, transportId, - false); + connectionRegistry.registerConnection(contactId, transportId, false); try { // Store any transport properties discovered from the connection transportPropertyManager.addRemotePropertiesFromConnection( diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/OutgoingHandshakeConnection.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/OutgoingHandshakeConnection.java index e9aeb9ff7..3a78c0a92 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/OutgoingHandshakeConnection.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/OutgoingHandshakeConnection.java @@ -44,14 +44,8 @@ class OutgoingHandshakeConnection extends HandshakeConnection @Override public void run() { // Allocate the outgoing stream context - StreamContext ctxOut; - try { - ctxOut = keyManager.getStreamContext(pendingContactId, transportId); - } catch (DbException e) { - logException(LOG, WARNING, e); - onError(); - return; - } + StreamContext ctxOut = + allocateStreamContext(pendingContactId, transportId); if (ctxOut == null) { LOG.warning("Could not allocate stream context"); onError(); @@ -69,15 +63,7 @@ class OutgoingHandshakeConnection extends HandshakeConnection return; } // Read and recognise the tag - StreamContext ctxIn; - try { - byte[] tag = readTag(reader.getInputStream()); - ctxIn = keyManager.getStreamContext(transportId, tag); - } catch (IOException | DbException e) { - logException(LOG, WARNING, e); - onError(); - return; - } + StreamContext ctxIn = recogniseTag(reader, transportId); // Unrecognised tags are suspicious in this case if (ctxIn == null) { LOG.warning("Unrecognised tag for returning stream"); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/OutgoingSimplexSyncConnection.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/OutgoingSimplexSyncConnection.java index 0df604f7c..300c25f23 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/OutgoingSimplexSyncConnection.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/OutgoingSimplexSyncConnection.java @@ -1,7 +1,6 @@ package org.briarproject.bramble.plugin; import org.briarproject.bramble.api.contact.ContactId; -import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.ConnectionRegistry; import org.briarproject.bramble.api.plugin.TransportConnectionWriter; @@ -47,14 +46,7 @@ class OutgoingSimplexSyncConnection extends SyncConnection implements Runnable { @Override public void run() { // Allocate a stream context - StreamContext ctx; - try { - ctx = keyManager.getStreamContext(contactId, transportId); - } catch (DbException e) { - logException(LOG, WARNING, e); - onError(); - return; - } + StreamContext ctx = allocateStreamContext(contactId, transportId); if (ctx == null) { LOG.warning("Could not allocate stream context"); onError(); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/SyncConnection.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/SyncConnection.java index 8e668b814..d603fd5d4 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/SyncConnection.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/SyncConnection.java @@ -1,9 +1,11 @@ package org.briarproject.bramble.plugin; import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.ConnectionRegistry; import org.briarproject.bramble.api.plugin.TransportConnectionReader; +import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.properties.TransportPropertyManager; import org.briarproject.bramble.api.sync.SyncSession; import org.briarproject.bramble.api.sync.SyncSessionFactory; @@ -15,7 +17,11 @@ import org.briarproject.bramble.api.transport.StreamWriterFactory; import java.io.IOException; import java.io.InputStream; +import javax.annotation.Nullable; + +import static java.util.logging.Level.WARNING; import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull; +import static org.briarproject.bramble.util.LogUtils.logException; @NotNullByDefault class SyncConnection extends Connection { @@ -34,6 +40,17 @@ class SyncConnection extends Connection { this.transportPropertyManager = transportPropertyManager; } + @Nullable + StreamContext allocateStreamContext(ContactId contactId, + TransportId transportId) { + try { + return keyManager.getStreamContext(contactId, transportId); + } catch (DbException e) { + logException(LOG, WARNING, e); + return null; + } + } + SyncSession createIncomingSession(StreamContext ctx, TransportConnectionReader r) throws IOException { InputStream streamReader = streamReaderFactory.createStreamReader(