mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-20 22:59:54 +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.ReaderFactory;
|
||||||
import net.sf.briar.api.serial.Writer;
|
import net.sf.briar.api.serial.Writer;
|
||||||
import net.sf.briar.api.serial.WriterFactory;
|
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.ConnectionReader;
|
||||||
import net.sf.briar.api.transport.ConnectionReaderFactory;
|
import net.sf.briar.api.transport.ConnectionReaderFactory;
|
||||||
import net.sf.briar.api.transport.ConnectionWriter;
|
import net.sf.briar.api.transport.ConnectionWriter;
|
||||||
@@ -43,13 +44,15 @@ class AliceConnector extends Connector {
|
|||||||
ReaderFactory readerFactory, WriterFactory writerFactory,
|
ReaderFactory readerFactory, WriterFactory writerFactory,
|
||||||
ConnectionReaderFactory connectionReaderFactory,
|
ConnectionReaderFactory connectionReaderFactory,
|
||||||
ConnectionWriterFactory connectionWriterFactory,
|
ConnectionWriterFactory connectionWriterFactory,
|
||||||
AuthorFactory authorFactory, KeyManager keyManager, Clock clock,
|
AuthorFactory authorFactory, KeyManager keyManager,
|
||||||
|
ConnectionDispatcher connectionDispatcher, Clock clock,
|
||||||
ConnectorGroup group, DuplexPlugin plugin, LocalAuthor localAuthor,
|
ConnectorGroup group, DuplexPlugin plugin, LocalAuthor localAuthor,
|
||||||
Map<TransportId, TransportProperties> localProps,
|
Map<TransportId, TransportProperties> localProps,
|
||||||
PseudoRandom random) {
|
PseudoRandom random) {
|
||||||
super(crypto, db, readerFactory, writerFactory, connectionReaderFactory,
|
super(crypto, db, readerFactory, writerFactory, connectionReaderFactory,
|
||||||
connectionWriterFactory, authorFactory, keyManager, clock,
|
connectionWriterFactory, authorFactory, keyManager,
|
||||||
group, plugin, localAuthor, localProps, random);
|
connectionDispatcher, clock, group, plugin, localAuthor,
|
||||||
|
localProps, random);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -171,6 +174,7 @@ class AliceConnector extends Connector {
|
|||||||
if(LOG.isLoggable(INFO))
|
if(LOG.isLoggable(INFO))
|
||||||
LOG.info(pluginName + " pseudonym exchange succeeded");
|
LOG.info(pluginName + " pseudonym exchange succeeded");
|
||||||
group.pseudonymExchangeSucceeded(remoteAuthor);
|
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.ReaderFactory;
|
||||||
import net.sf.briar.api.serial.Writer;
|
import net.sf.briar.api.serial.Writer;
|
||||||
import net.sf.briar.api.serial.WriterFactory;
|
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.ConnectionReader;
|
||||||
import net.sf.briar.api.transport.ConnectionReaderFactory;
|
import net.sf.briar.api.transport.ConnectionReaderFactory;
|
||||||
import net.sf.briar.api.transport.ConnectionWriter;
|
import net.sf.briar.api.transport.ConnectionWriter;
|
||||||
@@ -43,13 +44,15 @@ class BobConnector extends Connector {
|
|||||||
ReaderFactory readerFactory, WriterFactory writerFactory,
|
ReaderFactory readerFactory, WriterFactory writerFactory,
|
||||||
ConnectionReaderFactory connectionReaderFactory,
|
ConnectionReaderFactory connectionReaderFactory,
|
||||||
ConnectionWriterFactory connectionWriterFactory,
|
ConnectionWriterFactory connectionWriterFactory,
|
||||||
AuthorFactory authorFactory, KeyManager keyManager, Clock clock,
|
AuthorFactory authorFactory, KeyManager keyManager,
|
||||||
|
ConnectionDispatcher connectionDispatcher, Clock clock,
|
||||||
ConnectorGroup group, DuplexPlugin plugin, LocalAuthor localAuthor,
|
ConnectorGroup group, DuplexPlugin plugin, LocalAuthor localAuthor,
|
||||||
Map<TransportId, TransportProperties> localProps,
|
Map<TransportId, TransportProperties> localProps,
|
||||||
PseudoRandom random) {
|
PseudoRandom random) {
|
||||||
super(crypto, db, readerFactory, writerFactory, connectionReaderFactory,
|
super(crypto, db, readerFactory, writerFactory, connectionReaderFactory,
|
||||||
connectionWriterFactory, authorFactory, keyManager, clock,
|
connectionWriterFactory, authorFactory, keyManager,
|
||||||
group, plugin, localAuthor, localProps, random);
|
connectionDispatcher, clock, group, plugin, localAuthor,
|
||||||
|
localProps, random);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -171,6 +174,7 @@ class BobConnector extends Connector {
|
|||||||
if(LOG.isLoggable(INFO))
|
if(LOG.isLoggable(INFO))
|
||||||
LOG.info(pluginName + " pseudonym exchange succeeded");
|
LOG.info(pluginName + " pseudonym exchange succeeded");
|
||||||
group.pseudonymExchangeSucceeded(remoteAuthor);
|
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.ReaderFactory;
|
||||||
import net.sf.briar.api.serial.Writer;
|
import net.sf.briar.api.serial.Writer;
|
||||||
import net.sf.briar.api.serial.WriterFactory;
|
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.ConnectionReaderFactory;
|
||||||
import net.sf.briar.api.transport.ConnectionWriterFactory;
|
import net.sf.briar.api.transport.ConnectionWriterFactory;
|
||||||
import net.sf.briar.api.transport.Endpoint;
|
import net.sf.briar.api.transport.Endpoint;
|
||||||
@@ -65,6 +66,7 @@ abstract class Connector extends Thread {
|
|||||||
protected final ConnectionWriterFactory connectionWriterFactory;
|
protected final ConnectionWriterFactory connectionWriterFactory;
|
||||||
protected final AuthorFactory authorFactory;
|
protected final AuthorFactory authorFactory;
|
||||||
protected final KeyManager keyManager;
|
protected final KeyManager keyManager;
|
||||||
|
protected final ConnectionDispatcher connectionDispatcher;
|
||||||
protected final Clock clock;
|
protected final Clock clock;
|
||||||
protected final ConnectorGroup group;
|
protected final ConnectorGroup group;
|
||||||
protected final DuplexPlugin plugin;
|
protected final DuplexPlugin plugin;
|
||||||
@@ -77,11 +79,14 @@ abstract class Connector extends Thread {
|
|||||||
private final KeyParser keyParser;
|
private final KeyParser keyParser;
|
||||||
private final MessageDigest messageDigest;
|
private final MessageDigest messageDigest;
|
||||||
|
|
||||||
|
private volatile ContactId contactId = null;
|
||||||
|
|
||||||
Connector(CryptoComponent crypto, DatabaseComponent db,
|
Connector(CryptoComponent crypto, DatabaseComponent db,
|
||||||
ReaderFactory readerFactory, WriterFactory writerFactory,
|
ReaderFactory readerFactory, WriterFactory writerFactory,
|
||||||
ConnectionReaderFactory connectionReaderFactory,
|
ConnectionReaderFactory connectionReaderFactory,
|
||||||
ConnectionWriterFactory connectionWriterFactory,
|
ConnectionWriterFactory connectionWriterFactory,
|
||||||
AuthorFactory authorFactory, KeyManager keyManager, Clock clock,
|
AuthorFactory authorFactory, KeyManager keyManager,
|
||||||
|
ConnectionDispatcher connectionDispatcher, Clock clock,
|
||||||
ConnectorGroup group, DuplexPlugin plugin, LocalAuthor localAuthor,
|
ConnectorGroup group, DuplexPlugin plugin, LocalAuthor localAuthor,
|
||||||
Map<TransportId, TransportProperties> localProps,
|
Map<TransportId, TransportProperties> localProps,
|
||||||
PseudoRandom random) {
|
PseudoRandom random) {
|
||||||
@@ -94,6 +99,7 @@ abstract class Connector extends Thread {
|
|||||||
this.connectionWriterFactory = connectionWriterFactory;
|
this.connectionWriterFactory = connectionWriterFactory;
|
||||||
this.authorFactory = authorFactory;
|
this.authorFactory = authorFactory;
|
||||||
this.keyManager = keyManager;
|
this.keyManager = keyManager;
|
||||||
|
this.connectionDispatcher = connectionDispatcher;
|
||||||
this.clock = clock;
|
this.clock = clock;
|
||||||
this.group = group;
|
this.group = group;
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
@@ -275,11 +281,11 @@ abstract class Connector extends Thread {
|
|||||||
Map<TransportId, TransportProperties> remoteProps, byte[] secret,
|
Map<TransportId, TransportProperties> remoteProps, byte[] secret,
|
||||||
long epoch, boolean alice) throws DbException {
|
long epoch, boolean alice) throws DbException {
|
||||||
// Add the contact to the database
|
// 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
|
// Add a positive rating for the contact's pseudonym
|
||||||
db.setRating(remoteAuthor.getId(), GOOD);
|
db.setRating(remoteAuthor.getId(), GOOD);
|
||||||
// Store the remote transport properties
|
// Store the remote transport properties
|
||||||
db.setRemoteProperties(c, remoteProps);
|
db.setRemoteProperties(contactId, remoteProps);
|
||||||
// Create an endpoint for each transport shared with the contact
|
// Create an endpoint for each transport shared with the contact
|
||||||
List<TransportId> ids = new ArrayList<TransportId>();
|
List<TransportId> ids = new ArrayList<TransportId>();
|
||||||
for(TransportId id : localProps.keySet())
|
for(TransportId id : localProps.keySet())
|
||||||
@@ -288,7 +294,7 @@ abstract class Connector extends Thread {
|
|||||||
Collections.sort(ids, TransportIdComparator.INSTANCE);
|
Collections.sort(ids, TransportIdComparator.INSTANCE);
|
||||||
int size = ids.size();
|
int size = ids.size();
|
||||||
for(int i = 0; i < size; i++) {
|
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 {
|
try {
|
||||||
db.addEndpoint(ep);
|
db.addEndpoint(ep);
|
||||||
} catch(NoSuchTransportException e) {
|
} 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
|
private static class TransportIdComparator
|
||||||
implements Comparator<TransportId> {
|
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.plugins.duplex.DuplexPlugin;
|
||||||
import net.sf.briar.api.serial.ReaderFactory;
|
import net.sf.briar.api.serial.ReaderFactory;
|
||||||
import net.sf.briar.api.serial.WriterFactory;
|
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.ConnectionReaderFactory;
|
||||||
import net.sf.briar.api.transport.ConnectionWriterFactory;
|
import net.sf.briar.api.transport.ConnectionWriterFactory;
|
||||||
|
|
||||||
@@ -48,6 +49,7 @@ class ConnectorGroup extends Thread implements InvitationTask {
|
|||||||
private final ConnectionWriterFactory connectionWriterFactory;
|
private final ConnectionWriterFactory connectionWriterFactory;
|
||||||
private final AuthorFactory authorFactory;
|
private final AuthorFactory authorFactory;
|
||||||
private final KeyManager keyManager;
|
private final KeyManager keyManager;
|
||||||
|
private final ConnectionDispatcher connectionDispatcher;
|
||||||
private final Clock clock;
|
private final Clock clock;
|
||||||
private final PluginManager pluginManager;
|
private final PluginManager pluginManager;
|
||||||
private final AuthorId localAuthorId;
|
private final AuthorId localAuthorId;
|
||||||
@@ -72,7 +74,8 @@ class ConnectorGroup extends Thread implements InvitationTask {
|
|||||||
ReaderFactory readerFactory, WriterFactory writerFactory,
|
ReaderFactory readerFactory, WriterFactory writerFactory,
|
||||||
ConnectionReaderFactory connectionReaderFactory,
|
ConnectionReaderFactory connectionReaderFactory,
|
||||||
ConnectionWriterFactory connectionWriterFactory,
|
ConnectionWriterFactory connectionWriterFactory,
|
||||||
AuthorFactory authorFactory, KeyManager keyManager, Clock clock,
|
AuthorFactory authorFactory, KeyManager keyManager,
|
||||||
|
ConnectionDispatcher connectionDispatcher, Clock clock,
|
||||||
PluginManager pluginManager, AuthorId localAuthorId,
|
PluginManager pluginManager, AuthorId localAuthorId,
|
||||||
int localInvitationCode, int remoteInvitationCode) {
|
int localInvitationCode, int remoteInvitationCode) {
|
||||||
super("ConnectorGroup");
|
super("ConnectorGroup");
|
||||||
@@ -84,6 +87,7 @@ class ConnectorGroup extends Thread implements InvitationTask {
|
|||||||
this.connectionWriterFactory = connectionWriterFactory;
|
this.connectionWriterFactory = connectionWriterFactory;
|
||||||
this.authorFactory = authorFactory;
|
this.authorFactory = authorFactory;
|
||||||
this.keyManager = keyManager;
|
this.keyManager = keyManager;
|
||||||
|
this.connectionDispatcher = connectionDispatcher;
|
||||||
this.clock = clock;
|
this.clock = clock;
|
||||||
this.pluginManager = pluginManager;
|
this.pluginManager = pluginManager;
|
||||||
this.localAuthorId = localAuthorId;
|
this.localAuthorId = localAuthorId;
|
||||||
@@ -167,8 +171,8 @@ class ConnectorGroup extends Thread implements InvitationTask {
|
|||||||
remoteInvitationCode);
|
remoteInvitationCode);
|
||||||
return new AliceConnector(crypto, db, readerFactory, writerFactory,
|
return new AliceConnector(crypto, db, readerFactory, writerFactory,
|
||||||
connectionReaderFactory, connectionWriterFactory, authorFactory,
|
connectionReaderFactory, connectionWriterFactory, authorFactory,
|
||||||
keyManager, clock, this, plugin, localAuthor, localProps,
|
keyManager, connectionDispatcher, clock, this, plugin,
|
||||||
random);
|
localAuthor, localProps, random);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Connector createBobConnector(DuplexPlugin plugin,
|
private Connector createBobConnector(DuplexPlugin plugin,
|
||||||
@@ -178,8 +182,8 @@ class ConnectorGroup extends Thread implements InvitationTask {
|
|||||||
localInvitationCode);
|
localInvitationCode);
|
||||||
return new BobConnector(crypto, db, readerFactory, writerFactory,
|
return new BobConnector(crypto, db, readerFactory, writerFactory,
|
||||||
connectionReaderFactory, connectionWriterFactory, authorFactory,
|
connectionReaderFactory, connectionWriterFactory, authorFactory,
|
||||||
keyManager, clock, this, plugin, localAuthor, localProps,
|
keyManager, connectionDispatcher, clock, this, plugin,
|
||||||
random);
|
localAuthor, localProps, random);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void localConfirmationSucceeded() {
|
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.plugins.PluginManager;
|
||||||
import net.sf.briar.api.serial.ReaderFactory;
|
import net.sf.briar.api.serial.ReaderFactory;
|
||||||
import net.sf.briar.api.serial.WriterFactory;
|
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.ConnectionReaderFactory;
|
||||||
import net.sf.briar.api.transport.ConnectionWriterFactory;
|
import net.sf.briar.api.transport.ConnectionWriterFactory;
|
||||||
|
|
||||||
@@ -26,6 +27,7 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory {
|
|||||||
private final ConnectionWriterFactory connectionWriterFactory;
|
private final ConnectionWriterFactory connectionWriterFactory;
|
||||||
private final AuthorFactory authorFactory;
|
private final AuthorFactory authorFactory;
|
||||||
private final KeyManager keyManager;
|
private final KeyManager keyManager;
|
||||||
|
private final ConnectionDispatcher connectionDispatcher;
|
||||||
private final Clock clock;
|
private final Clock clock;
|
||||||
private final PluginManager pluginManager;
|
private final PluginManager pluginManager;
|
||||||
|
|
||||||
@@ -34,7 +36,8 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory {
|
|||||||
ReaderFactory readerFactory, WriterFactory writerFactory,
|
ReaderFactory readerFactory, WriterFactory writerFactory,
|
||||||
ConnectionReaderFactory connectionReaderFactory,
|
ConnectionReaderFactory connectionReaderFactory,
|
||||||
ConnectionWriterFactory connectionWriterFactory,
|
ConnectionWriterFactory connectionWriterFactory,
|
||||||
AuthorFactory authorFactory, KeyManager keyManager, Clock clock,
|
AuthorFactory authorFactory, KeyManager keyManager,
|
||||||
|
ConnectionDispatcher connectionDispatcher, Clock clock,
|
||||||
PluginManager pluginManager) {
|
PluginManager pluginManager) {
|
||||||
this.crypto = crypto;
|
this.crypto = crypto;
|
||||||
this.db = db;
|
this.db = db;
|
||||||
@@ -44,6 +47,7 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory {
|
|||||||
this.connectionWriterFactory = connectionWriterFactory;
|
this.connectionWriterFactory = connectionWriterFactory;
|
||||||
this.authorFactory = authorFactory;
|
this.authorFactory = authorFactory;
|
||||||
this.keyManager = keyManager;
|
this.keyManager = keyManager;
|
||||||
|
this.connectionDispatcher = connectionDispatcher;
|
||||||
this.clock = clock;
|
this.clock = clock;
|
||||||
this.pluginManager = pluginManager;
|
this.pluginManager = pluginManager;
|
||||||
}
|
}
|
||||||
@@ -52,7 +56,7 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory {
|
|||||||
int remoteCode) {
|
int remoteCode) {
|
||||||
return new ConnectorGroup(crypto, db, readerFactory, writerFactory,
|
return new ConnectorGroup(crypto, db, readerFactory, writerFactory,
|
||||||
connectionReaderFactory, connectionWriterFactory,
|
connectionReaderFactory, connectionWriterFactory,
|
||||||
authorFactory, keyManager, clock, pluginManager, localAuthorId,
|
authorFactory, keyManager, connectionDispatcher, clock,
|
||||||
localCode, remoteCode);
|
pluginManager, localAuthorId, localCode, remoteCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user