Reuse invitation connections as BTP connections. Fixes issue #3611916.

This commit is contained in:
akwizgran
2013-05-01 14:59:31 +01:00
parent eeb1ce27ab
commit 48396262d7
5 changed files with 51 additions and 20 deletions

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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> {

View File

@@ -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() {

View File

@@ -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);
}
}