From 86cd4c5c30032805fd2b393563ca5d975888984c Mon Sep 17 00:00:00 2001 From: Clark Date: Tue, 20 Jun 2023 10:29:47 -0400 Subject: [PATCH] Fix remote delete for edit messages. --- .../securesms/database/MessageTable.kt | 42 ++++++++++++++++++- .../messages/DataMessageProcessor.kt | 2 +- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt index 082fa004ab..6d0bc551d7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -1941,6 +1941,18 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat return mmsReaderFor(cursor) } + private fun getPreviousEditIds(id: Long): List { + return readableDatabase + .select(ID) + .from(TABLE_NAME) + .where("$LATEST_REVISION_ID = ?", id) + .orderBy("$DATE_SENT ASC") + .run() + .readToList { + it.requireLong(ID) + } + } + private fun updateMailboxBitmask(id: Long, maskOff: Long, maskOn: Long, threadId: Optional) { writableDatabase.withinTransaction { db -> db.execSQL( @@ -2011,7 +2023,33 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat ApplicationDependencies.getDatabaseObserver().notifyConversationListListeners() } + fun markAsRemoteDelete(targetMessage: MessageRecord) { + writableDatabase.withinTransaction { db -> + if (targetMessage.isEditMessage) { + val latestRevisionId = (targetMessage as? MediaMmsMessageRecord)?.latestRevisionId?.id ?: targetMessage.id + markAsRemoteDeleteInternal(latestRevisionId) + getPreviousEditIds(latestRevisionId).map { id -> + db.update(TABLE_NAME) + .values( + ORIGINAL_MESSAGE_ID to null, + LATEST_REVISION_ID to null + ) + .where("$ID = ?", id) + .run() + deleteMessage(id) + } + } else { + markAsRemoteDeleteInternal(targetMessage.id) + } + } + } + fun markAsRemoteDelete(messageId: Long) { + val targetMessage: MessageRecord = getMessageRecord(messageId) + markAsRemoteDelete(targetMessage) + } + + private fun markAsRemoteDeleteInternal(messageId: Long) { var deletedAttachments = false writableDatabase.withinTransaction { db -> db.update(TABLE_NAME) @@ -2023,7 +2061,9 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat QUOTE_TYPE to null, QUOTE_ID to null, LINK_PREVIEWS to null, - SHARED_CONTACTS to null + SHARED_CONTACTS to null, + ORIGINAL_MESSAGE_ID to null, + LATEST_REVISION_ID to null ) .where("$ID = ?", messageId) .run() diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt index ee8f700e47..251d2cc13b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt @@ -522,7 +522,7 @@ object DataMessageProcessor { val targetMessage: MessageRecord? = SignalDatabase.messages.getMessageFor(targetSentTimestamp, senderRecipientId) return if (targetMessage != null && MessageConstraintsUtil.isValidRemoteDeleteReceive(targetMessage, senderRecipientId, envelope.serverTimestamp)) { - SignalDatabase.messages.markAsRemoteDelete(targetMessage.id) + SignalDatabase.messages.markAsRemoteDelete(targetMessage) if (targetMessage.isStory()) { SignalDatabase.messages.deleteRemotelyDeletedStory(targetMessage.id) }