mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-18 13:49:53 +01:00
Merge branch '2295-broadcast-event-on-contact-mailbox-props-update' into 'master'
Broadcast event when a contact's Mailbox properties are updated Closes #2295 See merge request briar/briar!1612
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,6 +12,10 @@ import org.briarproject.bramble.api.crypto.PublicKey;
|
|||||||
import org.briarproject.bramble.api.crypto.SecretKey;
|
import org.briarproject.bramble.api.crypto.SecretKey;
|
||||||
import org.briarproject.bramble.api.crypto.SignaturePrivateKey;
|
import org.briarproject.bramble.api.crypto.SignaturePrivateKey;
|
||||||
import org.briarproject.bramble.api.crypto.SignaturePublicKey;
|
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.Author;
|
||||||
import org.briarproject.bramble.api.identity.AuthorId;
|
import org.briarproject.bramble.api.identity.AuthorId;
|
||||||
import org.briarproject.bramble.api.identity.Identity;
|
import org.briarproject.bramble.api.identity.Identity;
|
||||||
@@ -287,4 +291,14 @@ public class TestUtils {
|
|||||||
a.getOutboxId().equals(b.getOutboxId());
|
a.getOutboxId().equals(b.getOutboxId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean hasEvent(Transaction txn,
|
||||||
|
Class<? extends Event> eventClass) {
|
||||||
|
for (CommitAction action : txn.getActions()) {
|
||||||
|
if (action instanceof EventAction) {
|
||||||
|
Event event = ((EventAction) action).getEvent();
|
||||||
|
if (eventClass.isInstance(event)) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import org.briarproject.bramble.api.mailbox.MailboxPropertiesUpdate;
|
|||||||
import org.briarproject.bramble.api.mailbox.MailboxPropertyManager;
|
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.MailboxSettingsManager.MailboxHook;
|
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.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.sync.Group;
|
import org.briarproject.bramble.api.sync.Group;
|
||||||
import org.briarproject.bramble.api.sync.Group.Visibility;
|
import org.briarproject.bramble.api.sync.Group.Visibility;
|
||||||
@@ -101,6 +102,8 @@ class MailboxPropertyManagerImpl implements MailboxPropertyManager,
|
|||||||
Visibility client = clientVersioningManager
|
Visibility client = clientVersioningManager
|
||||||
.getClientVisibility(txn, c.getId(), CLIENT_ID, MAJOR_VERSION);
|
.getClientVisibility(txn, c.getId(), CLIENT_ID, MAJOR_VERSION);
|
||||||
db.setGroupVisibility(txn, c.getId(), g.getId(), client);
|
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
|
// If we are paired, create and send props to the newly added contact
|
||||||
MailboxProperties ownProps =
|
MailboxProperties ownProps =
|
||||||
mailboxSettingsManager.getOwnMailboxProperties(txn);
|
mailboxSettingsManager.getOwnMailboxProperties(txn);
|
||||||
@@ -155,8 +158,10 @@ class MailboxPropertyManagerImpl implements MailboxPropertyManager,
|
|||||||
return ACCEPT_DO_NOT_SHARE;
|
return ACCEPT_DO_NOT_SHARE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// TODO should probably broadcast an event that a contact's mailbox
|
ContactId c = clientHelper.getContactId(txn, m.getGroupId());
|
||||||
// properties were updated
|
BdfList body = clientHelper.getMessageAsList(txn, m.getId());
|
||||||
|
MailboxPropertiesUpdate p = parseProperties(body);
|
||||||
|
txn.attach(new RemoteMailboxPropertiesUpdateEvent(c, p));
|
||||||
} catch (FormatException e) {
|
} catch (FormatException e) {
|
||||||
throw new InvalidMessageException(e);
|
throw new InvalidMessageException(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import org.briarproject.bramble.api.mailbox.MailboxFolderId;
|
|||||||
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.MailboxPropertiesUpdate;
|
||||||
import org.briarproject.bramble.api.mailbox.MailboxSettingsManager;
|
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.Group;
|
||||||
import org.briarproject.bramble.api.sync.GroupId;
|
import org.briarproject.bramble.api.sync.GroupId;
|
||||||
import org.briarproject.bramble.api.sync.Message;
|
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.getGroup;
|
||||||
import static org.briarproject.bramble.test.TestUtils.getMessage;
|
import static org.briarproject.bramble.test.TestUtils.getMessage;
|
||||||
import static org.briarproject.bramble.test.TestUtils.getRandomId;
|
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.briarproject.bramble.test.TestUtils.mailboxPropertiesUpdateEqual;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
@@ -120,6 +123,8 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase {
|
|||||||
will(returnValue(SHARED));
|
will(returnValue(SHARED));
|
||||||
oneOf(db).setGroupVisibility(txn, contact.getId(),
|
oneOf(db).setGroupVisibility(txn, contact.getId(),
|
||||||
contactGroup.getId(), SHARED);
|
contactGroup.getId(), SHARED);
|
||||||
|
oneOf(clientHelper).setContactId(txn, contactGroup.getId(),
|
||||||
|
contact.getId());
|
||||||
oneOf(mailboxSettingsManager).getOwnMailboxProperties(txn);
|
oneOf(mailboxSettingsManager).getOwnMailboxProperties(txn);
|
||||||
will(returnValue(null));
|
will(returnValue(null));
|
||||||
}});
|
}});
|
||||||
@@ -151,6 +156,8 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase {
|
|||||||
will(returnValue(SHARED));
|
will(returnValue(SHARED));
|
||||||
oneOf(db).setGroupVisibility(txn, contact.getId(),
|
oneOf(db).setGroupVisibility(txn, contact.getId(),
|
||||||
contactGroup.getId(), SHARED);
|
contactGroup.getId(), SHARED);
|
||||||
|
oneOf(clientHelper).setContactId(txn, contactGroup.getId(),
|
||||||
|
contact.getId());
|
||||||
oneOf(mailboxSettingsManager).getOwnMailboxProperties(txn);
|
oneOf(mailboxSettingsManager).getOwnMailboxProperties(txn);
|
||||||
will(returnValue(ownProps));
|
will(returnValue(ownProps));
|
||||||
oneOf(crypto).generateUniqueId();
|
oneOf(crypto).generateUniqueId();
|
||||||
@@ -204,6 +211,8 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase {
|
|||||||
will(returnValue(SHARED));
|
will(returnValue(SHARED));
|
||||||
oneOf(db).setGroupVisibility(txn, contact.getId(),
|
oneOf(db).setGroupVisibility(txn, contact.getId(),
|
||||||
contactGroup.getId(), SHARED);
|
contactGroup.getId(), SHARED);
|
||||||
|
oneOf(clientHelper).setContactId(txn, contactGroup.getId(),
|
||||||
|
contact.getId());
|
||||||
oneOf(mailboxSettingsManager).getOwnMailboxProperties(txn);
|
oneOf(mailboxSettingsManager).getOwnMailboxProperties(txn);
|
||||||
will(returnValue(null));
|
will(returnValue(null));
|
||||||
}});
|
}});
|
||||||
@@ -231,6 +240,8 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase {
|
|||||||
will(returnValue(SHARED));
|
will(returnValue(SHARED));
|
||||||
oneOf(db).setGroupVisibility(txn, contact.getId(),
|
oneOf(db).setGroupVisibility(txn, contact.getId(),
|
||||||
contactGroup.getId(), SHARED);
|
contactGroup.getId(), SHARED);
|
||||||
|
oneOf(clientHelper).setContactId(txn, contactGroup.getId(),
|
||||||
|
contact.getId());
|
||||||
oneOf(mailboxSettingsManager).getOwnMailboxProperties(txn);
|
oneOf(mailboxSettingsManager).getOwnMailboxProperties(txn);
|
||||||
will(returnValue(ownProps));
|
will(returnValue(ownProps));
|
||||||
oneOf(crypto).generateUniqueId();
|
oneOf(crypto).generateUniqueId();
|
||||||
@@ -275,6 +286,7 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase {
|
|||||||
Transaction txn = new Transaction(null, false);
|
Transaction txn = new Transaction(null, false);
|
||||||
GroupId contactGroupId = new GroupId(getRandomId());
|
GroupId contactGroupId = new GroupId(getRandomId());
|
||||||
Message message = getMessage(contactGroupId);
|
Message message = getMessage(contactGroupId);
|
||||||
|
BdfList body = BdfList.of(1, propsDict);
|
||||||
Metadata meta = new Metadata();
|
Metadata meta = new Metadata();
|
||||||
BdfDictionary metaDictionary = BdfDictionary.of(
|
BdfDictionary metaDictionary = BdfDictionary.of(
|
||||||
new BdfEntry(MSG_KEY_VERSION, 1),
|
new BdfEntry(MSG_KEY_VERSION, 1),
|
||||||
@@ -294,11 +306,18 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase {
|
|||||||
oneOf(clientHelper).getMessageMetadataAsDictionary(txn,
|
oneOf(clientHelper).getMessageMetadataAsDictionary(txn,
|
||||||
contactGroupId);
|
contactGroupId);
|
||||||
will(returnValue(messageMetadata));
|
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();
|
MailboxPropertyManagerImpl t = createInstance();
|
||||||
assertEquals(ACCEPT_DO_NOT_SHARE,
|
assertEquals(ACCEPT_DO_NOT_SHARE,
|
||||||
t.incomingMessage(txn, message, meta));
|
t.incomingMessage(txn, message, meta));
|
||||||
|
assertTrue(hasEvent(txn, RemoteMailboxPropertiesUpdateEvent.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -307,6 +326,7 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase {
|
|||||||
Transaction txn = new Transaction(null, false);
|
Transaction txn = new Transaction(null, false);
|
||||||
GroupId contactGroupId = new GroupId(getRandomId());
|
GroupId contactGroupId = new GroupId(getRandomId());
|
||||||
Message message = getMessage(contactGroupId);
|
Message message = getMessage(contactGroupId);
|
||||||
|
BdfList body = BdfList.of(1, propsDict);
|
||||||
Metadata meta = new Metadata();
|
Metadata meta = new Metadata();
|
||||||
BdfDictionary metaDictionary = BdfDictionary.of(
|
BdfDictionary metaDictionary = BdfDictionary.of(
|
||||||
new BdfEntry(MSG_KEY_VERSION, 2),
|
new BdfEntry(MSG_KEY_VERSION, 2),
|
||||||
@@ -334,11 +354,18 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase {
|
|||||||
will(returnValue(messageMetadata));
|
will(returnValue(messageMetadata));
|
||||||
oneOf(db).deleteMessage(txn, updateId);
|
oneOf(db).deleteMessage(txn, updateId);
|
||||||
oneOf(db).deleteMessageMetadata(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();
|
MailboxPropertyManagerImpl t = createInstance();
|
||||||
assertEquals(ACCEPT_DO_NOT_SHARE,
|
assertEquals(ACCEPT_DO_NOT_SHARE,
|
||||||
t.incomingMessage(txn, message, meta));
|
t.incomingMessage(txn, message, meta));
|
||||||
|
assertTrue(hasEvent(txn, RemoteMailboxPropertiesUpdateEvent.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -372,6 +399,7 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase {
|
|||||||
MailboxPropertyManagerImpl t = createInstance();
|
MailboxPropertyManagerImpl t = createInstance();
|
||||||
assertEquals(ACCEPT_DO_NOT_SHARE,
|
assertEquals(ACCEPT_DO_NOT_SHARE,
|
||||||
t.incomingMessage(txn, message, meta));
|
t.incomingMessage(txn, message, meta));
|
||||||
|
assertFalse(hasEvent(txn, RemoteMailboxPropertiesUpdateEvent.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -667,5 +695,4 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase {
|
|||||||
false);
|
false);
|
||||||
}});
|
}});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,12 +8,9 @@ import org.briarproject.bramble.api.data.BdfDictionary;
|
|||||||
import org.briarproject.bramble.api.data.BdfEntry;
|
import org.briarproject.bramble.api.data.BdfEntry;
|
||||||
import org.briarproject.bramble.api.data.BdfList;
|
import org.briarproject.bramble.api.data.BdfList;
|
||||||
import org.briarproject.bramble.api.data.MetadataParser;
|
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.DatabaseComponent;
|
||||||
import org.briarproject.bramble.api.db.EventAction;
|
|
||||||
import org.briarproject.bramble.api.db.Metadata;
|
import org.briarproject.bramble.api.db.Metadata;
|
||||||
import org.briarproject.bramble.api.db.Transaction;
|
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.plugin.TransportId;
|
||||||
import org.briarproject.bramble.api.properties.TransportProperties;
|
import org.briarproject.bramble.api.properties.TransportProperties;
|
||||||
import org.briarproject.bramble.api.properties.event.RemoteTransportPropertiesUpdatedEvent;
|
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.getGroup;
|
||||||
import static org.briarproject.bramble.test.TestUtils.getMessage;
|
import static org.briarproject.bramble.test.TestUtils.getMessage;
|
||||||
import static org.briarproject.bramble.test.TestUtils.getRandomId;
|
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.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
@@ -855,15 +853,4 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
|
|||||||
false);
|
false);
|
||||||
}});
|
}});
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasEvent(Transaction txn,
|
|
||||||
Class<? extends Event> eventClass) {
|
|
||||||
for (CommitAction action : txn.getActions()) {
|
|
||||||
if (action instanceof EventAction) {
|
|
||||||
Event event = ((EventAction) action).getEvent();
|
|
||||||
if (eventClass.isInstance(event)) return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user