From 04508a7431032336f94825d5b21036415e38a008 Mon Sep 17 00:00:00 2001 From: Torsten Grote <t@grobox.de> Date: Thu, 5 Jan 2017 12:56:46 -0200 Subject: [PATCH] Store invitation outcome in metadata and include in canBeOpened calculation for private groups and sharables. --- .../invitation/AbstractProtocolEngine.java | 16 ++++++++++++++-- .../invitation/GroupInvitationConstants.java | 1 + .../invitation/GroupInvitationManagerImpl.java | 4 +++- .../invitation/GroupInvitationValidator.java | 8 ++++---- .../invitation/InviteeProtocolEngine.java | 2 ++ .../invitation/MessageEncoder.java | 4 +++- .../invitation/MessageEncoderImpl.java | 9 ++++++++- .../invitation/MessageMetadata.java | 15 +++++++++++++-- .../invitation/MessageParserImpl.java | 4 +++- .../briar/sharing/MessageEncoder.java | 4 +++- .../briar/sharing/MessageEncoderImpl.java | 11 +++++++++-- .../briar/sharing/MessageMetadata.java | 15 +++++++++++++-- .../briar/sharing/MessageParserImpl.java | 4 +++- .../briar/sharing/ProtocolEngineImpl.java | 18 ++++++++++++++++-- .../briar/sharing/SharingConstants.java | 1 + .../briar/sharing/SharingManagerImpl.java | 4 +++- .../briar/sharing/SharingValidator.java | 4 ++-- .../invitation/AbstractProtocolEngineTest.java | 2 +- .../GroupInvitationIntegrationTest.java | 3 +++ .../GroupInvitationManagerImplTest.java | 4 ++-- .../GroupInvitationValidatorTest.java | 12 ++++++------ .../invitation/InviteeProtocolEngineTest.java | 12 ++++++------ .../sharing/ForumSharingIntegrationTest.java | 2 ++ .../briar/sharing/SharingValidatorTest.java | 2 +- 24 files changed, 122 insertions(+), 39 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java index 30c1401197..cc1049683b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java @@ -174,6 +174,17 @@ abstract class AbstractProtocolEngine<S extends Session> markMessageAvailableToAnswer(txn, m, false); } + void markInviteAccepted(Transaction txn, MessageId m, boolean accepted) + throws DbException { + BdfDictionary meta = new BdfDictionary(); + messageEncoder.setInvitationAccepted(meta, accepted); + try { + clientHelper.mergeMessageMetadata(txn, m, meta); + } catch (FormatException e) { + throw new AssertionError(e); + } + } + void subscribeToPrivateGroup(Transaction txn, MessageId inviteId) throws DbException, FormatException { InviteMessage invite = messageParser.getInviteMessage(txn, inviteId); @@ -199,8 +210,9 @@ abstract class AbstractProtocolEngine<S extends Session> private void sendMessage(Transaction txn, Message m, MessageType type, GroupId privateGroupId, boolean visibleInConversation) throws DbException { - BdfDictionary meta = messageEncoder.encodeMetadata(type, privateGroupId, - m.getTimestamp(), true, true, visibleInConversation, false); + BdfDictionary meta = messageEncoder + .encodeMetadata(type, privateGroupId, m.getTimestamp(), true, + true, visibleInConversation, false, false); try { clientHelper.addLocalMessage(txn, m, meta, true); } catch (FormatException e) { diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationConstants.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationConstants.java index c55bc19f4f..a9a6ef0929 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationConstants.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationConstants.java @@ -12,6 +12,7 @@ interface GroupInvitationConstants { String MSG_KEY_LOCAL = "local"; String MSG_KEY_VISIBLE_IN_UI = "visibleInUi"; String MSG_KEY_AVAILABLE_TO_ANSWER = "availableToAnswer"; + String MSG_KEY_INVITATION_ACCEPTED = "invitationAccepted"; // Session keys String SESSION_KEY_SESSION_ID = "sessionId"; diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java index 1fac77c630..cbc26bb4a6 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java @@ -405,7 +405,9 @@ class GroupInvitationManagerImpl extends ConversationClientImpl PrivateGroup pg = privateGroupFactory .createPrivateGroup(invite.getGroupName(), invite.getCreator(), invite.getSalt()); - boolean canBeOpened = db.containsGroup(txn, invite.getPrivateGroupId()); + // Find out whether the private group can be opened + boolean canBeOpened = meta.wasAccepted() && + db.containsGroup(txn, invite.getPrivateGroupId()); return new GroupInvitationRequest(m, contactGroupId, meta.getTimestamp(), meta.isLocal(), status.isSent(), status.isSeen(), meta.isRead(), sessionId, pg, c, diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidator.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidator.java index 125588cabc..1b111f5dc9 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidator.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidator.java @@ -112,7 +112,7 @@ class GroupInvitationValidator extends BdfMessageValidator { // Create the metadata BdfDictionary meta = messageEncoder.encodeMetadata(INVITE, privateGroup.getId(), m.getTimestamp(), false, false, false, - false); + false, false); return new BdfMessageContext(meta); } @@ -125,7 +125,7 @@ class GroupInvitationValidator extends BdfMessageValidator { checkLength(previousMessageId, UniqueId.LENGTH); BdfDictionary meta = messageEncoder.encodeMetadata(JOIN, new GroupId(privateGroupId), m.getTimestamp(), false, false, - false, false); + false, false, false); if (previousMessageId == null) { return new BdfMessageContext(meta); } else { @@ -144,7 +144,7 @@ class GroupInvitationValidator extends BdfMessageValidator { checkLength(previousMessageId, UniqueId.LENGTH); BdfDictionary meta = messageEncoder.encodeMetadata(LEAVE, new GroupId(privateGroupId), m.getTimestamp(), false, false, - false, false); + false, false, false); if (previousMessageId == null) { return new BdfMessageContext(meta); } else { @@ -161,7 +161,7 @@ class GroupInvitationValidator extends BdfMessageValidator { checkLength(privateGroupId, UniqueId.LENGTH); BdfDictionary meta = messageEncoder.encodeMetadata(ABORT, new GroupId(privateGroupId), m.getTimestamp(), false, false, - false, false); + false, false, false); return new BdfMessageContext(meta); } } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java index bf30f96edd..f4782a3875 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java @@ -172,6 +172,8 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> { MessageId inviteId = s.getLastRemoteMessageId(); if (inviteId == null) throw new IllegalStateException(); markMessageAvailableToAnswer(txn, inviteId, false); + // Record the response + markInviteAccepted(txn, inviteId, true); // Send a JOIN message Message sent = sendJoinMessage(txn, s, true); // Track the message diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageEncoder.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageEncoder.java index 4312e519d5..ee6b98a84a 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageEncoder.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageEncoder.java @@ -14,12 +14,14 @@ interface MessageEncoder { BdfDictionary encodeMetadata(MessageType type, GroupId privateGroupId, long timestamp, boolean local, boolean read, boolean visible, - boolean available); + boolean available, boolean accepted); void setVisibleInUi(BdfDictionary meta, boolean visible); void setAvailableToAnswer(BdfDictionary meta, boolean available); + void setInvitationAccepted(BdfDictionary meta, boolean accepted); + Message encodeInviteMessage(GroupId contactGroupId, GroupId privateGroupId, long timestamp, String groupName, Author creator, byte[] salt, @Nullable String message, byte[] signature); diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageEncoderImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageEncoderImpl.java index 17e0843d71..a9ff4ac9e3 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageEncoderImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageEncoderImpl.java @@ -17,6 +17,7 @@ import javax.inject.Inject; import static org.briarproject.briar.client.MessageTrackerConstants.MSG_KEY_READ; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.MSG_KEY_AVAILABLE_TO_ANSWER; +import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.MSG_KEY_INVITATION_ACCEPTED; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.MSG_KEY_LOCAL; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.MSG_KEY_MESSAGE_TYPE; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.MSG_KEY_PRIVATE_GROUP_ID; @@ -44,7 +45,7 @@ class MessageEncoderImpl implements MessageEncoder { @Override public BdfDictionary encodeMetadata(MessageType type, GroupId privateGroupId, long timestamp, boolean local, boolean read, - boolean visible, boolean available) { + boolean visible, boolean available, boolean accepted) { BdfDictionary meta = new BdfDictionary(); meta.put(MSG_KEY_MESSAGE_TYPE, type.getValue()); meta.put(MSG_KEY_PRIVATE_GROUP_ID, privateGroupId); @@ -53,6 +54,7 @@ class MessageEncoderImpl implements MessageEncoder { meta.put(MSG_KEY_READ, read); meta.put(MSG_KEY_VISIBLE_IN_UI, visible); meta.put(MSG_KEY_AVAILABLE_TO_ANSWER, available); + meta.put(MSG_KEY_INVITATION_ACCEPTED, accepted); return meta; } @@ -66,6 +68,11 @@ class MessageEncoderImpl implements MessageEncoder { meta.put(MSG_KEY_AVAILABLE_TO_ANSWER, available); } + @Override + public void setInvitationAccepted(BdfDictionary meta, boolean accepted) { + meta.put(MSG_KEY_INVITATION_ACCEPTED, accepted); + } + @Override public Message encodeInviteMessage(GroupId contactGroupId, GroupId privateGroupId, long timestamp, String groupName, diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageMetadata.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageMetadata.java index 92c62748df..c4490641d4 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageMetadata.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageMetadata.java @@ -12,11 +12,11 @@ class MessageMetadata { private final MessageType type; private final GroupId privateGroupId; private final long timestamp; - private final boolean local, read, visible, available; + private final boolean local, read, visible, available, accepted; MessageMetadata(MessageType type, GroupId privateGroupId, long timestamp, boolean local, boolean read, boolean visible, - boolean available) { + boolean available, boolean accepted) { this.privateGroupId = privateGroupId; this.type = type; this.timestamp = timestamp; @@ -24,6 +24,7 @@ class MessageMetadata { this.read = read; this.visible = visible; this.available = available; + this.accepted = accepted; } MessageType getMessageType() { @@ -53,4 +54,14 @@ class MessageMetadata { boolean isAvailableToAnswer() { return available; } + + /** + * Returns true if the invitation was accepted. + * + * Only applies to messages of type INVITE. + */ + public boolean wasAccepted() { + return accepted; + } + } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageParserImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageParserImpl.java index 1cf35ee9c3..d5160b0d84 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageParserImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageParserImpl.java @@ -21,6 +21,7 @@ import javax.inject.Inject; import static org.briarproject.briar.client.MessageTrackerConstants.MSG_KEY_READ; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.MSG_KEY_AVAILABLE_TO_ANSWER; +import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.MSG_KEY_INVITATION_ACCEPTED; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.MSG_KEY_LOCAL; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.MSG_KEY_MESSAGE_TYPE; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.MSG_KEY_PRIVATE_GROUP_ID; @@ -79,8 +80,9 @@ class MessageParserImpl implements MessageParser { boolean read = meta.getBoolean(MSG_KEY_READ, false); boolean visible = meta.getBoolean(MSG_KEY_VISIBLE_IN_UI, false); boolean available = meta.getBoolean(MSG_KEY_AVAILABLE_TO_ANSWER, false); + boolean accepted = meta.getBoolean(MSG_KEY_INVITATION_ACCEPTED, false); return new MessageMetadata(type, privateGroupId, timestamp, local, read, - visible, available); + visible, available, accepted); } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/MessageEncoder.java b/briar-core/src/main/java/org/briarproject/briar/sharing/MessageEncoder.java index 33ce9b3fc1..b53d4fbadf 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/MessageEncoder.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/MessageEncoder.java @@ -14,12 +14,14 @@ interface MessageEncoder { BdfDictionary encodeMetadata(MessageType type, GroupId shareableId, long timestamp, boolean local, boolean read, boolean visible, - boolean available); + boolean available, boolean accepted); void setVisibleInUi(BdfDictionary meta, boolean visible); void setAvailableToAnswer(BdfDictionary meta, boolean available); + void setInvitationAccepted(BdfDictionary meta, boolean accepted); + Message encodeInviteMessage(GroupId contactGroupId, long timestamp, @Nullable MessageId previousMessageId, BdfList descriptor, @Nullable String message); diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/MessageEncoderImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/MessageEncoderImpl.java index 1047df487e..17938b8e21 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/MessageEncoderImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/MessageEncoderImpl.java @@ -20,10 +20,11 @@ import static org.briarproject.briar.sharing.MessageType.DECLINE; import static org.briarproject.briar.sharing.MessageType.INVITE; import static org.briarproject.briar.sharing.MessageType.LEAVE; import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_AVAILABLE_TO_ANSWER; +import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_INVITATION_ACCEPTED; import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_LOCAL; import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_MESSAGE_TYPE; -import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_SHAREABLE_ID; import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_READ; +import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_SHAREABLE_ID; import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_TIMESTAMP; import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_VISIBLE_IN_UI; @@ -44,7 +45,7 @@ class MessageEncoderImpl implements MessageEncoder { @Override public BdfDictionary encodeMetadata(MessageType type, GroupId shareableId, long timestamp, boolean local, boolean read, - boolean visible, boolean available) { + boolean visible, boolean available, boolean accepted) { BdfDictionary meta = new BdfDictionary(); meta.put(MSG_KEY_MESSAGE_TYPE, type.getValue()); meta.put(MSG_KEY_SHAREABLE_ID, shareableId); @@ -53,6 +54,7 @@ class MessageEncoderImpl implements MessageEncoder { meta.put(MSG_KEY_READ, read); meta.put(MSG_KEY_VISIBLE_IN_UI, visible); meta.put(MSG_KEY_AVAILABLE_TO_ANSWER, available); + meta.put(MSG_KEY_INVITATION_ACCEPTED, accepted); return meta; } @@ -66,6 +68,11 @@ class MessageEncoderImpl implements MessageEncoder { meta.put(MSG_KEY_AVAILABLE_TO_ANSWER, available); } + @Override + public void setInvitationAccepted(BdfDictionary meta, boolean accepted) { + meta.put(MSG_KEY_INVITATION_ACCEPTED, accepted); + } + @Override public Message encodeInviteMessage(GroupId contactGroupId, long timestamp, @Nullable MessageId previousMessageId, BdfList descriptor, diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/MessageMetadata.java b/briar-core/src/main/java/org/briarproject/briar/sharing/MessageMetadata.java index 031676249a..a9f1662d57 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/MessageMetadata.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/MessageMetadata.java @@ -12,10 +12,11 @@ class MessageMetadata { private final MessageType type; private final GroupId shareableId; private final long timestamp; - private final boolean local, read, visible, available; + private final boolean local, read, visible, available, accepted; MessageMetadata(MessageType type, GroupId shareableId, long timestamp, - boolean local, boolean read, boolean visible, boolean available) { + boolean local, boolean read, boolean visible, boolean available, + boolean accepted) { this.shareableId = shareableId; this.type = type; this.timestamp = timestamp; @@ -23,6 +24,7 @@ class MessageMetadata { this.read = read; this.visible = visible; this.available = available; + this.accepted = accepted; } MessageType getMessageType() { @@ -53,4 +55,13 @@ class MessageMetadata { return available; } + /** + * Returns true if the invitation was accepted. + * + * Only applies to messages of type INVITE. + */ + public boolean wasAccepted() { + return accepted; + } + } diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/MessageParserImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/MessageParserImpl.java index 4384941179..d09055626e 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/MessageParserImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/MessageParserImpl.java @@ -20,6 +20,7 @@ import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_AVAILABLE_ import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_LOCAL; import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_MESSAGE_TYPE; import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_READ; +import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_INVITATION_ACCEPTED; import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_SHAREABLE_ID; import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_TIMESTAMP; import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_VISIBLE_IN_UI; @@ -68,8 +69,9 @@ abstract class MessageParserImpl<S extends Shareable> boolean read = meta.getBoolean(MSG_KEY_READ, false); boolean visible = meta.getBoolean(MSG_KEY_VISIBLE_IN_UI, false); boolean available = meta.getBoolean(MSG_KEY_AVAILABLE_TO_ANSWER, false); + boolean accepted = meta.getBoolean(MSG_KEY_INVITATION_ACCEPTED, false); return new MessageMetadata(type, shareableId, timestamp, local, read, - visible, available); + visible, available, accepted); } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java index ad017942a9..971c42df65 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java @@ -148,6 +148,8 @@ abstract class ProtocolEngineImpl<S extends Shareable> MessageId inviteId = s.getLastRemoteMessageId(); if (inviteId == null) throw new IllegalStateException(); markMessageAvailableToAnswer(txn, inviteId, false); + // Mark the invite message as accepted + markInvitationAccepted(txn, inviteId, true); // Send a ACCEPT message Message sent = sendAcceptMessage(txn, s); // Track the message @@ -568,8 +570,9 @@ abstract class ProtocolEngineImpl<S extends Shareable> private void sendMessage(Transaction txn, Message m, MessageType type, GroupId shareableId, boolean visibleInConversation) throws DbException { - BdfDictionary meta = messageEncoder.encodeMetadata(type, shareableId, - m.getTimestamp(), true, true, visibleInConversation, false); + BdfDictionary meta = messageEncoder + .encodeMetadata(type, shareableId, m.getTimestamp(), true, true, + visibleInConversation, false, false); try { clientHelper.addLocalMessage(txn, m, meta, true); } catch (FormatException e) { @@ -599,6 +602,17 @@ abstract class ProtocolEngineImpl<S extends Shareable> } } + private void markInvitationAccepted(Transaction txn, MessageId m, + boolean accepted) throws DbException { + BdfDictionary meta = new BdfDictionary(); + messageEncoder.setInvitationAccepted(meta, accepted); + try { + clientHelper.mergeMessageMetadata(txn, m, meta); + } catch (FormatException e) { + throw new AssertionError(e); + } + } + private void setShareableVisibility(Transaction txn, Session session, Visibility v) throws DbException, FormatException { ContactId contactId = getContactId(txn, session.getContactGroupId()); diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingConstants.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingConstants.java index d860abc8f2..d98099e27b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingConstants.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingConstants.java @@ -15,6 +15,7 @@ interface SharingConstants { String MSG_KEY_LOCAL = "local"; String MSG_KEY_VISIBLE_IN_UI = "visibleInUi"; String MSG_KEY_AVAILABLE_TO_ANSWER = "availableToAnswer"; + String MSG_KEY_INVITATION_ACCEPTED = "invitationAccepted"; // Session keys String SESSION_KEY_STATE = "state"; diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java index 76ba8d1cf0..fc61bf49df 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java @@ -319,7 +319,9 @@ abstract class SharingManagerImpl<S extends Shareable> MessageStatus status) throws DbException, FormatException { // Look up the invite message to get the details of the private group InviteMessage<S> invite = messageParser.getInviteMessage(txn, m); - boolean canBeOpened = db.containsGroup(txn, invite.getShareableId()); + // Find out whether the shareable can be opened + boolean canBeOpened = meta.wasAccepted() && + db.containsGroup(txn, invite.getShareableId()); return invitationFactory .createInvitationRequest(meta.isLocal(), status.isSent(), status.isSeen(), meta.isRead(), invite, c, diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingValidator.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingValidator.java index e8f9287f8f..a7eadcd154 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingValidator.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingValidator.java @@ -65,7 +65,7 @@ abstract class SharingValidator extends BdfMessageValidator { BdfDictionary meta = messageEncoder .encodeMetadata(INVITE, shareableId, m.getTimestamp(), false, - false, false, false); + false, false, false, false); if (previousMessageId == null) { return new BdfMessageContext(meta); } else { @@ -88,7 +88,7 @@ abstract class SharingValidator extends BdfMessageValidator { BdfDictionary meta = messageEncoder .encodeMetadata(type, new GroupId(shareableId), - m.getTimestamp(), false, false, false, false); + m.getTimestamp(), false, false, false, false, false); if (previousMessageId == null) { return new BdfMessageContext(meta); } else { diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java index 9ce107eee1..aafa34f116 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java @@ -169,7 +169,7 @@ public abstract class AbstractProtocolEngineTest extends BrambleMockTestCase { final boolean visible) throws Exception { context.checking(new Expectations() {{ oneOf(messageEncoder).encodeMetadata(type, privateGroupId, - message.getTimestamp(), true, true, visible, false); + message.getTimestamp(), true, true, visible, false, false); will(returnValue(meta)); oneOf(clientHelper).addLocalMessage(txn, message, meta, true); }}); diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationIntegrationTest.java index fe41423312..66a0bdb032 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationIntegrationTest.java @@ -104,6 +104,7 @@ public class GroupInvitationIntegrationTest assertEquals(privateGroup0.getName(), request.getShareable().getName()); assertFalse(request.isLocal()); assertFalse(request.isRead()); + assertFalse(request.canBeOpened()); } @Test @@ -175,6 +176,8 @@ public class GroupInvitationIntegrationTest foundResponse = true; InvitationResponse response = (GroupInvitationResponse) m; assertTrue(response.wasAccepted()); + } else { + assertTrue(((GroupInvitationRequest) m).canBeOpened()); } } assertTrue(foundResponse); diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java index 37c7b76e32..c197bb73c0 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java @@ -638,10 +638,10 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { final long time1 = 1L, time2 = 2L; final MessageMetadata messageMetadata1 = new MessageMetadata(INVITE, privateGroup.getId(), time1, true, - true, true, false); + true, true, false, true); final MessageMetadata messageMetadata2 = new MessageMetadata(JOIN, privateGroup.getId(), time2, true, - true, true, true); + true, true, true, false); final InviteMessage invite = new InviteMessage(message.getId(), contactGroup.getId(), privateGroup.getId(), time1, "name", author, diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidatorTest.java index fe79b36784..cc8f025f08 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidatorTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidatorTest.java @@ -311,7 +311,7 @@ public class GroupInvitationValidatorTest extends ValidatorTestCase { } else { oneOf(messageEncoder).encodeMetadata(INVITE, message.getGroupId(), message.getTimestamp(), false, - false, false, false); + false, false, false, false); will(returnValue(meta)); } }}); @@ -389,7 +389,7 @@ public class GroupInvitationValidatorTest extends ValidatorTestCase { BdfList body = BdfList.of(JOIN.getValue(), privateGroup.getId(), null); context.checking(new Expectations() {{ oneOf(messageEncoder).encodeMetadata(JOIN, message.getGroupId(), - message.getTimestamp(), false, false, false, false); + message.getTimestamp(), false, false, false, false, false); will(returnValue(meta)); }}); BdfMessageContext messageContext = @@ -404,7 +404,7 @@ public class GroupInvitationValidatorTest extends ValidatorTestCase { previousMessageId); context.checking(new Expectations() {{ oneOf(messageEncoder).encodeMetadata(JOIN, message.getGroupId(), - message.getTimestamp(), false, false, false, false); + message.getTimestamp(), false, false, false, false, false); will(returnValue(meta)); }}); BdfMessageContext messageContext = @@ -487,7 +487,7 @@ public class GroupInvitationValidatorTest extends ValidatorTestCase { BdfList body = BdfList.of(LEAVE.getValue(), privateGroup.getId(), null); context.checking(new Expectations() {{ oneOf(messageEncoder).encodeMetadata(LEAVE, message.getGroupId(), - message.getTimestamp(), false, false, false, false); + message.getTimestamp(), false, false, false, false, false); will(returnValue(meta)); }}); BdfMessageContext messageContext = @@ -500,7 +500,7 @@ public class GroupInvitationValidatorTest extends ValidatorTestCase { public void testAcceptsValidLeaveMessage() throws Exception { context.checking(new Expectations() {{ oneOf(messageEncoder).encodeMetadata(LEAVE, message.getGroupId(), - message.getTimestamp(), false, false, false, false); + message.getTimestamp(), false, false, false, false, false); will(returnValue(meta)); }}); BdfList body = BdfList.of(LEAVE.getValue(), privateGroup.getId(), @@ -557,7 +557,7 @@ public class GroupInvitationValidatorTest extends ValidatorTestCase { public void testAcceptsValidAbortMessage() throws Exception { context.checking(new Expectations() {{ oneOf(messageEncoder).encodeMetadata(ABORT, message.getGroupId(), - message.getTimestamp(), false, false, false, false); + message.getTimestamp(), false, false, false, false, false); will(returnValue(meta)); }}); BdfList body = BdfList.of(ABORT.getValue(), privateGroup.getId()); diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java index 6e42727708..1165c7ceeb 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java @@ -3,11 +3,9 @@ package org.briarproject.briar.privategroup.invitation; import org.briarproject.bramble.api.contact.Contact; 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.identity.Author; import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.identity.LocalAuthor; -import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.privategroup.GroupMessage; @@ -132,15 +130,17 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest { final JoinMessage properJoinMessage = new JoinMessage(messageId, contactGroupId, privateGroupId, messageTimestamp, lastRemoteMessageId); - final Message inviteMsg = - new Message(lastRemoteMessageId, contactGroupId, 1337L, - getRandomBytes(42)); - final BdfList inviteList = BdfList.of("inviteMessage"); final long timestamp = 0L; final GroupMessage joinGroupMessage = new GroupMessage(message, null, localAuthor); + final BdfDictionary meta = new BdfDictionary(); expectMarkMessageAvailableToAnswer(lastRemoteMessageId, false); + context.checking(new Expectations() {{ + oneOf(messageEncoder).setInvitationAccepted(meta, true); + oneOf(clientHelper) + .mergeMessageMetadata(txn, lastRemoteMessageId, meta); + }}); expectSendJoinMessage(properJoinMessage, true); context.checking(new Expectations() {{ oneOf(messageTracker).trackOutgoingMessage(txn, message); diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java index 537e2b64b8..6f351f7087 100644 --- a/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java @@ -136,6 +136,7 @@ public class ForumSharingIntegrationTest assertEquals(forum0.getName(), invitation.getForumName()); assertEquals(contactId1From0, invitation.getContactId()); assertEquals("Hi!", invitation.getMessage()); + assertTrue(invitation.canBeOpened()); } else { ForumInvitationResponse response = (ForumInvitationResponse) m; @@ -195,6 +196,7 @@ public class ForumSharingIntegrationTest assertEquals(forum0.getName(), invitation.getForumName()); assertEquals(contactId1From0, invitation.getContactId()); assertEquals(null, invitation.getMessage()); + assertFalse(invitation.canBeOpened()); } else { ForumInvitationResponse response = (ForumInvitationResponse) m; diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/SharingValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/SharingValidatorTest.java index c8e688ce1f..f0c87e9d73 100644 --- a/briar-core/src/test/java/org/briarproject/briar/sharing/SharingValidatorTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/sharing/SharingValidatorTest.java @@ -147,7 +147,7 @@ public abstract class SharingValidatorTest extends ValidatorTestCase { context.checking(new Expectations() {{ oneOf(messageEncoder) .encodeMetadata(type, groupId, timestamp, false, false, - false, false); + false, false, false); will(returnValue(meta)); }}); } -- GitLab