diff --git a/briar-core/src/net/sf/briar/invitation/AliceConnector.java b/briar-core/src/net/sf/briar/invitation/AliceConnector.java index 5e72fc30e291518365228744154fde7177d84c4a..ad49087a1d0c1a0374ee2ba3da920b80dce0b090 100644 --- a/briar-core/src/net/sf/briar/invitation/AliceConnector.java +++ b/briar-core/src/net/sf/briar/invitation/AliceConnector.java @@ -28,6 +28,7 @@ import net.sf.briar.api.serial.Reader; import net.sf.briar.api.serial.ReaderFactory; import net.sf.briar.api.serial.Writer; import net.sf.briar.api.serial.WriterFactory; +import net.sf.briar.api.transport.ConnectionDispatcher; import net.sf.briar.api.transport.ConnectionReader; import net.sf.briar.api.transport.ConnectionReaderFactory; import net.sf.briar.api.transport.ConnectionWriter; @@ -43,13 +44,15 @@ class AliceConnector extends Connector { ReaderFactory readerFactory, WriterFactory writerFactory, ConnectionReaderFactory connectionReaderFactory, ConnectionWriterFactory connectionWriterFactory, - AuthorFactory authorFactory, KeyManager keyManager, Clock clock, + AuthorFactory authorFactory, KeyManager keyManager, + ConnectionDispatcher connectionDispatcher, Clock clock, ConnectorGroup group, DuplexPlugin plugin, LocalAuthor localAuthor, Map<TransportId, TransportProperties> localProps, PseudoRandom random) { super(crypto, db, readerFactory, writerFactory, connectionReaderFactory, - connectionWriterFactory, authorFactory, keyManager, clock, - group, plugin, localAuthor, localProps, random); + connectionWriterFactory, authorFactory, keyManager, + connectionDispatcher, clock, group, plugin, localAuthor, + localProps, random); } @Override @@ -171,6 +174,7 @@ class AliceConnector extends Connector { if(LOG.isLoggable(INFO)) LOG.info(pluginName + " pseudonym exchange succeeded"); group.pseudonymExchangeSucceeded(remoteAuthor); - tryToClose(conn, false); + // Reuse the connection as an outgoing BTP connection + reuseConnection(conn, true); } } \ No newline at end of file diff --git a/briar-core/src/net/sf/briar/invitation/BobConnector.java b/briar-core/src/net/sf/briar/invitation/BobConnector.java index db759e3e17b180609ce2d9b0dd9a2e0ac5081cf0..a86b1ea01359756f3a289f795a3f620cd9f3dd46 100644 --- a/briar-core/src/net/sf/briar/invitation/BobConnector.java +++ b/briar-core/src/net/sf/briar/invitation/BobConnector.java @@ -28,6 +28,7 @@ import net.sf.briar.api.serial.Reader; import net.sf.briar.api.serial.ReaderFactory; import net.sf.briar.api.serial.Writer; import net.sf.briar.api.serial.WriterFactory; +import net.sf.briar.api.transport.ConnectionDispatcher; import net.sf.briar.api.transport.ConnectionReader; import net.sf.briar.api.transport.ConnectionReaderFactory; import net.sf.briar.api.transport.ConnectionWriter; @@ -43,13 +44,15 @@ class BobConnector extends Connector { ReaderFactory readerFactory, WriterFactory writerFactory, ConnectionReaderFactory connectionReaderFactory, ConnectionWriterFactory connectionWriterFactory, - AuthorFactory authorFactory, KeyManager keyManager, Clock clock, + AuthorFactory authorFactory, KeyManager keyManager, + ConnectionDispatcher connectionDispatcher, Clock clock, ConnectorGroup group, DuplexPlugin plugin, LocalAuthor localAuthor, Map<TransportId, TransportProperties> localProps, PseudoRandom random) { super(crypto, db, readerFactory, writerFactory, connectionReaderFactory, - connectionWriterFactory, authorFactory, keyManager, clock, - group, plugin, localAuthor, localProps, random); + connectionWriterFactory, authorFactory, keyManager, + connectionDispatcher, clock, group, plugin, localAuthor, + localProps, random); } @Override @@ -171,6 +174,7 @@ class BobConnector extends Connector { if(LOG.isLoggable(INFO)) LOG.info(pluginName + " pseudonym exchange succeeded"); group.pseudonymExchangeSucceeded(remoteAuthor); - tryToClose(conn, false); + // Reuse the connection as an incoming BTP connection + reuseConnection(conn, false); } } diff --git a/briar-core/src/net/sf/briar/invitation/Connector.java b/briar-core/src/net/sf/briar/invitation/Connector.java index e938f6f0cda5fa14a8cc50bd434a8efc01fb3701..e54f1518d8f430e779d3caaedababe9ea0ecc508 100644 --- a/briar-core/src/net/sf/briar/invitation/Connector.java +++ b/briar-core/src/net/sf/briar/invitation/Connector.java @@ -48,6 +48,7 @@ import net.sf.briar.api.serial.Reader; import net.sf.briar.api.serial.ReaderFactory; import net.sf.briar.api.serial.Writer; import net.sf.briar.api.serial.WriterFactory; +import net.sf.briar.api.transport.ConnectionDispatcher; import net.sf.briar.api.transport.ConnectionReaderFactory; import net.sf.briar.api.transport.ConnectionWriterFactory; import net.sf.briar.api.transport.Endpoint; @@ -65,6 +66,7 @@ abstract class Connector extends Thread { protected final ConnectionWriterFactory connectionWriterFactory; protected final AuthorFactory authorFactory; protected final KeyManager keyManager; + protected final ConnectionDispatcher connectionDispatcher; protected final Clock clock; protected final ConnectorGroup group; protected final DuplexPlugin plugin; @@ -77,11 +79,14 @@ abstract class Connector extends Thread { private final KeyParser keyParser; private final MessageDigest messageDigest; + private volatile ContactId contactId = null; + Connector(CryptoComponent crypto, DatabaseComponent db, ReaderFactory readerFactory, WriterFactory writerFactory, ConnectionReaderFactory connectionReaderFactory, ConnectionWriterFactory connectionWriterFactory, - AuthorFactory authorFactory, KeyManager keyManager, Clock clock, + AuthorFactory authorFactory, KeyManager keyManager, + ConnectionDispatcher connectionDispatcher, Clock clock, ConnectorGroup group, DuplexPlugin plugin, LocalAuthor localAuthor, Map<TransportId, TransportProperties> localProps, PseudoRandom random) { @@ -94,6 +99,7 @@ abstract class Connector extends Thread { this.connectionWriterFactory = connectionWriterFactory; this.authorFactory = authorFactory; this.keyManager = keyManager; + this.connectionDispatcher = connectionDispatcher; this.clock = clock; this.group = group; this.plugin = plugin; @@ -275,11 +281,11 @@ abstract class Connector extends Thread { Map<TransportId, TransportProperties> remoteProps, byte[] secret, long epoch, boolean alice) throws DbException { // Add the contact to the database - ContactId c = db.addContact(remoteAuthor, localAuthor.getId()); + contactId = db.addContact(remoteAuthor, localAuthor.getId()); // Add a positive rating for the contact's pseudonym db.setRating(remoteAuthor.getId(), GOOD); // Store the remote transport properties - db.setRemoteProperties(c, remoteProps); + db.setRemoteProperties(contactId, remoteProps); // Create an endpoint for each transport shared with the contact List<TransportId> ids = new ArrayList<TransportId>(); for(TransportId id : localProps.keySet()) @@ -288,7 +294,7 @@ abstract class Connector extends Thread { Collections.sort(ids, TransportIdComparator.INSTANCE); int size = ids.size(); for(int i = 0; i < size; i++) { - Endpoint ep = new Endpoint(c, ids.get(i), epoch, alice); + Endpoint ep = new Endpoint(contactId, ids.get(i), epoch, alice); try { db.addEndpoint(ep); } catch(NoSuchTransportException e) { @@ -308,6 +314,15 @@ abstract class Connector extends Thread { } } + protected void reuseConnection(DuplexTransportConnection conn, + boolean alice) { + if(contactId == null) throw new IllegalStateException(); + TransportId t = plugin.getId(); + if(alice) + connectionDispatcher.dispatchOutgoingConnection(contactId, t, conn); + else connectionDispatcher.dispatchIncomingConnection(t, conn); + } + private static class TransportIdComparator implements Comparator<TransportId> { diff --git a/briar-core/src/net/sf/briar/invitation/ConnectorGroup.java b/briar-core/src/net/sf/briar/invitation/ConnectorGroup.java index cc0602789d4cba4e5976f69fddf935a03e074de4..a96b1b556e94adab2fd6c16cb44a25f8f5b5dc6d 100644 --- a/briar-core/src/net/sf/briar/invitation/ConnectorGroup.java +++ b/briar-core/src/net/sf/briar/invitation/ConnectorGroup.java @@ -31,6 +31,7 @@ import net.sf.briar.api.plugins.PluginManager; import net.sf.briar.api.plugins.duplex.DuplexPlugin; import net.sf.briar.api.serial.ReaderFactory; import net.sf.briar.api.serial.WriterFactory; +import net.sf.briar.api.transport.ConnectionDispatcher; import net.sf.briar.api.transport.ConnectionReaderFactory; import net.sf.briar.api.transport.ConnectionWriterFactory; @@ -48,6 +49,7 @@ class ConnectorGroup extends Thread implements InvitationTask { private final ConnectionWriterFactory connectionWriterFactory; private final AuthorFactory authorFactory; private final KeyManager keyManager; + private final ConnectionDispatcher connectionDispatcher; private final Clock clock; private final PluginManager pluginManager; private final AuthorId localAuthorId; @@ -72,7 +74,8 @@ class ConnectorGroup extends Thread implements InvitationTask { ReaderFactory readerFactory, WriterFactory writerFactory, ConnectionReaderFactory connectionReaderFactory, ConnectionWriterFactory connectionWriterFactory, - AuthorFactory authorFactory, KeyManager keyManager, Clock clock, + AuthorFactory authorFactory, KeyManager keyManager, + ConnectionDispatcher connectionDispatcher, Clock clock, PluginManager pluginManager, AuthorId localAuthorId, int localInvitationCode, int remoteInvitationCode) { super("ConnectorGroup"); @@ -84,6 +87,7 @@ class ConnectorGroup extends Thread implements InvitationTask { this.connectionWriterFactory = connectionWriterFactory; this.authorFactory = authorFactory; this.keyManager = keyManager; + this.connectionDispatcher = connectionDispatcher; this.clock = clock; this.pluginManager = pluginManager; this.localAuthorId = localAuthorId; @@ -167,8 +171,8 @@ class ConnectorGroup extends Thread implements InvitationTask { remoteInvitationCode); return new AliceConnector(crypto, db, readerFactory, writerFactory, connectionReaderFactory, connectionWriterFactory, authorFactory, - keyManager, clock, this, plugin, localAuthor, localProps, - random); + keyManager, connectionDispatcher, clock, this, plugin, + localAuthor, localProps, random); } private Connector createBobConnector(DuplexPlugin plugin, @@ -178,8 +182,8 @@ class ConnectorGroup extends Thread implements InvitationTask { localInvitationCode); return new BobConnector(crypto, db, readerFactory, writerFactory, connectionReaderFactory, connectionWriterFactory, authorFactory, - keyManager, clock, this, plugin, localAuthor, localProps, - random); + keyManager, connectionDispatcher, clock, this, plugin, + localAuthor, localProps, random); } public void localConfirmationSucceeded() { diff --git a/briar-core/src/net/sf/briar/invitation/InvitationTaskFactoryImpl.java b/briar-core/src/net/sf/briar/invitation/InvitationTaskFactoryImpl.java index 62ffa37cf2b11a5ed12e01c41c7bd907d0ba2afa..66d5d649f43568852b83ff043dde0a88fb6a596c 100644 --- a/briar-core/src/net/sf/briar/invitation/InvitationTaskFactoryImpl.java +++ b/briar-core/src/net/sf/briar/invitation/InvitationTaskFactoryImpl.java @@ -11,6 +11,7 @@ import net.sf.briar.api.invitation.InvitationTaskFactory; import net.sf.briar.api.plugins.PluginManager; import net.sf.briar.api.serial.ReaderFactory; import net.sf.briar.api.serial.WriterFactory; +import net.sf.briar.api.transport.ConnectionDispatcher; import net.sf.briar.api.transport.ConnectionReaderFactory; import net.sf.briar.api.transport.ConnectionWriterFactory; @@ -26,6 +27,7 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory { private final ConnectionWriterFactory connectionWriterFactory; private final AuthorFactory authorFactory; private final KeyManager keyManager; + private final ConnectionDispatcher connectionDispatcher; private final Clock clock; private final PluginManager pluginManager; @@ -34,7 +36,8 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory { ReaderFactory readerFactory, WriterFactory writerFactory, ConnectionReaderFactory connectionReaderFactory, ConnectionWriterFactory connectionWriterFactory, - AuthorFactory authorFactory, KeyManager keyManager, Clock clock, + AuthorFactory authorFactory, KeyManager keyManager, + ConnectionDispatcher connectionDispatcher, Clock clock, PluginManager pluginManager) { this.crypto = crypto; this.db = db; @@ -44,6 +47,7 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory { this.connectionWriterFactory = connectionWriterFactory; this.authorFactory = authorFactory; this.keyManager = keyManager; + this.connectionDispatcher = connectionDispatcher; this.clock = clock; this.pluginManager = pluginManager; } @@ -52,7 +56,7 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory { int remoteCode) { return new ConnectorGroup(crypto, db, readerFactory, writerFactory, connectionReaderFactory, connectionWriterFactory, - authorFactory, keyManager, clock, pluginManager, localAuthorId, - localCode, remoteCode); + authorFactory, keyManager, connectionDispatcher, clock, + pluginManager, localAuthorId, localCode, remoteCode); } }