From 98cf6b5bba9c6aa550304277f9be0ed642f6c48a Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 11 Nov 2016 11:29:55 +0000 Subject: [PATCH 1/3] Mark relationship visible when syncing group with peer. --- .../privategroup/PrivateGroupManagerImpl.java | 19 ++++++++++------- .../invitation/PeerProtocolEngine.java | 21 +++++++++++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/briar-core/src/org/briarproject/privategroup/PrivateGroupManagerImpl.java b/briar-core/src/org/briarproject/privategroup/PrivateGroupManagerImpl.java index c2bdf6cf4..5ff1193f9 100644 --- a/briar-core/src/org/briarproject/privategroup/PrivateGroupManagerImpl.java +++ b/briar-core/src/org/briarproject/privategroup/PrivateGroupManagerImpl.java @@ -443,21 +443,26 @@ public class PrivateGroupManagerImpl extends BdfIncomingMessageHook implements BdfDictionary meta = clientHelper.getGroupMetadataAsDictionary(txn, g); BdfList members = meta.getList(GROUP_KEY_MEMBERS); Visibility v = INVISIBLE; - boolean foundMember = false; + boolean foundMember = false, changed = false; 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(); - v = byContact ? REVEALED_BY_CONTACT : REVEALED_BY_US; - d.put(GROUP_KEY_VISIBILITY, v.getInt()); + // Don't update the visibility if the contact is already visible + if (getVisibility(d) == INVISIBLE) { + changed = true; + v = byContact ? REVEALED_BY_CONTACT : REVEALED_BY_US; + d.put(GROUP_KEY_VISIBILITY, v.getInt()); + } + break; } } if (!foundMember) throw new ProtocolStateException(); - clientHelper.mergeGroupMetadata(txn, g, meta); - txn.attach(new ContactRelationshipRevealedEvent(g, v)); + if (changed) { + clientHelper.mergeGroupMetadata(txn, g, meta); + txn.attach(new ContactRelationshipRevealedEvent(g, v)); + } } @Override diff --git a/briar-core/src/org/briarproject/privategroup/invitation/PeerProtocolEngine.java b/briar-core/src/org/briarproject/privategroup/invitation/PeerProtocolEngine.java index 6d3c721f3..84aa82ced 100644 --- a/briar-core/src/org/briarproject/privategroup/invitation/PeerProtocolEngine.java +++ b/briar-core/src/org/briarproject/privategroup/invitation/PeerProtocolEngine.java @@ -3,6 +3,8 @@ package org.briarproject.privategroup.invitation; import org.briarproject.api.FormatException; import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.clients.ProtocolStateException; +import org.briarproject.api.contact.Contact; +import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; import org.briarproject.api.db.Transaction; @@ -179,6 +181,7 @@ class PeerProtocolEngine extends AbstractProtocolEngine { } catch (FormatException e) { throw new DbException(e); // Invalid group metadata } + // The relationship is already marked visible to the group // Move to the BOTH_JOINED state return new PeerSession(s.getContactGroupId(), s.getPrivateGroupId(), sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(), @@ -228,6 +231,12 @@ class PeerProtocolEngine extends AbstractProtocolEngine { } catch (FormatException e) { throw new DbException(e); // Invalid group metadata } + try { + // Mark the relationship visible to the group, revealed by contact + relationshipRevealed(txn, s, true); + } catch (FormatException e) { + throw new DbException(e); // Invalid group metadata + } // Move to the BOTH_JOINED state return new PeerSession(s.getContactGroupId(), s.getPrivateGroupId(), sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(), @@ -254,6 +263,8 @@ class PeerProtocolEngine extends AbstractProtocolEngine { Message sent = sendJoinMessage(txn, s, false); // Start syncing the private group with the contact syncPrivateGroupWithContact(txn, s, true); + // Mark the relationship visible to the group, revealed by contact + relationshipRevealed(txn, s, true); // Move to the BOTH_JOINED state return new PeerSession(s.getContactGroupId(), s.getPrivateGroupId(), sent.getId(), m.getId(), sent.getTimestamp(), BOTH_JOINED); @@ -266,6 +277,8 @@ class PeerProtocolEngine extends AbstractProtocolEngine { return abort(txn, s); // Start syncing the private group with the contact syncPrivateGroupWithContact(txn, s, true); + // Mark the relationship visible to the group, revealed by us + relationshipRevealed(txn, s, false); // Move to the BOTH_JOINED state return new PeerSession(s.getContactGroupId(), s.getPrivateGroupId(), s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(), @@ -321,4 +334,12 @@ class PeerProtocolEngine extends AbstractProtocolEngine { sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(), ERROR); } + + private void relationshipRevealed(Transaction txn, PeerSession s, + boolean byContact) throws DbException, FormatException { + ContactId contactId = getContactId(txn, s.getContactGroupId()); + Contact contact = db.getContact(txn, contactId); + privateGroupManager.relationshipRevealed(txn, s.getPrivateGroupId(), + contact.getAuthor().getId(), byContact); + } } From 3a2205123f1b3c1fba6a4721196aeff1f2aa1e89 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 11 Nov 2016 13:49:49 +0000 Subject: [PATCH 2/3] Added a method for revealing a contact to a private group. --- .../invitation/GroupInvitationManager.java | 6 +++++ .../GroupInvitationManagerImpl.java | 24 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationManager.java b/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationManager.java index 489e51a59..2a4d4539f 100644 --- a/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationManager.java +++ b/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationManager.java @@ -42,6 +42,12 @@ public interface GroupInvitationManager { void respondToInvitation(ContactId c, SessionId s, boolean accept) throws DbException; + /** + * Makes the user's relationship with the given contact visible to the + * given private group. + */ + void revealRelationship(ContactId c, GroupId g) throws DbException; + /** * Returns all private group invitation messages related to the given * contact. diff --git a/briar-core/src/org/briarproject/privategroup/invitation/GroupInvitationManagerImpl.java b/briar-core/src/org/briarproject/privategroup/invitation/GroupInvitationManagerImpl.java index ae11b48b8..bc6dd88f6 100644 --- a/briar-core/src/org/briarproject/privategroup/invitation/GroupInvitationManagerImpl.java +++ b/briar-core/src/org/briarproject/privategroup/invitation/GroupInvitationManagerImpl.java @@ -315,6 +315,30 @@ class GroupInvitationManagerImpl extends ConversationClientImpl } } + @Override + public void revealRelationship(ContactId c, GroupId g) throws DbException { + Transaction txn = db.startTransaction(false); + try { + // Look up the session + Contact contact = db.getContact(txn, c); + GroupId contactGroupId = getContactGroup(contact).getId(); + StoredSession ss = getSession(txn, contactGroupId, getSessionId(g)); + if (ss == null) throw new IllegalArgumentException(); + // Parse the session + PeerSession session = sessionParser + .parsePeerSession(contactGroupId, ss.bdfSession); + // Handle the join action + session = peerEngine.onJoinAction(txn, session); + // Store the updated session + storeSession(txn, ss.storageId, session); + db.commitTransaction(txn); + } catch (FormatException e) { + throw new DbException(e); + } finally { + db.endTransaction(txn); + } + } + private S handleAction(Transaction txn, LocalAction type, S session, ProtocolEngine engine) throws DbException, FormatException { From da543c100421c38abbcd54ca74627a4e2a2d9a49 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 14 Nov 2016 10:30:38 +0000 Subject: [PATCH 3/3] Added javadocs, removed redundant exception. --- .idea/codeStyleSettings.xml | 2 ++ .../invitation/GroupInvitationManager.java | 14 ++++++++++++++ .../invitation/GroupInvitationManagerImpl.java | 3 --- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml index 2feaa4e95..a7a72e1fb 100644 --- a/.idea/codeStyleSettings.xml +++ b/.idea/codeStyleSettings.xml @@ -31,6 +31,8 @@