Broadcast events for private group invitations.

This commit is contained in:
akwizgran
2016-11-08 10:24:44 +00:00
parent f89d8cbe38
commit fb095c1f4d
6 changed files with 66 additions and 12 deletions

View File

@@ -7,7 +7,8 @@ import org.briarproject.api.db.DatabaseExecutor;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
import org.briarproject.api.event.Event; import org.briarproject.api.event.Event;
import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.GroupInvitationReceivedEvent; import org.briarproject.api.event.GroupInvitationRequestReceivedEvent;
import org.briarproject.api.event.GroupInvitationResponseReceivedEvent;
import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.LifecycleManager;
import org.briarproject.api.privategroup.PrivateGroup; import org.briarproject.api.privategroup.PrivateGroup;
import org.briarproject.api.privategroup.PrivateGroupManager; import org.briarproject.api.privategroup.PrivateGroupManager;
@@ -44,8 +45,11 @@ public class GroupInvitationControllerImpl
public void eventOccurred(Event e) { public void eventOccurred(Event e) {
super.eventOccurred(e); super.eventOccurred(e);
if (e instanceof GroupInvitationReceivedEvent) { if (e instanceof GroupInvitationRequestReceivedEvent) {
LOG.info("Group invitation received, reloading"); LOG.info("Group invitation request received, reloading");
listener.loadInvitations(false);
} else if (e instanceof GroupInvitationResponseReceivedEvent) {
LOG.info("Group invitation response received, reloading");
listener.loadInvitations(false); listener.loadInvitations(false);
} }
} }

View File

@@ -1,15 +1,14 @@
package org.briarproject.api.event; package org.briarproject.api.event;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
import org.briarproject.api.forum.ForumInvitationRequest;
import org.briarproject.api.privategroup.PrivateGroup; import org.briarproject.api.privategroup.PrivateGroup;
import org.briarproject.api.privategroup.invitation.GroupInvitationRequest; import org.briarproject.api.privategroup.invitation.GroupInvitationRequest;
public class GroupInvitationReceivedEvent extends public class GroupInvitationRequestReceivedEvent extends
InvitationRequestReceivedEvent<PrivateGroup> { InvitationRequestReceivedEvent<PrivateGroup> {
public GroupInvitationReceivedEvent(PrivateGroup group, ContactId contactId, public GroupInvitationRequestReceivedEvent(PrivateGroup group,
GroupInvitationRequest request) { ContactId contactId, GroupInvitationRequest request) {
super(group, contactId, request); super(group, contactId, request);
} }

View File

@@ -0,0 +1,13 @@
package org.briarproject.api.event;
import org.briarproject.api.contact.ContactId;
import org.briarproject.api.sharing.InvitationResponse;
public class GroupInvitationResponseReceivedEvent
extends InvitationResponseReceivedEvent {
public GroupInvitationResponseReceivedEvent(ContactId contactId,
InvitationResponse response) {
super(contactId, response);
}
}

View File

@@ -41,10 +41,10 @@ abstract class AbstractProtocolEngine<S extends Session>
protected final DatabaseComponent db; protected final DatabaseComponent db;
protected final ClientHelper clientHelper; protected final ClientHelper clientHelper;
protected final PrivateGroupManager privateGroupManager; protected final PrivateGroupManager privateGroupManager;
protected final PrivateGroupFactory privateGroupFactory;
private final IdentityManager identityManager;
private final PrivateGroupFactory privateGroupFactory;
private final GroupMessageFactory groupMessageFactory; private final GroupMessageFactory groupMessageFactory;
private final IdentityManager identityManager;
private final MessageParser messageParser; private final MessageParser messageParser;
private final MessageEncoder messageEncoder; private final MessageEncoder messageEncoder;
private final Clock clock; private final Clock clock;

View File

@@ -3,14 +3,18 @@ package org.briarproject.privategroup.invitation;
import org.briarproject.api.FormatException; import org.briarproject.api.FormatException;
import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.clients.ClientHelper;
import org.briarproject.api.clients.ProtocolStateException; import org.briarproject.api.clients.ProtocolStateException;
import org.briarproject.api.clients.SessionId;
import org.briarproject.api.contact.ContactId;
import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
import org.briarproject.api.db.Transaction; import org.briarproject.api.db.Transaction;
import org.briarproject.api.event.GroupInvitationResponseReceivedEvent;
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.GroupMessageFactory; import org.briarproject.api.privategroup.GroupMessageFactory;
import org.briarproject.api.privategroup.PrivateGroupFactory; import org.briarproject.api.privategroup.PrivateGroupFactory;
import org.briarproject.api.privategroup.PrivateGroupManager; import org.briarproject.api.privategroup.PrivateGroupManager;
import org.briarproject.api.privategroup.invitation.GroupInvitationResponse;
import org.briarproject.api.sync.Message; import org.briarproject.api.sync.Message;
import org.briarproject.api.system.Clock; import org.briarproject.api.system.Clock;
@@ -35,7 +39,7 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
IdentityManager identityManager, MessageParser messageParser, IdentityManager identityManager, MessageParser messageParser,
MessageEncoder messageEncoder, Clock clock) { MessageEncoder messageEncoder, Clock clock) {
super(db, clientHelper, privateGroupManager, privateGroupFactory, super(db, clientHelper, privateGroupManager, privateGroupFactory,
groupMessageFactory, identityManager,messageParser, groupMessageFactory, identityManager, messageParser,
messageEncoder, clock); messageEncoder, clock);
} }
@@ -170,10 +174,14 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
// The dependency, if any, must be the last remote message // The dependency, if any, must be the last remote message
if (!isValidDependency(s, m.getPreviousMessageId())) if (!isValidDependency(s, m.getPreviousMessageId()))
return abort(txn, s); return abort(txn, s);
// Mark the response visible // Mark the response visible in the UI
markMessageVisibleInUi(txn, m.getId(), true); markMessageVisibleInUi(txn, m.getId(), true);
// Start syncing the private group with the contact // Start syncing the private group with the contact
syncPrivateGroupWithContact(txn, s, true); syncPrivateGroupWithContact(txn, s, true);
// Broadcast an event
ContactId contactId = getContactId(txn, m.getContactGroupId());
txn.attach(new GroupInvitationResponseReceivedEvent(contactId,
createInvitationResponse(m, contactId, true)));
// Move to the INVITEE_JOINED state // Move to the INVITEE_JOINED state
return new CreatorSession(s.getContactGroupId(), s.getPrivateGroupId(), return new CreatorSession(s.getContactGroupId(), s.getPrivateGroupId(),
s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(), s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(),
@@ -187,8 +195,12 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
// The dependency, if any, must be the last remote message // The dependency, if any, must be the last remote message
if (!isValidDependency(s, m.getPreviousMessageId())) if (!isValidDependency(s, m.getPreviousMessageId()))
return abort(txn, s); return abort(txn, s);
// Mark the response visible // Mark the response visible in the UI
markMessageVisibleInUi(txn, m.getId(), true); markMessageVisibleInUi(txn, m.getId(), true);
// Broadcast an event
ContactId contactId = getContactId(txn, m.getContactGroupId());
txn.attach(new GroupInvitationResponseReceivedEvent(contactId,
createInvitationResponse(m, contactId, false)));
// Move to the START state // Move to the START state
return new CreatorSession(s.getContactGroupId(), s.getPrivateGroupId(), return new CreatorSession(s.getContactGroupId(), s.getPrivateGroupId(),
s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(), s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(),
@@ -224,4 +236,12 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(), sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(),
s.getInviteTimestamp(), ERROR); s.getInviteTimestamp(), ERROR);
} }
private GroupInvitationResponse createInvitationResponse(
GroupInvitationMessage m, ContactId c, boolean accept) {
SessionId sessionId = new SessionId(m.getPrivateGroupId().getBytes());
return new GroupInvitationResponse(m.getId(), sessionId,
m.getContactGroupId(), c, accept, m.getTimestamp(), false,
false, true, false);
}
} }

