From 5e5bf7ec05fcfedfcb5f5be302ef10567d098625 Mon Sep 17 00:00:00 2001 From: Torsten Grote <t@grobox.de> Date: Wed, 9 Nov 2016 17:45:25 -0200 Subject: [PATCH] Add ContactRelationshipRevealedEvent and address review comments --- .../briarproject/PrivateGroupManagerTest.java | 36 ++++++------ .../creation/CreateGroupControllerImpl.java | 2 +- .../ContactRelationshipRevealedEvent.java | 30 ++++++++++ .../api/privategroup/PrivateGroup.java | 4 +- .../api/privategroup/PrivateGroupManager.java | 16 +++--- .../api/privategroup/Visibility.java | 8 ++- .../privategroup/GroupConstants.java | 2 +- .../privategroup/GroupMessageValidator.java | 16 +++--- .../privategroup/PrivateGroupManagerImpl.java | 55 +++++++++---------- .../invitation/AbstractProtocolEngine.java | 3 +- 10 files changed, 101 insertions(+), 71 deletions(-) create mode 100644 briar-api/src/org/briarproject/api/privategroup/ContactRelationshipRevealedEvent.java diff --git a/briar-android-tests/src/test/java/org/briarproject/PrivateGroupManagerTest.java b/briar-android-tests/src/test/java/org/briarproject/PrivateGroupManagerTest.java index 0d79b1b027..e37000febf 100644 --- a/briar-android-tests/src/test/java/org/briarproject/PrivateGroupManagerTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/PrivateGroupManagerTest.java @@ -63,7 +63,7 @@ import static org.briarproject.TestUtils.getRandomBytes; import static org.briarproject.api.identity.Author.Status.VERIFIED; import static org.briarproject.api.privategroup.Visibility.INVISIBLE; import static org.briarproject.api.privategroup.Visibility.REVEALED_BY_CONTACT; -import static org.briarproject.api.privategroup.Visibility.REVEALED_BY_YOU; +import static org.briarproject.api.privategroup.Visibility.REVEALED_BY_US; import static org.briarproject.api.privategroup.Visibility.VISIBLE; import static org.briarproject.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID; import static org.briarproject.api.sync.ValidationManager.State.DELIVERED; @@ -344,7 +344,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest { GroupMessage joinMsg0 = groupMessageFactory .createJoinMessage(privateGroup0.getId(), joinTime, author0, joinTime, getRandomBytes(12)); - groupManager0.addPrivateGroup(privateGroup0, joinMsg0); + groupManager0.addPrivateGroup(privateGroup0, joinMsg0, true); assertEquals(joinMsg0.getMessage().getId(), groupManager0.getPreviousMsgId(groupId0)); @@ -367,7 +367,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest { GroupMessage joinMsg1 = groupMessageFactory .createJoinMessage(privateGroup0.getId(), joinTime, author1, inviteTime, creatorSignature); - groupManager1.addPrivateGroup(privateGroup0, joinMsg1); + groupManager1.addPrivateGroup(privateGroup0, joinMsg1, false); assertEquals(joinMsg1.getMessage().getId(), groupManager1.getPreviousMsgId(groupId0)); @@ -411,7 +411,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest { GroupMessage joinMsg0 = groupMessageFactory .createJoinMessage(privateGroup0.getId(), joinTime, author0, inviteTime, creatorSignature); - groupManager0.addPrivateGroup(privateGroup0, joinMsg0); + groupManager0.addPrivateGroup(privateGroup0, joinMsg0, true); assertEquals(joinMsg0.getMessage().getId(), groupManager0.getPreviousMsgId(groupId0)); @@ -434,7 +434,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest { GroupMessage joinMsg1 = groupMessageFactory .createJoinMessage(privateGroup0.getId(), joinTime, author1, inviteTime, creatorSignature); - groupManager1.addPrivateGroup(privateGroup0, joinMsg1); + groupManager1.addPrivateGroup(privateGroup0, joinMsg1, false); assertEquals(joinMsg1.getMessage().getId(), groupManager1.getPreviousMsgId(groupId0)); @@ -475,7 +475,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest { Collection<GroupMember> members1 = groupManager1.getMembers(groupId0); assertEquals(2, members1.size()); - for (GroupMember m : members0) { + for (GroupMember m : members1) { if (m.getAuthor().equals(author1)) { assertEquals(VISIBLE, m.getVisibility()); } else { @@ -538,7 +538,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest { .createJoinMessage(privateGroup0.getId(), joinTime, author2, inviteTime, creatorSignature); Transaction txn2 = db2.startTransaction(false); - groupManager2.addPrivateGroup(txn2, privateGroup0, joinMsg2); + groupManager2.addPrivateGroup(txn2, privateGroup0, joinMsg2, false); // make group visible to 0 db2.setVisibleToContact(txn2, contactId01, privateGroup0.getId(), true); @@ -589,7 +589,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest { members1 = groupManager1.getMembers(groupId0); for (GroupMember m : members1) { if (m.getAuthor().equals(author2)) { - assertEquals(REVEALED_BY_YOU, m.getVisibility()); + assertEquals(REVEALED_BY_US, m.getVisibility()); } } members2 = groupManager2.getMembers(groupId0); @@ -607,7 +607,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest { JoinMessageHeader j = (JoinMessageHeader) h; if (h.getAuthor().equals(author2)) // 1 revealed the relationship to 2 - assertEquals(REVEALED_BY_YOU, j.getVisibility()); + assertEquals(REVEALED_BY_US, j.getVisibility()); else // 1's other relationship (to 1 and creator) are visible assertEquals(VISIBLE, j.getVisibility()); @@ -633,16 +633,16 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest { defaultInit(); // group is not dissolved initially - assertFalse(groupManager0.isDissolved(groupId0)); + assertFalse(groupManager1.isDissolved(groupId0)); // creator dissolves group - Transaction txn0 = db0.startTransaction(false); - groupManager0.markGroupDissolved(txn0, groupId0); - db0.commitTransaction(txn0); - db0.endTransaction(txn0); + Transaction txn1 = db1.startTransaction(false); + groupManager1.markGroupDissolved(txn1, groupId0); + db1.commitTransaction(txn1); + db1.endTransaction(txn1); // group is dissolved now - assertTrue(groupManager0.isDissolved(groupId0)); + assertTrue(groupManager1.isDissolved(groupId0)); } @After @@ -737,7 +737,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest { long joinTime = clock.currentTimeMillis(); GroupMessage joinMsg0 = groupMessageFactory .createJoinMessage(privateGroup0.getId(), joinTime, author0); - groupManager0.addPrivateGroup(privateGroup0, joinMsg0); + groupManager0.addPrivateGroup(privateGroup0, joinMsg0, true); assertEquals(joinMsg0.getMessage().getId(), groupManager0.getPreviousMsgId(groupId0)); @@ -760,10 +760,10 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest { GroupMessage joinMsg1 = groupMessageFactory .createJoinMessage(privateGroup0.getId(), joinTime, author1, inviteTime, creatorSignature); - Transaction txn1 = db1.startTransaction(false); - groupManager1.addPrivateGroup(txn1, privateGroup0, joinMsg1); + groupManager1.addPrivateGroup(privateGroup0, joinMsg1, false); // make group visible to 0 + Transaction txn1 = db1.startTransaction(false); db1.setVisibleToContact(txn1, contactId01, privateGroup0.getId(), true); db1.commitTransaction(txn1); db1.endTransaction(txn1); diff --git a/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupControllerImpl.java b/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupControllerImpl.java index b37fc5e499..4f7ff84a55 100644 --- a/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupControllerImpl.java +++ b/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupControllerImpl.java @@ -117,7 +117,7 @@ public class CreateGroupControllerImpl extends DbControllerImpl public void run() { LOG.info("Adding group to database..."); try { - groupManager.addPrivateGroup(group, joinMsg); + groupManager.addPrivateGroup(group, joinMsg, true); handler.onResult(group.getId()); } catch (DbException e) { if (LOG.isLoggable(WARNING)) diff --git a/briar-api/src/org/briarproject/api/privategroup/ContactRelationshipRevealedEvent.java b/briar-api/src/org/briarproject/api/privategroup/ContactRelationshipRevealedEvent.java new file mode 100644 index 0000000000..40de39d1eb --- /dev/null +++ b/briar-api/src/org/briarproject/api/privategroup/ContactRelationshipRevealedEvent.java @@ -0,0 +1,30 @@ +package org.briarproject.api.privategroup; + +import org.briarproject.api.event.Event; +import org.briarproject.api.nullsafety.NotNullByDefault; +import org.briarproject.api.sync.GroupId; + +import javax.annotation.concurrent.Immutable; + +@Immutable +@NotNullByDefault +public class ContactRelationshipRevealedEvent extends Event { + + private final GroupId groupId; + private final Visibility visibility; + + public ContactRelationshipRevealedEvent(GroupId groupId, + Visibility visibility) { + this.groupId = groupId; + this.visibility = visibility; + } + + public GroupId getGroupId() { + return groupId; + } + + public Visibility getVisibility() { + return visibility; + } + +} diff --git a/briar-api/src/org/briarproject/api/privategroup/PrivateGroup.java b/briar-api/src/org/briarproject/api/privategroup/PrivateGroup.java index 3095d2abba..6bb6fdbe9e 100644 --- a/briar-api/src/org/briarproject/api/privategroup/PrivateGroup.java +++ b/briar-api/src/org/briarproject/api/privategroup/PrivateGroup.java @@ -25,9 +25,7 @@ public class PrivateGroup extends NamedGroup implements Shareable { @Override public boolean equals(Object o) { - return o instanceof PrivateGroup && - creator.equals(((PrivateGroup) o).getCreator()) && - super.equals(o); + return o instanceof PrivateGroup && super.equals(o); } } diff --git a/briar-api/src/org/briarproject/api/privategroup/PrivateGroupManager.java b/briar-api/src/org/briarproject/api/privategroup/PrivateGroupManager.java index f0197e0969..636678052d 100644 --- a/briar-api/src/org/briarproject/api/privategroup/PrivateGroupManager.java +++ b/briar-api/src/org/briarproject/api/privategroup/PrivateGroupManager.java @@ -22,22 +22,24 @@ public interface PrivateGroupManager extends MessageTracker { ClientId CLIENT_ID = new ClientId("org.briarproject.briar.privategroup"); /** - * Adds a new private group and joins it as the creator. + * Adds a new private group and joins it. * * @param group The private group to add * @param joinMsg The creators's join message + * @param creator True if the group is added by its creator */ - void addPrivateGroup(PrivateGroup group, GroupMessage joinMsg) - throws DbException; + void addPrivateGroup(PrivateGroup group, GroupMessage joinMsg, + boolean creator) throws DbException; /** - * Adds a new private group and joins it as a member. + * Adds a new private group and joins it. * * @param group The private group to add * @param joinMsg The new member's join message + * @param creator True if the group is added by its creator */ void addPrivateGroup(Transaction txn, PrivateGroup group, - GroupMessage joinMsg) throws DbException; + GroupMessage joinMsg, boolean creator) throws DbException; /** * Removes a dissolved private group. @@ -45,7 +47,7 @@ public interface PrivateGroupManager extends MessageTracker { void removePrivateGroup(GroupId g) throws DbException; /** - * Gets the MessageId of your previous message sent to the group + * Gets the MessageId of the user's previous message sent to the group */ MessageId getPreviousMsgId(GroupId g) throws DbException; @@ -107,7 +109,7 @@ public interface PrivateGroupManager extends MessageTracker { /** * This method needs to be called when a contact relationship - * has been revealed between you and the Author with AuthorId a + * has been revealed between the user and the Author with AuthorId a * in the Group identified by the GroupId g. * * @param byContact true if the remote contact has revealed diff --git a/briar-api/src/org/briarproject/api/privategroup/Visibility.java b/briar-api/src/org/briarproject/api/privategroup/Visibility.java index 9c535e86b8..4ff09c3ed4 100644 --- a/briar-api/src/org/briarproject/api/privategroup/Visibility.java +++ b/briar-api/src/org/briarproject/api/privategroup/Visibility.java @@ -1,10 +1,12 @@ package org.briarproject.api.privategroup; +import org.briarproject.api.FormatException; + public enum Visibility { INVISIBLE(0), VISIBLE(1), - REVEALED_BY_YOU(2), + REVEALED_BY_US(2), REVEALED_BY_CONTACT(3); int value; @@ -13,9 +15,9 @@ public enum Visibility { this.value = value; } - public static Visibility valueOf(int value) { + public static Visibility valueOf(int value) throws FormatException { for (Visibility v : values()) if (v.value == value) return v; - throw new IllegalArgumentException(); + throw new FormatException(); } public int getInt() { diff --git a/briar-core/src/org/briarproject/privategroup/GroupConstants.java b/briar-core/src/org/briarproject/privategroup/GroupConstants.java index 14d9fb22ef..72f57748c8 100644 --- a/briar-core/src/org/briarproject/privategroup/GroupConstants.java +++ b/briar-core/src/org/briarproject/privategroup/GroupConstants.java @@ -2,7 +2,7 @@ package org.briarproject.privategroup; import static org.briarproject.clients.BdfConstants.MSG_KEY_READ; -interface Constants { +interface GroupConstants { // Database keys String KEY_TYPE = "type"; diff --git a/briar-core/src/org/briarproject/privategroup/GroupMessageValidator.java b/briar-core/src/org/briarproject/privategroup/GroupMessageValidator.java index 6b9a59dae9..54b6324fc5 100644 --- a/briar-core/src/org/briarproject/privategroup/GroupMessageValidator.java +++ b/briar-core/src/org/briarproject/privategroup/GroupMessageValidator.java @@ -29,14 +29,14 @@ import static org.briarproject.api.identity.AuthorConstants.MAX_SIGNATURE_LENGTH import static org.briarproject.api.privategroup.MessageType.JOIN; import static org.briarproject.api.privategroup.MessageType.POST; import static org.briarproject.api.privategroup.PrivateGroupConstants.MAX_GROUP_POST_BODY_LENGTH; -import static org.briarproject.privategroup.Constants.KEY_MEMBER_ID; -import static org.briarproject.privategroup.Constants.KEY_MEMBER_NAME; -import static org.briarproject.privategroup.Constants.KEY_MEMBER_PUBLIC_KEY; -import static org.briarproject.privategroup.Constants.KEY_PARENT_MSG_ID; -import static org.briarproject.privategroup.Constants.KEY_PREVIOUS_MSG_ID; -import static org.briarproject.privategroup.Constants.KEY_READ; -import static org.briarproject.privategroup.Constants.KEY_TIMESTAMP; -import static org.briarproject.privategroup.Constants.KEY_TYPE; +import static org.briarproject.privategroup.GroupConstants.KEY_MEMBER_ID; +import static org.briarproject.privategroup.GroupConstants.KEY_MEMBER_NAME; +import static org.briarproject.privategroup.GroupConstants.KEY_MEMBER_PUBLIC_KEY; +import static org.briarproject.privategroup.GroupConstants.KEY_PARENT_MSG_ID; +import static org.briarproject.privategroup.GroupConstants.KEY_PREVIOUS_MSG_ID; +import static org.briarproject.privategroup.GroupConstants.KEY_READ; +import static org.briarproject.privategroup.GroupConstants.KEY_TIMESTAMP; +import static org.briarproject.privategroup.GroupConstants.KEY_TYPE; class GroupMessageValidator extends BdfMessageValidator { diff --git a/briar-core/src/org/briarproject/privategroup/PrivateGroupManagerImpl.java b/briar-core/src/org/briarproject/privategroup/PrivateGroupManagerImpl.java index 42ba0d9b01..c2bdf6cf49 100644 --- a/briar-core/src/org/briarproject/privategroup/PrivateGroupManagerImpl.java +++ b/briar-core/src/org/briarproject/privategroup/PrivateGroupManagerImpl.java @@ -18,6 +18,7 @@ import org.briarproject.api.identity.Author.Status; import org.briarproject.api.identity.AuthorId; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.nullsafety.NotNullByDefault; +import org.briarproject.api.privategroup.ContactRelationshipRevealedEvent; import org.briarproject.api.privategroup.GroupMember; import org.briarproject.api.privategroup.GroupMessage; import org.briarproject.api.privategroup.GroupMessageHeader; @@ -52,21 +53,21 @@ import static org.briarproject.api.privategroup.MessageType.JOIN; import static org.briarproject.api.privategroup.MessageType.POST; import static org.briarproject.api.privategroup.Visibility.INVISIBLE; import static org.briarproject.api.privategroup.Visibility.REVEALED_BY_CONTACT; -import static org.briarproject.api.privategroup.Visibility.REVEALED_BY_YOU; +import static org.briarproject.api.privategroup.Visibility.REVEALED_BY_US; import static org.briarproject.api.privategroup.Visibility.VISIBLE; -import static org.briarproject.privategroup.Constants.GROUP_KEY_CREATOR_ID; -import static org.briarproject.privategroup.Constants.GROUP_KEY_DISSOLVED; -import static org.briarproject.privategroup.Constants.GROUP_KEY_MEMBERS; -import static org.briarproject.privategroup.Constants.GROUP_KEY_OUR_GROUP; -import static org.briarproject.privategroup.Constants.GROUP_KEY_VISIBILITY; -import static org.briarproject.privategroup.Constants.KEY_MEMBER_ID; -import static org.briarproject.privategroup.Constants.KEY_MEMBER_NAME; -import static org.briarproject.privategroup.Constants.KEY_MEMBER_PUBLIC_KEY; -import static org.briarproject.privategroup.Constants.KEY_PARENT_MSG_ID; -import static org.briarproject.privategroup.Constants.KEY_PREVIOUS_MSG_ID; -import static org.briarproject.privategroup.Constants.KEY_READ; -import static org.briarproject.privategroup.Constants.KEY_TIMESTAMP; -import static org.briarproject.privategroup.Constants.KEY_TYPE; +import static org.briarproject.privategroup.GroupConstants.GROUP_KEY_CREATOR_ID; +import static org.briarproject.privategroup.GroupConstants.GROUP_KEY_DISSOLVED; +import static org.briarproject.privategroup.GroupConstants.GROUP_KEY_MEMBERS; +import static org.briarproject.privategroup.GroupConstants.GROUP_KEY_OUR_GROUP; +import static org.briarproject.privategroup.GroupConstants.GROUP_KEY_VISIBILITY; +import static org.briarproject.privategroup.GroupConstants.KEY_MEMBER_ID; +import static org.briarproject.privategroup.GroupConstants.KEY_MEMBER_NAME; +import static org.briarproject.privategroup.GroupConstants.KEY_MEMBER_PUBLIC_KEY; +import static org.briarproject.privategroup.GroupConstants.KEY_PARENT_MSG_ID; +import static org.briarproject.privategroup.GroupConstants.KEY_PREVIOUS_MSG_ID; +import static org.briarproject.privategroup.GroupConstants.KEY_READ; +import static org.briarproject.privategroup.GroupConstants.KEY_TIMESTAMP; +import static org.briarproject.privategroup.GroupConstants.KEY_TYPE; @NotNullByDefault public class PrivateGroupManagerImpl extends BdfIncomingMessageHook implements @@ -89,11 +90,11 @@ public class PrivateGroupManagerImpl extends BdfIncomingMessageHook implements } @Override - public void addPrivateGroup(PrivateGroup group, GroupMessage joinMsg) - throws DbException { + public void addPrivateGroup(PrivateGroup group, GroupMessage joinMsg, + boolean creator) throws DbException { Transaction txn = db.startTransaction(false); try { - addPrivateGroup(txn, group, joinMsg, true); + addPrivateGroup(txn, group, joinMsg, creator); db.commitTransaction(txn); } finally { db.endTransaction(txn); @@ -102,11 +103,6 @@ public class PrivateGroupManagerImpl extends BdfIncomingMessageHook implements @Override public void addPrivateGroup(Transaction txn, PrivateGroup group, - GroupMessage joinMsg) throws DbException { - addPrivateGroup(txn, group, joinMsg, false); - } - - private void addPrivateGroup(Transaction txn, PrivateGroup group, GroupMessage joinMsg, boolean creator) throws DbException { try { db.addGroup(txn, group.getGroup()); @@ -420,8 +416,8 @@ public class PrivateGroupManagerImpl extends BdfIncomingMessageHook implements BdfList list = meta.getList(GROUP_KEY_MEMBERS); Map<Author, Visibility> members = new HashMap<Author, Visibility>(list.size()); - for (Object o : list) { - BdfDictionary d = (BdfDictionary) o; + for (int i = 0 ; i < list.size(); i++) { + BdfDictionary d = list.getDictionary(i); Author member = getAuthor(d); Visibility v = getVisibility(d); members.put(member, v); @@ -446,21 +442,22 @@ public class PrivateGroupManagerImpl extends BdfIncomingMessageHook implements boolean byContact) throws FormatException, DbException { BdfDictionary meta = clientHelper.getGroupMetadataAsDictionary(txn, g); BdfList members = meta.getList(GROUP_KEY_MEMBERS); + Visibility v = INVISIBLE; boolean foundMember = false; - for (Object o : members) { - BdfDictionary d = (BdfDictionary) o; + for (int i = 0 ; i < members.size(); i++) { + BdfDictionary d = members.getDictionary(i); AuthorId memberId = new AuthorId(d.getRaw(KEY_MEMBER_ID)); if (a.equals(memberId)) { foundMember = true; Visibility vOld = getVisibility(d); if (vOld != INVISIBLE) throw new ProtocolStateException(); - Visibility vNew = - byContact ? REVEALED_BY_CONTACT : REVEALED_BY_YOU; - d.put(GROUP_KEY_VISIBILITY, vNew.getInt()); + v = byContact ? REVEALED_BY_CONTACT : REVEALED_BY_US; + d.put(GROUP_KEY_VISIBILITY, v.getInt()); } } if (!foundMember) throw new ProtocolStateException(); clientHelper.mergeGroupMetadata(txn, g, meta); + txn.attach(new ContactRelationshipRevealedEvent(g, v)); } @Override diff --git a/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java b/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java index c62e4831d6..86e8688a0d 100644 --- a/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java +++ b/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java @@ -183,7 +183,8 @@ abstract class AbstractProtocolEngine<S extends Session> GroupMessage joinMessage = groupMessageFactory.createJoinMessage( privateGroup.getId(), timestamp, member, invite.getTimestamp(), invite.getSignature()); - privateGroupManager.addPrivateGroup(txn, privateGroup, joinMessage); + privateGroupManager + .addPrivateGroup(txn, privateGroup, joinMessage, false); } long getLocalTimestamp(S session) { -- GitLab