diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPairingTaskFactoryImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPairingTaskFactoryImpl.java index 6c5150eb3..1bab17766 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPairingTaskFactoryImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPairingTaskFactoryImpl.java @@ -1,9 +1,10 @@ package org.briarproject.bramble.mailbox; import org.briarproject.bramble.api.crypto.CryptoComponent; -import org.briarproject.bramble.api.db.TransactionManager; +import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.event.EventExecutor; import org.briarproject.bramble.api.mailbox.MailboxPairingTask; +import org.briarproject.bramble.api.mailbox.MailboxPropertyManager; import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.system.Clock; @@ -18,31 +19,35 @@ import javax.inject.Inject; class MailboxPairingTaskFactoryImpl implements MailboxPairingTaskFactory { private final Executor eventExecutor; - private final TransactionManager db; + private final DatabaseComponent db; private final CryptoComponent crypto; private final Clock clock; private final MailboxApi api; private final MailboxSettingsManager mailboxSettingsManager; + private final MailboxPropertyManager mailboxPropertyManager; @Inject MailboxPairingTaskFactoryImpl( @EventExecutor Executor eventExecutor, - TransactionManager db, + DatabaseComponent db, CryptoComponent crypto, Clock clock, MailboxApi api, - MailboxSettingsManager mailboxSettingsManager) { + MailboxSettingsManager mailboxSettingsManager, + MailboxPropertyManager mailboxPropertyManager) { this.eventExecutor = eventExecutor; this.db = db; this.crypto = crypto; this.clock = clock; this.api = api; this.mailboxSettingsManager = mailboxSettingsManager; + this.mailboxPropertyManager = mailboxPropertyManager; } @Override public MailboxPairingTask createPairingTask(String qrCodePayload) { return new MailboxPairingTaskImpl(qrCodePayload, eventExecutor, db, - crypto, clock, api, mailboxSettingsManager); + crypto, clock, api, mailboxSettingsManager, + mailboxPropertyManager); } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImpl.java index 3873e2372..56ce0d6da 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImpl.java @@ -2,14 +2,17 @@ package org.briarproject.bramble.mailbox; import org.briarproject.bramble.api.Consumer; import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.crypto.CryptoComponent; +import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; -import org.briarproject.bramble.api.db.TransactionManager; import org.briarproject.bramble.api.event.EventExecutor; import org.briarproject.bramble.api.mailbox.MailboxAuthToken; import org.briarproject.bramble.api.mailbox.MailboxPairingState; import org.briarproject.bramble.api.mailbox.MailboxPairingTask; import org.briarproject.bramble.api.mailbox.MailboxProperties; +import org.briarproject.bramble.api.mailbox.MailboxPropertiesUpdate; +import org.briarproject.bramble.api.mailbox.MailboxPropertyManager; import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.system.Clock; @@ -43,11 +46,12 @@ class MailboxPairingTaskImpl implements MailboxPairingTask { private final String payload; private final Executor eventExecutor; - private final TransactionManager db; + private final DatabaseComponent db; private final CryptoComponent crypto; private final Clock clock; private final MailboxApi api; private final MailboxSettingsManager mailboxSettingsManager; + private final MailboxPropertyManager mailboxPropertyManager; private final Object lock = new Object(); @GuardedBy("lock") @@ -59,11 +63,12 @@ class MailboxPairingTaskImpl implements MailboxPairingTask { MailboxPairingTaskImpl( String payload, @EventExecutor Executor eventExecutor, - TransactionManager db, + DatabaseComponent db, CryptoComponent crypto, Clock clock, MailboxApi api, - MailboxSettingsManager mailboxSettingsManager) { + MailboxSettingsManager mailboxSettingsManager, + MailboxPropertyManager mailboxPropertyManager) { this.payload = payload; this.eventExecutor = eventExecutor; this.db = db; @@ -71,6 +76,7 @@ class MailboxPairingTaskImpl implements MailboxPairingTask { this.clock = clock; this.api = api; this.mailboxSettingsManager = mailboxSettingsManager; + this.mailboxPropertyManager = mailboxPropertyManager; state = new MailboxPairingState.QrCodeReceived(); } @@ -117,6 +123,16 @@ class MailboxPairingTaskImpl implements MailboxPairingTask { mailboxSettingsManager .setOwnMailboxProperties(txn, ownerProperties); mailboxSettingsManager.recordSuccessfulConnection(txn, time); + // A (possibly new) mailbox is paired. Reset message retransmission + // timers for contacts who doesn't have their own mailbox. This way, + // data stranded on our old mailbox will be re-uploaded to our new. + for (Contact c : db.getContacts(txn)) { + MailboxPropertiesUpdate remoteProps = mailboxPropertyManager + .getRemoteProperties(txn, c.getId()); + if (remoteProps == null) { + db.resetUnackedMessagesToSend(txn, c.getId()); + } + } }); setState(new MailboxPairingState.Paired()); } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImplTest.java index 05b2babee..e28612117 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImplTest.java @@ -1,13 +1,15 @@ package org.briarproject.bramble.mailbox; +import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.crypto.CryptoComponent; +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.db.TransactionManager; import org.briarproject.bramble.api.mailbox.MailboxAuthToken; import org.briarproject.bramble.api.mailbox.MailboxPairingState; import org.briarproject.bramble.api.mailbox.MailboxPairingTask; import org.briarproject.bramble.api.mailbox.MailboxProperties; +import org.briarproject.bramble.api.mailbox.MailboxPropertyManager; import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; import org.briarproject.bramble.api.mailbox.OwnMailboxConnectionStatusEvent; import org.briarproject.bramble.api.system.Clock; @@ -21,9 +23,11 @@ import org.junit.Test; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.Charset; +import java.util.Collections; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicInteger; +import static org.briarproject.bramble.test.TestUtils.getContact; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getRandomId; import static org.briarproject.bramble.test.TestUtils.hasEvent; @@ -35,16 +39,18 @@ import static org.junit.Assert.fail; public class MailboxPairingTaskImplTest extends BrambleMockTestCase { private final Executor executor = new ImmediateExecutor(); - private final TransactionManager db = - context.mock(TransactionManager.class); + private final DatabaseComponent db = + context.mock(DatabaseComponent.class); private final CryptoComponent crypto = context.mock(CryptoComponent.class); private final Clock clock = context.mock(Clock.class); private final MailboxApi api = context.mock(MailboxApi.class); private final MailboxSettingsManager mailboxSettingsManager = context.mock(MailboxSettingsManager.class); + private final MailboxPropertyManager mailboxPropertyManager = + context.mock(MailboxPropertyManager.class); private final MailboxPairingTaskFactory factory = new MailboxPairingTaskFactoryImpl(executor, db, crypto, clock, api, - mailboxSettingsManager); + mailboxSettingsManager, mailboxPropertyManager); private final String onion = getRandomString(56); private final byte[] onionBytes = getRandomBytes(32); @@ -96,12 +102,19 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase { oneOf(clock).currentTimeMillis(); will(returnValue(time)); }}); + Contact contact1 = getContact(); Transaction txn = new Transaction(null, false); context.checking(new DbExpectations() {{ oneOf(db).transaction(with(false), withDbRunnable(txn)); oneOf(mailboxSettingsManager).setOwnMailboxProperties( with(txn), with(matches(ownerProperties))); oneOf(mailboxSettingsManager).recordSuccessfulConnection(txn, time); + oneOf(db).getContacts(txn); + will(returnValue(Collections.singletonList(contact1))); + oneOf(mailboxPropertyManager).getRemoteProperties(txn, + contact1.getId()); + will(returnValue(null)); + oneOf(db).resetUnackedMessagesToSend(txn, contact1.getId()); }}); AtomicInteger i = new AtomicInteger(0);