Reset retransmission times when pairing (new) mailbox

This commit is contained in:
Daniel Lublin
2022-04-01 10:36:16 +02:00
parent 4b3c26feb6
commit 7cf2c2faa7
3 changed files with 38 additions and 13 deletions

View File

@@ -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);
}
}

View File

@@ -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());
}

View File

@@ -1,13 +1,14 @@
package org.briarproject.bramble.mailbox;
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;
@@ -35,16 +36,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);
@@ -102,6 +105,7 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
oneOf(mailboxSettingsManager).setOwnMailboxProperties(
with(txn), with(matches(ownerProperties)));
oneOf(mailboxSettingsManager).recordSuccessfulConnection(txn, time);
oneOf(db).getContacts(txn);
}});
AtomicInteger i = new AtomicInteger(0);