View File

@@ -3,16 +3,20 @@ package org.briarproject.privategroup.invitation;
import org.briarproject.api.FormatException; import org.briarproject.api.FormatException;
import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.clients.ClientHelper;
import org.briarproject.api.clients.ProtocolStateException; import org.briarproject.api.clients.ProtocolStateException;
import org.briarproject.api.clients.SessionId;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
import org.briarproject.api.db.Transaction; import org.briarproject.api.db.Transaction;
import org.briarproject.api.event.GroupInvitationRequestReceivedEvent;
import org.briarproject.api.identity.Author; import org.briarproject.api.identity.Author;
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.GroupMessageFactory; import org.briarproject.api.privategroup.GroupMessageFactory;
import org.briarproject.api.privategroup.PrivateGroup;
import org.briarproject.api.privategroup.PrivateGroupFactory; import org.briarproject.api.privategroup.PrivateGroupFactory;
import org.briarproject.api.privategroup.PrivateGroupManager; import org.briarproject.api.privategroup.PrivateGroupManager;
import org.briarproject.api.privategroup.invitation.GroupInvitationRequest;
import org.briarproject.api.sync.Message; import org.briarproject.api.sync.Message;
import org.briarproject.api.sync.MessageId; import org.briarproject.api.sync.MessageId;
import org.briarproject.api.system.Clock; import org.briarproject.api.system.Clock;
@@ -196,6 +200,11 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
// Mark the invite message visible in the UI and available to answer // Mark the invite message visible in the UI and available to answer
markMessageVisibleInUi(txn, m.getId(), true); markMessageVisibleInUi(txn, m.getId(), true);
markMessageAvailableToAnswer(txn, m.getId(), true); markMessageAvailableToAnswer(txn, m.getId(), true);
// Broadcast an event
PrivateGroup privateGroup = privateGroupFactory.createPrivateGroup(
m.getGroupName(), m.getCreator(), m.getSalt());
txn.attach(new GroupInvitationRequestReceivedEvent(privateGroup,
contactId, createInvitationRequest(m, contactId)));
// Move to the INVITED state // Move to the INVITED state
return new InviteeSession(s.getContactGroupId(), s.getPrivateGroupId(), return new InviteeSession(s.getContactGroupId(), s.getPrivateGroupId(),
s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(), s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(),
@@ -239,4 +248,13 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(), sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(),
s.getInviteTimestamp(), ERROR); s.getInviteTimestamp(), ERROR);
} }
private GroupInvitationRequest createInvitationRequest(InviteMessage m,
ContactId c) {
SessionId sessionId = new SessionId(m.getPrivateGroupId().getBytes());
return new GroupInvitationRequest(m.getId(), sessionId,
m.getContactGroupId(), c, m.getMessage(), m.getGroupName(),
m.getCreator(), true, m.getTimestamp(), false, false, true,
false);
}
} }