diff --git a/bramble-api/src/main/java/org/briarproject/bramble/util/ValidationUtils.java b/bramble-api/src/main/java/org/briarproject/bramble/util/ValidationUtils.java index bc44a04d5..346edc1f7 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/util/ValidationUtils.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/util/ValidationUtils.java @@ -6,11 +6,9 @@ import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import javax.annotation.Nullable; +import javax.annotation.concurrent.Immutable; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; - +@Immutable @NotNullByDefault public class ValidationUtils { @@ -73,11 +71,4 @@ public class ValidationUtils { throws FormatException { if (l != null && (l < min || l > max)) throw new FormatException(); } - - public static long validateAutoDeleteTimer(@Nullable Long timer) - throws FormatException { - if (timer == null) return NO_AUTO_DELETE_TIMER; - checkRange(timer, MIN_AUTO_DELETE_TIMER_MS, MAX_AUTO_DELETE_TIMER_MS); - return timer; - } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java index 9f2e034a6..62150773d 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java @@ -10,6 +10,7 @@ import org.briarproject.bramble.api.contact.ContactManager; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.NoSuchContactException; +import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.db.TransactionManager; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.EventBus; @@ -28,6 +29,7 @@ import org.briarproject.briar.android.attachment.AttachmentRetriever; import org.briarproject.briar.android.util.UiUtils; import org.briarproject.briar.android.viewmodel.LiveEvent; import org.briarproject.briar.android.viewmodel.MutableLiveEvent; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.messaging.AttachmentHeader; import org.briarproject.briar.api.messaging.MessagingManager; import org.briarproject.briar.api.messaging.PrivateMessage; @@ -53,7 +55,6 @@ import androidx.lifecycle.Transformations; import static java.util.Objects.requireNonNull; import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.util.LogUtils.logDuration; import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.LogUtils.now; @@ -84,6 +85,7 @@ public class ConversationViewModel extends AndroidViewModel private final PrivateMessageFactory privateMessageFactory; private final AttachmentRetriever attachmentRetriever; private final AttachmentCreator attachmentCreator; + private final AutoDeleteManager autoDeleteManager; @Nullable private ContactId contactId = null; @@ -116,7 +118,8 @@ public class ConversationViewModel extends AndroidViewModel SettingsManager settingsManager, PrivateMessageFactory privateMessageFactory, AttachmentRetriever attachmentRetriever, - AttachmentCreator attachmentCreator) { + AttachmentCreator attachmentCreator, + AutoDeleteManager autoDeleteManager) { super(application); this.dbExecutor = dbExecutor; this.db = db; @@ -127,6 +130,7 @@ public class ConversationViewModel extends AndroidViewModel this.privateMessageFactory = privateMessageFactory; this.attachmentRetriever = attachmentRetriever; this.attachmentCreator = attachmentCreator; + this.autoDeleteManager = autoDeleteManager; messagingGroupId = Transformations .map(contact, c -> messagingManager.getContactGroup(c).getId()); contactDeleted.setValue(false); @@ -215,7 +219,8 @@ public class ConversationViewModel extends AndroidViewModel observeForeverOnce(messagingGroupId, groupId -> { requireNonNull(groupId); observeForeverOnce(privateMessageFormat, format -> - createMessage(groupId, text, headers, timestamp, format)); + storeMessage(requireNonNull(contactId), groupId, text, + headers, timestamp, format)); }); } @@ -275,45 +280,50 @@ public class ConversationViewModel extends AndroidViewModel settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE); } - @UiThread - private void createMessage(GroupId groupId, @Nullable String text, + private PrivateMessage createMessage(Transaction txn, ContactId c, + GroupId groupId, @Nullable String text, List headers, long timestamp, - PrivateMessageFormat format) { + PrivateMessageFormat format) throws DbException { try { - PrivateMessage pm; if (format == TEXT_ONLY) { - pm = privateMessageFactory.createLegacyPrivateMessage( + return privateMessageFactory.createLegacyPrivateMessage( groupId, timestamp, requireNonNull(text)); } else if (format == TEXT_IMAGES) { - pm = privateMessageFactory.createPrivateMessage(groupId, + return privateMessageFactory.createPrivateMessage(groupId, timestamp, text, headers); } else { - // TODO: Look up auto-delete timer - pm = privateMessageFactory.createPrivateMessage(groupId, - timestamp, text, headers, NO_AUTO_DELETE_TIMER); + long timer = autoDeleteManager.getAutoDeleteTimer(txn, c); + return privateMessageFactory.createPrivateMessage(groupId, + timestamp, text, headers, timer); } - storeMessage(pm); } catch (FormatException e) { throw new AssertionError(e); } } @UiThread - private void storeMessage(PrivateMessage m) { - attachmentCreator.onAttachmentsSent(m.getMessage().getId()); + private void storeMessage(ContactId c, GroupId groupId, + @Nullable String text, List headers, + long timestamp, PrivateMessageFormat format) { dbExecutor.execute(() -> { try { - long start = now(); - messagingManager.addLocalMessage(m); - logDuration(LOG, "Storing message", start); - Message message = m.getMessage(); - PrivateMessageHeader h = new PrivateMessageHeader( - message.getId(), message.getGroupId(), - message.getTimestamp(), true, true, false, false, - m.hasText(), m.getAttachmentHeaders(), - m.getAutoDeleteTimer()); - // TODO add text to cache when available here - addedHeader.postEvent(h); + db.transaction(false, txn -> { + long start = now(); + PrivateMessage m = createMessage(txn, c, groupId, text, + headers, timestamp, format); + messagingManager.addLocalMessage(txn, m); + logDuration(LOG, "Storing message", start); + Message message = m.getMessage(); + PrivateMessageHeader h = new PrivateMessageHeader( + message.getId(), message.getGroupId(), + message.getTimestamp(), true, true, false, false, + 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) { logException(LOG, WARNING, e); } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/autodelete/AutoDeleteConstants.java b/briar-api/src/main/java/org/briarproject/briar/api/autodelete/AutoDeleteConstants.java similarity index 92% rename from bramble-api/src/main/java/org/briarproject/bramble/api/autodelete/AutoDeleteConstants.java rename to briar-api/src/main/java/org/briarproject/briar/api/autodelete/AutoDeleteConstants.java index ca1aaaf8e..f0c6da350 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/autodelete/AutoDeleteConstants.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/autodelete/AutoDeleteConstants.java @@ -1,4 +1,4 @@ -package org.briarproject.bramble.api.autodelete; +package org.briarproject.briar.api.autodelete; import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.MINUTES; diff --git a/briar-api/src/main/java/org/briarproject/briar/api/autodelete/AutoDeleteManager.java b/briar-api/src/main/java/org/briarproject/briar/api/autodelete/AutoDeleteManager.java new file mode 100644 index 000000000..251178817 --- /dev/null +++ b/briar-api/src/main/java/org/briarproject/briar/api/autodelete/AutoDeleteManager.java @@ -0,0 +1,31 @@ +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; +import org.briarproject.bramble.api.sync.ClientId; + +@NotNullByDefault +public interface AutoDeleteManager { + + /** + * The unique ID of the auto-delete client. + */ + ClientId CLIENT_ID = new ClientId("org.briarproject.briar.autodelete"); + + /** + * The current major version of the auto-delete client. + */ + int MAJOR_VERSION = 0; + + /** + * The current minor version of the auto-delete client. + */ + int MINOR_VERSION = 0; + + long getAutoDeleteTimer(Transaction txn, ContactId c) throws DbException; + + void setAutoDeleteTimer(Transaction txn, ContactId c, long timer) + throws DbException; +} diff --git a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java index 413bc6204..2a6078de4 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java @@ -37,6 +37,11 @@ public interface MessagingManager extends ConversationClient { */ void addLocalMessage(PrivateMessage m) throws DbException; + /** + * Stores a local private message. + */ + void addLocalMessage(Transaction txn, PrivateMessage m) throws DbException; + /** * Stores a local attachment message. * diff --git a/briar-api/src/main/java/org/briarproject/briar/api/messaging/PrivateMessage.java b/briar-api/src/main/java/org/briarproject/briar/api/messaging/PrivateMessage.java index f9d17c6c1..f9f25ae33 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/messaging/PrivateMessage.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/messaging/PrivateMessage.java @@ -8,7 +8,7 @@ import java.util.List; import javax.annotation.concurrent.Immutable; import static java.util.Collections.emptyList; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +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_AUTO_DELETE; import static org.briarproject.briar.api.messaging.PrivateMessageFormat.TEXT_ONLY; diff --git a/briar-core/src/main/java/org/briarproject/briar/BriarCoreEagerSingletons.java b/briar-core/src/main/java/org/briarproject/briar/BriarCoreEagerSingletons.java index 3d42616b5..e9ed662de 100644 --- a/briar-core/src/main/java/org/briarproject/briar/BriarCoreEagerSingletons.java +++ b/briar-core/src/main/java/org/briarproject/briar/BriarCoreEagerSingletons.java @@ -1,5 +1,6 @@ package org.briarproject.briar; +import org.briarproject.briar.autodelete.AutoDeleteModule; import org.briarproject.briar.blog.BlogModule; import org.briarproject.briar.feed.FeedModule; import org.briarproject.briar.forum.ForumModule; @@ -11,6 +12,8 @@ import org.briarproject.briar.sharing.SharingModule; public interface BriarCoreEagerSingletons { + void inject(AutoDeleteModule.EagerSingletons init); + void inject(BlogModule.EagerSingletons init); void inject(FeedModule.EagerSingletons init); @@ -30,6 +33,7 @@ public interface BriarCoreEagerSingletons { class Helper { public static void injectEagerSingletons(BriarCoreEagerSingletons c) { + c.inject(new AutoDeleteModule.EagerSingletons()); c.inject(new BlogModule.EagerSingletons()); c.inject(new FeedModule.EagerSingletons()); c.inject(new ForumModule.EagerSingletons()); diff --git a/briar-core/src/main/java/org/briarproject/briar/BriarCoreModule.java b/briar-core/src/main/java/org/briarproject/briar/BriarCoreModule.java index 5ba057706..3ad9eec32 100644 --- a/briar-core/src/main/java/org/briarproject/briar/BriarCoreModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/BriarCoreModule.java @@ -1,5 +1,6 @@ package org.briarproject.briar; +import org.briarproject.briar.autodelete.AutoDeleteModule; import org.briarproject.briar.blog.BlogModule; import org.briarproject.briar.client.BriarClientModule; import org.briarproject.briar.feed.DnsModule; @@ -15,6 +16,7 @@ import org.briarproject.briar.test.TestModule; import dagger.Module; @Module(includes = { + AutoDeleteModule.class, BlogModule.class, BriarClientModule.class, FeedModule.class, diff --git a/briar-core/src/main/java/org/briarproject/briar/autodelete/AutoDeleteConstants.java b/briar-core/src/main/java/org/briarproject/briar/autodelete/AutoDeleteConstants.java new file mode 100644 index 000000000..7dc94eced --- /dev/null +++ b/briar-core/src/main/java/org/briarproject/briar/autodelete/AutoDeleteConstants.java @@ -0,0 +1,7 @@ +package org.briarproject.briar.autodelete; + +interface AutoDeleteConstants { + + // Group metadata key for storing the auto-delete timer + String GROUP_KEY_AUTO_DELETE_TIMER = "autoDeleteTimer"; +} diff --git a/briar-core/src/main/java/org/briarproject/briar/autodelete/AutoDeleteManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/autodelete/AutoDeleteManagerImpl.java new file mode 100644 index 000000000..ce83a3085 --- /dev/null +++ b/briar-core/src/main/java/org/briarproject/briar/autodelete/AutoDeleteManagerImpl.java @@ -0,0 +1,107 @@ +package org.briarproject.briar.autodelete; + +import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.client.ClientHelper; +import org.briarproject.bramble.api.client.ContactGroupFactory; +import org.briarproject.bramble.api.contact.Contact; +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.contact.ContactManager.ContactHook; +import org.briarproject.bramble.api.data.BdfDictionary; +import org.briarproject.bramble.api.data.BdfEntry; +import org.briarproject.bramble.api.db.DatabaseComponent; +import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.db.Transaction; +import org.briarproject.bramble.api.lifecycle.LifecycleManager.OpenDatabaseHook; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.Group; +import org.briarproject.bramble.api.sync.GroupFactory; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; + +import javax.annotation.concurrent.Immutable; +import javax.inject.Inject; + +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +import static org.briarproject.briar.autodelete.AutoDeleteConstants.GROUP_KEY_AUTO_DELETE_TIMER; + +@Immutable +@NotNullByDefault +class AutoDeleteManagerImpl + implements AutoDeleteManager, OpenDatabaseHook, ContactHook { + + private final DatabaseComponent db; + private final ClientHelper clientHelper; + private final GroupFactory groupFactory; + private final Group localGroup; + + @Inject + AutoDeleteManagerImpl( + DatabaseComponent db, + ClientHelper clientHelper, + GroupFactory groupFactory, + ContactGroupFactory contactGroupFactory) { + this.db = db; + this.clientHelper = clientHelper; + this.groupFactory = groupFactory; + localGroup = contactGroupFactory.createLocalGroup(CLIENT_ID, + MAJOR_VERSION); + } + + @Override + public void onDatabaseOpened(Transaction txn) throws DbException { + if (db.containsGroup(txn, localGroup.getId())) return; + db.addGroup(txn, localGroup); + // Set things up for any pre-existing contacts + for (Contact c : db.getContacts(txn)) addingContact(txn, c); + } + + @Override + public void addingContact(Transaction txn, Contact c) throws DbException { + Group g = getGroup(c); + db.addGroup(txn, g); + clientHelper.setContactId(txn, g.getId(), c.getId()); + } + + @Override + public void removingContact(Transaction txn, Contact c) throws DbException { + db.removeGroup(txn, getGroup(c)); + } + + @Override + public long getAutoDeleteTimer(Transaction txn, ContactId c) + throws DbException { + try { + Group g = getGroup(db.getContact(txn, c)); + BdfDictionary meta = + clientHelper.getGroupMetadataAsDictionary(txn, g.getId()); + return meta.getLong(GROUP_KEY_AUTO_DELETE_TIMER, + NO_AUTO_DELETE_TIMER); + } catch (FormatException e) { + throw new DbException(e); + } + } + + @Override + public void setAutoDeleteTimer(Transaction txn, ContactId c, long timer) + throws DbException { + if (timer != NO_AUTO_DELETE_TIMER && + (timer < MIN_AUTO_DELETE_TIMER_MS || + timer > MAX_AUTO_DELETE_TIMER_MS)) { + throw new IllegalArgumentException(); + } + try { + Group g = getGroup(db.getContact(txn, c)); + BdfDictionary meta = BdfDictionary.of( + new BdfEntry(GROUP_KEY_AUTO_DELETE_TIMER, timer)); + clientHelper.mergeGroupMetadata(txn, g.getId(), meta); + } catch (FormatException e) { + throw new AssertionError(e); + } + } + + private Group getGroup(Contact c) { + byte[] descriptor = c.getAuthor().getId().getBytes(); + return groupFactory.createGroup(CLIENT_ID, MAJOR_VERSION, descriptor); + } +} diff --git a/briar-core/src/main/java/org/briarproject/briar/autodelete/AutoDeleteModule.java b/briar-core/src/main/java/org/briarproject/briar/autodelete/AutoDeleteModule.java new file mode 100644 index 000000000..dbe63c611 --- /dev/null +++ b/briar-core/src/main/java/org/briarproject/briar/autodelete/AutoDeleteModule.java @@ -0,0 +1,32 @@ +package org.briarproject.briar.autodelete; + +import org.briarproject.bramble.api.contact.ContactManager; +import org.briarproject.bramble.api.lifecycle.LifecycleManager; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +@Module +public class AutoDeleteModule { + + public static class EagerSingletons { + @Inject + AutoDeleteManager autoDeleteManager; + } + + @Provides + @Singleton + AutoDeleteManager provideAutoDeleteManager( + LifecycleManager lifecycleManager, ContactManager contactManager, + AutoDeleteManagerImpl autoDeleteManager) { + lifecycleManager.registerOpenDatabaseHook(autoDeleteManager); + contactManager.registerContactHook(autoDeleteManager); + // Don't need to register with the client versioning manager as this + // client's groups aren't shared with contacts + return autoDeleteManager; + } +} diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/AbortMessage.java b/briar-core/src/main/java/org/briarproject/briar/introduction/AbortMessage.java index af98a1da2..fe90afa3c 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/AbortMessage.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/AbortMessage.java @@ -8,7 +8,7 @@ import org.briarproject.briar.api.client.SessionId; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; @Immutable @NotNullByDefault diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/AbstractProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/introduction/AbstractProtocolEngine.java index 1d7554f72..1fc011fc2 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/AbstractProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/AbstractProtocolEngine.java @@ -23,6 +23,7 @@ import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.introduction.IntroductionResponse; @@ -33,7 +34,7 @@ import java.util.Map; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_ID; import static org.briarproject.briar.api.introduction.IntroductionManager.MAJOR_VERSION; import static org.briarproject.briar.introduction.MessageType.ABORT; @@ -57,6 +58,7 @@ abstract class AbstractProtocolEngine> protected final MessageParser messageParser; protected final MessageEncoder messageEncoder; protected final ClientVersioningManager clientVersioningManager; + protected final AutoDeleteManager autoDeleteManager; protected final Clock clock; AbstractProtocolEngine( @@ -69,6 +71,7 @@ abstract class AbstractProtocolEngine> MessageParser messageParser, MessageEncoder messageEncoder, ClientVersioningManager clientVersioningManager, + AutoDeleteManager autoDeleteManager, Clock clock) { this.db = db; this.clientHelper = clientHelper; @@ -79,6 +82,7 @@ abstract class AbstractProtocolEngine> this.messageParser = messageParser; this.messageEncoder = messageEncoder; this.clientVersioningManager = clientVersioningManager; + this.autoDeleteManager = autoDeleteManager; this.clock = clock; } @@ -86,9 +90,9 @@ abstract class AbstractProtocolEngine> long timestamp, Author author, @Nullable String text) throws DbException { Message m; - if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { - // TODO: Look up the current auto-delete timer - long timer = NO_AUTO_DELETE_TIMER; + ContactId c = getContactId(txn, s.getContactGroupId()); + if (contactSupportsAutoDeletion(txn, c)) { + long timer = autoDeleteManager.getAutoDeleteTimer(txn, c); m = messageEncoder.encodeRequestMessage(s.getContactGroupId(), timestamp, s.getLastLocalMessageId(), author, text, timer); sendMessage(txn, REQUEST, s.getSessionId(), m, true, timer); @@ -106,9 +110,9 @@ abstract class AbstractProtocolEngine> Map transportProperties, boolean visible) throws DbException { Message m; - if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { - // TODO: Look up the current auto-delete timer - long timer = NO_AUTO_DELETE_TIMER; + ContactId c = getContactId(txn, s.getContactGroupId()); + if (contactSupportsAutoDeletion(txn, c)) { + long timer = autoDeleteManager.getAutoDeleteTimer(txn, c); m = messageEncoder.encodeAcceptMessage(s.getContactGroupId(), timestamp, s.getLastLocalMessageId(), s.getSessionId(), ephemeralPublicKey, acceptTimestamp, transportProperties, @@ -127,9 +131,9 @@ abstract class AbstractProtocolEngine> Message sendDeclineMessage(Transaction txn, PeerSession s, long timestamp, boolean visible) throws DbException { Message m; - if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { - // TODO: Look up the current auto-delete timer - long timer = NO_AUTO_DELETE_TIMER; + ContactId c = getContactId(txn, s.getContactGroupId()); + if (contactSupportsAutoDeletion(txn, c)) { + long timer = autoDeleteManager.getAutoDeleteTimer(txn, c); m = messageEncoder.encodeDeclineMessage(s.getContactGroupId(), timestamp, s.getLastLocalMessageId(), s.getSessionId(), timer); @@ -233,16 +237,20 @@ abstract class AbstractProtocolEngine> ); } - boolean contactSupportsAutoDeletion(Transaction txn, GroupId contactGroupId) + private ContactId getContactId(Transaction txn, GroupId contactGroupId) throws DbException { try { - ContactId c = 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; + return clientHelper.getContactId(txn, contactGroupId); } catch (FormatException 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; + } } diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/ActivateMessage.java b/briar-core/src/main/java/org/briarproject/briar/introduction/ActivateMessage.java index 5c2f25375..4f53f2c32 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/ActivateMessage.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/ActivateMessage.java @@ -7,7 +7,7 @@ import org.briarproject.briar.api.client.SessionId; import javax.annotation.concurrent.Immutable; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; @Immutable @NotNullByDefault diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/AuthMessage.java b/briar-core/src/main/java/org/briarproject/briar/introduction/AuthMessage.java index 01bdcae33..09c09c35b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/AuthMessage.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/AuthMessage.java @@ -7,7 +7,7 @@ import org.briarproject.briar.api.client.SessionId; import javax.annotation.concurrent.Immutable; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; @Immutable @NotNullByDefault diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroduceeProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroduceeProtocolEngine.java index 2ace6aa3e..98e1883fc 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroduceeProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroduceeProtocolEngine.java @@ -27,6 +27,7 @@ import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.transport.KeyManager; import org.briarproject.bramble.api.transport.KeySetId; import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.client.SessionId; @@ -78,10 +79,11 @@ class IntroduceeProtocolEngine IntroductionCrypto crypto, KeyManager keyManager, TransportPropertyManager transportPropertyManager, - ClientVersioningManager clientVersioningManager) { + ClientVersioningManager clientVersioningManager, + AutoDeleteManager autoDeleteManager) { super(db, clientHelper, contactManager, contactGroupFactory, messageTracker, identityManager, messageParser, messageEncoder, - clientVersioningManager, clock); + clientVersioningManager, autoDeleteManager, clock); this.crypto = crypto; this.keyManager = keyManager; this.transportPropertyManager = transportPropertyManager; diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroducerProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroducerProtocolEngine.java index 18773c047..ba632bb4b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroducerProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroducerProtocolEngine.java @@ -14,6 +14,7 @@ import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.introduction.event.IntroductionAbortedEvent; @@ -52,10 +53,11 @@ class IntroducerProtocolEngine MessageParser messageParser, MessageEncoder messageEncoder, ClientVersioningManager clientVersioningManager, + AutoDeleteManager autoDeleteManager, Clock clock) { super(db, clientHelper, contactManager, contactGroupFactory, messageTracker, identityManager, messageParser, messageEncoder, - clientVersioningManager, clock); + clientVersioningManager, autoDeleteManager, clock); } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionValidator.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionValidator.java index a4c460bb5..604bee0d4 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionValidator.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionValidator.java @@ -18,17 +18,17 @@ import org.briarproject.briar.api.client.SessionId; import javax.annotation.concurrent.Immutable; import static java.util.Collections.singletonList; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.crypto.CryptoConstants.MAC_BYTES; import static org.briarproject.bramble.api.crypto.CryptoConstants.MAX_SIGNATURE_BYTES; import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH; import static org.briarproject.bramble.util.ValidationUtils.checkLength; import static org.briarproject.bramble.util.ValidationUtils.checkSize; -import static org.briarproject.bramble.util.ValidationUtils.validateAutoDeleteTimer; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.introduction.IntroductionConstants.MAX_INTRODUCTION_TEXT_LENGTH; import static org.briarproject.briar.introduction.MessageType.ACCEPT; import static org.briarproject.briar.introduction.MessageType.ACTIVATE; import static org.briarproject.briar.introduction.MessageType.AUTH; +import static org.briarproject.briar.util.ValidationUtils.validateAutoDeleteTimer; @Immutable diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/MessageEncoderImpl.java b/briar-core/src/main/java/org/briarproject/briar/introduction/MessageEncoderImpl.java index ecb5dbccb..6b56089f8 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/MessageEncoderImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/MessageEncoderImpl.java @@ -20,7 +20,7 @@ import java.util.Map; import javax.annotation.Nullable; import javax.inject.Inject; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.client.MessageTrackerConstants.MSG_KEY_READ; import static org.briarproject.briar.introduction.IntroductionConstants.MSG_KEY_AUTO_DELETE_TIMER; import static org.briarproject.briar.introduction.IntroductionConstants.MSG_KEY_AVAILABLE_TO_ANSWER; diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/MessageParserImpl.java b/briar-core/src/main/java/org/briarproject/briar/introduction/MessageParserImpl.java index bc4160d1e..97d665ca1 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/MessageParserImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/MessageParserImpl.java @@ -19,7 +19,7 @@ import java.util.Map; import javax.inject.Inject; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.client.MessageTrackerConstants.MSG_KEY_READ; import static org.briarproject.briar.introduction.IntroductionConstants.MSG_KEY_AUTO_DELETE_TIMER; import static org.briarproject.briar.introduction.IntroductionConstants.MSG_KEY_AVAILABLE_TO_ANSWER; diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java index 99b02206e..aec7fb62f 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java @@ -58,10 +58,10 @@ import javax.annotation.concurrent.Immutable; import javax.inject.Inject; import static java.util.Collections.emptyList; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.sync.SyncConstants.MAX_MESSAGE_BODY_LENGTH; import static org.briarproject.bramble.api.sync.validation.MessageState.DELIVERED; import static org.briarproject.bramble.util.IoUtils.copyAndClose; +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_AUTO_DELETE; import static org.briarproject.briar.api.messaging.PrivateMessageFormat.TEXT_ONLY; @@ -229,7 +229,12 @@ class MessagingManagerImpl implements MessagingManager, IncomingMessageHook, @Override 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 { BdfDictionary meta = new BdfDictionary(); meta.put(MSG_KEY_TIMESTAMP, m.getMessage().getTimestamp()); @@ -259,11 +264,8 @@ class MessagingManagerImpl implements MessagingManager, IncomingMessageHook, clientHelper.addLocalMessage(txn, m.getMessage(), meta, true, false); messageTracker.trackOutgoingMessage(txn, m.getMessage()); - db.commitTransaction(txn); } catch (FormatException e) { throw new AssertionError(e); - } finally { - db.endTransaction(txn); } } diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/PrivateMessageFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/PrivateMessageFactoryImpl.java index 4c330db48..97ff30d2a 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/PrivateMessageFactoryImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/PrivateMessageFactoryImpl.java @@ -16,8 +16,8 @@ import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.util.StringUtils.utf8IsTooLong; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_TEXT_LENGTH; import static org.briarproject.briar.messaging.MessageTypes.PRIVATE_MESSAGE; diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/PrivateMessageValidator.java b/briar-core/src/main/java/org/briarproject/briar/messaging/PrivateMessageValidator.java index af47f1640..c6eef5563 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/PrivateMessageValidator.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/PrivateMessageValidator.java @@ -23,12 +23,11 @@ import java.io.InputStream; import javax.annotation.concurrent.Immutable; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.sync.SyncConstants.MAX_MESSAGE_BODY_LENGTH; import static org.briarproject.bramble.api.transport.TransportConstants.MAX_CLOCK_DIFFERENCE; import static org.briarproject.bramble.util.ValidationUtils.checkLength; import static org.briarproject.bramble.util.ValidationUtils.checkSize; -import static org.briarproject.bramble.util.ValidationUtils.validateAutoDeleteTimer; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_ATTACHMENTS_PER_MESSAGE; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_CONTENT_TYPE_BYTES; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_TEXT_LENGTH; @@ -43,6 +42,7 @@ import static org.briarproject.briar.messaging.MessagingConstants.MSG_KEY_HAS_TE import static org.briarproject.briar.messaging.MessagingConstants.MSG_KEY_LOCAL; import static org.briarproject.briar.messaging.MessagingConstants.MSG_KEY_MSG_TYPE; import static org.briarproject.briar.messaging.MessagingConstants.MSG_KEY_TIMESTAMP; +import static org.briarproject.briar.util.ValidationUtils.validateAutoDeleteTimer; @Immutable @NotNullByDefault diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java index af62d3661..396512594 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java @@ -17,6 +17,7 @@ import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.privategroup.GroupMessage; import org.briarproject.briar.api.privategroup.GroupMessageFactory; @@ -30,7 +31,7 @@ import java.util.Map; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.privategroup.invitation.MessageType.ABORT; import static org.briarproject.briar.privategroup.invitation.MessageType.INVITE; import static org.briarproject.briar.privategroup.invitation.MessageType.JOIN; @@ -52,15 +53,21 @@ abstract class AbstractProtocolEngine> private final IdentityManager identityManager; private final MessageParser messageParser; private final MessageEncoder messageEncoder; + private final AutoDeleteManager autoDeleteManager; private final Clock clock; - AbstractProtocolEngine(DatabaseComponent db, ClientHelper clientHelper, + AbstractProtocolEngine( + DatabaseComponent db, + ClientHelper clientHelper, ClientVersioningManager clientVersioningManager, PrivateGroupManager privateGroupManager, PrivateGroupFactory privateGroupFactory, GroupMessageFactory groupMessageFactory, - IdentityManager identityManager, MessageParser messageParser, - MessageEncoder messageEncoder, MessageTracker messageTracker, + IdentityManager identityManager, + MessageParser messageParser, + MessageEncoder messageEncoder, + MessageTracker messageTracker, + AutoDeleteManager autoDeleteManager, Clock clock) { this.db = db; this.clientHelper = clientHelper; @@ -72,6 +79,7 @@ abstract class AbstractProtocolEngine> this.messageParser = messageParser; this.messageEncoder = messageEncoder; this.messageTracker = messageTracker; + this.autoDeleteManager = autoDeleteManager; this.clock = clock; } @@ -112,9 +120,9 @@ abstract class AbstractProtocolEngine> throw new DbException(e); // Invalid group descriptor } Message m; - if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { - // TODO: Look up the current auto-delete timer - long timer = NO_AUTO_DELETE_TIMER; + ContactId c = getContactId(txn, s.getContactGroupId()); + if (contactSupportsAutoDeletion(txn, c)) { + long timer = autoDeleteManager.getAutoDeleteTimer(txn, c); m = messageEncoder.encodeInviteMessage(s.getContactGroupId(), privateGroup.getId(), timestamp, privateGroup.getName(), privateGroup.getCreator(), privateGroup.getSalt(), text, @@ -134,10 +142,12 @@ abstract class AbstractProtocolEngine> Message sendJoinMessage(Transaction txn, S s, boolean visibleInUi) throws DbException { Message m; - if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { - // TODO: Look up the current auto-delete timer if the message is - // visible in the UI (accepting an invitation) - long timer = NO_AUTO_DELETE_TIMER; + ContactId c = getContactId(txn, s.getContactGroupId()); + if (contactSupportsAutoDeletion(txn, c)) { + // Set auto-delete timer if manually accepting an invitation + long timer = visibleInUi + ? autoDeleteManager.getAutoDeleteTimer(txn, c) + : NO_AUTO_DELETE_TIMER; m = messageEncoder.encodeJoinMessage(s.getContactGroupId(), s.getPrivateGroupId(), getLocalTimestamp(s), s.getLastLocalMessageId(), timer); @@ -156,10 +166,12 @@ abstract class AbstractProtocolEngine> Message sendLeaveMessage(Transaction txn, S s, boolean visibleInUi) throws DbException { Message m; - if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { - // TODO: Look up the current auto-delete timer if the message is - // visible in the UI (declining an invitation) - long timer = NO_AUTO_DELETE_TIMER; + ContactId c = getContactId(txn, s.getContactGroupId()); + if (contactSupportsAutoDeletion(txn, c)) { + // Set auto-delete timer if manually accepting an invitation + long timer = visibleInUi + ? autoDeleteManager.getAutoDeleteTimer(txn, c) + : NO_AUTO_DELETE_TIMER; m = messageEncoder.encodeLeaveMessage(s.getContactGroupId(), s.getPrivateGroupId(), getLocalTimestamp(s), s.getLastLocalMessageId(), timer); @@ -263,18 +275,21 @@ abstract class AbstractProtocolEngine> } } - boolean contactSupportsAutoDeletion(Transaction txn, GroupId contactGroupId) + private ContactId getContactId(Transaction txn, GroupId contactGroupId) throws DbException { try { - ContactId c = 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; + return clientHelper.getContactId(txn, contactGroupId); } catch (FormatException 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; + } } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java index 519d6cb6d..a38967fdd 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java @@ -11,6 +11,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.client.SessionId; @@ -36,17 +37,23 @@ import static org.briarproject.briar.privategroup.invitation.CreatorState.START; @NotNullByDefault class CreatorProtocolEngine extends AbstractProtocolEngine { - CreatorProtocolEngine(DatabaseComponent db, ClientHelper clientHelper, + CreatorProtocolEngine( + DatabaseComponent db, + ClientHelper clientHelper, ClientVersioningManager clientVersioningManager, PrivateGroupManager privateGroupManager, PrivateGroupFactory privateGroupFactory, GroupMessageFactory groupMessageFactory, - IdentityManager identityManager, MessageParser messageParser, - MessageEncoder messageEncoder, MessageTracker messageTracker, + IdentityManager identityManager, + MessageParser messageParser, + MessageEncoder messageEncoder, + MessageTracker messageTracker, + AutoDeleteManager autoDeleteManager, Clock clock) { super(db, clientHelper, clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, - messageParser, messageEncoder, messageTracker, clock); + messageParser, messageEncoder, messageTracker, + autoDeleteManager, clock); } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidator.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidator.java index 7e3a6fb76..9b9661ea9 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidator.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidator.java @@ -23,11 +23,10 @@ import java.util.Collections; import javax.annotation.concurrent.Immutable; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_SIGNATURE_LENGTH; import static org.briarproject.bramble.util.ValidationUtils.checkLength; import static org.briarproject.bramble.util.ValidationUtils.checkSize; -import static org.briarproject.bramble.util.ValidationUtils.validateAutoDeleteTimer; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.GROUP_SALT_LENGTH; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_INVITATION_TEXT_LENGTH; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_NAME_LENGTH; @@ -36,6 +35,7 @@ import static org.briarproject.briar.privategroup.invitation.MessageType.ABORT; import static org.briarproject.briar.privategroup.invitation.MessageType.INVITE; import static org.briarproject.briar.privategroup.invitation.MessageType.JOIN; import static org.briarproject.briar.privategroup.invitation.MessageType.LEAVE; +import static org.briarproject.briar.util.ValidationUtils.validateAutoDeleteTimer; @Immutable @NotNullByDefault diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java index cdb597a5e..dbc17477f 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java @@ -13,6 +13,7 @@ import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.client.SessionId; @@ -41,17 +42,22 @@ import static org.briarproject.briar.privategroup.invitation.InviteeState.START; @NotNullByDefault class InviteeProtocolEngine extends AbstractProtocolEngine { - InviteeProtocolEngine(DatabaseComponent db, ClientHelper clientHelper, + InviteeProtocolEngine(DatabaseComponent db, + ClientHelper clientHelper, ClientVersioningManager clientVersioningManager, PrivateGroupManager privateGroupManager, PrivateGroupFactory privateGroupFactory, GroupMessageFactory groupMessageFactory, - IdentityManager identityManager, MessageParser messageParser, - MessageEncoder messageEncoder, MessageTracker messageTracker, + IdentityManager identityManager, + MessageParser messageParser, + MessageEncoder messageEncoder, + MessageTracker messageTracker, + AutoDeleteManager autoDeleteManager, Clock clock) { super(db, clientHelper, clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, - messageParser, messageEncoder, messageTracker, clock); + messageParser, messageEncoder, messageTracker, + autoDeleteManager, clock); } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageEncoderImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageEncoderImpl.java index b326a61b4..8027ebf07 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageEncoderImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageEncoderImpl.java @@ -15,7 +15,7 @@ import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.client.MessageTrackerConstants.MSG_KEY_READ; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.MSG_KEY_AUTO_DELETE_TIMER; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.MSG_KEY_AVAILABLE_TO_ANSWER; diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageParserImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageParserImpl.java index 4249b7952..0fdc19c8b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageParserImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/MessageParserImpl.java @@ -18,7 +18,7 @@ import org.briarproject.briar.api.privategroup.PrivateGroupFactory; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.client.MessageTrackerConstants.MSG_KEY_READ; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.MSG_KEY_AUTO_DELETE_TIMER; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.MSG_KEY_AVAILABLE_TO_ANSWER; diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java index de0a96fc6..21eef0053 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java @@ -12,6 +12,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.privategroup.GroupMessageFactory; @@ -36,17 +37,23 @@ import static org.briarproject.briar.privategroup.invitation.PeerState.START; @NotNullByDefault class PeerProtocolEngine extends AbstractProtocolEngine { - PeerProtocolEngine(DatabaseComponent db, ClientHelper clientHelper, + PeerProtocolEngine( + DatabaseComponent db, + ClientHelper clientHelper, ClientVersioningManager clientVersioningManager, PrivateGroupManager privateGroupManager, PrivateGroupFactory privateGroupFactory, GroupMessageFactory groupMessageFactory, - IdentityManager identityManager, MessageParser messageParser, - MessageEncoder messageEncoder, MessageTracker messageTracker, + IdentityManager identityManager, + MessageParser messageParser, + MessageEncoder messageEncoder, + MessageTracker messageTracker, + AutoDeleteManager autoDeleteManager, Clock clock) { super(db, clientHelper, clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, - messageParser, messageEncoder, messageTracker, clock); + messageParser, messageEncoder, messageTracker, + autoDeleteManager, clock); } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java index d54031029..089b06c66 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java @@ -6,6 +6,7 @@ import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.privategroup.GroupMessageFactory; import org.briarproject.briar.api.privategroup.PrivateGroupFactory; @@ -28,16 +29,22 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { private final MessageParser messageParser; private final MessageEncoder messageEncoder; private final MessageTracker messageTracker; + private final AutoDeleteManager autoDeleteManager; private final Clock clock; @Inject - ProtocolEngineFactoryImpl(DatabaseComponent db, ClientHelper clientHelper, + ProtocolEngineFactoryImpl( + DatabaseComponent db, + ClientHelper clientHelper, ClientVersioningManager clientVersioningManager, PrivateGroupManager privateGroupManager, PrivateGroupFactory privateGroupFactory, GroupMessageFactory groupMessageFactory, - IdentityManager identityManager, MessageParser messageParser, - MessageEncoder messageEncoder, MessageTracker messageTracker, + IdentityManager identityManager, + MessageParser messageParser, + MessageEncoder messageEncoder, + MessageTracker messageTracker, + AutoDeleteManager autoDeleteManager, Clock clock) { this.db = db; this.clientHelper = clientHelper; @@ -49,6 +56,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { this.messageParser = messageParser; this.messageEncoder = messageEncoder; this.messageTracker = messageTracker; + this.autoDeleteManager = autoDeleteManager; this.clock = clock; } @@ -57,7 +65,8 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { return new CreatorProtocolEngine(db, clientHelper, clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, - messageParser, messageEncoder, messageTracker, clock); + messageParser, messageEncoder, messageTracker, + autoDeleteManager, clock); } @Override @@ -65,7 +74,8 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { return new InviteeProtocolEngine(db, clientHelper, clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, - messageParser, messageEncoder, messageTracker, clock); + messageParser, messageEncoder, messageTracker, + autoDeleteManager, clock); } @Override @@ -73,6 +83,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { return new PeerProtocolEngine(db, clientHelper, clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, - messageParser, messageEncoder, messageTracker, clock); + messageParser, messageEncoder, messageTracker, + autoDeleteManager, clock); } } diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java index 79dfaaa42..05fcc2eb0 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java @@ -11,6 +11,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.blog.Blog; import org.briarproject.briar.api.blog.BlogInvitationResponse; import org.briarproject.briar.api.blog.BlogManager; @@ -32,13 +33,19 @@ class BlogProtocolEngineImpl extends ProtocolEngineImpl { invitationFactory; @Inject - BlogProtocolEngineImpl(DatabaseComponent db, ClientHelper clientHelper, + BlogProtocolEngineImpl( + DatabaseComponent db, + ClientHelper clientHelper, ClientVersioningManager clientVersioningManager, - MessageEncoder messageEncoder, MessageParser messageParser, - MessageTracker messageTracker, Clock clock, BlogManager blogManager, + MessageEncoder messageEncoder, + MessageParser messageParser, + MessageTracker messageTracker, + AutoDeleteManager autoDeleteManager, + Clock clock, + BlogManager blogManager, InvitationFactory invitationFactory) { super(db, clientHelper, clientVersioningManager, messageEncoder, - messageParser, messageTracker, clock, + messageParser, messageTracker, autoDeleteManager, clock, BlogSharingManager.CLIENT_ID, BlogSharingManager.MAJOR_VERSION, BlogManager.CLIENT_ID, BlogManager.MAJOR_VERSION); this.blogManager = blogManager; diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java index e6df8fc48..91757b463 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java @@ -11,6 +11,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.conversation.ConversationRequest; import org.briarproject.briar.api.forum.Forum; @@ -32,15 +33,19 @@ class ForumProtocolEngineImpl extends ProtocolEngineImpl { invitationFactory; @Inject - ForumProtocolEngineImpl(DatabaseComponent db, + ForumProtocolEngineImpl( + DatabaseComponent db, ClientHelper clientHelper, ClientVersioningManager clientVersioningManager, - MessageEncoder messageEncoder, MessageParser messageParser, - MessageTracker messageTracker, Clock clock, + MessageEncoder messageEncoder, + MessageParser messageParser, + MessageTracker messageTracker, + AutoDeleteManager autoDeleteManager, + Clock clock, ForumManager forumManager, InvitationFactory invitationFactory) { super(db, clientHelper, clientVersioningManager, messageEncoder, - messageParser, messageTracker, clock, + messageParser, messageTracker, autoDeleteManager, clock, ForumSharingManager.CLIENT_ID, ForumSharingManager.MAJOR_VERSION, ForumManager.CLIENT_ID, ForumManager.MAJOR_VERSION); diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/MessageEncoderImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/MessageEncoderImpl.java index 42d5985d8..90d694d58 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/MessageEncoderImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/MessageEncoderImpl.java @@ -14,7 +14,7 @@ import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.sharing.MessageType.ABORT; import static org.briarproject.briar.sharing.MessageType.ACCEPT; import static org.briarproject.briar.sharing.MessageType.DECLINE; diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/MessageParserImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/MessageParserImpl.java index 2cadda417..11e76cf6c 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/MessageParserImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/MessageParserImpl.java @@ -15,7 +15,7 @@ import org.briarproject.briar.api.sharing.Shareable; import javax.annotation.concurrent.Immutable; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.sharing.MessageType.INVITE; import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_AUTO_DELETE_TIMER; import static org.briarproject.briar.sharing.SharingConstants.MSG_KEY_AVAILABLE_TO_ANSWER; diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java index 612e9f3aa..9e841bd44 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java @@ -18,6 +18,7 @@ import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.sharing.Shareable; @@ -28,10 +29,10 @@ import java.util.Map; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; import static org.briarproject.bramble.api.sync.Group.Visibility.VISIBLE; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.sharing.MessageType.ABORT; import static org.briarproject.briar.sharing.MessageType.ACCEPT; import static org.briarproject.briar.sharing.MessageType.DECLINE; @@ -56,22 +57,31 @@ abstract class ProtocolEngineImpl private final ClientVersioningManager clientVersioningManager; private final MessageEncoder messageEncoder; private final MessageTracker messageTracker; + private final AutoDeleteManager autoDeleteManager; private final Clock clock; private final ClientId sharingClientId, shareableClientId; private final int sharingClientMajorVersion, shareableClientMajorVersion; - ProtocolEngineImpl(DatabaseComponent db, ClientHelper clientHelper, + ProtocolEngineImpl( + DatabaseComponent db, + ClientHelper clientHelper, ClientVersioningManager clientVersioningManager, - MessageEncoder messageEncoder, MessageParser messageParser, - MessageTracker messageTracker, Clock clock, - ClientId sharingClientId, int sharingClientMajorVersion, - ClientId shareableClientId, int shareableClientMajorVersion) { + MessageEncoder messageEncoder, + MessageParser messageParser, + MessageTracker messageTracker, + AutoDeleteManager autoDeleteManager, + Clock clock, + ClientId sharingClientId, + int sharingClientMajorVersion, + ClientId shareableClientId, + int shareableClientMajorVersion) { this.db = db; this.clientHelper = clientHelper; this.clientVersioningManager = clientVersioningManager; this.messageEncoder = messageEncoder; this.messageParser = messageParser; this.messageTracker = messageTracker; + this.autoDeleteManager = autoDeleteManager; this.clock = clock; this.sharingClientId = sharingClientId; this.sharingClientMajorVersion = sharingClientMajorVersion; @@ -125,9 +135,9 @@ abstract class ProtocolEngineImpl } long localTimestamp = Math.max(timestamp, getLocalTimestamp(s)); Message m; - if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { - // TODO: Look up the current auto-delete timer - long timer = NO_AUTO_DELETE_TIMER; + ContactId c = getContactId(txn, s.getContactGroupId()); + if (contactSupportsAutoDeletion(txn, c)) { + long timer = autoDeleteManager.getAutoDeleteTimer(txn, c); m = messageEncoder.encodeInviteMessage(s.getContactGroupId(), localTimestamp, s.getLastLocalMessageId(), descriptor, text, timer); @@ -191,9 +201,9 @@ abstract class ProtocolEngineImpl private Message sendAcceptMessage(Transaction txn, Session s) throws DbException { Message m; - if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { - // TODO: Look up the current auto-delete timer - long timer = NO_AUTO_DELETE_TIMER; + ContactId c = getContactId(txn, s.getContactGroupId()); + if (contactSupportsAutoDeletion(txn, c)) { + long timer = autoDeleteManager.getAutoDeleteTimer(txn, c); m = messageEncoder.encodeAcceptMessage(s.getContactGroupId(), s.getShareableId(), getLocalTimestamp(s), s.getLastLocalMessageId(), timer); @@ -244,9 +254,9 @@ abstract class ProtocolEngineImpl private Message sendDeclineMessage(Transaction txn, Session s) throws DbException { Message m; - if (contactSupportsAutoDeletion(txn, s.getContactGroupId())) { - // TODO: Look up the current auto-delete timer - long timer = NO_AUTO_DELETE_TIMER; + ContactId c = getContactId(txn, s.getContactGroupId()); + if (contactSupportsAutoDeletion(txn, c)) { + long timer = autoDeleteManager.getAutoDeleteTimer(txn, c); m = messageEncoder.encodeDeclineMessage(s.getContactGroupId(), s.getShareableId(), getLocalTimestamp(s), s.getLastLocalMessageId(), timer); @@ -673,17 +683,20 @@ abstract class ProtocolEngineImpl session.getInviteTimestamp()) + 1); } - boolean contactSupportsAutoDeletion(Transaction txn, GroupId contactGroupId) + private ContactId getContactId(Transaction txn, GroupId contactGroupId) throws DbException { try { - ContactId c = clientHelper.getContactId(txn, contactGroupId); - int minorVersion = clientVersioningManager - .getClientMinorVersion(txn, c, sharingClientId, - sharingClientMajorVersion); - // Auto-delete was added in client version 0.1 - return minorVersion >= 1; + return clientHelper.getContactId(txn, contactGroupId); } catch (FormatException 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; + } } diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingValidator.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingValidator.java index 76dc51118..73e34be0c 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingValidator.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingValidator.java @@ -18,12 +18,12 @@ import org.briarproject.bramble.api.system.Clock; import javax.annotation.concurrent.Immutable; import static java.util.Collections.singletonList; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.util.ValidationUtils.checkLength; import static org.briarproject.bramble.util.ValidationUtils.checkSize; -import static org.briarproject.bramble.util.ValidationUtils.validateAutoDeleteTimer; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.sharing.SharingConstants.MAX_INVITATION_TEXT_LENGTH; import static org.briarproject.briar.sharing.MessageType.INVITE; +import static org.briarproject.briar.util.ValidationUtils.validateAutoDeleteTimer; @Immutable @NotNullByDefault diff --git a/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java b/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java index 9f3e71f94..803b45496 100644 --- a/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java @@ -54,11 +54,11 @@ import javax.inject.Inject; import static java.util.Collections.emptyList; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.plugin.BluetoothConstants.UUID_BYTES; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; import static org.briarproject.bramble.util.StringUtils.getRandomString; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.test.TestData.AUTHOR_NAMES; import static org.briarproject.briar.test.TestData.GROUP_NAMES; diff --git a/briar-core/src/main/java/org/briarproject/briar/util/ValidationUtils.java b/briar-core/src/main/java/org/briarproject/briar/util/ValidationUtils.java new file mode 100644 index 000000000..58b8ddf6c --- /dev/null +++ b/briar-core/src/main/java/org/briarproject/briar/util/ValidationUtils.java @@ -0,0 +1,24 @@ +package org.briarproject.briar.util; + +import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import javax.annotation.Nullable; +import javax.annotation.concurrent.Immutable; + +import static org.briarproject.bramble.util.ValidationUtils.checkRange; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; + +@Immutable +@NotNullByDefault +public class ValidationUtils { + + public static long validateAutoDeleteTimer(@Nullable Long timer) + throws FormatException { + if (timer == null) return NO_AUTO_DELETE_TIMER; + checkRange(timer, MIN_AUTO_DELETE_TIMER_MS, MAX_AUTO_DELETE_TIMER_MS); + return timer; + } +} diff --git a/briar-core/src/test/java/org/briarproject/briar/autodelete/AutoDeleteManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/autodelete/AutoDeleteManagerImplTest.java new file mode 100644 index 000000000..ef2e83f77 --- /dev/null +++ b/briar-core/src/test/java/org/briarproject/briar/autodelete/AutoDeleteManagerImplTest.java @@ -0,0 +1,182 @@ +package org.briarproject.briar.autodelete; + +import org.briarproject.bramble.api.client.ClientHelper; +import org.briarproject.bramble.api.client.ContactGroupFactory; +import org.briarproject.bramble.api.contact.Contact; +import org.briarproject.bramble.api.data.BdfDictionary; +import org.briarproject.bramble.api.data.BdfEntry; +import org.briarproject.bramble.api.db.DatabaseComponent; +import org.briarproject.bramble.api.db.Transaction; +import org.briarproject.bramble.api.sync.Group; +import org.briarproject.bramble.api.sync.GroupFactory; +import org.briarproject.bramble.test.BrambleMockTestCase; +import org.jmock.Expectations; +import org.junit.Test; + +import static java.util.Collections.singletonList; +import static org.briarproject.bramble.api.client.ContactGroupConstants.GROUP_KEY_CONTACT_ID; +import static org.briarproject.bramble.test.TestUtils.getContact; +import static org.briarproject.bramble.test.TestUtils.getGroup; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +import static org.briarproject.briar.api.autodelete.AutoDeleteManager.CLIENT_ID; +import static org.briarproject.briar.api.autodelete.AutoDeleteManager.MAJOR_VERSION; +import static org.briarproject.briar.autodelete.AutoDeleteConstants.GROUP_KEY_AUTO_DELETE_TIMER; +import static org.junit.Assert.assertEquals; + +public class AutoDeleteManagerImplTest extends BrambleMockTestCase { + + private final DatabaseComponent db = context.mock(DatabaseComponent.class); + private final ClientHelper clientHelper = context.mock(ClientHelper.class); + private final GroupFactory groupFactory = context.mock(GroupFactory.class); + private final ContactGroupFactory contactGroupFactory = + context.mock(ContactGroupFactory.class); + + private final Group localGroup = getGroup(CLIENT_ID, MAJOR_VERSION); + private final Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION); + private final Contact contact = getContact(); + + private final AutoDeleteManagerImpl autoDeleteManager; + + public AutoDeleteManagerImplTest() { + context.checking(new Expectations() {{ + oneOf(contactGroupFactory) + .createLocalGroup(CLIENT_ID, MAJOR_VERSION); + will(returnValue(localGroup)); + }}); + autoDeleteManager = new AutoDeleteManagerImpl(db, clientHelper, + groupFactory, contactGroupFactory); + context.assertIsSatisfied(); + } + + @Test + public void testDoesNotAddContactGroupsAtStartupIfLocalGroupExists() + throws Exception { + Transaction txn = new Transaction(null, false); + + context.checking(new Expectations() {{ + oneOf(db).containsGroup(txn, localGroup.getId()); + will(returnValue(true)); + }}); + + autoDeleteManager.onDatabaseOpened(txn); + } + + @Test + public void testAddsContactGroupsAtStartupIfLocalGroupDoesNotExist() + throws Exception { + Transaction txn = new Transaction(null, false); + + context.checking(new Expectations() {{ + oneOf(db).containsGroup(txn, localGroup.getId()); + will(returnValue(false)); + oneOf(db).addGroup(txn, localGroup); + oneOf(db).getContacts(txn); + will(returnValue(singletonList(contact))); + }}); + expectGetContactGroup(); + context.checking(new Expectations() {{ + oneOf(db).addGroup(txn, contactGroup); + oneOf(clientHelper).setContactId(txn, contactGroup.getId(), + contact.getId()); + }}); + + autoDeleteManager.onDatabaseOpened(txn); + } + + @Test + public void testAddsContactGroupWhenContactIsAdded() throws Exception { + Transaction txn = new Transaction(null, false); + + expectGetContactGroup(); + context.checking(new Expectations() {{ + oneOf(db).addGroup(txn, contactGroup); + oneOf(clientHelper).setContactId(txn, contactGroup.getId(), + contact.getId()); + }}); + + autoDeleteManager.addingContact(txn, contact); + } + + @Test + public void testRemovesContactGroupWhenContactIsRemoved() throws Exception { + Transaction txn = new Transaction(null, false); + + expectGetContactGroup(); + context.checking(new Expectations() {{ + oneOf(db).removeGroup(txn, contactGroup); + }}); + + autoDeleteManager.removingContact(txn, contact); + } + + @Test + public void testStoresTimer() throws Exception { + Transaction txn = new Transaction(null, false); + long timer = MAX_AUTO_DELETE_TIMER_MS; + BdfDictionary meta = BdfDictionary.of( + new BdfEntry(GROUP_KEY_AUTO_DELETE_TIMER, timer)); + + expectGetContact(txn); + expectGetContactGroup(); + context.checking(new Expectations() {{ + oneOf(clientHelper).mergeGroupMetadata(txn, + contactGroup.getId(), meta); + }}); + + autoDeleteManager.setAutoDeleteTimer(txn, contact.getId(), timer); + } + + @Test + public void testRetrievesTimer() throws Exception { + Transaction txn = new Transaction(null, false); + long timer = MAX_AUTO_DELETE_TIMER_MS; + BdfDictionary meta = BdfDictionary.of( + new BdfEntry(GROUP_KEY_CONTACT_ID, contact.getId().getInt()), + new BdfEntry(GROUP_KEY_AUTO_DELETE_TIMER, timer)); + + expectGetContact(txn); + expectGetContactGroup(); + context.checking(new Expectations() {{ + oneOf(clientHelper).getGroupMetadataAsDictionary(txn, + contactGroup.getId()); + will(returnValue(meta)); + }}); + + assertEquals(timer, + autoDeleteManager.getAutoDeleteTimer(txn, contact.getId())); + } + + @Test + public void testReturnsConstantIfNoTimerIsStored() throws Exception { + Transaction txn = new Transaction(null, false); + BdfDictionary meta = BdfDictionary.of( + new BdfEntry(GROUP_KEY_CONTACT_ID, contact.getId().getInt())); + + expectGetContact(txn); + expectGetContactGroup(); + context.checking(new Expectations() {{ + oneOf(clientHelper).getGroupMetadataAsDictionary(txn, + contactGroup.getId()); + will(returnValue(meta)); + }}); + + assertEquals(NO_AUTO_DELETE_TIMER, + autoDeleteManager.getAutoDeleteTimer(txn, contact.getId())); + } + + private void expectGetContact(Transaction txn) throws Exception { + context.checking(new Expectations() {{ + oneOf(db).getContact(txn, contact.getId()); + will(returnValue(contact)); + }}); + } + + private void expectGetContactGroup() { + context.checking(new Expectations() {{ + oneOf(groupFactory).createGroup(CLIENT_ID, MAJOR_VERSION, + contact.getAuthor().getId().getBytes()); + will(returnValue(contactGroup)); + }}); + } +} diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java index e13aa0aee..feb1e65ee 100644 --- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java @@ -45,12 +45,12 @@ import java.util.Map; import java.util.Set; import static java.util.Collections.emptySet; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.test.TestPluginConfigModule.SIMPLEX_TRANSPORT_ID; import static org.briarproject.bramble.test.TestUtils.getAgreementPublicKey; import static org.briarproject.bramble.test.TestUtils.getSecretKey; import static org.briarproject.bramble.test.TestUtils.getTransportProperties; import static org.briarproject.bramble.test.TestUtils.getTransportPropertiesMap; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_ID; import static org.briarproject.briar.api.introduction.IntroductionManager.MAJOR_VERSION; import static org.briarproject.briar.introduction.IntroduceeState.AWAIT_RESPONSES; diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java index cb0051089..3f9b057be 100644 --- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java @@ -2,6 +2,7 @@ package org.briarproject.briar.introduction; import org.briarproject.bramble.BrambleCoreModule; import org.briarproject.bramble.test.BrambleCoreIntegrationTestModule; +import org.briarproject.briar.autodelete.AutoDeleteModule; import org.briarproject.briar.blog.BlogModule; import org.briarproject.briar.client.BriarClientModule; import org.briarproject.briar.forum.ForumModule; @@ -17,6 +18,7 @@ import dagger.Component; @Singleton @Component(modules = { + AutoDeleteModule.class, BrambleCoreIntegrationTestModule.class, BrambleCoreModule.class, BlogModule.class, diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionValidatorTest.java index 7cd82468a..d73c1f5d6 100644 --- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionValidatorTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionValidatorTest.java @@ -19,9 +19,6 @@ import java.util.Map; import javax.annotation.Nullable; import static java.util.Collections.singletonMap; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.crypto.CryptoConstants.MAC_BYTES; import static org.briarproject.bramble.api.crypto.CryptoConstants.MAX_AGREEMENT_PUBLIC_KEY_BYTES; import static org.briarproject.bramble.api.crypto.CryptoConstants.MAX_SIGNATURE_BYTES; @@ -30,6 +27,9 @@ import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getRandomId; import static org.briarproject.bramble.test.TestUtils.getTransportId; import static org.briarproject.bramble.util.StringUtils.getRandomString; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.introduction.IntroductionConstants.MAX_INTRODUCTION_TEXT_LENGTH; import static org.briarproject.briar.introduction.MessageType.ABORT; import static org.briarproject.briar.introduction.MessageType.ACCEPT; diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/MessageEncoderParserIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/MessageEncoderParserIntegrationTest.java index 808ca3454..15a872292 100644 --- a/briar-core/src/test/java/org/briarproject/briar/introduction/MessageEncoderParserIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/introduction/MessageEncoderParserIntegrationTest.java @@ -23,9 +23,6 @@ import java.util.Map; import javax.inject.Inject; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.crypto.CryptoConstants.MAC_BYTES; import static org.briarproject.bramble.api.crypto.CryptoConstants.MAX_SIGNATURE_BYTES; import static org.briarproject.bramble.test.TestUtils.getAgreementPublicKey; @@ -34,6 +31,9 @@ import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getRandomId; import static org.briarproject.bramble.test.TestUtils.getTransportPropertiesMap; import static org.briarproject.bramble.util.StringUtils.getRandomString; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.introduction.IntroductionConstants.MAX_INTRODUCTION_TEXT_LENGTH; import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_ID; import static org.briarproject.briar.api.introduction.IntroductionManager.MAJOR_VERSION; diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java index 2a2c4a829..883ea3e8e 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java @@ -19,12 +19,12 @@ import java.util.List; import javax.inject.Inject; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH; import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH; import static org.briarproject.bramble.api.record.Record.MAX_RECORD_PAYLOAD_BYTES; import static org.briarproject.bramble.test.TestUtils.getRandomId; import static org.briarproject.bramble.util.StringUtils.getRandomString; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; import static org.briarproject.briar.api.forum.ForumConstants.MAX_FORUM_POST_TEXT_LENGTH; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_ATTACHMENTS_PER_MESSAGE; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_CONTENT_TYPE_BYTES; diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/MessagingManagerIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/messaging/MessagingManagerIntegrationTest.java index bf42ff5ed..0231df375 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/MessagingManagerIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/MessagingManagerIntegrationTest.java @@ -32,12 +32,12 @@ import static java.util.Collections.emptyList; import static java.util.Collections.emptySet; import static java.util.Collections.singleton; import static java.util.Collections.singletonList; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.sync.validation.MessageState.DELIVERED; import static org.briarproject.bramble.api.sync.validation.MessageState.PENDING; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.util.StringUtils.getRandomString; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.test.BriarTestUtils.assertGroupCount; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/PrivateMessageValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/messaging/PrivateMessageValidatorTest.java index a99c3a1eb..7ec7d3a3b 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/PrivateMessageValidatorTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/PrivateMessageValidatorTest.java @@ -20,8 +20,6 @@ import org.junit.Test; import java.io.InputStream; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; import static org.briarproject.bramble.api.transport.TransportConstants.MAX_CLOCK_DIFFERENCE; import static org.briarproject.bramble.test.TestUtils.getClientId; import static org.briarproject.bramble.test.TestUtils.getGroup; @@ -29,6 +27,8 @@ import static org.briarproject.bramble.test.TestUtils.getMessage; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getRandomId; import static org.briarproject.bramble.util.StringUtils.getRandomString; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_ATTACHMENTS_PER_MESSAGE; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_CONTENT_TYPE_BYTES; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_TEXT_LENGTH; diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java index dff4034ff..3e834073e 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java @@ -34,12 +34,12 @@ import java.util.concurrent.CountDownLatch; import static java.util.Collections.singletonList; import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.sync.validation.MessageState.DELIVERED; import static org.briarproject.bramble.test.TestPluginConfigModule.SIMPLEX_TRANSPORT_ID; import static org.briarproject.bramble.test.TestUtils.deleteTestDirectory; import static org.briarproject.bramble.test.TestUtils.getSecretKey; import static org.briarproject.bramble.test.TestUtils.getTestDirectory; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.junit.Assert.assertTrue; public class SimplexMessagingIntegrationTest extends BriarTestCase { diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java index f7cff5186..1f2f85008 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java @@ -17,6 +17,7 @@ import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.bramble.test.BrambleMockTestCase; +import org.briarproject.briar.api.autodelete.AutoDeleteManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.privategroup.GroupMessageFactory; import org.briarproject.briar.api.privategroup.PrivateGroup; @@ -25,7 +26,6 @@ import org.briarproject.briar.api.privategroup.PrivateGroupManager; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager; import org.jmock.Expectations; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_SIGNATURE_LENGTH; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; import static org.briarproject.bramble.test.TestUtils.getContact; @@ -34,6 +34,7 @@ import static org.briarproject.bramble.test.TestUtils.getMessage; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getRandomId; import static org.briarproject.bramble.util.StringUtils.getRandomString; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.GROUP_SALT_LENGTH; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_INVITATION_TEXT_LENGTH; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_NAME_LENGTH; @@ -59,6 +60,8 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase { final IdentityManager identityManager = context.mock(IdentityManager.class); final MessageEncoder messageEncoder = context.mock(MessageEncoder.class); final MessageTracker messageTracker = context.mock(MessageTracker.class); + final AutoDeleteManager autoDeleteManager = + context.mock(AutoDeleteManager.class); final Clock clock = context.mock(Clock.class); final Transaction txn = new Transaction(null, false); @@ -120,7 +123,7 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase { } void expectSendInviteMessage(String text) throws Exception { - expectCheckWhetherContactSupportsAutoDeletion(); + expectCheckWhetherContactSupportsAutoDeletion(true); expectGetLocalTimestamp(messageTimestamp); context.checking(new Expectations() {{ oneOf(messageEncoder).encodeInviteMessage(contactGroupId, @@ -134,7 +137,7 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase { void expectSendJoinMessage(JoinMessage m, boolean visible) throws Exception { - expectCheckWhetherContactSupportsAutoDeletion(); + expectCheckWhetherContactSupportsAutoDeletion(visible); expectGetLocalTimestamp(messageTimestamp); context.checking(new Expectations() {{ oneOf(messageEncoder).encodeJoinMessage(m.getContactGroupId(), @@ -146,7 +149,7 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase { } void expectSendLeaveMessage(boolean visible) throws Exception { - expectCheckWhetherContactSupportsAutoDeletion(); + expectCheckWhetherContactSupportsAutoDeletion(visible); expectGetLocalTimestamp(messageTimestamp); context.checking(new Expectations() {{ 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() {{ oneOf(clientHelper).getContactId(txn, contactGroupId); will(returnValue(contactId)); @@ -231,6 +235,10 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase { GroupInvitationManager.CLIENT_ID, GroupInvitationManager.MAJOR_VERSION); will(returnValue(GroupInvitationManager.MINOR_VERSION)); + if (visible) { + oneOf(autoDeleteManager).getAutoDeleteTimer(txn, contactId); + will(returnValue(NO_AUTO_DELETE_TIMER)); + } }}); } } diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java index 559a6de93..fde516717 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java @@ -5,10 +5,10 @@ import org.briarproject.briar.api.client.ProtocolStateException; import org.jmock.Expectations; import org.junit.Test; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; import static org.briarproject.bramble.test.TestUtils.getRandomId; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.privategroup.invitation.CreatorState.DISSOLVED; import static org.briarproject.briar.privategroup.invitation.CreatorState.ERROR; import static org.briarproject.briar.privategroup.invitation.CreatorState.INVITED; @@ -24,7 +24,7 @@ public class CreatorProtocolEngineTest extends AbstractProtocolEngineTest { new CreatorProtocolEngine(db, clientHelper, clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, - messageEncoder, messageTracker, clock); + messageEncoder, messageTracker, autoDeleteManager, clock); private CreatorSession getDefaultSession(CreatorState state) { return new CreatorSession(contactGroupId, privateGroupId, diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java index d533cacf9..85df40b38 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java @@ -45,7 +45,6 @@ import javax.annotation.Nullable; import static java.util.Arrays.asList; import static junit.framework.TestCase.fail; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; import static org.briarproject.bramble.test.TestUtils.getAuthor; import static org.briarproject.bramble.test.TestUtils.getContact; @@ -54,6 +53,7 @@ import static org.briarproject.bramble.test.TestUtils.getMessage; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getRandomId; import static org.briarproject.bramble.util.StringUtils.getRandomString; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.GROUP_SALT_LENGTH; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_NAME_LENGTH; import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID; diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidatorTest.java index fe9ced797..fd5ccbe1d 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidatorTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidatorTest.java @@ -18,14 +18,14 @@ import java.security.GeneralSecurityException; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_SIGNATURE_LENGTH; import static org.briarproject.bramble.test.TestUtils.getAuthor; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getRandomId; import static org.briarproject.bramble.util.StringUtils.getRandomString; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.GROUP_SALT_LENGTH; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_INVITATION_TEXT_LENGTH; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_NAME_LENGTH; diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java index fee724bb8..56a984d6e 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java @@ -13,7 +13,6 @@ import org.junit.Test; import java.util.Collections; import java.util.Map; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; import static org.briarproject.bramble.api.sync.Group.Visibility.VISIBLE; @@ -22,6 +21,7 @@ import static org.briarproject.bramble.test.TestUtils.getContact; import static org.briarproject.bramble.test.TestUtils.getLocalAuthor; import static org.briarproject.bramble.test.TestUtils.getRandomId; import static org.briarproject.bramble.util.StringUtils.getRandomString; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_INVITATION_TEXT_LENGTH; import static org.briarproject.briar.privategroup.invitation.InviteeState.ACCEPTED; import static org.briarproject.briar.privategroup.invitation.InviteeState.DISSOLVED; @@ -43,7 +43,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest { new InviteeProtocolEngine(db, clientHelper, clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, - messageEncoder, messageTracker, clock); + messageEncoder, messageTracker, autoDeleteManager, clock); private final LocalAuthor localAuthor = getLocalAuthor(); private InviteeSession getDefaultSession(InviteeState state) { diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java index 2be8c0a94..35191e995 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java @@ -5,11 +5,11 @@ import org.briarproject.briar.api.client.ProtocolStateException; import org.jmock.Expectations; import org.junit.Test; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; import static org.briarproject.bramble.api.sync.Group.Visibility.VISIBLE; import static org.briarproject.bramble.test.TestUtils.getRandomId; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.privategroup.invitation.PeerState.AWAIT_MEMBER; import static org.briarproject.briar.privategroup.invitation.PeerState.BOTH_JOINED; import static org.briarproject.briar.privategroup.invitation.PeerState.ERROR; @@ -27,7 +27,7 @@ public class PeerProtocolEngineTest extends AbstractProtocolEngineTest { new PeerProtocolEngine(db, clientHelper, clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, - messageEncoder, messageTracker, clock); + messageEncoder, messageTracker, autoDeleteManager, clock); private PeerSession getDefaultSession(PeerState state) { return new PeerSession(contactGroupId, privateGroupId, diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingValidatorTest.java index 8ce003360..6b9f21183 100644 --- a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingValidatorTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingValidatorTest.java @@ -10,11 +10,11 @@ import org.junit.Test; import javax.annotation.Nullable; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.test.TestUtils.getAuthor; import static org.briarproject.bramble.util.StringUtils.getRandomString; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.sharing.SharingConstants.MAX_INVITATION_TEXT_LENGTH; import static org.briarproject.briar.sharing.MessageType.INVITE; import static org.junit.Assert.fail; diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingValidatorTest.java index c42a3b7f3..7844f190b 100644 --- a/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingValidatorTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingValidatorTest.java @@ -9,11 +9,11 @@ import org.junit.Test; import javax.annotation.Nullable; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.util.StringUtils.getRandomString; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.api.forum.ForumConstants.FORUM_SALT_LENGTH; import static org.briarproject.briar.api.forum.ForumConstants.MAX_FORUM_NAME_LENGTH; import static org.briarproject.briar.api.sharing.SharingConstants.MAX_INVITATION_TEXT_LENGTH; diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/SharingValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/SharingValidatorTest.java index c5c6349e0..11eb4a603 100644 --- a/briar-core/src/test/java/org/briarproject/briar/sharing/SharingValidatorTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/sharing/SharingValidatorTest.java @@ -18,11 +18,11 @@ import javax.annotation.Nullable; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; -import static org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getRandomId; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MAX_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; import static org.briarproject.briar.sharing.MessageType.ABORT; import static org.briarproject.briar.sharing.MessageType.ACCEPT; import static org.briarproject.briar.sharing.MessageType.DECLINE; diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java index cc074a97a..1c036a78c 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java @@ -24,6 +24,7 @@ import org.briarproject.briar.api.messaging.MessagingManager; import org.briarproject.briar.api.messaging.PrivateMessageFactory; import org.briarproject.briar.api.privategroup.PrivateGroupManager; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager; +import org.briarproject.briar.autodelete.AutoDeleteModule; import org.briarproject.briar.blog.BlogModule; import org.briarproject.briar.client.BriarClientModule; import org.briarproject.briar.forum.ForumModule; @@ -39,6 +40,7 @@ import dagger.Component; @Singleton @Component(modules = { + AutoDeleteModule.class, BrambleCoreIntegrationTestModule.class, BrambleCoreModule.class, BlogModule.class, @@ -55,6 +57,8 @@ public interface BriarIntegrationTestComponent void inject(BriarIntegrationTest init); + void inject(AutoDeleteModule.EagerSingletons init); + void inject(BlogModule.EagerSingletons init); void inject(ForumModule.EagerSingletons init); @@ -117,6 +121,7 @@ public interface BriarIntegrationTestComponent BriarIntegrationTestComponent c) { BrambleCoreIntegrationTestEagerSingletons.Helper .injectEagerSingletons(c); + c.inject(new AutoDeleteModule.EagerSingletons()); c.inject(new BlogModule.EagerSingletons()); c.inject(new ForumModule.EagerSingletons()); c.inject(new GroupInvitationModule.EagerSingletons()); diff --git a/briar-headless/src/test/java/org/briarproject/briar/headless/event/WebSocketControllerTest.kt b/briar-headless/src/test/java/org/briarproject/briar/headless/event/WebSocketControllerTest.kt index 4f2fdc36a..d812d956e 100644 --- a/briar-headless/src/test/java/org/briarproject/briar/headless/event/WebSocketControllerTest.kt +++ b/briar-headless/src/test/java/org/briarproject/briar/headless/event/WebSocketControllerTest.kt @@ -6,11 +6,11 @@ import io.mockk.CapturingSlot import io.mockk.every import io.mockk.mockk import io.mockk.verify -import org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER import org.briarproject.bramble.api.identity.AuthorInfo import org.briarproject.bramble.api.identity.AuthorInfo.Status.VERIFIED import org.briarproject.bramble.test.ImmediateExecutor import org.briarproject.bramble.test.TestUtils.getRandomId +import org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER import org.briarproject.briar.api.client.SessionId import org.briarproject.briar.api.introduction.IntroductionRequest import org.briarproject.briar.api.introduction.event.IntroductionRequestReceivedEvent diff --git a/briar-headless/src/test/java/org/briarproject/briar/headless/messaging/MessagingControllerImplTest.kt b/briar-headless/src/test/java/org/briarproject/briar/headless/messaging/MessagingControllerImplTest.kt index 8abf24e94..b76d0fb49 100644 --- a/briar-headless/src/test/java/org/briarproject/briar/headless/messaging/MessagingControllerImplTest.kt +++ b/briar-headless/src/test/java/org/briarproject/briar/headless/messaging/MessagingControllerImplTest.kt @@ -11,7 +11,6 @@ import io.mockk.just import io.mockk.mockk import io.mockk.mockkStatic import io.mockk.runs -import org.briarproject.bramble.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER import org.briarproject.bramble.api.contact.ContactId import org.briarproject.bramble.api.db.NoSuchContactException import org.briarproject.bramble.api.identity.AuthorInfo @@ -23,6 +22,7 @@ import org.briarproject.bramble.api.sync.event.MessagesSentEvent import org.briarproject.bramble.test.ImmediateExecutor import org.briarproject.bramble.test.TestUtils.getRandomId import org.briarproject.bramble.util.StringUtils.getRandomString +import org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER import org.briarproject.briar.api.client.SessionId import org.briarproject.briar.api.conversation.DeletionResult import org.briarproject.briar.api.introduction.IntroductionRequest