diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java index 14480c3f6eb44bff3c9e08053ccbc33a4d1acd12..2a1bf7807b76460f53f88a8e95e503a9f94761a9 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java @@ -7,8 +7,6 @@ import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection; import org.briarproject.bramble.api.transport.StreamContext; -import javax.annotation.Nullable; - public interface MailboxManager { /** * Connection to a contact's mailbox @@ -23,24 +21,16 @@ public interface MailboxManager { void handleOutgoingPrivateMailboxConnection(ContactId contactId, DuplexTransportConnection connection, TransportId transportId); - /** - * Connection from Owner to mailbox - */ - void handleIncomingMailboxOwnerConnection(StreamContext ctx, - TransportId transportId, TransportConnectionReader reader, - TransportConnectionWriter writer); - - /** - * Connection from contact (of owner) to mailbox - */ - void handleInomingOwnerContactConnection(StreamContext ctx, - TransportId transportId, TransportConnectionReader reader, - TransportConnectionWriter writer); - /** * Contacts without private mailbox which have been introduced * to private mailbox */ void handleContactWithoutMailbox(MailboxInfo mailboxInfo); + + /** + * Handle incoming connections from owner or contacts + */ + void handleIncomingConnection(StreamContext ctx, TransportId transportId, + TransportConnectionReader reader, TransportConnectionWriter writer); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java index f5b3da2f693d19ec2f8d1ec470c92812d9193fa1..0b719a29257351f8405ab1b8e9c27117e861e751 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java @@ -6,7 +6,9 @@ import org.briarproject.bramble.api.data.BdfReader; import org.briarproject.bramble.api.data.BdfReaderFactory; import org.briarproject.bramble.api.data.BdfWriter; import org.briarproject.bramble.api.data.BdfWriterFactory; +import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.mailbox.MailboxInfo; import org.briarproject.bramble.api.mailbox.MailboxManager; @@ -36,7 +38,10 @@ import java.util.logging.Logger; import javax.inject.Inject; import static java.util.logging.Level.WARNING; -import static org.briarproject.bramble.api.contact.ContactType.*; +import static org.briarproject.bramble.api.contact.ContactType.CONTACT_MAILBOX; +import static org.briarproject.bramble.api.contact.ContactType.MAILBOX_CONTACT; +import static org.briarproject.bramble.api.contact.ContactType.MAILBOX_OWNER; +import static org.briarproject.bramble.api.contact.ContactType.PRIVATE_MAILBOX; import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENGTH; import static org.briarproject.bramble.util.LogUtils.logException; @@ -44,6 +49,7 @@ public class MailboxManagerImpl implements MailboxManager { private static final Logger LOG = Logger.getLogger(MailboxManagerImpl.class.getName()); private Executor ioExecutor; + private final DatabaseComponent db; private MailboxSessionFactory mailboxSessionFactory; private ConnectionRegistry connectionRegistry; private StreamWriterFactory streamWriterFactory; @@ -57,6 +63,7 @@ public class MailboxManagerImpl implements MailboxManager { @Inject public MailboxManagerImpl(@IoExecutor Executor ioExecutor, + DatabaseComponent db, KeyManager keyManager, MailboxSessionFactory mailboxSessionFactory, ConnectionRegistry connectionRegistry, StreamWriterFactory streamWriterFactory, @@ -64,6 +71,7 @@ public class MailboxManagerImpl implements MailboxManager { BdfReaderFactory bdfReaderFactory, BdfWriterFactory bdfWriterFactory) { this.ioExecutor = ioExecutor; + this.db = db; this.keyManager = keyManager; this.mailboxSessionFactory = mailboxSessionFactory; this.connectionRegistry = connectionRegistry; @@ -90,8 +98,7 @@ public class MailboxManagerImpl implements MailboxManager { PRIVATE_MAILBOX, contactId)); } - @Override - public void handleIncomingMailboxOwnerConnection(StreamContext ctx, + private void handleIncomingMailboxOwnerConnection(StreamContext ctx, TransportId transportId, TransportConnectionReader reader, TransportConnectionWriter writer) { @@ -100,8 +107,7 @@ public class MailboxManagerImpl implements MailboxManager { MAILBOX_OWNER)); } - @Override - public void handleInomingOwnerContactConnection(StreamContext ctx, + private void handleIncomingOwnerContactConnection(StreamContext ctx, TransportId transportId, TransportConnectionReader reader, TransportConnectionWriter writer) { ioExecutor.execute( @@ -121,6 +127,40 @@ public class MailboxManagerImpl implements MailboxManager { .handleContactWithoutPrivateMailbox(mailboxInfo)); } + @Override + public void handleIncomingConnection(StreamContext ctx, + TransportId transportId, TransportConnectionReader reader, + TransportConnectionWriter writer) { + Transaction txn = null; + try { + txn = db.startTransaction(true); + ContactType type = db.getContactType(txn, ctx.getContactId()); + switch (type) { + case MAILBOX_OWNER: + handleIncomingMailboxOwnerConnection(ctx, + transportId, reader, writer); + return; + case CONTACT: + handleIncomingOwnerContactConnection(ctx, + transportId, reader, writer); + return; + } + db.commitTransaction(txn); + } catch (DbException e) { + logException(LOG, WARNING, e); + try { + reader.dispose(true, true); + } catch (IOException ioException) { + logException(LOG, WARNING, ioException); + } + return; + } finally { + if (txn != null) + db.endTransaction(txn); + } + + } + private class ManageMailboxConnection implements Runnable { private boolean incoming; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/ConnectionManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/ConnectionManagerImpl.java index 91847693c728c55af9c58b6387f2f67855848cc2..bfd3d59124452490c7e9afe8b25c75b0c8754154 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/ConnectionManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/ConnectionManagerImpl.java @@ -1,10 +1,9 @@ package org.briarproject.bramble.plugin; +import org.briarproject.bramble.api.BrambleConfig; import org.briarproject.bramble.api.contact.ContactId; -import org.briarproject.bramble.api.contact.ContactType; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; -import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.mailbox.MailboxManager; import org.briarproject.bramble.api.plugin.ConnectionManager; @@ -42,6 +41,7 @@ class ConnectionManagerImpl implements ConnectionManager { private final KeyManager keyManager; private final MailboxManager mailboxManager; private final DatabaseComponent db; + private final BrambleConfig brambleConfig; private final StreamReaderFactory streamReaderFactory; private final StreamWriterFactory streamWriterFactory; private final SyncSessionFactory syncSessionFactory; @@ -52,6 +52,7 @@ class ConnectionManagerImpl implements ConnectionManager { KeyManager keyManager, MailboxManager mailboxManager, DatabaseComponent db, + BrambleConfig brambleConfig, StreamReaderFactory streamReaderFactory, StreamWriterFactory streamWriterFactory, SyncSessionFactory syncSessionFactory, @@ -60,6 +61,7 @@ class ConnectionManagerImpl implements ConnectionManager { this.keyManager = keyManager; this.mailboxManager = mailboxManager; this.db = db; + this.brambleConfig = brambleConfig; this.streamReaderFactory = streamReaderFactory; this.streamWriterFactory = streamWriterFactory; this.syncSessionFactory = syncSessionFactory; @@ -267,31 +269,13 @@ class ConnectionManagerImpl implements ConnectionManager { disposeReader(false, false); return; } - contactId = ctx.getContactId(); - Transaction txn = null; - try { - txn = db.startTransaction(true); - ContactType type = db.getContactType(txn, contactId); - switch (type) { - case MAILBOX_OWNER: - mailboxManager.handleIncomingMailboxOwnerConnection(ctx, - transportId, reader, writer); - return; - case MAILBOX_CONTACT: - mailboxManager.handleInomingOwnerContactConnection(ctx, - transportId, reader, writer); - return; - } - db.commitTransaction(txn); - } catch (DbException e) { - logException(LOG, WARNING, e); - disposeReader(true, true); + if (brambleConfig.isMailbox()) { + mailboxManager + .handleIncomingConnection(ctx, transportId, reader, + writer); return; - }finally { - if (txn != null) - db.endTransaction(txn); } - + contactId = ctx.getContactId(); connectionRegistry.registerConnection(contactId, transportId, true); // Start the outgoing session on another thread ioExecutor.execute(this::runOutgoingSession);