Merge branch '709-track-private-group-invitation-messages' into 'master'

Use MessageTracker for private group invitation messages

Depends on !405.

See merge request !412
This commit is contained in:
Torsten Grote
2016-11-16 14:14:48 +00:00
6 changed files with 42 additions and 13 deletions

View File

@@ -5,6 +5,7 @@ import org.briarproject.api.clients.SessionId;
import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.Contact;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
import org.briarproject.api.messaging.ConversationManager.ConversationClient;
import org.briarproject.api.nullsafety.NotNullByDefault; import org.briarproject.api.nullsafety.NotNullByDefault;
import org.briarproject.api.privategroup.PrivateGroup; import org.briarproject.api.privategroup.PrivateGroup;
import org.briarproject.api.sharing.InvitationMessage; import org.briarproject.api.sharing.InvitationMessage;
@@ -16,7 +17,7 @@ import java.util.Collection;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@NotNullByDefault @NotNullByDefault
public interface GroupInvitationManager { public interface GroupInvitationManager extends ConversationClient {
/** /**
* The unique ID of the private group invitation client. * The unique ID of the private group invitation client.

View File

@@ -2,6 +2,7 @@ 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.MessageTracker;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
import org.briarproject.api.data.BdfDictionary; import org.briarproject.api.data.BdfDictionary;
import org.briarproject.api.data.BdfList; import org.briarproject.api.data.BdfList;
@@ -42,6 +43,7 @@ abstract class AbstractProtocolEngine<S extends Session>
protected final ClientHelper clientHelper; protected final ClientHelper clientHelper;
protected final PrivateGroupManager privateGroupManager; protected final PrivateGroupManager privateGroupManager;
protected final PrivateGroupFactory privateGroupFactory; protected final PrivateGroupFactory privateGroupFactory;
protected final MessageTracker messageTracker;
private final GroupMessageFactory groupMessageFactory; private final GroupMessageFactory groupMessageFactory;
private final IdentityManager identityManager; private final IdentityManager identityManager;
@@ -54,7 +56,8 @@ abstract class AbstractProtocolEngine<S extends Session>
PrivateGroupFactory privateGroupFactory, PrivateGroupFactory privateGroupFactory,
GroupMessageFactory groupMessageFactory, GroupMessageFactory groupMessageFactory,
IdentityManager identityManager, MessageParser messageParser, IdentityManager identityManager, MessageParser messageParser,
MessageEncoder messageEncoder, Clock clock) { MessageEncoder messageEncoder, MessageTracker messageTracker,
Clock clock) {
this.db = db; this.db = db;
this.clientHelper = clientHelper; this.clientHelper = clientHelper;
this.privateGroupManager = privateGroupManager; this.privateGroupManager = privateGroupManager;
@@ -63,6 +66,7 @@ abstract class AbstractProtocolEngine<S extends Session>
this.identityManager = identityManager; this.identityManager = identityManager;
this.messageParser = messageParser; this.messageParser = messageParser;
this.messageEncoder = messageEncoder; this.messageEncoder = messageEncoder;
this.messageTracker = messageTracker;
this.clock = clock; this.clock = clock;
} }

View File

@@ -2,6 +2,7 @@ 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.MessageTracker;
import org.briarproject.api.clients.ProtocolStateException; import org.briarproject.api.clients.ProtocolStateException;
import org.briarproject.api.clients.SessionId; import org.briarproject.api.clients.SessionId;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
@@ -37,10 +38,11 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
PrivateGroupFactory privateGroupFactory, PrivateGroupFactory privateGroupFactory,
GroupMessageFactory groupMessageFactory, GroupMessageFactory groupMessageFactory,
IdentityManager identityManager, MessageParser messageParser, IdentityManager identityManager, MessageParser messageParser,
MessageEncoder messageEncoder, Clock clock) { MessageEncoder messageEncoder, MessageTracker messageTracker,
Clock clock) {
super(db, clientHelper, privateGroupManager, privateGroupFactory, super(db, clientHelper, privateGroupManager, privateGroupFactory,
groupMessageFactory, identityManager, messageParser, groupMessageFactory, identityManager, messageParser,
messageEncoder, clock); messageEncoder, messageTracker, clock);
} }
@Override @Override
@@ -144,8 +146,10 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
throws DbException { throws DbException {
// Send an INVITE message // Send an INVITE message
Message sent = sendInviteMessage(txn, s, message, timestamp, signature); Message sent = sendInviteMessage(txn, s, message, timestamp, signature);
long localTimestamp = Math.max(timestamp, getLocalTimestamp(s)); // Track the message
messageTracker.trackOutgoingMessage(txn, sent);
// Move to the INVITED state // Move to the INVITED state
long localTimestamp = Math.max(timestamp, getLocalTimestamp(s));
return new CreatorSession(s.getContactGroupId(), s.getPrivateGroupId(), return new CreatorSession(s.getContactGroupId(), s.getPrivateGroupId(),
sent.getId(), s.getLastRemoteMessageId(), localTimestamp, sent.getId(), s.getLastRemoteMessageId(), localTimestamp,
timestamp, INVITED); timestamp, INVITED);
@@ -176,6 +180,9 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
return abort(txn, s); return abort(txn, s);
// Mark the response visible in the UI // Mark the response visible in the UI
markMessageVisibleInUi(txn, m.getId(), true); markMessageVisibleInUi(txn, m.getId(), true);
// Track the message
messageTracker.trackMessage(txn, m.getContactGroupId(),
m.getTimestamp(), false);
// 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 // Broadcast an event
@@ -197,6 +204,9 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
return abort(txn, s); return abort(txn, s);
// Mark the response visible in the UI // Mark the response visible in the UI
markMessageVisibleInUi(txn, m.getId(), true); markMessageVisibleInUi(txn, m.getId(), true);
// Track the message
messageTracker.trackMessage(txn, m.getContactGroupId(),
m.getTimestamp(), false);
// Broadcast an event // Broadcast an event
ContactId contactId = getContactId(txn, m.getContactGroupId()); ContactId contactId = getContactId(txn, m.getContactGroupId());
txn.attach(new GroupInvitationResponseReceivedEvent(contactId, txn.attach(new GroupInvitationResponseReceivedEvent(contactId,

View File

@@ -2,6 +2,7 @@ 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.MessageTracker;
import org.briarproject.api.clients.ProtocolStateException; import org.briarproject.api.clients.ProtocolStateException;
import org.briarproject.api.clients.SessionId; import org.briarproject.api.clients.SessionId;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
@@ -40,10 +41,11 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
PrivateGroupFactory privateGroupFactory, PrivateGroupFactory privateGroupFactory,
GroupMessageFactory groupMessageFactory, GroupMessageFactory groupMessageFactory,
IdentityManager identityManager, MessageParser messageParser, IdentityManager identityManager, MessageParser messageParser,
MessageEncoder messageEncoder, Clock clock) { MessageEncoder messageEncoder, MessageTracker messageTracker,
Clock clock) {
super(db, clientHelper, privateGroupManager, privateGroupFactory, super(db, clientHelper, privateGroupManager, privateGroupFactory,
groupMessageFactory, identityManager, messageParser, groupMessageFactory, identityManager, messageParser,
messageEncoder, clock); messageEncoder, messageTracker, clock);
} }
@Override @Override
@@ -150,6 +152,8 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
markMessageAvailableToAnswer(txn, inviteId, false); markMessageAvailableToAnswer(txn, inviteId, false);
// Send a JOIN message // Send a JOIN message
Message sent = sendJoinMessage(txn, s, true); Message sent = sendJoinMessage(txn, s, true);
// Track the message
messageTracker.trackOutgoingMessage(txn, sent);
try { try {
// Subscribe to the private group // Subscribe to the private group
subscribeToPrivateGroup(txn, inviteId); subscribeToPrivateGroup(txn, inviteId);
@@ -172,6 +176,8 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
markMessageAvailableToAnswer(txn, inviteId, false); markMessageAvailableToAnswer(txn, inviteId, false);
// Send a LEAVE message // Send a LEAVE message
Message sent = sendLeaveMessage(txn, s, true); Message sent = sendLeaveMessage(txn, s, true);
// Track the message
messageTracker.trackOutgoingMessage(txn, sent);
// Move to the START state // Move to the START state
return new InviteeSession(s.getContactGroupId(), s.getPrivateGroupId(), return new InviteeSession(s.getContactGroupId(), s.getPrivateGroupId(),
sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(), sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(),
@@ -200,6 +206,9 @@ 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);
// Track the message
messageTracker.trackMessage(txn, m.getContactGroupId(),
m.getTimestamp(), false);
// Broadcast an event // Broadcast an event
PrivateGroup privateGroup = privateGroupFactory.createPrivateGroup( PrivateGroup privateGroup = privateGroupFactory.createPrivateGroup(
m.getGroupName(), m.getCreator(), m.getSalt()); m.getGroupName(), m.getCreator(), m.getSalt());

View File

@@ -2,6 +2,7 @@ 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.MessageTracker;
import org.briarproject.api.clients.ProtocolStateException; import org.briarproject.api.clients.ProtocolStateException;
import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.Contact;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
@@ -36,10 +37,11 @@ class PeerProtocolEngine extends AbstractProtocolEngine<PeerSession> {
PrivateGroupFactory privateGroupFactory, PrivateGroupFactory privateGroupFactory,
GroupMessageFactory groupMessageFactory, GroupMessageFactory groupMessageFactory,
IdentityManager identityManager, MessageParser messageParser, IdentityManager identityManager, MessageParser messageParser,
MessageEncoder messageEncoder, Clock clock) { MessageEncoder messageEncoder, MessageTracker messageTracker,
Clock clock) {
super(db, clientHelper, privateGroupManager, privateGroupFactory, super(db, clientHelper, privateGroupManager, privateGroupFactory,
groupMessageFactory, identityManager, messageParser, groupMessageFactory, identityManager, messageParser,
messageEncoder, clock); messageEncoder, messageTracker, clock);
} }
@Override @Override

View File

@@ -1,6 +1,7 @@
package org.briarproject.privategroup.invitation; package org.briarproject.privategroup.invitation;
import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.clients.ClientHelper;
import org.briarproject.api.clients.MessageTracker;
import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DatabaseComponent;
import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.IdentityManager;
import org.briarproject.api.nullsafety.NotNullByDefault; import org.briarproject.api.nullsafety.NotNullByDefault;
@@ -24,6 +25,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
private final IdentityManager identityManager; private final IdentityManager identityManager;
private final MessageParser messageParser; private final MessageParser messageParser;
private final MessageEncoder messageEncoder; private final MessageEncoder messageEncoder;
private final MessageTracker messageTracker;
private final Clock clock; private final Clock clock;
@Inject @Inject
@@ -32,7 +34,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
PrivateGroupFactory privateGroupFactory, PrivateGroupFactory privateGroupFactory,
GroupMessageFactory groupMessageFactory, GroupMessageFactory groupMessageFactory,
IdentityManager identityManager, MessageParser messageParser, IdentityManager identityManager, MessageParser messageParser,
MessageEncoder messageEncoder, MessageEncoder messageEncoder, MessageTracker messageTracker,
Clock clock) { Clock clock) {
this.db = db; this.db = db;
this.clientHelper = clientHelper; this.clientHelper = clientHelper;
@@ -42,6 +44,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
this.identityManager = identityManager; this.identityManager = identityManager;
this.messageParser = messageParser; this.messageParser = messageParser;
this.messageEncoder = messageEncoder; this.messageEncoder = messageEncoder;
this.messageTracker = messageTracker;
this.clock = clock; this.clock = clock;
} }
@@ -49,20 +52,20 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
public ProtocolEngine<CreatorSession> createCreatorEngine() { public ProtocolEngine<CreatorSession> createCreatorEngine() {
return new CreatorProtocolEngine(db, clientHelper, privateGroupManager, return new CreatorProtocolEngine(db, clientHelper, privateGroupManager,
privateGroupFactory, groupMessageFactory, identityManager, privateGroupFactory, groupMessageFactory, identityManager,
messageParser, messageEncoder, clock); messageParser, messageEncoder, messageTracker, clock);
} }
@Override @Override
public ProtocolEngine<InviteeSession> createInviteeEngine() { public ProtocolEngine<InviteeSession> createInviteeEngine() {
return new InviteeProtocolEngine(db, clientHelper, privateGroupManager, return new InviteeProtocolEngine(db, clientHelper, privateGroupManager,
privateGroupFactory, groupMessageFactory, identityManager, privateGroupFactory, groupMessageFactory, identityManager,
messageParser, messageEncoder, clock); messageParser, messageEncoder, messageTracker, clock);
} }
@Override @Override
public ProtocolEngine<PeerSession> createPeerEngine() { public ProtocolEngine<PeerSession> createPeerEngine() {
return new PeerProtocolEngine(db, clientHelper, privateGroupManager, return new PeerProtocolEngine(db, clientHelper, privateGroupManager,
privateGroupFactory, groupMessageFactory, identityManager, privateGroupFactory, groupMessageFactory, identityManager,
messageParser, messageEncoder, clock); messageParser, messageEncoder, messageTracker, clock);
} }
} }