diff --git a/briar-api/src/main/java/org/briarproject/briar/api/conversation/ConversationManager.java b/briar-api/src/main/java/org/briarproject/briar/api/conversation/ConversationManager.java index a5698375f..fb51b2574 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/conversation/ConversationManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/conversation/ConversationManager.java @@ -24,7 +24,7 @@ public interface ConversationManager { /** * Returns the headers of all messages in the given private conversation. - * + *

* Only {@link MessagingManager} returns only headers. * The others also return the message text. */ @@ -36,6 +36,13 @@ public interface ConversationManager { */ GroupCount getGroupCount(ContactId c) throws DbException; + /** + * Deletes all messages exchanged with the given contact. + * + * @return true if all messages could be deleted, false otherwise + */ + boolean deleteAllMessages(ContactId c) throws DbException; + @NotNullByDefault interface ConversationClient { @@ -49,6 +56,14 @@ public interface ConversationManager { void setReadFlag(GroupId g, MessageId m, boolean read) throws DbException; + + /** + * Deletes all messages associated with the given contact. + * + * @return true if all messages could be deleted, false otherwise + */ + boolean deleteAllMessages(Transaction txn, + ContactId c) throws DbException; } } diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java index 0b5afe9df..185c59c0b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java @@ -45,6 +45,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; @@ -557,6 +558,26 @@ class IntroductionManagerImpl extends ConversationClientImpl } } + @Override + public boolean deleteAllMessages(Transaction txn, ContactId c) + throws DbException { + // TODO actually delete messages (#1627 and #1629) + return getMessageIds(txn, c).size() == 0; + } + + private Set getMessageIds(Transaction txn, ContactId c) + throws DbException { + GroupId g = getContactGroup(db.getContact(txn, c)).getId(); + BdfDictionary query = messageParser.getMessagesVisibleInUiQuery(); + try { + Map results = + clientHelper.getMessageMetadataAsDictionary(txn, g, query); + return results.keySet(); + } catch (FormatException e) { + throw new DbException(e); + } + } + private static class StoredSession { private final MessageId storageId; diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/ConversationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/ConversationManagerImpl.java index 7d0d04a9d..957f7e2ad 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/ConversationManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/ConversationManagerImpl.java @@ -73,4 +73,15 @@ class ConversationManagerImpl implements ConversationManager { return new GroupCount(msgCount, unreadCount, latestTime); } + @Override + public boolean deleteAllMessages(ContactId c) throws DbException { + return db.transactionWithResult(false, txn -> { + boolean allDeleted = true; + for (ConversationClient client : clients) { + allDeleted = client.deleteAllMessages(txn, c) && allDeleted; + } + return allDeleted; + }); + } + } 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 c85a2a22d..cd6cbbd3e 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 @@ -404,4 +404,17 @@ class MessagingManagerImpl implements MessagingManager, IncomingMessageHook, return minorVersion > 0; } + @Override + public boolean deleteAllMessages(Transaction txn, ContactId c) + throws DbException { + GroupId g = getContactGroup(db.getContact(txn, c)).getId(); + // this indiscriminately deletes all raw messages in this group + // also attachments + for (MessageId messageId : db.getMessageIds(txn, g)) { + db.deleteMessage(txn, messageId); + db.deleteMessageMetadata(txn, messageId); + } + return true; + } + } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java index e72bc3af9..b2d80c7bb 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java @@ -43,6 +43,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; @@ -629,6 +630,26 @@ class GroupInvitationManagerImpl extends ConversationClientImpl return m; } + @Override + public boolean deleteAllMessages(Transaction txn, ContactId c) + throws DbException { + // TODO actually delete messages (#1627 and #1629) + return getMessageIds(txn, c).size() == 0; + } + + private Set getMessageIds(Transaction txn, ContactId c) + throws DbException { + GroupId g = getContactGroup(db.getContact(txn, c)).getId(); + BdfDictionary query = messageParser.getMessagesVisibleInUiQuery(); + try { + Map results = + clientHelper.getMessageMetadataAsDictionary(txn, g, query); + return results.keySet(); + } catch (FormatException e) { + throw new DbException(e); + } + } + private static class StoredSession { private final MessageId storageId; diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java index 2ac7dd8d1..194bdb41f 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java @@ -40,6 +40,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import javax.annotation.Nullable; @@ -537,6 +538,26 @@ abstract class SharingManagerImpl return m; } + @Override + public boolean deleteAllMessages(Transaction txn, ContactId c) + throws DbException { + // TODO actually delete messages (#1627 and #1629) + return getMessageIds(txn, c).size() == 0; + } + + private Set getMessageIds(Transaction txn, ContactId c) + throws DbException { + GroupId g = getContactGroup(db.getContact(txn, c)).getId(); + BdfDictionary query = messageParser.getMessagesVisibleInUiQuery(); + try { + Map results = + clientHelper.getMessageMetadataAsDictionary(txn, g, query); + return results.keySet(); + } catch (FormatException e) { + throw new DbException(e); + } + } + private static class StoredSession { private final MessageId storageId;