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