From 8b94dad01f2d2303b27703e31d74a7f76f70bad5 Mon Sep 17 00:00:00 2001 From: Daniel Lublin Date: Wed, 30 Mar 2022 10:58:30 +0200 Subject: [PATCH] Broadcast event when a contact's Mailbox properties are updated --- .../RemoteMailboxPropertiesUpdateEvent.java | 36 +++++++++++++++++++ .../briarproject/bramble/test/TestUtils.java | 14 ++++++++ .../mailbox/MailboxPropertyManagerImpl.java | 9 +++-- .../MailboxPropertyManagerImplTest.java | 29 ++++++++++++++- .../TransportPropertyManagerImplTest.java | 15 +------- 5 files changed, 86 insertions(+), 17 deletions(-) create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/RemoteMailboxPropertiesUpdateEvent.java diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/RemoteMailboxPropertiesUpdateEvent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/RemoteMailboxPropertiesUpdateEvent.java new file mode 100644 index 000000000..3d63acd37 --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/RemoteMailboxPropertiesUpdateEvent.java @@ -0,0 +1,36 @@ +package org.briarproject.bramble.api.mailbox; + +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.event.Event; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import javax.annotation.Nullable; +import javax.annotation.concurrent.Immutable; + +/** + * An event that is broadcast when {@link MailboxPropertiesUpdate} are received + * from a contact. + */ +@Immutable +@NotNullByDefault +public class RemoteMailboxPropertiesUpdateEvent extends Event { + + private final ContactId contactId; + @Nullable + private final MailboxPropertiesUpdate mailboxPropertiesUpdate; + + public RemoteMailboxPropertiesUpdateEvent(ContactId contactId, + @Nullable MailboxPropertiesUpdate mailboxPropertiesUpdate) { + this.contactId = contactId; + this.mailboxPropertiesUpdate = mailboxPropertiesUpdate; + } + + public ContactId getContact() { + return contactId; + } + + @Nullable + public MailboxPropertiesUpdate getMailboxPropertiesUpdate() { + return mailboxPropertiesUpdate; + } +} diff --git a/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java b/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java index d5a2b7c65..309f167da 100644 --- a/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java +++ b/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java @@ -12,6 +12,10 @@ import org.briarproject.bramble.api.crypto.PublicKey; import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.crypto.SignaturePrivateKey; import org.briarproject.bramble.api.crypto.SignaturePublicKey; +import org.briarproject.bramble.api.db.CommitAction; +import org.briarproject.bramble.api.db.EventAction; +import org.briarproject.bramble.api.db.Transaction; +import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.identity.Identity; @@ -287,4 +291,14 @@ public class TestUtils { a.getOutboxId().equals(b.getOutboxId()); } + public static boolean hasEvent(Transaction txn, + Class eventClass) { + for (CommitAction action : txn.getActions()) { + if (action instanceof EventAction) { + Event event = ((EventAction) action).getEvent(); + if (eventClass.isInstance(event)) return true; + } + } + return false; + } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImpl.java index 18d0d0f40..fcd6c3c95 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImpl.java @@ -23,6 +23,7 @@ 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.MailboxHook; +import org.briarproject.bramble.api.mailbox.RemoteMailboxPropertiesUpdateEvent; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.Group.Visibility; @@ -101,6 +102,8 @@ class MailboxPropertyManagerImpl implements MailboxPropertyManager, 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 + clientHelper.setContactId(txn, g.getId(), c.getId()); // If we are paired, create and send props to the newly added contact MailboxProperties ownProps = mailboxSettingsManager.getOwnMailboxProperties(txn); @@ -155,8 +158,10 @@ class MailboxPropertyManagerImpl implements MailboxPropertyManager, return ACCEPT_DO_NOT_SHARE; } } - // TODO should probably broadcast an event that a contact's mailbox - // properties were updated + ContactId c = clientHelper.getContactId(txn, m.getGroupId()); + BdfList body = clientHelper.getMessageAsList(txn, m.getId()); + MailboxPropertiesUpdate p = parseProperties(body); + txn.attach(new RemoteMailboxPropertiesUpdateEvent(c, p)); } catch (FormatException e) { throw new InvalidMessageException(e); } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImplTest.java index 68f77c624..39fe24da5 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImplTest.java @@ -17,6 +17,7 @@ import org.briarproject.bramble.api.mailbox.MailboxFolderId; import org.briarproject.bramble.api.mailbox.MailboxProperties; import org.briarproject.bramble.api.mailbox.MailboxPropertiesUpdate; import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; +import org.briarproject.bramble.api.mailbox.RemoteMailboxPropertiesUpdateEvent; import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.Message; @@ -46,8 +47,10 @@ import static org.briarproject.bramble.test.TestUtils.getContact; import static org.briarproject.bramble.test.TestUtils.getGroup; import static org.briarproject.bramble.test.TestUtils.getMessage; import static org.briarproject.bramble.test.TestUtils.getRandomId; +import static org.briarproject.bramble.test.TestUtils.hasEvent; import static org.briarproject.bramble.test.TestUtils.mailboxPropertiesUpdateEqual; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -120,6 +123,8 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase { will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, contact.getId(), contactGroup.getId(), SHARED); + oneOf(clientHelper).setContactId(txn, contactGroup.getId(), + contact.getId()); oneOf(mailboxSettingsManager).getOwnMailboxProperties(txn); will(returnValue(null)); }}); @@ -151,6 +156,8 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase { will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, contact.getId(), contactGroup.getId(), SHARED); + oneOf(clientHelper).setContactId(txn, contactGroup.getId(), + contact.getId()); oneOf(mailboxSettingsManager).getOwnMailboxProperties(txn); will(returnValue(ownProps)); oneOf(crypto).generateUniqueId(); @@ -204,6 +211,8 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase { will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, contact.getId(), contactGroup.getId(), SHARED); + oneOf(clientHelper).setContactId(txn, contactGroup.getId(), + contact.getId()); oneOf(mailboxSettingsManager).getOwnMailboxProperties(txn); will(returnValue(null)); }}); @@ -231,6 +240,8 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase { will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, contact.getId(), contactGroup.getId(), SHARED); + oneOf(clientHelper).setContactId(txn, contactGroup.getId(), + contact.getId()); oneOf(mailboxSettingsManager).getOwnMailboxProperties(txn); will(returnValue(ownProps)); oneOf(crypto).generateUniqueId(); @@ -275,6 +286,7 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase { Transaction txn = new Transaction(null, false); GroupId contactGroupId = new GroupId(getRandomId()); Message message = getMessage(contactGroupId); + BdfList body = BdfList.of(1, propsDict); Metadata meta = new Metadata(); BdfDictionary metaDictionary = BdfDictionary.of( new BdfEntry(MSG_KEY_VERSION, 1), @@ -294,11 +306,18 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase { oneOf(clientHelper).getMessageMetadataAsDictionary(txn, contactGroupId); will(returnValue(messageMetadata)); + oneOf(clientHelper).getContactId(txn, contactGroupId); + oneOf(clientHelper).getMessageAsList(txn, message.getId()); + will(returnValue(body)); + oneOf(clientHelper).parseAndValidateMailboxPropertiesUpdate( + propsDict); + will(returnValue(props)); }}); MailboxPropertyManagerImpl t = createInstance(); assertEquals(ACCEPT_DO_NOT_SHARE, t.incomingMessage(txn, message, meta)); + assertTrue(hasEvent(txn, RemoteMailboxPropertiesUpdateEvent.class)); } @Test @@ -307,6 +326,7 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase { Transaction txn = new Transaction(null, false); GroupId contactGroupId = new GroupId(getRandomId()); Message message = getMessage(contactGroupId); + BdfList body = BdfList.of(1, propsDict); Metadata meta = new Metadata(); BdfDictionary metaDictionary = BdfDictionary.of( new BdfEntry(MSG_KEY_VERSION, 2), @@ -334,11 +354,18 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase { will(returnValue(messageMetadata)); oneOf(db).deleteMessage(txn, updateId); oneOf(db).deleteMessageMetadata(txn, updateId); + oneOf(clientHelper).getContactId(txn, contactGroupId); + oneOf(clientHelper).getMessageAsList(txn, message.getId()); + will(returnValue(body)); + oneOf(clientHelper).parseAndValidateMailboxPropertiesUpdate( + propsDict); + will(returnValue(props)); }}); MailboxPropertyManagerImpl t = createInstance(); assertEquals(ACCEPT_DO_NOT_SHARE, t.incomingMessage(txn, message, meta)); + assertTrue(hasEvent(txn, RemoteMailboxPropertiesUpdateEvent.class)); } @Test @@ -372,6 +399,7 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase { MailboxPropertyManagerImpl t = createInstance(); assertEquals(ACCEPT_DO_NOT_SHARE, t.incomingMessage(txn, message, meta)); + assertFalse(hasEvent(txn, RemoteMailboxPropertiesUpdateEvent.class)); } @Test @@ -667,5 +695,4 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase { false); }}); } - } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java index 0f9b63663..7c7396f6e 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java @@ -8,12 +8,9 @@ import org.briarproject.bramble.api.data.BdfDictionary; import org.briarproject.bramble.api.data.BdfEntry; import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.data.MetadataParser; -import org.briarproject.bramble.api.db.CommitAction; import org.briarproject.bramble.api.db.DatabaseComponent; -import org.briarproject.bramble.api.db.EventAction; import org.briarproject.bramble.api.db.Metadata; import org.briarproject.bramble.api.db.Transaction; -import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.properties.event.RemoteTransportPropertiesUpdatedEvent; @@ -48,6 +45,7 @@ import static org.briarproject.bramble.test.TestUtils.getContact; import static org.briarproject.bramble.test.TestUtils.getGroup; import static org.briarproject.bramble.test.TestUtils.getMessage; import static org.briarproject.bramble.test.TestUtils.getRandomId; +import static org.briarproject.bramble.test.TestUtils.hasEvent; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -855,15 +853,4 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { false); }}); } - - private boolean hasEvent(Transaction txn, - Class eventClass) { - for (CommitAction action : txn.getActions()) { - if (action instanceof EventAction) { - Event event = ((EventAction) action).getEvent(); - if (eventClass.isInstance(event)) return true; - } - } - return false; - } }