diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupControllerImpl.java index 809f224e6..6e62bfb14 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupControllerImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/creation/CreateGroupControllerImpl.java @@ -7,6 +7,7 @@ import org.briarproject.bramble.api.crypto.CryptoExecutor; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.NoSuchContactException; +import org.briarproject.bramble.api.db.TransactionManager; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.lifecycle.LifecycleManager; @@ -15,6 +16,7 @@ import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.system.Clock; import org.briarproject.briar.android.contactselection.ContactSelectorControllerImpl; import org.briarproject.briar.android.controller.handler.ResultExceptionHandler; +import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.identity.AuthorManager; import org.briarproject.briar.api.privategroup.GroupMessage; import org.briarproject.briar.api.privategroup.GroupMessageFactory; @@ -36,6 +38,8 @@ import javax.inject.Inject; import androidx.annotation.Nullable; import static java.util.logging.Level.WARNING; +import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull; import static org.briarproject.bramble.util.LogUtils.logException; @Immutable @@ -44,9 +48,11 @@ class CreateGroupControllerImpl extends ContactSelectorControllerImpl implements CreateGroupController { private static final Logger LOG = - Logger.getLogger(CreateGroupControllerImpl.class.getName()); + getLogger(CreateGroupControllerImpl.class.getName()); private final Executor cryptoExecutor; + private final TransactionManager db; + private final ConversationManager conversationManager; private final ContactManager contactManager; private final IdentityManager identityManager; private final PrivateGroupFactory groupFactory; @@ -57,17 +63,25 @@ class CreateGroupControllerImpl extends ContactSelectorControllerImpl private final Clock clock; @Inject - CreateGroupControllerImpl(@DatabaseExecutor Executor dbExecutor, + CreateGroupControllerImpl( + @DatabaseExecutor Executor dbExecutor, @CryptoExecutor Executor cryptoExecutor, - LifecycleManager lifecycleManager, ContactManager contactManager, - AuthorManager authorManager, IdentityManager identityManager, + TransactionManager db, + ConversationManager conversationManager, + LifecycleManager lifecycleManager, + ContactManager contactManager, + AuthorManager authorManager, + IdentityManager identityManager, PrivateGroupFactory groupFactory, GroupMessageFactory groupMessageFactory, PrivateGroupManager groupManager, GroupInvitationFactory groupInvitationFactory, - GroupInvitationManager groupInvitationManager, Clock clock) { + GroupInvitationManager groupInvitationManager, + Clock clock) { super(dbExecutor, lifecycleManager, contactManager, authorManager); this.cryptoExecutor = cryptoExecutor; + this.db = db; + this.conversationManager = conversationManager; this.contactManager = contactManager; this.identityManager = identityManager; this.groupFactory = groupFactory; @@ -131,16 +145,24 @@ class CreateGroupControllerImpl extends ContactSelectorControllerImpl ResultExceptionHandler handler) { runOnDbThread(() -> { try { - LocalAuthor localAuthor = identityManager.getLocalAuthor(); - List contacts = new ArrayList<>(); - for (ContactId c : contactIds) { - try { - contacts.add(contactManager.getContact(c)); - } catch (NoSuchContactException e) { - // Continue + db.transaction(true, txn -> { + List contexts = new ArrayList<>(); + LocalAuthor localAuthor = + identityManager.getLocalAuthor(txn); + for (ContactId c : contactIds) { + try { + Contact contact = contactManager.getContact(txn, c); + long timestamp = conversationManager + .getTimestampForOutgoingMessage(txn, c); + contexts.add( + new InvitationContext(contact, timestamp)); + } catch (NoSuchContactException e) { + // Continue + } } - } - signInvitations(g, localAuthor, contacts, text, handler); + txn.attach(() -> signInvitations(g, localAuthor, contexts, + text, handler)); + }); } catch (DbException e) { logException(LOG, WARNING, e); handler.onException(e); @@ -149,16 +171,13 @@ class CreateGroupControllerImpl extends ContactSelectorControllerImpl } private void signInvitations(GroupId g, LocalAuthor localAuthor, - Collection contacts, @Nullable String text, + List contexts, @Nullable String text, ResultExceptionHandler handler) { cryptoExecutor.execute(() -> { long timestamp = clock.currentTimeMillis(); - List contexts = new ArrayList<>(); - for (Contact c : contacts) { - byte[] signature = groupInvitationFactory.signInvitation(c, g, - timestamp, localAuthor.getPrivateKey()); - contexts.add(new InvitationContext(c.getId(), timestamp, - signature)); + for (InvitationContext ctx : contexts) { + ctx.signature = groupInvitationFactory.signInvitation( + ctx.contact, g, timestamp, localAuthor.getPrivateKey()); } sendInvitations(g, contexts, text, handler); }); @@ -172,8 +191,9 @@ class CreateGroupControllerImpl extends ContactSelectorControllerImpl for (InvitationContext context : contexts) { try { groupInvitationManager.sendInvitation(g, - context.contactId, text, context.timestamp, - context.signature); + context.contact.getId(), text, + context.timestamp, + requireNonNull(context.signature)); } catch (NoSuchContactException e) { // Continue } @@ -188,15 +208,14 @@ class CreateGroupControllerImpl extends ContactSelectorControllerImpl private static class InvitationContext { - private final ContactId contactId; + private final Contact contact; private final long timestamp; - private final byte[] signature; + @Nullable + private byte[] signature = null; - private InvitationContext(ContactId contactId, long timestamp, - byte[] signature) { - this.contactId = contactId; + private InvitationContext(Contact contact, long timestamp) { + this.contact = contact; this.timestamp = timestamp; - this.signature = signature; } } } 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 396512594..ee275abf2 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 @@ -19,6 +19,7 @@ import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; +import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.privategroup.GroupMessage; import org.briarproject.briar.api.privategroup.GroupMessageFactory; import org.briarproject.briar.api.privategroup.PrivateGroup; @@ -31,6 +32,7 @@ import java.util.Map; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; +import static java.lang.Math.max; import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.privategroup.invitation.MessageType.ABORT; import static org.briarproject.briar.privategroup.invitation.MessageType.INVITE; @@ -54,6 +56,7 @@ abstract class AbstractProtocolEngine> private final MessageParser messageParser; private final MessageEncoder messageEncoder; private final AutoDeleteManager autoDeleteManager; + private final ConversationManager conversationManager; private final Clock clock; AbstractProtocolEngine( @@ -68,6 +71,7 @@ abstract class AbstractProtocolEngine> MessageEncoder messageEncoder, MessageTracker messageTracker, AutoDeleteManager autoDeleteManager, + ConversationManager conversationManager, Clock clock) { this.db = db; this.clientHelper = clientHelper; @@ -80,6 +84,7 @@ abstract class AbstractProtocolEngine> this.messageEncoder = messageEncoder; this.messageTracker = messageTracker; this.autoDeleteManager = autoDeleteManager; + this.conversationManager = conversationManager; this.clock = clock; } @@ -142,6 +147,7 @@ abstract class AbstractProtocolEngine> Message sendJoinMessage(Transaction txn, S s, boolean visibleInUi) throws DbException { Message m; + long localTimestamp = getLocalTimestamp(txn, s); ContactId c = getContactId(txn, s.getContactGroupId()); if (contactSupportsAutoDeletion(txn, c)) { // Set auto-delete timer if manually accepting an invitation @@ -149,13 +155,13 @@ abstract class AbstractProtocolEngine> ? autoDeleteManager.getAutoDeleteTimer(txn, c) : NO_AUTO_DELETE_TIMER; m = messageEncoder.encodeJoinMessage(s.getContactGroupId(), - s.getPrivateGroupId(), getLocalTimestamp(s), + s.getPrivateGroupId(), localTimestamp, s.getLastLocalMessageId(), timer); sendMessage(txn, m, JOIN, s.getPrivateGroupId(), visibleInUi, timer); } else { m = messageEncoder.encodeJoinMessage(s.getContactGroupId(), - s.getPrivateGroupId(), getLocalTimestamp(s), + s.getPrivateGroupId(), localTimestamp, s.getLastLocalMessageId()); sendMessage(txn, m, JOIN, s.getPrivateGroupId(), visibleInUi, NO_AUTO_DELETE_TIMER); @@ -166,6 +172,7 @@ abstract class AbstractProtocolEngine> Message sendLeaveMessage(Transaction txn, S s, boolean visibleInUi) throws DbException { Message m; + long localTimestamp = getLocalTimestamp(txn, s); ContactId c = getContactId(txn, s.getContactGroupId()); if (contactSupportsAutoDeletion(txn, c)) { // Set auto-delete timer if manually accepting an invitation @@ -173,13 +180,13 @@ abstract class AbstractProtocolEngine> ? autoDeleteManager.getAutoDeleteTimer(txn, c) : NO_AUTO_DELETE_TIMER; m = messageEncoder.encodeLeaveMessage(s.getContactGroupId(), - s.getPrivateGroupId(), getLocalTimestamp(s), + s.getPrivateGroupId(), localTimestamp, s.getLastLocalMessageId(), timer); sendMessage(txn, m, LEAVE, s.getPrivateGroupId(), visibleInUi, timer); } else { m = messageEncoder.encodeLeaveMessage(s.getContactGroupId(), - s.getPrivateGroupId(), getLocalTimestamp(s), + s.getPrivateGroupId(), localTimestamp, s.getLastLocalMessageId()); sendMessage(txn, m, LEAVE, s.getPrivateGroupId(), visibleInUi, NO_AUTO_DELETE_TIMER); @@ -190,7 +197,7 @@ abstract class AbstractProtocolEngine> Message sendAbortMessage(Transaction txn, S session) throws DbException { Message m = messageEncoder.encodeAbortMessage( session.getContactGroupId(), session.getPrivateGroupId(), - getLocalTimestamp(session)); + getLocalTimestamp(txn, session)); sendMessage(txn, m, ABORT, session.getPrivateGroupId(), false, NO_AUTO_DELETE_TIMER); return m; @@ -246,7 +253,7 @@ abstract class AbstractProtocolEngine> PrivateGroup privateGroup = privateGroupFactory.createPrivateGroup( invite.getGroupName(), invite.getCreator(), invite.getSalt()); long timestamp = - Math.max(clock.currentTimeMillis(), invite.getTimestamp() + 1); + max(clock.currentTimeMillis(), invite.getTimestamp() + 1); // TODO: Create the join message on the crypto executor LocalAuthor member = identityManager.getLocalAuthor(txn); GroupMessage joinMessage = groupMessageFactory.createJoinMessage( @@ -256,10 +263,18 @@ abstract class AbstractProtocolEngine> .addPrivateGroup(txn, privateGroup, joinMessage, false); } - long getLocalTimestamp(S session) { - return Math.max(clock.currentTimeMillis(), - Math.max(session.getLocalTimestamp(), - session.getInviteTimestamp()) + 1); + /** + * Returns a timestamp for an outgoing message, which is later than the + * timestamp of any message sent or received so far in the conversation + * or the session. + */ + long getLocalTimestamp(Transaction txn, S s) throws DbException { + ContactId c = getContactId(txn, s.getContactGroupId()); + long conversationTimestamp = + conversationManager.getTimestampForOutgoingMessage(txn, c); + long sessionTimestamp = + max(s.getLocalTimestamp(), s.getInviteTimestamp()) + 1; + return max(conversationTimestamp, sessionTimestamp); } private void sendMessage(Transaction txn, Message m, MessageType type, diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java index a38967fdd..ebb9ad2c4 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java @@ -15,6 +15,7 @@ import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.client.SessionId; +import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.privategroup.GroupMessageFactory; import org.briarproject.briar.api.privategroup.PrivateGroupFactory; import org.briarproject.briar.api.privategroup.PrivateGroupManager; @@ -24,6 +25,7 @@ import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRespons import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; +import static java.lang.Math.max; import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; import static org.briarproject.briar.privategroup.invitation.CreatorState.DISSOLVED; @@ -49,11 +51,12 @@ class CreatorProtocolEngine extends AbstractProtocolEngine { MessageEncoder messageEncoder, MessageTracker messageTracker, AutoDeleteManager autoDeleteManager, + ConversationManager conversationManager, Clock clock) { super(db, clientHelper, clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, messageEncoder, messageTracker, - autoDeleteManager, clock); + autoDeleteManager, conversationManager, clock); } @Override @@ -159,7 +162,7 @@ class CreatorProtocolEngine extends AbstractProtocolEngine { // Track the message messageTracker.trackOutgoingMessage(txn, sent); // Move to the INVITED state - long localTimestamp = Math.max(timestamp, getLocalTimestamp(s)); + long localTimestamp = max(timestamp, getLocalTimestamp(txn, s)); return new CreatorSession(s.getContactGroupId(), s.getPrivateGroupId(), sent.getId(), s.getLastRemoteMessageId(), localTimestamp, timestamp, INVITED); 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 dbc17477f..3ee96b9f9 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 @@ -17,6 +17,7 @@ import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.client.SessionId; +import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.privategroup.GroupMessageFactory; import org.briarproject.briar.api.privategroup.PrivateGroup; import org.briarproject.briar.api.privategroup.PrivateGroupFactory; @@ -42,7 +43,8 @@ import static org.briarproject.briar.privategroup.invitation.InviteeState.START; @NotNullByDefault class InviteeProtocolEngine extends AbstractProtocolEngine { - InviteeProtocolEngine(DatabaseComponent db, + InviteeProtocolEngine( + DatabaseComponent db, ClientHelper clientHelper, ClientVersioningManager clientVersioningManager, PrivateGroupManager privateGroupManager, @@ -53,11 +55,12 @@ class InviteeProtocolEngine extends AbstractProtocolEngine { MessageEncoder messageEncoder, MessageTracker messageTracker, AutoDeleteManager autoDeleteManager, + ConversationManager conversationManager, Clock clock) { super(db, clientHelper, clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, messageEncoder, messageTracker, - autoDeleteManager, clock); + autoDeleteManager, conversationManager, clock); } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java index 21eef0053..8f57c7e4e 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java @@ -15,6 +15,7 @@ import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.ProtocolStateException; +import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.privategroup.GroupMessageFactory; import org.briarproject.briar.api.privategroup.PrivateGroupFactory; import org.briarproject.briar.api.privategroup.PrivateGroupManager; @@ -49,11 +50,12 @@ class PeerProtocolEngine extends AbstractProtocolEngine { MessageEncoder messageEncoder, MessageTracker messageTracker, AutoDeleteManager autoDeleteManager, + ConversationManager conversationManager, Clock clock) { super(db, clientHelper, clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, messageEncoder, messageTracker, - autoDeleteManager, clock); + autoDeleteManager, conversationManager, clock); } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java index 089b06c66..210c4d27d 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java @@ -8,6 +8,7 @@ import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; +import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.privategroup.GroupMessageFactory; import org.briarproject.briar.api.privategroup.PrivateGroupFactory; import org.briarproject.briar.api.privategroup.PrivateGroupManager; @@ -30,6 +31,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { private final MessageEncoder messageEncoder; private final MessageTracker messageTracker; private final AutoDeleteManager autoDeleteManager; + private final ConversationManager conversationManager; private final Clock clock; @Inject @@ -45,6 +47,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { MessageEncoder messageEncoder, MessageTracker messageTracker, AutoDeleteManager autoDeleteManager, + ConversationManager conversationManager, Clock clock) { this.db = db; this.clientHelper = clientHelper; @@ -57,6 +60,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { this.messageEncoder = messageEncoder; this.messageTracker = messageTracker; this.autoDeleteManager = autoDeleteManager; + this.conversationManager = conversationManager; this.clock = clock; } @@ -66,7 +70,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, messageEncoder, messageTracker, - autoDeleteManager, clock); + autoDeleteManager, conversationManager, clock); } @Override @@ -75,7 +79,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, messageEncoder, messageTracker, - autoDeleteManager, clock); + autoDeleteManager, conversationManager, clock); } @Override @@ -84,6 +88,6 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, messageEncoder, messageTracker, - autoDeleteManager, clock); + autoDeleteManager, conversationManager, clock); } } 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 1f2f85008..2ceff9376 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 @@ -19,6 +19,7 @@ import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.bramble.test.BrambleMockTestCase; import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; +import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.privategroup.GroupMessageFactory; import org.briarproject.briar.api.privategroup.PrivateGroup; import org.briarproject.briar.api.privategroup.PrivateGroupFactory; @@ -62,6 +63,8 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase { final MessageTracker messageTracker = context.mock(MessageTracker.class); final AutoDeleteManager autoDeleteManager = context.mock(AutoDeleteManager.class); + final ConversationManager conversationManager = + context.mock(ConversationManager.class); final Clock clock = context.mock(Clock.class); final Transaction txn = new Transaction(null, false); @@ -115,9 +118,12 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase { assertEquals(inviteTimestamp, s.getInviteTimestamp()); } - void expectGetLocalTimestamp(long time) { + void expectGetLocalTimestamp(long time) throws Exception { context.checking(new Expectations() {{ - oneOf(clock).currentTimeMillis(); + oneOf(clientHelper).getContactId(txn, contactGroupId); + will(returnValue(contactId)); + oneOf(conversationManager) + .getTimestampForOutgoingMessage(txn, contactId); will(returnValue(time)); }}); } diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java index fde516717..2e967228f 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java @@ -24,7 +24,8 @@ public class CreatorProtocolEngineTest extends AbstractProtocolEngineTest { new CreatorProtocolEngine(db, clientHelper, clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, - messageEncoder, messageTracker, autoDeleteManager, clock); + messageEncoder, messageTracker, autoDeleteManager, + conversationManager, clock); private CreatorSession getDefaultSession(CreatorState state) { return new CreatorSession(contactGroupId, privateGroupId, 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 56a984d6e..f8552e09f 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 @@ -43,7 +43,8 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest { new InviteeProtocolEngine(db, clientHelper, clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, - messageEncoder, messageTracker, autoDeleteManager, clock); + messageEncoder, messageTracker, autoDeleteManager, + conversationManager, clock); private final LocalAuthor localAuthor = getLocalAuthor(); private InviteeSession getDefaultSession(InviteeState state) { diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java index 35191e995..533246f6a 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java @@ -27,7 +27,8 @@ public class PeerProtocolEngineTest extends AbstractProtocolEngineTest { new PeerProtocolEngine(db, clientHelper, clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, - messageEncoder, messageTracker, autoDeleteManager, clock); + messageEncoder, messageTracker, autoDeleteManager, + conversationManager, clock); private PeerSession getDefaultSession(PeerState state) { return new PeerSession(contactGroupId, privateGroupId,