Add ContactRelationshipRevealedEvent and address review comments

This commit is contained in:
Torsten Grote
2016-11-09 17:45:25 -02:00
parent 3eed0bfe81
commit 5e5bf7ec05
10 changed files with 101 additions and 71 deletions

View File

@@ -63,7 +63,7 @@ import static org.briarproject.TestUtils.getRandomBytes;
import static org.briarproject.api.identity.Author.Status.VERIFIED; import static org.briarproject.api.identity.Author.Status.VERIFIED;
import static org.briarproject.api.privategroup.Visibility.INVISIBLE; 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_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.Visibility.VISIBLE;
import static org.briarproject.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID; import static org.briarproject.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID;
import static org.briarproject.api.sync.ValidationManager.State.DELIVERED; import static org.briarproject.api.sync.ValidationManager.State.DELIVERED;
@@ -344,7 +344,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest {
GroupMessage joinMsg0 = groupMessageFactory GroupMessage joinMsg0 = groupMessageFactory
.createJoinMessage(privateGroup0.getId(), joinTime, author0, .createJoinMessage(privateGroup0.getId(), joinTime, author0,
joinTime, getRandomBytes(12)); joinTime, getRandomBytes(12));
groupManager0.addPrivateGroup(privateGroup0, joinMsg0); groupManager0.addPrivateGroup(privateGroup0, joinMsg0, true);
assertEquals(joinMsg0.getMessage().getId(), assertEquals(joinMsg0.getMessage().getId(),
groupManager0.getPreviousMsgId(groupId0)); groupManager0.getPreviousMsgId(groupId0));
@@ -367,7 +367,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest {
GroupMessage joinMsg1 = groupMessageFactory GroupMessage joinMsg1 = groupMessageFactory
.createJoinMessage(privateGroup0.getId(), joinTime, author1, .createJoinMessage(privateGroup0.getId(), joinTime, author1,
inviteTime, creatorSignature); inviteTime, creatorSignature);
groupManager1.addPrivateGroup(privateGroup0, joinMsg1); groupManager1.addPrivateGroup(privateGroup0, joinMsg1, false);
assertEquals(joinMsg1.getMessage().getId(), assertEquals(joinMsg1.getMessage().getId(),
groupManager1.getPreviousMsgId(groupId0)); groupManager1.getPreviousMsgId(groupId0));
@@ -411,7 +411,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest {
GroupMessage joinMsg0 = groupMessageFactory GroupMessage joinMsg0 = groupMessageFactory
.createJoinMessage(privateGroup0.getId(), joinTime, author0, .createJoinMessage(privateGroup0.getId(), joinTime, author0,
inviteTime, creatorSignature); inviteTime, creatorSignature);
groupManager0.addPrivateGroup(privateGroup0, joinMsg0); groupManager0.addPrivateGroup(privateGroup0, joinMsg0, true);
assertEquals(joinMsg0.getMessage().getId(), assertEquals(joinMsg0.getMessage().getId(),
groupManager0.getPreviousMsgId(groupId0)); groupManager0.getPreviousMsgId(groupId0));
@@ -434,7 +434,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest {
GroupMessage joinMsg1 = groupMessageFactory GroupMessage joinMsg1 = groupMessageFactory
.createJoinMessage(privateGroup0.getId(), joinTime, author1, .createJoinMessage(privateGroup0.getId(), joinTime, author1,
inviteTime, creatorSignature); inviteTime, creatorSignature);
groupManager1.addPrivateGroup(privateGroup0, joinMsg1); groupManager1.addPrivateGroup(privateGroup0, joinMsg1, false);
assertEquals(joinMsg1.getMessage().getId(), assertEquals(joinMsg1.getMessage().getId(),
groupManager1.getPreviousMsgId(groupId0)); groupManager1.getPreviousMsgId(groupId0));
@@ -475,7 +475,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest {
Collection<GroupMember> members1 = groupManager1.getMembers(groupId0); Collection<GroupMember> members1 = groupManager1.getMembers(groupId0);
assertEquals(2, members1.size()); assertEquals(2, members1.size());
for (GroupMember m : members0) { for (GroupMember m : members1) {
if (m.getAuthor().equals(author1)) { if (m.getAuthor().equals(author1)) {
assertEquals(VISIBLE, m.getVisibility()); assertEquals(VISIBLE, m.getVisibility());
} else { } else {
@@ -538,7 +538,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest {
.createJoinMessage(privateGroup0.getId(), joinTime, author2, .createJoinMessage(privateGroup0.getId(), joinTime, author2,
inviteTime, creatorSignature); inviteTime, creatorSignature);
Transaction txn2 = db2.startTransaction(false); Transaction txn2 = db2.startTransaction(false);
groupManager2.addPrivateGroup(txn2, privateGroup0, joinMsg2); groupManager2.addPrivateGroup(txn2, privateGroup0, joinMsg2, false);
// make group visible to 0 // make group visible to 0
db2.setVisibleToContact(txn2, contactId01, privateGroup0.getId(), true); db2.setVisibleToContact(txn2, contactId01, privateGroup0.getId(), true);
@@ -589,7 +589,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest {
members1 = groupManager1.getMembers(groupId0); members1 = groupManager1.getMembers(groupId0);
for (GroupMember m : members1) { for (GroupMember m : members1) {
if (m.getAuthor().equals(author2)) { if (m.getAuthor().equals(author2)) {
assertEquals(REVEALED_BY_YOU, m.getVisibility()); assertEquals(REVEALED_BY_US, m.getVisibility());
} }
} }
members2 = groupManager2.getMembers(groupId0); members2 = groupManager2.getMembers(groupId0);
@@ -607,7 +607,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest {
JoinMessageHeader j = (JoinMessageHeader) h; JoinMessageHeader j = (JoinMessageHeader) h;
if (h.getAuthor().equals(author2)) if (h.getAuthor().equals(author2))
// 1 revealed the relationship to 2 // 1 revealed the relationship to 2
assertEquals(REVEALED_BY_YOU, j.getVisibility()); assertEquals(REVEALED_BY_US, j.getVisibility());
else else
// 1's other relationship (to 1 and creator) are visible // 1's other relationship (to 1 and creator) are visible
assertEquals(VISIBLE, j.getVisibility()); assertEquals(VISIBLE, j.getVisibility());
@@ -633,16 +633,16 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest {
defaultInit(); defaultInit();
// group is not dissolved initially // group is not dissolved initially
assertFalse(groupManager0.isDissolved(groupId0)); assertFalse(groupManager1.isDissolved(groupId0));
// creator dissolves group // creator dissolves group
Transaction txn0 = db0.startTransaction(false); Transaction txn1 = db1.startTransaction(false);
groupManager0.markGroupDissolved(txn0, groupId0); groupManager1.markGroupDissolved(txn1, groupId0);
db0.commitTransaction(txn0); db1.commitTransaction(txn1);
db0.endTransaction(txn0); db1.endTransaction(txn1);
// group is dissolved now // group is dissolved now
assertTrue(groupManager0.isDissolved(groupId0)); assertTrue(groupManager1.isDissolved(groupId0));
} }
@After @After
@@ -737,7 +737,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest {
long joinTime = clock.currentTimeMillis(); long joinTime = clock.currentTimeMillis();
GroupMessage joinMsg0 = groupMessageFactory GroupMessage joinMsg0 = groupMessageFactory
.createJoinMessage(privateGroup0.getId(), joinTime, author0); .createJoinMessage(privateGroup0.getId(), joinTime, author0);
groupManager0.addPrivateGroup(privateGroup0, joinMsg0); groupManager0.addPrivateGroup(privateGroup0, joinMsg0, true);
assertEquals(joinMsg0.getMessage().getId(), assertEquals(joinMsg0.getMessage().getId(),
groupManager0.getPreviousMsgId(groupId0)); groupManager0.getPreviousMsgId(groupId0));
@@ -760,10 +760,10 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest {
GroupMessage joinMsg1 = groupMessageFactory GroupMessage joinMsg1 = groupMessageFactory
.createJoinMessage(privateGroup0.getId(), joinTime, author1, .createJoinMessage(privateGroup0.getId(), joinTime, author1,
inviteTime, creatorSignature); inviteTime, creatorSignature);
Transaction txn1 = db1.startTransaction(false); groupManager1.addPrivateGroup(privateGroup0, joinMsg1, false);
groupManager1.addPrivateGroup(txn1, privateGroup0, joinMsg1);
// make group visible to 0 // make group visible to 0
Transaction txn1 = db1.startTransaction(false);
db1.setVisibleToContact(txn1, contactId01, privateGroup0.getId(), true); db1.setVisibleToContact(txn1, contactId01, privateGroup0.getId(), true);
db1.commitTransaction(txn1); db1.commitTransaction(txn1);
db1.endTransaction(txn1); db1.endTransaction(txn1);

View File

@@ -117,7 +117,7 @@ public class CreateGroupControllerImpl extends DbControllerImpl
public void run() { public void run() {
LOG.info("Adding group to database..."); LOG.info("Adding group to database...");
try { try {
groupManager.addPrivateGroup(group, joinMsg); groupManager.addPrivateGroup(group, joinMsg, true);
handler.onResult(group.getId()); handler.onResult(group.getId());
} catch (DbException e) { } catch (DbException e) {
if (LOG.isLoggable(WARNING)) if (LOG.isLoggable(WARNING))

View File

@@ -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;
}
}

View File

@@ -25,9 +25,7 @@ public class PrivateGroup extends NamedGroup implements Shareable {
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
return o instanceof PrivateGroup && return o instanceof PrivateGroup && super.equals(o);
creator.equals(((PrivateGroup) o).getCreator()) &&
super.equals(o);
} }
} }

View File

@@ -22,22 +22,24 @@ public interface PrivateGroupManager extends MessageTracker {
ClientId CLIENT_ID = new ClientId("org.briarproject.briar.privategroup"); 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 group The private group to add
* @param joinMsg The creators's join message * @param joinMsg The creators's join message
* @param creator True if the group is added by its creator
*/ */
void addPrivateGroup(PrivateGroup group, GroupMessage joinMsg) void addPrivateGroup(PrivateGroup group, GroupMessage joinMsg,
throws DbException; 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 group The private group to add
* @param joinMsg The new member's join message * @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, void addPrivateGroup(Transaction txn, PrivateGroup group,
GroupMessage joinMsg) throws DbException; GroupMessage joinMsg, boolean creator) throws DbException;
/** /**
* Removes a dissolved private group. * Removes a dissolved private group.
@@ -45,7 +47,7 @@ public interface PrivateGroupManager extends MessageTracker {
void removePrivateGroup(GroupId g) throws DbException; 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; 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 * 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. * in the Group identified by the GroupId g.
* *
* @param byContact true if the remote contact has revealed * @param byContact true if the remote contact has revealed

View File

@@ -1,10 +1,12 @@
package org.briarproject.api.privategroup; package org.briarproject.api.privategroup;
import org.briarproject.api.FormatException;
public enum Visibility { public enum Visibility {
INVISIBLE(0), INVISIBLE(0),
VISIBLE(1), VISIBLE(1),
REVEALED_BY_YOU(2), REVEALED_BY_US(2),
REVEALED_BY_CONTACT(3); REVEALED_BY_CONTACT(3);
int value; int value;
@@ -13,9 +15,9 @@ public enum Visibility {
this.value = value; 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; for (Visibility v : values()) if (v.value == value) return v;
throw new IllegalArgumentException(); throw new FormatException();
} }
public int getInt() { public int getInt() {

View File

@@ -2,7 +2,7 @@ package org.briarproject.privategroup;
import static org.briarproject.clients.BdfConstants.MSG_KEY_READ; import static org.briarproject.clients.BdfConstants.MSG_KEY_READ;
interface Constants { interface GroupConstants {
// Database keys // Database keys
String KEY_TYPE = "type"; String KEY_TYPE = "type";

View File

@@ -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.JOIN;
import static org.briarproject.api.privategroup.MessageType.POST; import static org.briarproject.api.privategroup.MessageType.POST;
import static org.briarproject.api.privategroup.PrivateGroupConstants.MAX_GROUP_POST_BODY_LENGTH; 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.GroupConstants.KEY_MEMBER_ID;
import static org.briarproject.privategroup.Constants.KEY_MEMBER_NAME; import static org.briarproject.privategroup.GroupConstants.KEY_MEMBER_NAME;
import static org.briarproject.privategroup.Constants.KEY_MEMBER_PUBLIC_KEY; import static org.briarproject.privategroup.GroupConstants.KEY_MEMBER_PUBLIC_KEY;
import static org.briarproject.privategroup.Constants.KEY_PARENT_MSG_ID; import static org.briarproject.privategroup.GroupConstants.KEY_PARENT_MSG_ID;
import static org.briarproject.privategroup.Constants.KEY_PREVIOUS_MSG_ID; import static org.briarproject.privategroup.GroupConstants.KEY_PREVIOUS_MSG_ID;
import static org.briarproject.privategroup.Constants.KEY_READ; import static org.briarproject.privategroup.GroupConstants.KEY_READ;
import static org.briarproject.privategroup.Constants.KEY_TIMESTAMP; import static org.briarproject.privategroup.GroupConstants.KEY_TIMESTAMP;
import static org.briarproject.privategroup.Constants.KEY_TYPE; import static org.briarproject.privategroup.GroupConstants.KEY_TYPE;
class GroupMessageValidator extends BdfMessageValidator { class GroupMessageValidator extends BdfMessageValidator {

View File

@@ -18,6 +18,7 @@ import org.briarproject.api.identity.Author.Status;
import org.briarproject.api.identity.AuthorId; import org.briarproject.api.identity.AuthorId;
import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.IdentityManager;
import org.briarproject.api.nullsafety.NotNullByDefault; import org.briarproject.api.nullsafety.NotNullByDefault;
import org.briarproject.api.privategroup.ContactRelationshipRevealedEvent;
import org.briarproject.api.privategroup.GroupMember; import org.briarproject.api.privategroup.GroupMember;
import org.briarproject.api.privategroup.GroupMessage; import org.briarproject.api.privategroup.GroupMessage;
import org.briarproject.api.privategroup.GroupMessageHeader; 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.MessageType.POST;
import static org.briarproject.api.privategroup.Visibility.INVISIBLE; 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_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.Visibility.VISIBLE;
import static org.briarproject.privategroup.Constants.GROUP_KEY_CREATOR_ID; import static org.briarproject.privategroup.GroupConstants.GROUP_KEY_CREATOR_ID;
import static org.briarproject.privategroup.Constants.GROUP_KEY_DISSOLVED; import static org.briarproject.privategroup.GroupConstants.GROUP_KEY_DISSOLVED;
import static org.briarproject.privategroup.Constants.GROUP_KEY_MEMBERS; import static org.briarproject.privategroup.GroupConstants.GROUP_KEY_MEMBERS;
import static org.briarproject.privategroup.Constants.GROUP_KEY_OUR_GROUP; import static org.briarproject.privategroup.GroupConstants.GROUP_KEY_OUR_GROUP;
import static org.briarproject.privategroup.Constants.GROUP_KEY_VISIBILITY; import static org.briarproject.privategroup.GroupConstants.GROUP_KEY_VISIBILITY;
import static org.briarproject.privategroup.Constants.KEY_MEMBER_ID; import static org.briarproject.privategroup.GroupConstants.KEY_MEMBER_ID;
import static org.briarproject.privategroup.Constants.KEY_MEMBER_NAME; import static org.briarproject.privategroup.GroupConstants.KEY_MEMBER_NAME;
import static org.briarproject.privategroup.Constants.KEY_MEMBER_PUBLIC_KEY; import static org.briarproject.privategroup.GroupConstants.KEY_MEMBER_PUBLIC_KEY;
import static org.briarproject.privategroup.Constants.KEY_PARENT_MSG_ID; import static org.briarproject.privategroup.GroupConstants.KEY_PARENT_MSG_ID;
import static org.briarproject.privategroup.Constants.KEY_PREVIOUS_MSG_ID; import static org.briarproject.privategroup.GroupConstants.KEY_PREVIOUS_MSG_ID;
import static org.briarproject.privategroup.Constants.KEY_READ; import static org.briarproject.privategroup.GroupConstants.KEY_READ;
import static org.briarproject.privategroup.Constants.KEY_TIMESTAMP; import static org.briarproject.privategroup.GroupConstants.KEY_TIMESTAMP;
import static org.briarproject.privategroup.Constants.KEY_TYPE; import static org.briarproject.privategroup.GroupConstants.KEY_TYPE;
@NotNullByDefault @NotNullByDefault
public class PrivateGroupManagerImpl extends BdfIncomingMessageHook implements public class PrivateGroupManagerImpl extends BdfIncomingMessageHook implements
@@ -89,11 +90,11 @@ public class PrivateGroupManagerImpl extends BdfIncomingMessageHook implements
} }
@Override @Override
public void addPrivateGroup(PrivateGroup group, GroupMessage joinMsg) public void addPrivateGroup(PrivateGroup group, GroupMessage joinMsg,
throws DbException { boolean creator) throws DbException {
Transaction txn = db.startTransaction(false); Transaction txn = db.startTransaction(false);
try { try {
addPrivateGroup(txn, group, joinMsg, true); addPrivateGroup(txn, group, joinMsg, creator);
db.commitTransaction(txn); db.commitTransaction(txn);
} finally { } finally {
db.endTransaction(txn); db.endTransaction(txn);
@@ -102,11 +103,6 @@ public class PrivateGroupManagerImpl extends BdfIncomingMessageHook implements
@Override @Override
public void addPrivateGroup(Transaction txn, PrivateGroup group, 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 { GroupMessage joinMsg, boolean creator) throws DbException {
try { try {
db.addGroup(txn, group.getGroup()); db.addGroup(txn, group.getGroup());
@@ -420,8 +416,8 @@ public class PrivateGroupManagerImpl extends BdfIncomingMessageHook implements
BdfList list = meta.getList(GROUP_KEY_MEMBERS); BdfList list = meta.getList(GROUP_KEY_MEMBERS);
Map<Author, Visibility> members = Map<Author, Visibility> members =
new HashMap<Author, Visibility>(list.size()); new HashMap<Author, Visibility>(list.size());
for (Object o : list) { for (int i = 0 ; i < list.size(); i++) {
BdfDictionary d = (BdfDictionary) o; BdfDictionary d = list.getDictionary(i);
Author member = getAuthor(d); Author member = getAuthor(d);
Visibility v = getVisibility(d); Visibility v = getVisibility(d);
members.put(member, v); members.put(member, v);
@@ -446,21 +442,22 @@ public class PrivateGroupManagerImpl extends BdfIncomingMessageHook implements
boolean byContact) throws FormatException, DbException { boolean byContact) throws FormatException, DbException {
BdfDictionary meta = clientHelper.getGroupMetadataAsDictionary(txn, g); BdfDictionary meta = clientHelper.getGroupMetadataAsDictionary(txn, g);
BdfList members = meta.getList(GROUP_KEY_MEMBERS); BdfList members = meta.getList(GROUP_KEY_MEMBERS);
Visibility v = INVISIBLE;
boolean foundMember = false; boolean foundMember = false;
for (Object o : members) { for (int i = 0 ; i < members.size(); i++) {
BdfDictionary d = (BdfDictionary) o; BdfDictionary d = members.getDictionary(i);
AuthorId memberId = new AuthorId(d.getRaw(KEY_MEMBER_ID)); AuthorId memberId = new AuthorId(d.getRaw(KEY_MEMBER_ID));
if (a.equals(memberId)) { if (a.equals(memberId)) {
foundMember = true; foundMember = true;
Visibility vOld = getVisibility(d); Visibility vOld = getVisibility(d);
if (vOld != INVISIBLE) throw new ProtocolStateException(); if (vOld != INVISIBLE) throw new ProtocolStateException();
Visibility vNew = v = byContact ? REVEALED_BY_CONTACT : REVEALED_BY_US;
byContact ? REVEALED_BY_CONTACT : REVEALED_BY_YOU; d.put(GROUP_KEY_VISIBILITY, v.getInt());
d.put(GROUP_KEY_VISIBILITY, vNew.getInt());
} }
} }
if (!foundMember) throw new ProtocolStateException(); if (!foundMember) throw new ProtocolStateException();
clientHelper.mergeGroupMetadata(txn, g, meta); clientHelper.mergeGroupMetadata(txn, g, meta);
txn.attach(new ContactRelationshipRevealedEvent(g, v));
} }
@Override @Override

View File

@@ -183,7 +183,8 @@ abstract class AbstractProtocolEngine<S extends Session>
GroupMessage joinMessage = groupMessageFactory.createJoinMessage( GroupMessage joinMessage = groupMessageFactory.createJoinMessage(
privateGroup.getId(), timestamp, member, invite.getTimestamp(), privateGroup.getId(), timestamp, member, invite.getTimestamp(),
invite.getSignature()); invite.getSignature());
privateGroupManager.addPrivateGroup(txn, privateGroup, joinMessage); privateGroupManager
.addPrivateGroup(txn, privateGroup, joinMessage, false);
} }
long getLocalTimestamp(S session) { long getLocalTimestamp(S session) {