From 18efb1b1f960f55c1b9cc34c1194bf894a0f92d1 Mon Sep 17 00:00:00 2001 From: SessionHero01 <180888785+SessionHero01@users.noreply.github.com> Date: Thu, 28 Nov 2024 17:03:36 +1100 Subject: [PATCH] Add missing implementation to delete member's message on swarm (#815) * Add missing implementation to delete member's message on swarm * Add comment --- .../attachments/DatabaseAttachmentProvider.kt | 12 +++++++ .../securesms/groups/GroupManagerV2Impl.kt | 36 +++++++++++++------ .../database/MessageDataProvider.kt | 1 + 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt b/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt index 6d1ff33d6a..72d8c2aabe 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentProvider.kt @@ -189,6 +189,18 @@ class DatabaseAttachmentProvider(context: Context, helper: SQLCipherOpenHelper) return messageDB.getMessageIDs(serverIds, threadId) } + override fun getUserMessageHashes(threadId: Long, userPubKey: String): List { + val component = DatabaseComponent.get(context) + val messages = component.mmsSmsDatabase().getUserMessages(threadId, userPubKey) + val messageDatabase = component.lokiMessageDatabase() + return messages.mapNotNull { + messageDatabase.getMessageServerHash( + messageID = it.id, + mms = it.isMms + ) + } + } + override fun deleteMessage(messageID: Long, isSms: Boolean) { val messagingDatabase: MessagingDatabase = if (isSms) DatabaseComponent.get(context).smsDatabase() else DatabaseComponent.get(context).mmsDatabase() diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt index 760eb1745a..c48181a3ee 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt @@ -1012,15 +1012,18 @@ class GroupManagerV2Impl @Inject constructor( } } + // Delete from swarm if we are admin val adminKey = configFactory.getGroup(groupId)?.adminKey - if (!senderIsVerifiedAdmin && adminKey != null && hashes.isNotEmpty()) { - // If the deletion request comes from a non-admin, and we as an admin, will also delete - // the content from the swarm, provided that the messages are actually sent by that user - if (storage.ensureMessageHashesAreSender( - hashes.toSet(), - sender.hexString, - groupId.hexString - ) + if (adminKey != null) { + + // If hashes are given, these are the messages to delete. To be able to delete these + // messages from the swarm, the deletion request must be sent by an admin, or the messages + // belong to the requester. + if (hashes.isNotEmpty() && ( + senderIsVerifiedAdmin || storage.ensureMessageHashesAreSender( + hashes = hashes.toSet(), + sender = sender.hexString, + closedGroupId = groupId.hexString)) ) { SnodeAPI.deleteMessage( groupId.hexString, @@ -1029,8 +1032,21 @@ class GroupManagerV2Impl @Inject constructor( ) } - // The non-admin user shouldn't be able to delete other user's messages so we will - // ignore the memberIds in the message + // If memberIds are given, all messages belong to these members will be deleted on the + // swarm. These requests must be sent by an admin. + if (memberIds.isNotEmpty() && senderIsVerifiedAdmin) { + val userMessageHashes = memberIds.flatMap { memberId -> + messageDataProvider.getUserMessageHashes(threadId, memberId) + } + + if (userMessageHashes.isNotEmpty()) { + SnodeAPI.deleteMessage( + groupId.hexString, + OwnedSwarmAuth.ofClosedGroup(groupId, adminKey), + userMessageHashes + ) + } + } } } diff --git a/libsession/src/main/java/org/session/libsession/database/MessageDataProvider.kt b/libsession/src/main/java/org/session/libsession/database/MessageDataProvider.kt index e0af1a0e30..b0c3bc7780 100644 --- a/libsession/src/main/java/org/session/libsession/database/MessageDataProvider.kt +++ b/libsession/src/main/java/org/session/libsession/database/MessageDataProvider.kt @@ -22,6 +22,7 @@ interface MessageDataProvider { */ fun getMessageID(serverId: Long, threadId: Long): Pair? fun getMessageIDs(serverIDs: List, threadID: Long): Pair, List> + fun getUserMessageHashes(threadId: Long, userPubKey: String): List fun deleteMessage(messageID: Long, isSms: Boolean) fun deleteMessages(messageIDs: List, threadId: Long, isSms: Boolean) fun markMessageAsDeleted(timestamp: Long, author: String, displayedMessage: String)