From d02a68edfcb8dc5ed95702dfa4c2899e9307fd90 Mon Sep 17 00:00:00 2001 From: akwizgran <akwizgran@users.sourceforge.net> Date: Tue, 15 Nov 2011 17:47:30 +0000 Subject: [PATCH] Return a connection context for outgoing connections (the secret will be included in this context in the near future). --- .../sf/briar/api/db/DatabaseComponent.java | 6 ++++-- .../transport/ConnectionContextFactory.java | 10 ++++++++++ components/net/sf/briar/db/Database.java | 5 +++-- .../sf/briar/db/DatabaseComponentImpl.java | 7 ++++--- .../net/sf/briar/db/DatabaseModule.java | 6 ++++-- components/net/sf/briar/db/H2Database.java | 7 +++++-- components/net/sf/briar/db/JdbcDatabase.java | 16 +++++++++++----- .../ConnectionContextFactoryImpl.java | 14 ++++++++++++++ .../sf/briar/transport/TransportModule.java | 3 +++ .../batch/OutgoingBatchConnection.java | 6 ++++-- .../stream/OutgoingStreamConnection.java | 19 +++++++++---------- .../sf/briar/db/DatabaseComponentTest.java | 2 +- test/net/sf/briar/db/H2DatabaseTest.java | 7 ++++++- 13 files changed, 78 insertions(+), 30 deletions(-) create mode 100644 api/net/sf/briar/api/transport/ConnectionContextFactory.java create mode 100644 components/net/sf/briar/transport/ConnectionContextFactoryImpl.java diff --git a/api/net/sf/briar/api/db/DatabaseComponent.java b/api/net/sf/briar/api/db/DatabaseComponent.java index 1717f00ca9..f2df7b5cc2 100644 --- a/api/net/sf/briar/api/db/DatabaseComponent.java +++ b/api/net/sf/briar/api/db/DatabaseComponent.java @@ -28,6 +28,7 @@ import net.sf.briar.api.protocol.writers.OfferWriter; import net.sf.briar.api.protocol.writers.RequestWriter; import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter; import net.sf.briar.api.protocol.writers.TransportUpdateWriter; +import net.sf.briar.api.transport.ConnectionContext; import net.sf.briar.api.transport.ConnectionWindow; /** @@ -114,10 +115,11 @@ public interface DatabaseComponent { TransportConfig getConfig(TransportId t) throws DbException; /** - * Returns an outgoing connection number for the given contact and + * Returns an outgoing connection context for the given contact and * transport. */ - long getConnectionNumber(ContactId c, TransportIndex i) throws DbException; + ConnectionContext getConnectionContext(ContactId c, TransportIndex i) + throws DbException; /** * Returns the connection reordering window for the given contact and diff --git a/api/net/sf/briar/api/transport/ConnectionContextFactory.java b/api/net/sf/briar/api/transport/ConnectionContextFactory.java new file mode 100644 index 0000000000..39ab561dce --- /dev/null +++ b/api/net/sf/briar/api/transport/ConnectionContextFactory.java @@ -0,0 +1,10 @@ +package net.sf.briar.api.transport; + +import net.sf.briar.api.ContactId; +import net.sf.briar.api.protocol.TransportIndex; + +public interface ConnectionContextFactory { + + ConnectionContext createConnectionContext(ContactId c, TransportIndex i, + long connection); +} diff --git a/components/net/sf/briar/db/Database.java b/components/net/sf/briar/db/Database.java index a3281c7973..fe1a6fc005 100644 --- a/components/net/sf/briar/db/Database.java +++ b/components/net/sf/briar/db/Database.java @@ -20,6 +20,7 @@ import net.sf.briar.api.protocol.MessageId; import net.sf.briar.api.protocol.Transport; import net.sf.briar.api.protocol.TransportId; import net.sf.briar.api.protocol.TransportIndex; +import net.sf.briar.api.transport.ConnectionContext; import net.sf.briar.api.transport.ConnectionWindow; /** @@ -183,12 +184,12 @@ interface Database<T> { TransportConfig getConfig(T txn, TransportId t) throws DbException; /** - * Allocates and returns a connection number for the given contact and + * Returns an outgoing connection context for the given contact and * transport. * <p> * Locking: contact read, window write. */ - long getConnectionNumber(T txn, ContactId c, TransportIndex i) + ConnectionContext getConnectionContext(T txn, ContactId c, TransportIndex i) throws DbException; /** diff --git a/components/net/sf/briar/db/DatabaseComponentImpl.java b/components/net/sf/briar/db/DatabaseComponentImpl.java index a671f95c1c..1fd216d55f 100644 --- a/components/net/sf/briar/db/DatabaseComponentImpl.java +++ b/components/net/sf/briar/db/DatabaseComponentImpl.java @@ -60,6 +60,7 @@ import net.sf.briar.api.protocol.writers.OfferWriter; import net.sf.briar.api.protocol.writers.RequestWriter; import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter; import net.sf.briar.api.protocol.writers.TransportUpdateWriter; +import net.sf.briar.api.transport.ConnectionContext; import net.sf.briar.api.transport.ConnectionWindow; import com.google.inject.Inject; @@ -700,7 +701,7 @@ DatabaseCleaner.Callback { } } - public long getConnectionNumber(ContactId c, TransportIndex i) + public ConnectionContext getConnectionContext(ContactId c, TransportIndex i) throws DbException { contactLock.readLock().lock(); try { @@ -709,9 +710,9 @@ DatabaseCleaner.Callback { try { T txn = db.startTransaction(); try { - long outgoing = db.getConnectionNumber(txn, c, i); + ConnectionContext ctx = db.getConnectionContext(txn, c, i); db.commitTransaction(txn); - return outgoing; + return ctx; } catch(DbException e) { db.abortTransaction(txn); throw e; diff --git a/components/net/sf/briar/db/DatabaseModule.java b/components/net/sf/briar/db/DatabaseModule.java index 903fb43458..9df6352ecd 100644 --- a/components/net/sf/briar/db/DatabaseModule.java +++ b/components/net/sf/briar/db/DatabaseModule.java @@ -9,6 +9,7 @@ import net.sf.briar.api.db.DatabaseDirectory; import net.sf.briar.api.db.DatabaseMaxSize; import net.sf.briar.api.db.DatabasePassword; import net.sf.briar.api.protocol.GroupFactory; +import net.sf.briar.api.transport.ConnectionContextFactory; import net.sf.briar.api.transport.ConnectionWindowFactory; import com.google.inject.AbstractModule; @@ -25,10 +26,11 @@ public class DatabaseModule extends AbstractModule { @Provides Database<Connection> getDatabase(@DatabaseDirectory File dir, @DatabasePassword Password password, @DatabaseMaxSize long maxSize, + ConnectionContextFactory connectionContextFactory, ConnectionWindowFactory connectionWindowFactory, GroupFactory groupFactory) { - return new H2Database(dir, password, maxSize, connectionWindowFactory, - groupFactory); + return new H2Database(dir, password, maxSize, connectionContextFactory, + connectionWindowFactory, groupFactory); } @Provides @Singleton diff --git a/components/net/sf/briar/db/H2Database.java b/components/net/sf/briar/db/H2Database.java index 2922c8ff7d..a721aa9a2e 100644 --- a/components/net/sf/briar/db/H2Database.java +++ b/components/net/sf/briar/db/H2Database.java @@ -16,6 +16,7 @@ import net.sf.briar.api.db.DatabaseMaxSize; import net.sf.briar.api.db.DatabasePassword; import net.sf.briar.api.db.DbException; import net.sf.briar.api.protocol.GroupFactory; +import net.sf.briar.api.transport.ConnectionContextFactory; import net.sf.briar.api.transport.ConnectionWindowFactory; import org.apache.commons.io.FileSystemUtils; @@ -34,11 +35,13 @@ class H2Database extends JdbcDatabase { private final long maxSize; @Inject - H2Database(@DatabaseDirectory File dir, @DatabasePassword Password password, + H2Database(@DatabaseDirectory File dir, + @DatabasePassword Password password, @DatabaseMaxSize long maxSize, + ConnectionContextFactory connectionContextFactory, ConnectionWindowFactory connectionWindowFactory, GroupFactory groupFactory) { - super(connectionWindowFactory, groupFactory, + super(connectionContextFactory, connectionWindowFactory, groupFactory, "BINARY(32)", "BINARY", "INT NOT NULL AUTO_INCREMENT"); home = new File(dir, "db"); this.password = password; diff --git a/components/net/sf/briar/db/JdbcDatabase.java b/components/net/sf/briar/db/JdbcDatabase.java index 0398d75e6a..6a874a16fd 100644 --- a/components/net/sf/briar/db/JdbcDatabase.java +++ b/components/net/sf/briar/db/JdbcDatabase.java @@ -35,6 +35,8 @@ import net.sf.briar.api.protocol.ProtocolConstants; import net.sf.briar.api.protocol.Transport; import net.sf.briar.api.protocol.TransportId; import net.sf.briar.api.protocol.TransportIndex; +import net.sf.briar.api.transport.ConnectionContext; +import net.sf.briar.api.transport.ConnectionContextFactory; import net.sf.briar.api.transport.ConnectionWindow; import net.sf.briar.api.transport.ConnectionWindowFactory; import net.sf.briar.util.FileUtils; @@ -265,10 +267,11 @@ abstract class JdbcDatabase implements Database<Connection> { private static final Logger LOG = Logger.getLogger(JdbcDatabase.class.getName()); - // Different database libraries use different names for certain types - private final String hashType, binaryType, counterType; + private final ConnectionContextFactory connectionContextFactory; private final ConnectionWindowFactory connectionWindowFactory; private final GroupFactory groupFactory; + // Different database libraries use different names for certain types + private final String hashType, binaryType, counterType; private final LinkedList<Connection> connections = new LinkedList<Connection>(); // Locking: self @@ -278,9 +281,11 @@ abstract class JdbcDatabase implements Database<Connection> { protected abstract Connection createConnection() throws SQLException; - JdbcDatabase(ConnectionWindowFactory connectionWindowFactory, + JdbcDatabase(ConnectionContextFactory connectionContextFactory, + ConnectionWindowFactory connectionWindowFactory, GroupFactory groupFactory, String hashType, String binaryType, String counterType) { + this.connectionContextFactory = connectionContextFactory; this.connectionWindowFactory = connectionWindowFactory; this.groupFactory = groupFactory; this.hashType = hashType; @@ -939,7 +944,7 @@ abstract class JdbcDatabase implements Database<Connection> { } } - public long getConnectionNumber(Connection txn, ContactId c, + public ConnectionContext getConnectionContext(Connection txn, ContactId c, TransportIndex i) throws DbException { PreparedStatement ps = null; ResultSet rs = null; @@ -963,7 +968,8 @@ abstract class JdbcDatabase implements Database<Connection> { if(rs.next()) throw new DbStateException(); rs.close(); ps.close(); - return outgoing; + return connectionContextFactory.createConnectionContext(c, i, + outgoing); } catch(SQLException e) { tryToClose(rs); tryToClose(ps); diff --git a/components/net/sf/briar/transport/ConnectionContextFactoryImpl.java b/components/net/sf/briar/transport/ConnectionContextFactoryImpl.java new file mode 100644 index 0000000000..08116a58b7 --- /dev/null +++ b/components/net/sf/briar/transport/ConnectionContextFactoryImpl.java @@ -0,0 +1,14 @@ +package net.sf.briar.transport; + +import net.sf.briar.api.ContactId; +import net.sf.briar.api.protocol.TransportIndex; +import net.sf.briar.api.transport.ConnectionContext; +import net.sf.briar.api.transport.ConnectionContextFactory; + +class ConnectionContextFactoryImpl implements ConnectionContextFactory { + + public ConnectionContext createConnectionContext(ContactId c, + TransportIndex i, long connection) { + return new ConnectionContextImpl(c, i, connection); + } +} diff --git a/components/net/sf/briar/transport/TransportModule.java b/components/net/sf/briar/transport/TransportModule.java index 867b4e39f1..3af8ef144b 100644 --- a/components/net/sf/briar/transport/TransportModule.java +++ b/components/net/sf/briar/transport/TransportModule.java @@ -1,5 +1,6 @@ package net.sf.briar.transport; +import net.sf.briar.api.transport.ConnectionContextFactory; import net.sf.briar.api.transport.ConnectionDispatcher; import net.sf.briar.api.transport.ConnectionReaderFactory; import net.sf.briar.api.transport.ConnectionRecogniser; @@ -12,6 +13,8 @@ public class TransportModule extends AbstractModule { @Override protected void configure() { + bind(ConnectionContextFactory.class).to( + ConnectionContextFactoryImpl.class); bind(ConnectionDispatcher.class).to(ConnectionDispatcherImpl.class); bind(ConnectionReaderFactory.class).to( ConnectionReaderFactoryImpl.class); diff --git a/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java b/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java index b9d8630b35..e00529eee1 100644 --- a/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java +++ b/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java @@ -17,6 +17,7 @@ import net.sf.briar.api.protocol.writers.ProtocolWriterFactory; import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter; import net.sf.briar.api.protocol.writers.TransportUpdateWriter; import net.sf.briar.api.transport.BatchTransportWriter; +import net.sf.briar.api.transport.ConnectionContext; import net.sf.briar.api.transport.ConnectionWriter; import net.sf.briar.api.transport.ConnectionWriterFactory; @@ -47,10 +48,11 @@ class OutgoingBatchConnection { void write() { try { byte[] secret = db.getSharedSecret(contactId, false); - long connection = db.getConnectionNumber(contactId, transportIndex); + ConnectionContext ctx = + db.getConnectionContext(contactId, transportIndex); ConnectionWriter conn = connFactory.createConnectionWriter( writer.getOutputStream(), writer.getCapacity(), - transportIndex, connection, secret); + transportIndex, ctx.getConnectionNumber(), secret); OutputStream out = conn.getOutputStream(); // There should be enough space for a packet long capacity = conn.getRemainingCapacity(); diff --git a/components/net/sf/briar/transport/stream/OutgoingStreamConnection.java b/components/net/sf/briar/transport/stream/OutgoingStreamConnection.java index 4af22e161e..b02e460074 100644 --- a/components/net/sf/briar/transport/stream/OutgoingStreamConnection.java +++ b/components/net/sf/briar/transport/stream/OutgoingStreamConnection.java @@ -8,6 +8,7 @@ import net.sf.briar.api.db.DbException; import net.sf.briar.api.protocol.ProtocolReaderFactory; import net.sf.briar.api.protocol.TransportIndex; import net.sf.briar.api.protocol.writers.ProtocolWriterFactory; +import net.sf.briar.api.transport.ConnectionContext; import net.sf.briar.api.transport.ConnectionReader; import net.sf.briar.api.transport.ConnectionReaderFactory; import net.sf.briar.api.transport.ConnectionWriter; @@ -16,7 +17,7 @@ import net.sf.briar.api.transport.StreamTransportConnection; public class OutgoingStreamConnection extends StreamConnection { - private long connectionNum = -1L; // Locking: this + private ConnectionContext ctx = null; // Locking: this OutgoingStreamConnection(ConnectionReaderFactory connReaderFactory, ConnectionWriterFactory connWriterFactory, DatabaseComponent db, @@ -32,29 +33,27 @@ public class OutgoingStreamConnection extends StreamConnection { protected ConnectionReader createConnectionReader() throws DbException, IOException { synchronized(this) { - if(connectionNum == -1L) { - connectionNum = db.getConnectionNumber(contactId, - transportIndex); + if(ctx == null) { + ctx = db.getConnectionContext(contactId, transportIndex); } } byte[] secret = db.getSharedSecret(contactId, true); return connReaderFactory.createConnectionReader( - connection.getInputStream(), transportIndex, connectionNum, - secret); + connection.getInputStream(), transportIndex, + ctx.getConnectionNumber(), secret); } @Override protected ConnectionWriter createConnectionWriter() throws DbException, IOException { synchronized(this) { - if(connectionNum == -1L) { - connectionNum = db.getConnectionNumber(contactId, - transportIndex); + if(ctx == null) { + ctx = db.getConnectionContext(contactId, transportIndex); } } byte[] secret = db.getSharedSecret(contactId, false); return connWriterFactory.createConnectionWriter( connection.getOutputStream(), Long.MAX_VALUE, transportIndex, - connectionNum, secret); + ctx.getConnectionNumber(), secret); } } diff --git a/test/net/sf/briar/db/DatabaseComponentTest.java b/test/net/sf/briar/db/DatabaseComponentTest.java index 178f76d179..66c84b223e 100644 --- a/test/net/sf/briar/db/DatabaseComponentTest.java +++ b/test/net/sf/briar/db/DatabaseComponentTest.java @@ -561,7 +561,7 @@ public abstract class DatabaseComponentTest extends TestCase { } catch(NoSuchContactException expected) {} try { - db.getConnectionNumber(contactId, remoteIndex); + db.getConnectionContext(contactId, remoteIndex); fail(); } catch(NoSuchContactException expected) {} diff --git a/test/net/sf/briar/db/H2DatabaseTest.java b/test/net/sf/briar/db/H2DatabaseTest.java index 48a7532dc4..3e860fc7ad 100644 --- a/test/net/sf/briar/db/H2DatabaseTest.java +++ b/test/net/sf/briar/db/H2DatabaseTest.java @@ -37,6 +37,7 @@ import net.sf.briar.api.protocol.ProtocolConstants; import net.sf.briar.api.protocol.Transport; import net.sf.briar.api.protocol.TransportId; import net.sf.briar.api.protocol.TransportIndex; +import net.sf.briar.api.transport.ConnectionContextFactory; import net.sf.briar.api.transport.ConnectionWindow; import net.sf.briar.api.transport.ConnectionWindowFactory; import net.sf.briar.crypto.CryptoModule; @@ -65,6 +66,7 @@ public class H2DatabaseTest extends TestCase { private final String passwordString = "foo bar"; private final Password password = new TestPassword(); private final Random random = new Random(); + private final ConnectionContextFactory connectionContextFactory; private final ConnectionWindowFactory connectionWindowFactory; private final GroupFactory groupFactory; @@ -94,6 +96,8 @@ public class H2DatabaseTest extends TestCase { new ProtocolWritersModule(), new SerialModule(), new TransportBatchModule(), new TransportModule(), new TransportStreamModule(), new TestDatabaseModule(testDir)); + connectionContextFactory = + i.getInstance(ConnectionContextFactory.class); connectionWindowFactory = i.getInstance(ConnectionWindowFactory.class); groupFactory = i.getInstance(GroupFactory.class); authorId = new AuthorId(TestUtils.getRandomId()); @@ -1885,7 +1889,8 @@ public class H2DatabaseTest extends TestCase { private Database<Connection> open(boolean resume) throws Exception { Database<Connection> db = new H2Database(testDir, password, MAX_SIZE, - connectionWindowFactory, groupFactory); + connectionContextFactory, connectionWindowFactory, + groupFactory); db.open(resume); return db; } -- GitLab