mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-13 19:29:06 +01:00
Reuse invitation connections as BTP connections. Fixes issue #3611916.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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> {
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user