Add dummy implementation of AutoDeleteManager.

This commit is contained in:
akwizgran
2020-11-26 12:16:34 +00:00
committed by Torsten Grote
parent 07f20e1e0d
commit 96debcd616
24 changed files with 306 additions and 127 deletions
@@ -10,6 +10,7 @@ import org.briarproject.bramble.api.contact.ContactManager;
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.Transaction;
import org.briarproject.bramble.api.db.TransactionManager; import org.briarproject.bramble.api.db.TransactionManager;
import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.event.EventBus;
@@ -32,6 +33,7 @@ import org.briarproject.briar.android.viewmodel.DbViewModel;
import org.briarproject.briar.android.viewmodel.LiveEvent; import org.briarproject.briar.android.viewmodel.LiveEvent;
import org.briarproject.briar.android.viewmodel.MutableLiveEvent; import org.briarproject.briar.android.viewmodel.MutableLiveEvent;
import org.briarproject.briar.api.attachment.AttachmentHeader; import org.briarproject.briar.api.attachment.AttachmentHeader;
import org.briarproject.briar.api.autodelete.AutoDeleteManager;
import org.briarproject.briar.api.avatar.event.AvatarUpdatedEvent; import org.briarproject.briar.api.avatar.event.AvatarUpdatedEvent;
import org.briarproject.briar.api.identity.AuthorInfo; import org.briarproject.briar.api.identity.AuthorInfo;
import org.briarproject.briar.api.identity.AuthorManager; import org.briarproject.briar.api.identity.AuthorManager;
@@ -63,7 +65,6 @@ import static org.briarproject.bramble.util.LogUtils.logException;
import static org.briarproject.bramble.util.LogUtils.now; import static org.briarproject.bramble.util.LogUtils.now;
import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE; import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE;
import static org.briarproject.briar.android.util.UiUtils.observeForeverOnce; import static org.briarproject.briar.android.util.UiUtils.observeForeverOnce;
import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER;
import static org.briarproject.briar.api.messaging.PrivateMessageFormat.TEXT_IMAGES; import static org.briarproject.briar.api.messaging.PrivateMessageFormat.TEXT_IMAGES;
import static org.briarproject.briar.api.messaging.PrivateMessageFormat.TEXT_ONLY; import static org.briarproject.briar.api.messaging.PrivateMessageFormat.TEXT_ONLY;
@@ -88,6 +89,7 @@ public class ConversationViewModel extends DbViewModel
private final PrivateMessageFactory privateMessageFactory; private final PrivateMessageFactory privateMessageFactory;
private final AttachmentRetriever attachmentRetriever; private final AttachmentRetriever attachmentRetriever;
private final AttachmentCreator attachmentCreator; private final AttachmentCreator attachmentCreator;
private final AutoDeleteManager autoDeleteManager;
@Nullable @Nullable
private ContactId contactId = null; private ContactId contactId = null;
@@ -122,7 +124,8 @@ public class ConversationViewModel extends DbViewModel
SettingsManager settingsManager, SettingsManager settingsManager,
PrivateMessageFactory privateMessageFactory, PrivateMessageFactory privateMessageFactory,
AttachmentRetriever attachmentRetriever, AttachmentRetriever attachmentRetriever,
AttachmentCreator attachmentCreator) { AttachmentCreator attachmentCreator,
AutoDeleteManager autoDeleteManager) {
super(application, dbExecutor, lifecycleManager, db, androidExecutor); super(application, dbExecutor, lifecycleManager, db, androidExecutor);
this.db = db; this.db = db;
this.eventBus = eventBus; this.eventBus = eventBus;
@@ -133,6 +136,7 @@ public class ConversationViewModel extends DbViewModel
this.privateMessageFactory = privateMessageFactory; this.privateMessageFactory = privateMessageFactory;
this.attachmentRetriever = attachmentRetriever; this.attachmentRetriever = attachmentRetriever;
this.attachmentCreator = attachmentCreator; this.attachmentCreator = attachmentCreator;
this.autoDeleteManager = autoDeleteManager;
messagingGroupId = map(contactItem, c -> messagingGroupId = map(contactItem, c ->
messagingManager.getContactGroup(c.getContact()).getId()); messagingManager.getContactGroup(c.getContact()).getId());
contactDeleted.setValue(false); contactDeleted.setValue(false);
@@ -246,7 +250,8 @@ public class ConversationViewModel extends DbViewModel
observeForeverOnce(messagingGroupId, groupId -> { observeForeverOnce(messagingGroupId, groupId -> {
requireNonNull(groupId); requireNonNull(groupId);
observeForeverOnce(privateMessageFormat, format -> observeForeverOnce(privateMessageFormat, format ->
createMessage(groupId, text, headers, timestamp, format)); storeMessage(requireNonNull(contactId), groupId, text,
headers, timestamp, format));
}); });
} }
@@ -306,45 +311,50 @@ public class ConversationViewModel extends DbViewModel
settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE); settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE);
} }
@UiThread private PrivateMessage createMessage(Transaction txn, ContactId c,
private void createMessage(GroupId groupId, @Nullable String text, GroupId groupId, @Nullable String text,
List<AttachmentHeader> headers, long timestamp, List<AttachmentHeader> headers, long timestamp,
PrivateMessageFormat format) { PrivateMessageFormat format) throws DbException {
try { try {
PrivateMessage pm;
if (format == TEXT_ONLY) { if (format == TEXT_ONLY) {
pm = privateMessageFactory.createLegacyPrivateMessage( return privateMessageFactory.createLegacyPrivateMessage(
groupId, timestamp, requireNonNull(text)); groupId, timestamp, requireNonNull(text));
} else if (format == TEXT_IMAGES) { } else if (format == TEXT_IMAGES) {
pm = privateMessageFactory.createPrivateMessage(groupId, return privateMessageFactory.createPrivateMessage(groupId,
timestamp, text, headers); timestamp, text, headers);
} else { } else {
// TODO: Look up auto-delete timer long timer = autoDeleteManager.getAutoDeleteTimer(txn, c);
pm = privateMessageFactory.createPrivateMessage(groupId, return privateMessageFactory.createPrivateMessage(groupId,
timestamp, text, headers, NO_AUTO_DELETE_TIMER); timestamp, text, headers, timer);
} }
storeMessage(pm);
} catch (FormatException e) { } catch (FormatException e) {
throw new AssertionError(e); throw new AssertionError(e);
} }
} }
@UiThread @UiThread
private void storeMessage(PrivateMessage m) { private void storeMessage(ContactId c, GroupId groupId,
attachmentCreator.onAttachmentsSent(m.getMessage().getId()); @Nullable String text, List<AttachmentHeader> headers,
long timestamp, PrivateMessageFormat format) {
runOnDbThread(() -> { runOnDbThread(() -> {
try { try {
long start = now(); db.transaction(false, txn -> {
messagingManager.addLocalMessage(m); long start = now();
logDuration(LOG, "Storing message", start); PrivateMessage m = createMessage(txn, c, groupId, text,
Message message = m.getMessage(); headers, timestamp, format);
PrivateMessageHeader h = new PrivateMessageHeader( messagingManager.addLocalMessage(txn, m);
message.getId(), message.getGroupId(), logDuration(LOG, "Storing message", start);
message.getTimestamp(), true, true, false, false, Message message = m.getMessage();
m.hasText(), m.getAttachmentHeaders(), PrivateMessageHeader h = new PrivateMessageHeader(
m.getAutoDeleteTimer()); message.getId(), message.getGroupId(),
// TODO add text to cache when available here message.getTimestamp(), true, true, false, false,
addedHeader.postEvent(h); m.hasText(), m.getAttachmentHeaders(),
m.getAutoDeleteTimer());
// TODO add text to cache when available here
MessageId id = message.getId();
txn.attach(() -> attachmentCreator.onAttachmentsSent(id));
addedHeader.postEvent(h);
});
} catch (DbException e) { } catch (DbException e) {
logException(LOG, WARNING, e); logException(LOG, WARNING, e);
} }
@@ -0,0 +1,14 @@
package org.briarproject.briar.api.autodelete;
import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
@NotNullByDefault
public interface AutoDeleteManager {
long getAutoDeleteTimer(Transaction txn, ContactId c) throws DbException;
void setAutoDeleteTimer(Transaction txn, ContactId c) throws DbException;
}
@@ -39,6 +39,11 @@ public interface MessagingManager extends ConversationClient {
*/ */
void addLocalMessage(PrivateMessage m) throws DbException; void addLocalMessage(PrivateMessage m) throws DbException;
/**
* Stores a local private message.
*/
void addLocalMessage(Transaction txn, PrivateMessage m) throws DbException;
/** /**
* Stores a local attachment message. * Stores a local attachment message.
* *
@@ -1,6 +1,7 @@
package org.briarproject.briar; package org.briarproject.briar;
import org.briarproject.briar.attachment.AttachmentModule; import org.briarproject.briar.attachment.AttachmentModule;
import org.briarproject.briar.autodelete.AutoDeleteModule;
import org.briarproject.briar.avatar.AvatarModule; import org.briarproject.briar.avatar.AvatarModule;
import org.briarproject.briar.blog.BlogModule; import org.briarproject.briar.blog.BlogModule;
import org.briarproject.briar.client.BriarClientModule; import org.briarproject.briar.client.BriarClientModule;
@@ -18,6 +19,8 @@ import org.briarproject.briar.test.TestModule;
import dagger.Module; import dagger.Module;
@Module(includes = { @Module(includes = {
AttachmentModule.class,
AutoDeleteModule.class,
AvatarModule.class, AvatarModule.class,
BlogModule.class, BlogModule.class,
BriarClientModule.class, BriarClientModule.class,
@@ -27,7 +30,6 @@ import dagger.Module;
GroupInvitationModule.class, GroupInvitationModule.class,
IdentityModule.class, IdentityModule.class,
IntroductionModule.class, IntroductionModule.class,
AttachmentModule.class,
MessagingModule.class, MessagingModule.class,
PrivateGroupModule.class, PrivateGroupModule.class,
SharingModule.class, SharingModule.class,
@@ -0,0 +1,33 @@
package org.briarproject.briar.autodelete;
import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.autodelete.AutoDeleteManager;
import javax.annotation.concurrent.Immutable;
import javax.inject.Inject;
import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER;
@Immutable
@NotNullByDefault
class AutoDeleteManagerImpl implements AutoDeleteManager {
@Inject
AutoDeleteManagerImpl() {
}
@Override
public long getAutoDeleteTimer(Transaction txn, ContactId c)
throws DbException {
return NO_AUTO_DELETE_TIMER;
}
@Override
public void setAutoDeleteTimer(Transaction txn, ContactId c)
throws DbException {
// Mmm hmm, yup, I'll bear that in mind
}
}
@@ -0,0 +1,16 @@
package org.briarproject.briar.autodelete;
import org.briarproject.briar.api.autodelete.AutoDeleteManager;
import dagger.Module;
import dagger.Provides;
@Module
public class AutoDeleteModule {
@Provides
AutoDeleteManager provideAutoDeleteManager(
AutoDeleteManagerImpl autoDeleteManager) {
return autoDeleteManager;
}
}
@@ -22,6 +22,7 @@ import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock; 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.client.MessageTracker; import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.client.SessionId;
import org.briarproject.briar.api.identity.AuthorInfo; import org.briarproject.briar.api.identity.AuthorInfo;
@@ -59,6 +60,7 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
protected final MessageParser messageParser; protected final MessageParser messageParser;
protected final MessageEncoder messageEncoder; protected final MessageEncoder messageEncoder;
protected final ClientVersioningManager clientVersioningManager; protected final ClientVersioningManager clientVersioningManager;
protected final AutoDeleteManager autoDeleteManager;
protected final Clock clock; protected final Clock clock;
AbstractProtocolEngine( AbstractProtocolEngine(
@@ -72,6 +74,7 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
MessageParser messageParser, MessageParser messageParser,
MessageEncoder messageEncoder, MessageEncoder messageEncoder,
ClientVersioningManager clientVersioningManager, ClientVersioningManager clientVersioningManager,
AutoDeleteManager autoDeleteManager,
Clock clock) { Clock clock) {
this.db = db; this.db = db;
this.clientHelper = clientHelper; this.clientHelper = clientHelper;
@@ -83,6 +86,7 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
this.messageParser = messageParser; this.messageParser = messageParser;
this.messageEncoder = messageEncoder; this.messageEncoder = messageEncoder;
this.clientVersioningManager = clientVersioningManager; this.clientVersioningManager = clientVersioningManager;
this.autoDeleteManager = autoDeleteManager;
this.clock = clock; this.clock = clock;
} }
@@ -90,9 +94,9 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
long timestamp, Author author, @Nullable String text) long timestamp, Author author, @Nullable String text)
throws DbException { throws DbException {
Message m; Message m;
if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { ContactId c = getContactId(txn, s.getContactGroupId());
// TODO: Look up the current auto-delete timer if (contactSupportsAutoDeletion(txn, c)) {
long timer = NO_AUTO_DELETE_TIMER; long timer = autoDeleteManager.getAutoDeleteTimer(txn, c);
m = messageEncoder.encodeRequestMessage(s.getContactGroupId(), m = messageEncoder.encodeRequestMessage(s.getContactGroupId(),
timestamp, s.getLastLocalMessageId(), author, text, timer); timestamp, s.getLastLocalMessageId(), author, text, timer);
sendMessage(txn, REQUEST, s.getSessionId(), m, true, timer); sendMessage(txn, REQUEST, s.getSessionId(), m, true, timer);
@@ -110,9 +114,9 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
Map<TransportId, TransportProperties> transportProperties, Map<TransportId, TransportProperties> transportProperties,
boolean visible) throws DbException { boolean visible) throws DbException {
Message m; Message m;
if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { ContactId c = getContactId(txn, s.getContactGroupId());
// TODO: Look up the current auto-delete timer if (contactSupportsAutoDeletion(txn, c)) {
long timer = NO_AUTO_DELETE_TIMER; long timer = autoDeleteManager.getAutoDeleteTimer(txn, c);
m = messageEncoder.encodeAcceptMessage(s.getContactGroupId(), m = messageEncoder.encodeAcceptMessage(s.getContactGroupId(),
timestamp, s.getLastLocalMessageId(), s.getSessionId(), timestamp, s.getLastLocalMessageId(), s.getSessionId(),
ephemeralPublicKey, acceptTimestamp, transportProperties, ephemeralPublicKey, acceptTimestamp, transportProperties,
@@ -131,9 +135,9 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
Message sendDeclineMessage(Transaction txn, PeerSession s, long timestamp, Message sendDeclineMessage(Transaction txn, PeerSession s, long timestamp,
boolean visible) throws DbException { boolean visible) throws DbException {
Message m; Message m;
if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { ContactId c = getContactId(txn, s.getContactGroupId());
// TODO: Look up the current auto-delete timer if (contactSupportsAutoDeletion(txn, c)) {
long timer = NO_AUTO_DELETE_TIMER; long timer = autoDeleteManager.getAutoDeleteTimer(txn, c);
m = messageEncoder.encodeDeclineMessage(s.getContactGroupId(), m = messageEncoder.encodeDeclineMessage(s.getContactGroupId(),
timestamp, s.getLastLocalMessageId(), s.getSessionId(), timestamp, s.getLastLocalMessageId(), s.getSessionId(),
timer); timer);
@@ -237,16 +241,20 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
); );
} }
boolean contactSupportsAutoDeletion(Transaction txn, GroupId contactGroupId) private ContactId getContactId(Transaction txn, GroupId contactGroupId)
throws DbException { throws DbException {
try { try {
ContactId c = clientHelper.getContactId(txn, contactGroupId); return clientHelper.getContactId(txn, contactGroupId);
int minorVersion = clientVersioningManager
.getClientMinorVersion(txn, c, CLIENT_ID, MAJOR_VERSION);
// Auto-delete was added in client version 0.1
return minorVersion >= 1;
} catch (FormatException e) { } catch (FormatException e) {
throw new DbException(e); throw new DbException(e);
} }
} }
private boolean contactSupportsAutoDeletion(Transaction txn, ContactId c)
throws DbException {
int minorVersion = clientVersioningManager.getClientMinorVersion(txn, c,
CLIENT_ID, MAJOR_VERSION);
// Auto-delete was added in client version 0.1
return minorVersion >= 1;
}
} }
@@ -26,6 +26,7 @@ import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.transport.KeyManager; import org.briarproject.bramble.api.transport.KeyManager;
import org.briarproject.bramble.api.transport.KeySetId; import org.briarproject.bramble.api.transport.KeySetId;
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.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;
@@ -80,10 +81,12 @@ class IntroduceeProtocolEngine
IntroductionCrypto crypto, IntroductionCrypto crypto,
KeyManager keyManager, KeyManager keyManager,
TransportPropertyManager transportPropertyManager, TransportPropertyManager transportPropertyManager,
ClientVersioningManager clientVersioningManager) { ClientVersioningManager clientVersioningManager,
AutoDeleteManager autoDeleteManager) {
super(db, clientHelper, contactManager, contactGroupFactory, super(db, clientHelper, contactManager, contactGroupFactory,
messageTracker, identityManager, authorManager, messageParser, messageTracker, identityManager, authorManager, messageParser,
messageEncoder, clientVersioningManager, clock); messageEncoder, clientVersioningManager, autoDeleteManager,
clock);
this.crypto = crypto; this.crypto = crypto;
this.keyManager = keyManager; this.keyManager = keyManager;
this.transportPropertyManager = transportPropertyManager; this.transportPropertyManager = transportPropertyManager;
@@ -14,6 +14,7 @@ import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock; 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.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.identity.AuthorManager; import org.briarproject.briar.api.identity.AuthorManager;
@@ -54,10 +55,12 @@ class IntroducerProtocolEngine
MessageParser messageParser, MessageParser messageParser,
MessageEncoder messageEncoder, MessageEncoder messageEncoder,
ClientVersioningManager clientVersioningManager, ClientVersioningManager clientVersioningManager,
AutoDeleteManager autoDeleteManager,
Clock clock) { Clock clock) {
super(db, clientHelper, contactManager, contactGroupFactory, super(db, clientHelper, contactManager, contactGroupFactory,
messageTracker, identityManager, authorManager, messageParser, messageTracker, identityManager, authorManager, messageParser,
messageEncoder, clientVersioningManager, clock); messageEncoder, clientVersioningManager, autoDeleteManager,
clock);
} }
@Override @Override
@@ -227,7 +227,12 @@ class MessagingManagerImpl implements MessagingManager, IncomingMessageHook,
@Override @Override
public void addLocalMessage(PrivateMessage m) throws DbException { public void addLocalMessage(PrivateMessage m) throws DbException {
Transaction txn = db.startTransaction(false); db.transaction(false, txn -> addLocalMessage(txn, m));
}
@Override
public void addLocalMessage(Transaction txn, PrivateMessage m)
throws DbException {
try { try {
BdfDictionary meta = new BdfDictionary(); BdfDictionary meta = new BdfDictionary();
meta.put(MSG_KEY_TIMESTAMP, m.getMessage().getTimestamp()); meta.put(MSG_KEY_TIMESTAMP, m.getMessage().getTimestamp());
@@ -257,11 +262,8 @@ class MessagingManagerImpl implements MessagingManager, IncomingMessageHook,
clientHelper.addLocalMessage(txn, m.getMessage(), meta, true, clientHelper.addLocalMessage(txn, m.getMessage(), meta, true,
false); false);
messageTracker.trackOutgoingMessage(txn, m.getMessage()); messageTracker.trackOutgoingMessage(txn, m.getMessage());
db.commitTransaction(txn);
} catch (FormatException e) { } catch (FormatException e) {
throw new AssertionError(e); throw new AssertionError(e);
} finally {
db.endTransaction(txn);
} }
} }
@@ -17,6 +17,7 @@ import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock; 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.client.MessageTracker; import org.briarproject.briar.api.client.MessageTracker;
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;
@@ -52,15 +53,21 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
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 AutoDeleteManager autoDeleteManager;
private final Clock clock; private final Clock clock;
AbstractProtocolEngine(DatabaseComponent db, ClientHelper clientHelper, AbstractProtocolEngine(
DatabaseComponent db,
ClientHelper clientHelper,
ClientVersioningManager clientVersioningManager, ClientVersioningManager clientVersioningManager,
PrivateGroupManager privateGroupManager, PrivateGroupManager privateGroupManager,
PrivateGroupFactory privateGroupFactory, PrivateGroupFactory privateGroupFactory,
GroupMessageFactory groupMessageFactory, GroupMessageFactory groupMessageFactory,
IdentityManager identityManager, MessageParser messageParser, IdentityManager identityManager,
MessageEncoder messageEncoder, MessageTracker messageTracker, MessageParser messageParser,
MessageEncoder messageEncoder,
MessageTracker messageTracker,
AutoDeleteManager autoDeleteManager,
Clock clock) { Clock clock) {
this.db = db; this.db = db;
this.clientHelper = clientHelper; this.clientHelper = clientHelper;
@@ -72,6 +79,7 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
this.messageParser = messageParser; this.messageParser = messageParser;
this.messageEncoder = messageEncoder; this.messageEncoder = messageEncoder;
this.messageTracker = messageTracker; this.messageTracker = messageTracker;
this.autoDeleteManager = autoDeleteManager;
this.clock = clock; this.clock = clock;
} }
@@ -112,9 +120,9 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
throw new DbException(e); // Invalid group descriptor throw new DbException(e); // Invalid group descriptor
} }
Message m; Message m;
if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { ContactId c = getContactId(txn, s.getContactGroupId());
// TODO: Look up the current auto-delete timer if (contactSupportsAutoDeletion(txn, c)) {
long timer = NO_AUTO_DELETE_TIMER; long timer = autoDeleteManager.getAutoDeleteTimer(txn, c);
m = messageEncoder.encodeInviteMessage(s.getContactGroupId(), m = messageEncoder.encodeInviteMessage(s.getContactGroupId(),
privateGroup.getId(), timestamp, privateGroup.getName(), privateGroup.getId(), timestamp, privateGroup.getName(),
privateGroup.getCreator(), privateGroup.getSalt(), text, privateGroup.getCreator(), privateGroup.getSalt(), text,
@@ -134,10 +142,12 @@ 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;
if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { ContactId c = getContactId(txn, s.getContactGroupId());
// TODO: Look up the current auto-delete timer if the message is if (contactSupportsAutoDeletion(txn, c)) {
// visible in the UI (accepting an invitation) // Set auto-delete timer if manually accepting an invitation
long timer = NO_AUTO_DELETE_TIMER; long timer = visibleInUi
? autoDeleteManager.getAutoDeleteTimer(txn, c)
: NO_AUTO_DELETE_TIMER;
m = messageEncoder.encodeJoinMessage(s.getContactGroupId(), m = messageEncoder.encodeJoinMessage(s.getContactGroupId(),
s.getPrivateGroupId(), getLocalTimestamp(s), s.getPrivateGroupId(), getLocalTimestamp(s),
s.getLastLocalMessageId(), timer); s.getLastLocalMessageId(), timer);
@@ -156,10 +166,12 @@ 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;
if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { ContactId c = getContactId(txn, s.getContactGroupId());
// TODO: Look up the current auto-delete timer if the message is if (contactSupportsAutoDeletion(txn, c)) {
// visible in the UI (declining an invitation) // Set auto-delete timer if manually accepting an invitation
long timer = NO_AUTO_DELETE_TIMER; long timer = visibleInUi
? autoDeleteManager.getAutoDeleteTimer(txn, c)
: NO_AUTO_DELETE_TIMER;
m = messageEncoder.encodeLeaveMessage(s.getContactGroupId(), m = messageEncoder.encodeLeaveMessage(s.getContactGroupId(),
s.getPrivateGroupId(), getLocalTimestamp(s), s.getPrivateGroupId(), getLocalTimestamp(s),
s.getLastLocalMessageId(), timer); s.getLastLocalMessageId(), timer);
@@ -263,18 +275,21 @@ abstract class AbstractProtocolEngine<S extends Session<?>>
} }
} }
boolean contactSupportsAutoDeletion(Transaction txn, GroupId contactGroupId) private ContactId getContactId(Transaction txn, GroupId contactGroupId)
throws DbException { throws DbException {
try { try {
ContactId c = clientHelper.getContactId(txn, contactGroupId); return clientHelper.getContactId(txn, contactGroupId);
int minorVersion = clientVersioningManager
.getClientMinorVersion(txn, c,
GroupInvitationManager.CLIENT_ID,
GroupInvitationManager.MAJOR_VERSION);
// Auto-delete was added in client version 0.1
return minorVersion >= 1;
} catch (FormatException e) { } catch (FormatException e) {
throw new DbException(e); throw new DbException(e);
} }
} }
private boolean contactSupportsAutoDeletion(Transaction txn, ContactId c)
throws DbException {
int minorVersion = clientVersioningManager.getClientMinorVersion(txn, c,
GroupInvitationManager.CLIENT_ID,
GroupInvitationManager.MAJOR_VERSION);
// Auto-delete was added in client version 0.1
return minorVersion >= 1;
}
} }
@@ -11,6 +11,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.system.Clock; 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.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;
@@ -36,17 +37,23 @@ import static org.briarproject.briar.privategroup.invitation.CreatorState.START;
@NotNullByDefault @NotNullByDefault
class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> { class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> {
CreatorProtocolEngine(DatabaseComponent db, ClientHelper clientHelper, CreatorProtocolEngine(
DatabaseComponent db,
ClientHelper clientHelper,
ClientVersioningManager clientVersioningManager, ClientVersioningManager clientVersioningManager,
PrivateGroupManager privateGroupManager, PrivateGroupManager privateGroupManager,
PrivateGroupFactory privateGroupFactory, PrivateGroupFactory privateGroupFactory,
GroupMessageFactory groupMessageFactory, GroupMessageFactory groupMessageFactory,
IdentityManager identityManager, MessageParser messageParser, IdentityManager identityManager,
MessageEncoder messageEncoder, MessageTracker messageTracker, MessageParser messageParser,
MessageEncoder messageEncoder,
MessageTracker messageTracker,
AutoDeleteManager autoDeleteManager,
Clock clock) { Clock clock) {
super(db, clientHelper, clientVersioningManager, privateGroupManager, super(db, clientHelper, clientVersioningManager, privateGroupManager,
privateGroupFactory, groupMessageFactory, identityManager, privateGroupFactory, groupMessageFactory, identityManager,
messageParser, messageEncoder, messageTracker, clock); messageParser, messageEncoder, messageTracker,
autoDeleteManager, clock);
} }
@Override @Override
@@ -13,6 +13,7 @@ import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock; 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.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;
@@ -41,17 +42,22 @@ import static org.briarproject.briar.privategroup.invitation.InviteeState.START;
@NotNullByDefault @NotNullByDefault
class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> { class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> {
InviteeProtocolEngine(DatabaseComponent db, ClientHelper clientHelper, InviteeProtocolEngine(DatabaseComponent db,
ClientHelper clientHelper,
ClientVersioningManager clientVersioningManager, ClientVersioningManager clientVersioningManager,
PrivateGroupManager privateGroupManager, PrivateGroupManager privateGroupManager,
PrivateGroupFactory privateGroupFactory, PrivateGroupFactory privateGroupFactory,
GroupMessageFactory groupMessageFactory, GroupMessageFactory groupMessageFactory,
IdentityManager identityManager, MessageParser messageParser, IdentityManager identityManager,
MessageEncoder messageEncoder, MessageTracker messageTracker, MessageParser messageParser,
MessageEncoder messageEncoder,
MessageTracker messageTracker,
AutoDeleteManager autoDeleteManager,
Clock clock) { Clock clock) {
super(db, clientHelper, clientVersioningManager, privateGroupManager, super(db, clientHelper, clientVersioningManager, privateGroupManager,
privateGroupFactory, groupMessageFactory, identityManager, privateGroupFactory, groupMessageFactory, identityManager,
messageParser, messageEncoder, messageTracker, clock); messageParser, messageEncoder, messageTracker,
autoDeleteManager, clock);
} }
@Override @Override
@@ -12,6 +12,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.system.Clock; 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.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.privategroup.GroupMessageFactory; import org.briarproject.briar.api.privategroup.GroupMessageFactory;
@@ -36,17 +37,23 @@ import static org.briarproject.briar.privategroup.invitation.PeerState.START;
@NotNullByDefault @NotNullByDefault
class PeerProtocolEngine extends AbstractProtocolEngine<PeerSession> { class PeerProtocolEngine extends AbstractProtocolEngine<PeerSession> {
PeerProtocolEngine(DatabaseComponent db, ClientHelper clientHelper, PeerProtocolEngine(
DatabaseComponent db,
ClientHelper clientHelper,
ClientVersioningManager clientVersioningManager, ClientVersioningManager clientVersioningManager,
PrivateGroupManager privateGroupManager, PrivateGroupManager privateGroupManager,
PrivateGroupFactory privateGroupFactory, PrivateGroupFactory privateGroupFactory,
GroupMessageFactory groupMessageFactory, GroupMessageFactory groupMessageFactory,
IdentityManager identityManager, MessageParser messageParser, IdentityManager identityManager,
MessageEncoder messageEncoder, MessageTracker messageTracker, MessageParser messageParser,
MessageEncoder messageEncoder,
MessageTracker messageTracker,
AutoDeleteManager autoDeleteManager,
Clock clock) { Clock clock) {
super(db, clientHelper, clientVersioningManager, privateGroupManager, super(db, clientHelper, clientVersioningManager, privateGroupManager,
privateGroupFactory, groupMessageFactory, identityManager, privateGroupFactory, groupMessageFactory, identityManager,
messageParser, messageEncoder, messageTracker, clock); messageParser, messageEncoder, messageTracker,
autoDeleteManager, clock);
} }
@Override @Override
@@ -6,6 +6,7 @@ import org.briarproject.bramble.api.identity.IdentityManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.Clock; 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.client.MessageTracker; import org.briarproject.briar.api.client.MessageTracker;
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;
@@ -28,16 +29,22 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
private final MessageParser messageParser; private final MessageParser messageParser;
private final MessageEncoder messageEncoder; private final MessageEncoder messageEncoder;
private final MessageTracker messageTracker; private final MessageTracker messageTracker;
private final AutoDeleteManager autoDeleteManager;
private final Clock clock; private final Clock clock;
@Inject @Inject
ProtocolEngineFactoryImpl(DatabaseComponent db, ClientHelper clientHelper, ProtocolEngineFactoryImpl(
DatabaseComponent db,
ClientHelper clientHelper,
ClientVersioningManager clientVersioningManager, ClientVersioningManager clientVersioningManager,
PrivateGroupManager privateGroupManager, PrivateGroupManager privateGroupManager,
PrivateGroupFactory privateGroupFactory, PrivateGroupFactory privateGroupFactory,
GroupMessageFactory groupMessageFactory, GroupMessageFactory groupMessageFactory,
IdentityManager identityManager, MessageParser messageParser, IdentityManager identityManager,
MessageEncoder messageEncoder, MessageTracker messageTracker, MessageParser messageParser,
MessageEncoder messageEncoder,
MessageTracker messageTracker,
AutoDeleteManager autoDeleteManager,
Clock clock) { Clock clock) {
this.db = db; this.db = db;
this.clientHelper = clientHelper; this.clientHelper = clientHelper;
@@ -49,6 +56,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
this.messageParser = messageParser; this.messageParser = messageParser;
this.messageEncoder = messageEncoder; this.messageEncoder = messageEncoder;
this.messageTracker = messageTracker; this.messageTracker = messageTracker;
this.autoDeleteManager = autoDeleteManager;
this.clock = clock; this.clock = clock;
} }
@@ -57,7 +65,8 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
return new CreatorProtocolEngine(db, clientHelper, return new CreatorProtocolEngine(db, clientHelper,
clientVersioningManager, privateGroupManager, clientVersioningManager, privateGroupManager,
privateGroupFactory, groupMessageFactory, identityManager, privateGroupFactory, groupMessageFactory, identityManager,
messageParser, messageEncoder, messageTracker, clock); messageParser, messageEncoder, messageTracker,
autoDeleteManager, clock);
} }
@Override @Override
@@ -65,7 +74,8 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
return new InviteeProtocolEngine(db, clientHelper, return new InviteeProtocolEngine(db, clientHelper,
clientVersioningManager, privateGroupManager, clientVersioningManager, privateGroupManager,
privateGroupFactory, groupMessageFactory, identityManager, privateGroupFactory, groupMessageFactory, identityManager,
messageParser, messageEncoder, messageTracker, clock); messageParser, messageEncoder, messageTracker,
autoDeleteManager, clock);
} }
@Override @Override
@@ -73,6 +83,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory {
return new PeerProtocolEngine(db, clientHelper, return new PeerProtocolEngine(db, clientHelper,
clientVersioningManager, privateGroupManager, clientVersioningManager, privateGroupManager,
privateGroupFactory, groupMessageFactory, identityManager, privateGroupFactory, groupMessageFactory, identityManager,
messageParser, messageEncoder, messageTracker, clock); messageParser, messageEncoder, messageTracker,
autoDeleteManager, clock);
} }
} }
@@ -11,6 +11,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock; 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.blog.Blog; import org.briarproject.briar.api.blog.Blog;
import org.briarproject.briar.api.blog.BlogInvitationResponse; import org.briarproject.briar.api.blog.BlogInvitationResponse;
import org.briarproject.briar.api.blog.BlogManager; import org.briarproject.briar.api.blog.BlogManager;
@@ -32,13 +33,19 @@ class BlogProtocolEngineImpl extends ProtocolEngineImpl<Blog> {
invitationFactory; invitationFactory;
@Inject @Inject
BlogProtocolEngineImpl(DatabaseComponent db, ClientHelper clientHelper, BlogProtocolEngineImpl(
DatabaseComponent db,
ClientHelper clientHelper,
ClientVersioningManager clientVersioningManager, ClientVersioningManager clientVersioningManager,
MessageEncoder messageEncoder, MessageParser<Blog> messageParser, MessageEncoder messageEncoder,
MessageTracker messageTracker, Clock clock, BlogManager blogManager, MessageParser<Blog> messageParser,
MessageTracker messageTracker,
AutoDeleteManager autoDeleteManager,
Clock clock,
BlogManager blogManager,
InvitationFactory<Blog, BlogInvitationResponse> invitationFactory) { InvitationFactory<Blog, BlogInvitationResponse> invitationFactory) {
super(db, clientHelper, clientVersioningManager, messageEncoder, super(db, clientHelper, clientVersioningManager, messageEncoder,
messageParser, messageTracker, clock, messageParser, messageTracker, autoDeleteManager, clock,
BlogSharingManager.CLIENT_ID, BlogSharingManager.MAJOR_VERSION, BlogSharingManager.CLIENT_ID, BlogSharingManager.MAJOR_VERSION,
BlogManager.CLIENT_ID, BlogManager.MAJOR_VERSION); BlogManager.CLIENT_ID, BlogManager.MAJOR_VERSION);
this.blogManager = blogManager; this.blogManager = blogManager;
@@ -11,6 +11,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock; 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.client.MessageTracker; import org.briarproject.briar.api.client.MessageTracker;
import org.briarproject.briar.api.conversation.ConversationRequest; import org.briarproject.briar.api.conversation.ConversationRequest;
import org.briarproject.briar.api.forum.Forum; import org.briarproject.briar.api.forum.Forum;
@@ -32,15 +33,19 @@ class ForumProtocolEngineImpl extends ProtocolEngineImpl<Forum> {
invitationFactory; invitationFactory;
@Inject @Inject
ForumProtocolEngineImpl(DatabaseComponent db, ForumProtocolEngineImpl(
DatabaseComponent db,
ClientHelper clientHelper, ClientHelper clientHelper,
ClientVersioningManager clientVersioningManager, ClientVersioningManager clientVersioningManager,
MessageEncoder messageEncoder, MessageParser<Forum> messageParser, MessageEncoder messageEncoder,
MessageTracker messageTracker, Clock clock, MessageParser<Forum> messageParser,
MessageTracker messageTracker,
AutoDeleteManager autoDeleteManager,
Clock clock,
ForumManager forumManager, ForumManager forumManager,
InvitationFactory<Forum, ForumInvitationResponse> invitationFactory) { InvitationFactory<Forum, ForumInvitationResponse> invitationFactory) {
super(db, clientHelper, clientVersioningManager, messageEncoder, super(db, clientHelper, clientVersioningManager, messageEncoder,
messageParser, messageTracker, clock, messageParser, messageTracker, autoDeleteManager, clock,
ForumSharingManager.CLIENT_ID, ForumSharingManager.CLIENT_ID,
ForumSharingManager.MAJOR_VERSION, ForumSharingManager.MAJOR_VERSION,
ForumManager.CLIENT_ID, ForumManager.MAJOR_VERSION); ForumManager.CLIENT_ID, ForumManager.MAJOR_VERSION);
@@ -18,6 +18,7 @@ import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock; 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.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.sharing.Shareable; import org.briarproject.briar.api.sharing.Shareable;
@@ -56,22 +57,31 @@ abstract class ProtocolEngineImpl<S extends Shareable>
private final ClientVersioningManager clientVersioningManager; private final ClientVersioningManager clientVersioningManager;
private final MessageEncoder messageEncoder; private final MessageEncoder messageEncoder;
private final MessageTracker messageTracker; private final MessageTracker messageTracker;
private final AutoDeleteManager autoDeleteManager;
private final Clock clock; private final Clock clock;
private final ClientId sharingClientId, shareableClientId; private final ClientId sharingClientId, shareableClientId;
private final int sharingClientMajorVersion, shareableClientMajorVersion; private final int sharingClientMajorVersion, shareableClientMajorVersion;
ProtocolEngineImpl(DatabaseComponent db, ClientHelper clientHelper, ProtocolEngineImpl(
DatabaseComponent db,
ClientHelper clientHelper,
ClientVersioningManager clientVersioningManager, ClientVersioningManager clientVersioningManager,
MessageEncoder messageEncoder, MessageParser<S> messageParser, MessageEncoder messageEncoder,
MessageTracker messageTracker, Clock clock, MessageParser<S> messageParser,
ClientId sharingClientId, int sharingClientMajorVersion, MessageTracker messageTracker,
ClientId shareableClientId, int shareableClientMajorVersion) { AutoDeleteManager autoDeleteManager,
Clock clock,
ClientId sharingClientId,
int sharingClientMajorVersion,
ClientId shareableClientId,
int shareableClientMajorVersion) {
this.db = db; this.db = db;
this.clientHelper = clientHelper; this.clientHelper = clientHelper;
this.clientVersioningManager = clientVersioningManager; this.clientVersioningManager = clientVersioningManager;
this.messageEncoder = messageEncoder; this.messageEncoder = messageEncoder;
this.messageParser = messageParser; this.messageParser = messageParser;
this.messageTracker = messageTracker; this.messageTracker = messageTracker;
this.autoDeleteManager = autoDeleteManager;
this.clock = clock; this.clock = clock;
this.sharingClientId = sharingClientId; this.sharingClientId = sharingClientId;
this.sharingClientMajorVersion = sharingClientMajorVersion; this.sharingClientMajorVersion = sharingClientMajorVersion;
@@ -125,9 +135,9 @@ abstract class ProtocolEngineImpl<S extends Shareable>
} }
long localTimestamp = Math.max(timestamp, getLocalTimestamp(s)); long localTimestamp = Math.max(timestamp, getLocalTimestamp(s));
Message m; Message m;
if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { ContactId c = getContactId(txn, s.getContactGroupId());
// TODO: Look up the current auto-delete timer if (contactSupportsAutoDeletion(txn, c)) {
long timer = NO_AUTO_DELETE_TIMER; long timer = autoDeleteManager.getAutoDeleteTimer(txn, c);
m = messageEncoder.encodeInviteMessage(s.getContactGroupId(), m = messageEncoder.encodeInviteMessage(s.getContactGroupId(),
localTimestamp, s.getLastLocalMessageId(), descriptor, localTimestamp, s.getLastLocalMessageId(), descriptor,
text, timer); text, timer);
@@ -191,9 +201,9 @@ abstract class ProtocolEngineImpl<S extends Shareable>
private Message sendAcceptMessage(Transaction txn, Session s) private Message sendAcceptMessage(Transaction txn, Session s)
throws DbException { throws DbException {
Message m; Message m;
if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { ContactId c = getContactId(txn, s.getContactGroupId());
// TODO: Look up the current auto-delete timer if (contactSupportsAutoDeletion(txn, c)) {
long timer = NO_AUTO_DELETE_TIMER; long timer = autoDeleteManager.getAutoDeleteTimer(txn, c);
m = messageEncoder.encodeAcceptMessage(s.getContactGroupId(), m = messageEncoder.encodeAcceptMessage(s.getContactGroupId(),
s.getShareableId(), getLocalTimestamp(s), s.getShareableId(), getLocalTimestamp(s),
s.getLastLocalMessageId(), timer); s.getLastLocalMessageId(), timer);
@@ -244,9 +254,9 @@ abstract class ProtocolEngineImpl<S extends Shareable>
private Message sendDeclineMessage(Transaction txn, Session s) private Message sendDeclineMessage(Transaction txn, Session s)
throws DbException { throws DbException {
Message m; Message m;
if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { ContactId c = getContactId(txn, s.getContactGroupId());
// TODO: Look up the current auto-delete timer if (contactSupportsAutoDeletion(txn, c)) {
long timer = NO_AUTO_DELETE_TIMER; long timer = autoDeleteManager.getAutoDeleteTimer(txn, c);
m = messageEncoder.encodeDeclineMessage(s.getContactGroupId(), m = messageEncoder.encodeDeclineMessage(s.getContactGroupId(),
s.getShareableId(), getLocalTimestamp(s), s.getShareableId(), getLocalTimestamp(s),
s.getLastLocalMessageId(), timer); s.getLastLocalMessageId(), timer);
@@ -673,17 +683,20 @@ abstract class ProtocolEngineImpl<S extends Shareable>
session.getInviteTimestamp()) + 1); session.getInviteTimestamp()) + 1);
} }
boolean contactSupportsAutoDeletion(Transaction txn, GroupId contactGroupId) private ContactId getContactId(Transaction txn, GroupId contactGroupId)
throws DbException { throws DbException {
try { try {
ContactId c = clientHelper.getContactId(txn, contactGroupId); return clientHelper.getContactId(txn, contactGroupId);
int minorVersion = clientVersioningManager
.getClientMinorVersion(txn, c, sharingClientId,
sharingClientMajorVersion);
// Auto-delete was added in client version 0.1
return minorVersion >= 1;
} catch (FormatException e) { } catch (FormatException e) {
throw new DbException(e); throw new DbException(e);
} }
} }
private boolean contactSupportsAutoDeletion(Transaction txn, ContactId c)
throws DbException {
int minorVersion = clientVersioningManager.getClientMinorVersion(txn, c,
sharingClientId, sharingClientMajorVersion);
// Auto-delete was added in client version 0.1
return minorVersion >= 1;
}
} }
@@ -3,6 +3,7 @@ package org.briarproject.briar.introduction;
import org.briarproject.bramble.BrambleCoreModule; import org.briarproject.bramble.BrambleCoreModule;
import org.briarproject.bramble.test.BrambleCoreIntegrationTestModule; import org.briarproject.bramble.test.BrambleCoreIntegrationTestModule;
import org.briarproject.briar.attachment.AttachmentModule; import org.briarproject.briar.attachment.AttachmentModule;
import org.briarproject.briar.autodelete.AutoDeleteModule;
import org.briarproject.briar.avatar.AvatarModule; import org.briarproject.briar.avatar.AvatarModule;
import org.briarproject.briar.blog.BlogModule; import org.briarproject.briar.blog.BlogModule;
import org.briarproject.briar.client.BriarClientModule; import org.briarproject.briar.client.BriarClientModule;
@@ -22,6 +23,8 @@ import dagger.Component;
@Component(modules = { @Component(modules = {
BrambleCoreIntegrationTestModule.class, BrambleCoreIntegrationTestModule.class,
BrambleCoreModule.class, BrambleCoreModule.class,
AttachmentModule.class,
AutoDeleteModule.class,
AvatarModule.class, AvatarModule.class,
BlogModule.class, BlogModule.class,
BriarClientModule.class, BriarClientModule.class,
@@ -29,7 +32,6 @@ import dagger.Component;
GroupInvitationModule.class, GroupInvitationModule.class,
IdentityModule.class, IdentityModule.class,
IntroductionModule.class, IntroductionModule.class,
AttachmentModule.class,
MessagingModule.class, MessagingModule.class,
PrivateGroupModule.class, PrivateGroupModule.class,
SharingModule.class SharingModule.class
@@ -17,6 +17,7 @@ import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.versioning.ClientVersioningManager; 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.client.MessageTracker; import org.briarproject.briar.api.client.MessageTracker;
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;
@@ -59,6 +60,8 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase {
final IdentityManager identityManager = context.mock(IdentityManager.class); final IdentityManager identityManager = context.mock(IdentityManager.class);
final MessageEncoder messageEncoder = context.mock(MessageEncoder.class); final MessageEncoder messageEncoder = context.mock(MessageEncoder.class);
final MessageTracker messageTracker = context.mock(MessageTracker.class); final MessageTracker messageTracker = context.mock(MessageTracker.class);
final AutoDeleteManager autoDeleteManager =
context.mock(AutoDeleteManager.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);
@@ -120,7 +123,7 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase {
} }
void expectSendInviteMessage(String text) throws Exception { void expectSendInviteMessage(String text) throws Exception {
expectCheckWhetherContactSupportsAutoDeletion(); expectCheckWhetherContactSupportsAutoDeletion(true);
expectGetLocalTimestamp(messageTimestamp); expectGetLocalTimestamp(messageTimestamp);
context.checking(new Expectations() {{ context.checking(new Expectations() {{
oneOf(messageEncoder).encodeInviteMessage(contactGroupId, oneOf(messageEncoder).encodeInviteMessage(contactGroupId,
@@ -134,7 +137,7 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase {
void expectSendJoinMessage(JoinMessage m, boolean visible) void expectSendJoinMessage(JoinMessage m, boolean visible)
throws Exception { throws Exception {
expectCheckWhetherContactSupportsAutoDeletion(); expectCheckWhetherContactSupportsAutoDeletion(visible);
expectGetLocalTimestamp(messageTimestamp); expectGetLocalTimestamp(messageTimestamp);
context.checking(new Expectations() {{ context.checking(new Expectations() {{
oneOf(messageEncoder).encodeJoinMessage(m.getContactGroupId(), oneOf(messageEncoder).encodeJoinMessage(m.getContactGroupId(),
@@ -146,7 +149,7 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase {
} }
void expectSendLeaveMessage(boolean visible) throws Exception { void expectSendLeaveMessage(boolean visible) throws Exception {
expectCheckWhetherContactSupportsAutoDeletion(); expectCheckWhetherContactSupportsAutoDeletion(visible);
expectGetLocalTimestamp(messageTimestamp); expectGetLocalTimestamp(messageTimestamp);
context.checking(new Expectations() {{ context.checking(new Expectations() {{
oneOf(messageEncoder).encodeLeaveMessage(contactGroupId, oneOf(messageEncoder).encodeLeaveMessage(contactGroupId,
@@ -223,7 +226,8 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase {
}}); }});
} }
void expectCheckWhetherContactSupportsAutoDeletion() throws Exception { void expectCheckWhetherContactSupportsAutoDeletion(boolean visible)
throws Exception {
context.checking(new Expectations() {{ context.checking(new Expectations() {{
oneOf(clientHelper).getContactId(txn, contactGroupId); oneOf(clientHelper).getContactId(txn, contactGroupId);
will(returnValue(contactId)); will(returnValue(contactId));
@@ -231,6 +235,10 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase {
GroupInvitationManager.CLIENT_ID, GroupInvitationManager.CLIENT_ID,
GroupInvitationManager.MAJOR_VERSION); GroupInvitationManager.MAJOR_VERSION);
will(returnValue(GroupInvitationManager.MINOR_VERSION)); will(returnValue(GroupInvitationManager.MINOR_VERSION));
if (visible) {
oneOf(autoDeleteManager).getAutoDeleteTimer(txn, contactId);
will(returnValue(NO_AUTO_DELETE_TIMER));
}
}}); }});
} }
} }
@@ -24,7 +24,7 @@ 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, clock); messageEncoder, messageTracker, autoDeleteManager, clock);
private CreatorSession getDefaultSession(CreatorState state) { private CreatorSession getDefaultSession(CreatorState state) {
return new CreatorSession(contactGroupId, privateGroupId, return new CreatorSession(contactGroupId, privateGroupId,
@@ -43,7 +43,7 @@ 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, clock); messageEncoder, messageTracker, autoDeleteManager, clock);
private final LocalAuthor localAuthor = getLocalAuthor(); private final LocalAuthor localAuthor = getLocalAuthor();
private InviteeSession getDefaultSession(InviteeState state) { private InviteeSession getDefaultSession(InviteeState state) {
@@ -27,7 +27,7 @@ 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, clock); messageEncoder, messageTracker, autoDeleteManager, clock);
private PeerSession getDefaultSession(PeerState state) { private PeerSession getDefaultSession(PeerState state) {
return new PeerSession(contactGroupId, privateGroupId, return new PeerSession(contactGroupId, privateGroupId,
@@ -27,6 +27,7 @@ import org.briarproject.briar.api.messaging.PrivateMessageFactory;
import org.briarproject.briar.api.privategroup.PrivateGroupManager; import org.briarproject.briar.api.privategroup.PrivateGroupManager;
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager;
import org.briarproject.briar.attachment.AttachmentModule; import org.briarproject.briar.attachment.AttachmentModule;
import org.briarproject.briar.autodelete.AutoDeleteModule;
import org.briarproject.briar.avatar.AvatarModule; import org.briarproject.briar.avatar.AvatarModule;
import org.briarproject.briar.blog.BlogModule; import org.briarproject.briar.blog.BlogModule;
import org.briarproject.briar.client.BriarClientModule; import org.briarproject.briar.client.BriarClientModule;
@@ -46,6 +47,8 @@ import dagger.Component;
@Component(modules = { @Component(modules = {
BrambleCoreIntegrationTestModule.class, BrambleCoreIntegrationTestModule.class,
BrambleCoreModule.class, BrambleCoreModule.class,
AttachmentModule.class,
AutoDeleteModule.class,
AvatarModule.class, AvatarModule.class,
BlogModule.class, BlogModule.class,
BriarClientModule.class, BriarClientModule.class,
@@ -53,7 +56,6 @@ import dagger.Component;
GroupInvitationModule.class, GroupInvitationModule.class,
IdentityModule.class, IdentityModule.class,
IntroductionModule.class, IntroductionModule.class,
AttachmentModule.class,
MessagingModule.class, MessagingModule.class,
PrivateGroupModule.class, PrivateGroupModule.class,
SharingModule.class SharingModule.class