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 380fecec54b09fcbb404730fff0f9b0b20743adf..3a0a14acb45aed08ed28dba1f45e485a9efb7ad7 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 044f2432abcc2d33c93e0b58146f12a21ac18da3..cef10a8b62ee6a87417878ab5009b9cc1c9936d7 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) { - } }