From b7e7a2a9cc79d558c95839d1a607ff518364e239 Mon Sep 17 00:00:00 2001 From: bontric <benjohnwie@gmail.com> Date: Fri, 7 Sep 2018 19:59:30 +0200 Subject: [PATCH] Implement private mailbox session and add handling for ptivate mailbox contacts --- .../bramble/api/mailbox/MailboxManager.java | 2 + .../mailbox/PrivateMailboxSession.java | 59 ++++++++++++++----- 2 files changed, 46 insertions(+), 15 deletions(-) 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 380fecec5..3a0a14acb 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 @@ -23,4 +23,6 @@ public interface MailboxManager { void handleIncomingMailboxOwnerConnection(StreamContext ctx, TransportId transportId, TransportConnectionReader reader, TransportConnectionWriter writer); + + void handleOwnerContactWithoutMailbox(MailboxInfo mailboxInfo); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/PrivateMailboxSession.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/PrivateMailboxSession.java index 044f2432a..cef10a8b6 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/PrivateMailboxSession.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/PrivateMailboxSession.java @@ -1,25 +1,30 @@ package org.briarproject.bramble.mailbox; import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.mailbox.MailboxInfo; +import org.briarproject.bramble.api.sync.SyncSession; import org.briarproject.bramble.api.sync.SyncSessionFactory; import org.briarproject.bramble.api.transport.KeyManager; import org.briarproject.bramble.api.transport.StreamReaderFactory; import org.briarproject.bramble.api.transport.StreamWriterFactory; import org.briarproject.bramble.mailbox.protocol.MailboxProtocol; +import org.briarproject.bramble.mailbox.protocol.MailboxRequest; import org.briarproject.bramble.mailbox.protocol.MailboxRequestStore; -import org.briarproject.bramble.mailbox.protocol.MailboxRequestSync; -import org.briarproject.bramble.mailbox.protocol.MailboxRequestTake; import java.io.IOException; +import java.net.ProtocolException; import java.util.concurrent.Executor; import java.util.logging.Logger; +import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import static org.briarproject.bramble.util.LogUtils.logException; -class PrivateMailboxSession extends MailboxSession { +class PrivateMailboxSession extends AbstractMailboxSession { private static final Logger LOG = Logger.getLogger(PrivateMailboxSession.class.getName()); + private MailboxProtocol mailboxProtocol; public PrivateMailboxSession(ContactId contactId, Executor ioExecutor, KeyManager keyManager, @@ -32,29 +37,53 @@ class PrivateMailboxSession extends MailboxSession { super(ioExecutor, keyManager, syncSessionFactory, streamWriterFactory, streamReaderFactory, mailboxProtocol, transportMaxLatency, transportMaxIdleTime, contactId); + this.mailboxProtocol = mailboxProtocol; } + /** + * Stores messages on the private mailbox for a contact + * who does not have a mailbox + */ + public void handleOwnerContact(MailboxInfo mailboxInfo) { + byte[] encryptedStream; + try { + encryptedStream = + getSyncStreamToStore(mailboxInfo.getContactId()); + } catch (DbException | IOException e) { + logException(LOG, WARNING, e); + return; + } - @Override - public void run() { - ioExecutor.execute(() -> super.readRequests()); - runDuplexOutgoingSession(); + MailboxRequest req = + new MailboxRequestStore(mailboxInfo.getAliasId(), + encryptedStream); + try { + mailboxProtocol.writeRequest(req); + if (!req.awaitAndGetResponse()) + throw new ProtocolException(req.getError()); + } catch (InterruptedException | IOException e) { + // TODO: Handle STORE error! + if (LOG.isLoggable(INFO)) + LOG.info(req.getError()); + } } @Override - public void handleSync(MailboxRequestSync req) { + public void run() throws IOException { + ioExecutor.execute(() -> super.readRequests()); + createDuplexOutgoingSession().run(); try { - handleSyncStream(req.getSyncStream()); - } catch (IOException e) { - logException(LOG, WARNING, e); + endSession(); + } catch (InterruptedException e) { + throw new IOException("Interrupted while ending session"); } } @Override - public void handleStore(MailboxRequestStore mailboxRequestStore) { + public void handleStore(MailboxRequestStore req) + throws MailboxSessionHandleException { + throw new MailboxSessionHandleException( + "Private Mailbox Session does not support the TAKE request"); } - @Override - public void handleTake(MailboxRequestTake mailboxRequestTake) { - } } -- GitLab