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; package org.briarproject.bramble.mailbox;
import org.briarproject.bramble.api.crypto.CryptoComponent; 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.event.EventExecutor;
import org.briarproject.bramble.api.mailbox.MailboxPairingTask; 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.mailbox.MailboxSettingsManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.Clock;
@@ -18,31 +19,35 @@ import javax.inject.Inject;
class MailboxPairingTaskFactoryImpl implements MailboxPairingTaskFactory { class MailboxPairingTaskFactoryImpl implements MailboxPairingTaskFactory {
private final Executor eventExecutor; private final Executor eventExecutor;
private final TransactionManager db; private final DatabaseComponent db;
private final CryptoComponent crypto; private final CryptoComponent crypto;
private final Clock clock; private final Clock clock;
private final MailboxApi api; private final MailboxApi api;
private final MailboxSettingsManager mailboxSettingsManager; private final MailboxSettingsManager mailboxSettingsManager;
private final MailboxPropertyManager mailboxPropertyManager;
@Inject @Inject
MailboxPairingTaskFactoryImpl( MailboxPairingTaskFactoryImpl(
@EventExecutor Executor eventExecutor, @EventExecutor Executor eventExecutor,
TransactionManager db, DatabaseComponent db,
CryptoComponent crypto, CryptoComponent crypto,
Clock clock, Clock clock,
MailboxApi api, MailboxApi api,
MailboxSettingsManager mailboxSettingsManager) { MailboxSettingsManager mailboxSettingsManager,
MailboxPropertyManager mailboxPropertyManager) {
this.eventExecutor = eventExecutor; this.eventExecutor = eventExecutor;
this.db = db; this.db = db;
this.crypto = crypto; this.crypto = crypto;
this.clock = clock; this.clock = clock;
this.api = api; this.api = api;
this.mailboxSettingsManager = mailboxSettingsManager; this.mailboxSettingsManager = mailboxSettingsManager;
this.mailboxPropertyManager = mailboxPropertyManager;
} }
@Override @Override
public MailboxPairingTask createPairingTask(String qrCodePayload) { public MailboxPairingTask createPairingTask(String qrCodePayload) {
return new MailboxPairingTaskImpl(qrCodePayload, eventExecutor, db, 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.Consumer;
import org.briarproject.bramble.api.FormatException; 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.crypto.CryptoComponent;
import org.briarproject.bramble.api.db.DatabaseComponent;
import org.briarproject.bramble.api.db.DbException; 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.event.EventExecutor;
import org.briarproject.bramble.api.mailbox.MailboxAuthToken; import org.briarproject.bramble.api.mailbox.MailboxAuthToken;
import org.briarproject.bramble.api.mailbox.MailboxPairingState; import org.briarproject.bramble.api.mailbox.MailboxPairingState;
import org.briarproject.bramble.api.mailbox.MailboxPairingTask; import org.briarproject.bramble.api.mailbox.MailboxPairingTask;
import org.briarproject.bramble.api.mailbox.MailboxProperties; 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.mailbox.MailboxSettingsManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.Clock;
@@ -43,11 +46,12 @@ class MailboxPairingTaskImpl implements MailboxPairingTask {
private final String payload; private final String payload;
private final Executor eventExecutor; private final Executor eventExecutor;
private final TransactionManager db; private final DatabaseComponent db;
private final CryptoComponent crypto; private final CryptoComponent crypto;
private final Clock clock; private final Clock clock;
private final MailboxApi api; private final MailboxApi api;
private final MailboxSettingsManager mailboxSettingsManager; private final MailboxSettingsManager mailboxSettingsManager;
private final MailboxPropertyManager mailboxPropertyManager;
private final Object lock = new Object(); private final Object lock = new Object();
@GuardedBy("lock") @GuardedBy("lock")
@@ -59,11 +63,12 @@ class MailboxPairingTaskImpl implements MailboxPairingTask {
MailboxPairingTaskImpl( MailboxPairingTaskImpl(
String payload, String payload,
@EventExecutor Executor eventExecutor, @EventExecutor Executor eventExecutor,
TransactionManager db, DatabaseComponent db,
CryptoComponent crypto, CryptoComponent crypto,
Clock clock, Clock clock,
MailboxApi api, MailboxApi api,
MailboxSettingsManager mailboxSettingsManager) { MailboxSettingsManager mailboxSettingsManager,
MailboxPropertyManager mailboxPropertyManager) {
this.payload = payload; this.payload = payload;
this.eventExecutor = eventExecutor; this.eventExecutor = eventExecutor;
this.db = db; this.db = db;
@@ -71,6 +76,7 @@ class MailboxPairingTaskImpl implements MailboxPairingTask {
this.clock = clock; this.clock = clock;
this.api = api; this.api = api;
this.mailboxSettingsManager = mailboxSettingsManager; this.mailboxSettingsManager = mailboxSettingsManager;
this.mailboxPropertyManager = mailboxPropertyManager;
state = new MailboxPairingState.QrCodeReceived(); state = new MailboxPairingState.QrCodeReceived();
} }
@@ -117,6 +123,16 @@ class MailboxPairingTaskImpl implements MailboxPairingTask {
mailboxSettingsManager mailboxSettingsManager
.setOwnMailboxProperties(txn, ownerProperties); .setOwnMailboxProperties(txn, ownerProperties);
mailboxSettingsManager.recordSuccessfulConnection(txn, time); 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()); setState(new MailboxPairingState.Paired());
} }

View File

@@ -1,13 +1,14 @@
package org.briarproject.bramble.mailbox; package org.briarproject.bramble.mailbox;
import org.briarproject.bramble.api.crypto.CryptoComponent; 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.DbException;
import org.briarproject.bramble.api.db.Transaction; 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.MailboxAuthToken;
import org.briarproject.bramble.api.mailbox.MailboxPairingState; import org.briarproject.bramble.api.mailbox.MailboxPairingState;
import org.briarproject.bramble.api.mailbox.MailboxPairingTask; import org.briarproject.bramble.api.mailbox.MailboxPairingTask;
import org.briarproject.bramble.api.mailbox.MailboxProperties; 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.MailboxSettingsManager;
import org.briarproject.bramble.api.mailbox.OwnMailboxConnectionStatusEvent; import org.briarproject.bramble.api.mailbox.OwnMailboxConnectionStatusEvent;
import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.Clock;
@@ -35,16 +36,18 @@ import static org.junit.Assert.fail;
public class MailboxPairingTaskImplTest extends BrambleMockTestCase { public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
private final Executor executor = new ImmediateExecutor(); private final Executor executor = new ImmediateExecutor();
private final TransactionManager db = private final DatabaseComponent db =
context.mock(TransactionManager.class); context.mock(DatabaseComponent.class);
private final CryptoComponent crypto = context.mock(CryptoComponent.class); private final CryptoComponent crypto = context.mock(CryptoComponent.class);
private final Clock clock = context.mock(Clock.class); private final Clock clock = context.mock(Clock.class);
private final MailboxApi api = context.mock(MailboxApi.class); private final MailboxApi api = context.mock(MailboxApi.class);
private final MailboxSettingsManager mailboxSettingsManager = private final MailboxSettingsManager mailboxSettingsManager =
context.mock(MailboxSettingsManager.class); context.mock(MailboxSettingsManager.class);
private final MailboxPropertyManager mailboxPropertyManager =
context.mock(MailboxPropertyManager.class);
private final MailboxPairingTaskFactory factory = private final MailboxPairingTaskFactory factory =
new MailboxPairingTaskFactoryImpl(executor, db, crypto, clock, api, new MailboxPairingTaskFactoryImpl(executor, db, crypto, clock, api,
mailboxSettingsManager); mailboxSettingsManager, mailboxPropertyManager);
private final String onion = getRandomString(56); private final String onion = getRandomString(56);
private final byte[] onionBytes = getRandomBytes(32); private final byte[] onionBytes = getRandomBytes(32);
@@ -102,6 +105,7 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
oneOf(mailboxSettingsManager).setOwnMailboxProperties( oneOf(mailboxSettingsManager).setOwnMailboxProperties(
with(txn), with(matches(ownerProperties))); with(txn), with(matches(ownerProperties)));
oneOf(mailboxSettingsManager).recordSuccessfulConnection(txn, time); oneOf(mailboxSettingsManager).recordSuccessfulConnection(txn, time);
oneOf(db).getContacts(txn);
}}); }});
AtomicInteger i = new AtomicInteger(0); AtomicInteger i = new AtomicInteger(0);