diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 7b9dcd72e..3d081536f 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -31,15 +31,6 @@
-
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/connection/ConnectionManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/connection/ConnectionManagerImpl.java
index 08542cac7..63e72cbb0 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/connection/ConnectionManagerImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/connection/ConnectionManagerImpl.java
@@ -76,7 +76,7 @@ class ConnectionManagerImpl implements ConnectionManager {
ioExecutor.execute(new IncomingDuplexSyncConnection(keyManager,
connectionRegistry, streamReaderFactory, streamWriterFactory,
syncSessionFactory, transportPropertyManager, ioExecutor,
- t, d));
+ t, d, handshakeManager));
}
@Override
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/connection/DuplexSyncConnection.java b/bramble-core/src/main/java/org/briarproject/bramble/connection/DuplexSyncConnection.java
index 33b90c68f..b833505f2 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/connection/DuplexSyncConnection.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/connection/DuplexSyncConnection.java
@@ -3,6 +3,7 @@ package org.briarproject.bramble.connection;
import org.briarproject.bramble.api.connection.ConnectionRegistry;
import org.briarproject.bramble.api.connection.InterruptibleConnection;
import org.briarproject.bramble.api.contact.ContactId;
+import org.briarproject.bramble.api.contact.HandshakeManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.TransportConnectionReader;
import org.briarproject.bramble.api.plugin.TransportConnectionWriter;
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/connection/IncomingDuplexSyncConnection.java b/bramble-core/src/main/java/org/briarproject/bramble/connection/IncomingDuplexSyncConnection.java
index abf34ca0f..b2fafcc4f 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/connection/IncomingDuplexSyncConnection.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/connection/IncomingDuplexSyncConnection.java
@@ -2,6 +2,8 @@ package org.briarproject.bramble.connection;
import org.briarproject.bramble.api.connection.ConnectionRegistry;
import org.briarproject.bramble.api.contact.ContactId;
+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.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.TransportId;
@@ -13,9 +15,11 @@ import org.briarproject.bramble.api.sync.SyncSessionFactory;
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.StreamWriter;
import org.briarproject.bramble.api.transport.StreamWriterFactory;
import java.io.IOException;
+import java.io.InputStream;
import java.util.concurrent.Executor;
import static java.util.logging.Level.WARNING;
@@ -24,6 +28,7 @@ import static org.briarproject.bramble.util.LogUtils.logException;
@NotNullByDefault
class IncomingDuplexSyncConnection extends DuplexSyncConnection
implements Runnable {
+ private final HandshakeManager handshakeManager;
IncomingDuplexSyncConnection(KeyManager keyManager,
ConnectionRegistry connectionRegistry,
@@ -32,10 +37,12 @@ class IncomingDuplexSyncConnection extends DuplexSyncConnection
SyncSessionFactory syncSessionFactory,
TransportPropertyManager transportPropertyManager,
Executor ioExecutor, TransportId transportId,
- DuplexTransportConnection connection) {
+ DuplexTransportConnection connection,
+ HandshakeManager handshakeManager) {
super(keyManager, connectionRegistry, streamReaderFactory,
streamWriterFactory, syncSessionFactory,
transportPropertyManager, ioExecutor, transportId, connection);
+ this.handshakeManager = handshakeManager;
}
@Override
@@ -54,10 +61,41 @@ class IncomingDuplexSyncConnection extends DuplexSyncConnection
return;
}
if (ctx.isHandshakeMode()) {
+
+ StreamContext ctxIn = ctx;
+ PendingContactId inPendingContactId = ctxIn.getPendingContactId();
+ if (inPendingContactId == null) {
+ LOG.warning("Expected rendezvous tag, got contact tag");
+ onReadError(true);
+ return;
+ }
+ // Allocate the outgoing stream context
+ StreamContext ctxOut =
+ allocateStreamContext(contactId, transportId);
+ if (ctxOut == null) {
+ LOG.warning("Could not allocate stream context");
+ onReadError(true);
+ return;
+ }
+ try {
+ InputStream in = streamReaderFactory.createStreamReader(
+ reader.getInputStream(), ctxIn);
+ // Flush the output stream to send the outgoing stream header
+ StreamWriter out = streamWriterFactory.createStreamWriter(
+ writer.getOutputStream(), ctxOut);
+ out.getOutputStream().flush();
+ HandshakeManager.HandshakeResult result =
+ handshakeManager.handshake(contactId, in, out);
+
+ return;
+ } catch (IOException | DbException e) {
+ logException(LOG, WARNING, e);
+ onReadError(true);
+ }
// TODO: Support handshake mode for contacts
- LOG.warning("Received handshake tag, expected rotation mode");
- onReadError(true);
- return;
+// LOG.warning("Received handshake tag, expected rotation mode");
+// onReadError(true);
+// return;
}
connectionRegistry.registerIncomingConnection(contactId, transportId,
this);