Add dummy implementation of AutoDeleteManager.

This commit is contained in:
akwizgran
2020-11-26 12:16:34 +00:00
parent 51a308c6f4
commit 5cdbd58ac3
24 changed files with 306 additions and 127 deletions

View File

@@ -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);
} }

View File

@@ -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;
}

View File

@@ -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.
* *

View File

@@ -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,

View File

@@ -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
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
} }

View File

@@ -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;

View File

@@ -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

View File

@@ -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);
} }
} }

View File

@@ -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;
}
} }

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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);
} }
} }

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;
}
} }

View File

@@ -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

View File

@@ -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));
}
}}); }});
} }
} }

View File

@@ -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,

View File

@@ -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) {

View File

@@ -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,

View File

@@ -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