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;