From 5abe7ced2c57aae79a0c252d263c902c1275a013 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 13 Aug 2026 11:11:17 -0400 Subject: [PATCH] Fix validation error with remote deletes. --- .../securesms/backup/v2/ArchiveErrorCases.kt | 4 ++++ .../v2/exporters/ChatItemArchiveExporter.kt | 20 ++++++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt index f095f638fa..b55eea294d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt @@ -258,6 +258,10 @@ object ExportOddities { return log(0, "No release channel recipient was found.") } + fun adminDeleteInNonGroupChat(sentTimestamp: Long): String { + return log(sentTimestamp, "Message was deleted by someone other than the author, but it isn't in a group chat. Exporting it as a normal remote delete.") + } + private fun log(sentTimestamp: Long, message: String): String { return "[ODDITY][$sentTimestamp] $message" } diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt index 9bd292bc6e..d5915c1c45 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt @@ -193,14 +193,20 @@ class ChatItemArchiveExporter( } when { - record.deletedBy == record.fromRecipientId -> { - builder.remoteDeletedMessage = RemoteDeletedMessage() - transformTimer.emit("remote-delete") - } - record.deletedBy != null -> { - builder.adminDeletedMessage = AdminDeletedMessage(adminId = record.deletedBy) - transformTimer.emit("admin-delete") + val deletedByAuthor = record.deletedBy == builder.authorId + val isGroupChat = exportState.threadIdToRecipientId[record.threadId] in exportState.groupRecipientIds + + if (!deletedByAuthor && isGroupChat) { + builder.adminDeletedMessage = AdminDeletedMessage(adminId = record.deletedBy) + transformTimer.emit("admin-delete") + } else { + if (!deletedByAuthor) { + Log.w(TAG, ExportOddities.adminDeleteInNonGroupChat(record.dateSent)) + } + builder.remoteDeletedMessage = RemoteDeletedMessage() + transformTimer.emit("remote-delete") + } } MessageTypes.isJoinedType(record.type) -> {