diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java index fb71f9a778b9c974dcdc14eea7adf0fd4216c2f9..d4f49af6ba16f692c67eb1e331f3c3a6bb15494d 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java @@ -244,6 +244,10 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { // Pseudonym exchange succeeded LOG.info("Pseudonym exchange succeeded"); listener.contactExchangeSucceeded(remoteInfo.getAuthor()); + connectionManager + .manageOutgoingConnection(contactId, transportId, + conn); + /* // Reuse the connection as a transport connection if (localType == CONTACT) { connectionManager @@ -252,6 +256,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask { } else { tryToClose(conn); } + */ } catch (ContactExistsException e) { logException(LOG, WARNING, e); tryToClose(conn); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxServiceImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxServiceImpl.java index 7c9604cf85fba476f9bd5018ff7db8f35c6d8c5e..e4693373c302ee82d6dd98053287e28357102943 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxServiceImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxServiceImpl.java @@ -1,6 +1,5 @@ package org.briarproject.bramble.mailbox; -import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactManager; import org.briarproject.bramble.api.contact.ContactType; @@ -30,7 +29,6 @@ import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.properties.TransportPropertyManager; import org.briarproject.bramble.api.system.Scheduler; -import java.security.SecureRandom; import java.util.Collection; import java.util.Map; import java.util.concurrent.Executor; @@ -44,7 +42,6 @@ import javax.inject.Inject; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; -import static org.briarproject.bramble.api.contact.ContactType.PRIVATE_MAILBOX; import static org.briarproject.bramble.api.mailbox.MailboxConstants.POLLING_INTERVALL; import static org.briarproject.bramble.util.LogUtils.logException; @@ -97,7 +94,7 @@ public class MailboxServiceImpl implements MailboxService, EventListener { try { PrivateMailbox mb = contactManager.getPrivateMailbox(); - if (mb!=null) + if (mb != null) privateMailboxId = mb.getId(); } catch (DbException e1) { if (LOG.isLoggable(WARNING)) @@ -105,7 +102,7 @@ public class MailboxServiceImpl implements MailboxService, EventListener { } if (privateMailboxId != null) hasPrivateMailbox.set(true); - + tryToRunLanMailboxFuture(); this.eventBus.addListener(this); } @@ -128,12 +125,12 @@ public class MailboxServiceImpl implements MailboxService, EventListener { } } - if (e instanceof ContactAddedEvent){ + if (e instanceof ContactAddedEvent) { if (hasPrivateMailbox.get()) return; try { PrivateMailbox mb = contactManager.getPrivateMailbox(); - if (mb!=null) + if (mb != null) privateMailboxId = mb.getId(); } catch (DbException e1) { if (LOG.isLoggable(WARNING)) @@ -181,6 +178,7 @@ public class MailboxServiceImpl implements MailboxService, EventListener { @Override public void run() { + /* if (hasPrivateMailbox.get() && !connectionRegistry.isConnected(privateMailboxId)) { try { @@ -190,7 +188,7 @@ public class MailboxServiceImpl implements MailboxService, EventListener { return; } } - +*/ // Poll Contact mailboxes Map<ContactId, TransportProperties> contacts; Collection<MailboxInfo> contactMailboxes; @@ -210,9 +208,15 @@ public class MailboxServiceImpl implements MailboxService, EventListener { db.endTransaction(txn); } + for (MailboxInfo mailboxInfo : contactMailboxes) { if (mailboxInfo.getMailboxId() == null) - continue; + if (mailboxInfo.getMailboxId() == null && + hasPrivateMailbox.get()) { + mailboxManager + .handleOwnerContactWithoutMailbox(mailboxInfo); + continue; + } if (!connectionRegistry .isConnected(mailboxInfo.getContactId())) { TransportProperties mailboxTP = 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 4e7bf40241bf51e356b4acab8e83d47ffe4c78cd..a47357c0671d4c0d281f4f91502d9c4da688d513 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 @@ -273,10 +273,16 @@ class ConnectionManagerImpl implements ConnectionManager { txn = db.startTransaction(true); ContactType type = db.getContactType(txn, contactId); switch (type) { - case MAILBOX_OWNER: + case MAILBOX_OWNER: { mailboxManager.handleIncomingMailboxOwnerConnection(ctx, transportId, reader, writer); return; + } + case MAILBOX_CONTACT: { + mailboxManager.handleInomingOwnerContactConnection(ctx, + transportId, reader, writer); + return; + } default: } db.commitTransaction(txn); @@ -284,7 +290,7 @@ class ConnectionManagerImpl implements ConnectionManager { logException(LOG, WARNING, e); disposeReader(true, true); return; - }finally { + } finally { if (txn != null) db.endTransaction(txn); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/Poller.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/Poller.java index 8b140969c714b4d85c2b1333f3cfa1440493f14c..38422eb9af88a467d5ff6f3749d1f2da873b40ce 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/Poller.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/Poller.java @@ -111,10 +111,12 @@ class Poller implements EventListener { } private void connectToContact(ContactId c) { + /* for (SimplexPlugin s : pluginManager.getSimplexPlugins()) if (s.shouldPoll()) connectToContact(c, s); for (DuplexPlugin d : pluginManager.getDuplexPlugins()) if (d.shouldPoll()) connectToContact(c, d); + */ } private void connectToContact(ContactId c, TransportId t) { diff --git a/briar-core/src/main/java/org/briarproject/briar/mailbox/IntroduceeProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/mailbox/IntroduceeProtocolEngine.java index c2ad06076d8f2119315f414baf9d223b3a82a57a..c239fc311e75a986e98f79a4d2cda6f1d4a1b5e5 100644 --- a/briar-core/src/main/java/org/briarproject/briar/mailbox/IntroduceeProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/mailbox/IntroduceeProtocolEngine.java @@ -111,6 +111,7 @@ class IntroduceeProtocolEngine private IntroduceeSession onRemoteRequest(Transaction txn, IntroduceeSession s, IntroduceeRequestMessage m) throws DbException { + LOG.info("IntroduceeRequest received"); // The dependency, if any, must be the last remote message if (isInvalidDependency(s, m.getPreviousMessageId())) return abort(txn, s); @@ -196,6 +197,7 @@ class IntroduceeProtocolEngine public IntroduceeSession onAuthMessage(Transaction txn, IntroduceeSession s, MailboxAuthMessage m) throws DbException, FormatException { + LOG.info("AuthMessage received"); // The dependency, if any, must be the last remote message if (isInvalidDependency(s.getLastLocalMessageId(), m.getPreviousMessageId())) diff --git a/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionManagerImpl.java index 4192afbe87cbaea64d606a0f3ca09f17651a44ae..b4080ff786c873c11e440244620e30ec7574fe8b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionManagerImpl.java @@ -41,9 +41,11 @@ import javax.annotation.Nullable; import javax.inject.Inject; import static org.briarproject.bramble.api.contact.ContactManager.ContactHook; +import static org.briarproject.bramble.api.contact.ContactType.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.contact.ContactType.values; +import static org.briarproject.bramble.api.sync.Group.Visibility; import static org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook; import static org.briarproject.briar.api.mailbox.Role.INTRODUCEE; import static org.briarproject.briar.api.mailbox.Role.MAILBOX; @@ -121,6 +123,7 @@ class MailboxIntroductionManagerImpl extends BdfIncomingMessageHook @Override protected boolean incomingMessage(Transaction txn, Message m, BdfList body, BdfDictionary bdfMeta) throws DbException, FormatException { + LOG.info("Incoming message"); // For testing ContactId introduceeId = getContactId(txn, m.getGroupId()); ContactType type = db.getContactType(txn, introduceeId); @@ -316,9 +319,7 @@ class MailboxIntroductionManagerImpl extends BdfIncomingMessageHook public void addingContact(Transaction txn, Contact c) throws DbException { switch (c.getType()) { case PRIVATE_MAILBOX: - break; case MAILBOX_OWNER: - break; case CONTACT: contactAdded(txn, c); break; @@ -333,7 +334,7 @@ class MailboxIntroductionManagerImpl extends BdfIncomingMessageHook Group g = getContactGroup(c); db.addGroup(txn, g); // Apply the client's visibility to the contact group - Group.Visibility client = clientVersioningManager + Visibility client = clientVersioningManager .getClientVisibility(txn, c.getId(), CLIENT_ID, MAJOR_VERSION); db.setGroupVisibility(txn, c.getId(), g.getId(), client); // Attach the contact ID to the group @@ -344,23 +345,7 @@ class MailboxIntroductionManagerImpl extends BdfIncomingMessageHook } catch (FormatException e) { throw new AssertionError(e); } - Collection<Contact> pm = db.getContactsByType(txn, PRIVATE_MAILBOX); - if (pm.isEmpty()) return; - Collection<MailboxInfo> mailboxes = db.getContactMailboxes(txn); - for (MailboxInfo mailboxInfo : mailboxes) { - if (mailboxInfo.getContactId().equals(c.getId())) return; - } - ioExecutor.execute( - () -> { - try { - makeIntroduction((PrivateMailbox) pm.iterator().next(), - c, - clock.currentTimeMillis()); - } catch (DbException e) { - LOG.warning( - "Mailbox introduction failed: " + e.toString()); - } - }); + } @Override @@ -386,6 +371,7 @@ class MailboxIntroductionManagerImpl extends BdfIncomingMessageHook @Override public void makeIntroduction(PrivateMailbox privateMailbox, Contact contact, long timestamp) throws DbException { + LOG.info("Starting introduction"); Transaction txn = db.startTransaction(false); try { // Look up the session, if there is one @@ -471,11 +457,29 @@ class MailboxIntroductionManagerImpl extends BdfIncomingMessageHook @Override public void onClientVisibilityChanging(Transaction txn, Contact c, - Group.Visibility v) throws DbException { + Visibility v) throws DbException { if (!getApplicableContactTypes().contains(c.getType())) return; // Apply the client's visibility to the contact group Group g = getContactGroup(c); db.setGroupVisibility(txn, c.getId(), g.getId(), v); + if (v == Visibility.VISIBLE && c.getType() == CONTACT) { + Collection<Contact> pm = db.getContactsByType(txn, PRIVATE_MAILBOX); + if (pm.isEmpty()) return; + Collection<MailboxInfo> mailboxes = db.getContactMailboxes(txn); + for (MailboxInfo mailboxInfo : mailboxes) { + if (mailboxInfo.getContactId().equals(c.getId())) return; + } + PrivateMailbox privateMailbox = + (PrivateMailbox) pm.iterator().next(); + ioExecutor.execute(() -> { + try { + makeIntroduction(privateMailbox, c, + clock.currentTimeMillis()); + } catch (DbException e) { + e.printStackTrace(); + } + }); + } } private static class StoredSession { @@ -483,7 +487,8 @@ class MailboxIntroductionManagerImpl extends BdfIncomingMessageHook private final MessageId storageId; private final BdfDictionary bdfSession; - private StoredSession(MessageId storageId, BdfDictionary bdfSession) { + private StoredSession(MessageId storageId, + BdfDictionary bdfSession) { this.storageId = storageId; this.bdfSession = bdfSession; } diff --git a/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxProtocolEngine.java index 82f96d31b011b12562df82bdec49a65b6a6d8bde..1abbd4f6a11a9a6b3399b45700e0950d0c8263e6 100644 --- a/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxProtocolEngine.java @@ -96,6 +96,7 @@ class MailboxProtocolEngine extends AbstractProtocolEngine<MailboxSession> { private MailboxSession onRemoteRequest(Transaction txn, MailboxSession s, RequestMessage m) throws DbException { + LOG.info("REmote request"); // The dependency, if any, must be the last remote message if (isInvalidDependency(s, m.getPreviousMessageId())) return abort(txn, s); @@ -189,6 +190,7 @@ class MailboxProtocolEngine extends AbstractProtocolEngine<MailboxSession> { @Override public MailboxSession onIntroduceeAcceptMessage(Transaction txn, MailboxSession s, IntroduceeAcceptMessage m) throws DbException { + LOG.info("Introducee accept"); // The dependency, if any, must be the last remote message if (isInvalidDependency(s.getLastLocalMessageId(), m.getPreviousMessageId())) diff --git a/briar-core/src/main/java/org/briarproject/briar/mailbox/OwnerProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/mailbox/OwnerProtocolEngine.java index d54397a746a1fc2996973e31578478fa376fc2f9..d240c76a6d06edb5a82b8854f56b96a520540491 100644 --- a/briar-core/src/main/java/org/briarproject/briar/mailbox/OwnerProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/mailbox/OwnerProtocolEngine.java @@ -19,6 +19,8 @@ import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.mailbox.event.MailboxIntroductionResponseReceivedEvent; import org.briarproject.briar.api.mailbox.event.MailboxIntroductionSucceededEvent; +import java.util.logging.Logger; + import javax.inject.Inject; import static org.briarproject.briar.mailbox.OwnerState.ADDED; @@ -28,6 +30,9 @@ import static org.briarproject.briar.mailbox.OwnerState.AWAIT_RESPONSE_M; class OwnerProtocolEngine extends AbstractProtocolEngine<OwnerSession> { + private final static Logger LOG = + Logger.getLogger(OwnerProtocolEngine.class.getName()); + @Inject OwnerProtocolEngine(DatabaseComponent db, ClientHelper clientHelper, ContactManager contactManager, @@ -113,6 +118,7 @@ class OwnerProtocolEngine extends AbstractProtocolEngine<OwnerSession> { private OwnerSession onMailboxAccept(Transaction txn, OwnerSession s, MailboxAcceptMessage m) throws DbException { + LOG.info("Mailbox accept"); // The dependency, if any, must be the last remote message if (isInvalidDependency(s.getMailbox().lastRemoteMessageId, m.getPreviousMessageId())) return abort(txn, s); @@ -139,6 +145,7 @@ class OwnerProtocolEngine extends AbstractProtocolEngine<OwnerSession> { @Override public OwnerSession onAuthMessage(Transaction txn, OwnerSession s, MailboxAuthMessage m) throws DbException, FormatException { + LOG.info("AUth message"); // The dependency, if any, must be the last remote message if (isInvalidDependency(s.getMailbox().getLastLocalMessageId(), m.getPreviousMessageId())) return abort(txn, s); @@ -166,6 +173,7 @@ class OwnerProtocolEngine extends AbstractProtocolEngine<OwnerSession> { @Override public OwnerSession onIntroduceeAcceptMessage(Transaction txn, OwnerSession s, IntroduceeAcceptMessage m) throws DbException { + LOG.info("IntroduceeAccept"); // The dependency, if any, must be the last remote message if (isInvalidDependency(s.getIntroducee().getLastLocalMessageId(), m.getPreviousMessageId())) return abort(txn, s); @@ -185,6 +193,7 @@ class OwnerProtocolEngine extends AbstractProtocolEngine<OwnerSession> { private OwnerSession onLocalRequest(Transaction txn, OwnerSession s, long timestamp) throws DbException { + LOG.info("Local Request"); // Send REQUEST messages long maxIntroduceeTimestamp = Math.max(getLocalTimestamp(s, s.getMailbox()),