From 3d2c51c14b169b27ce54fe438f55d278db849f04 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 24 Mar 2026 15:46:39 +0000 Subject: [PATCH] Filter out revisions with mismatched authors during backup export. --- .../securesms/backup/v2/ArchiveErrorCases.kt | 4 ++++ .../backup/v2/exporters/ChatItemArchiveExporter.kt | 13 +++++++++---- 2 files changed, 13 insertions(+), 4 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 3c9b7fff64..baa3dad161 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 @@ -194,6 +194,10 @@ object ExportOddities { return log(sentTimestamp, "Revisions for this message contained items of a different type than the parent item. Ignoring mismatched revisions.") } + fun mismatchedRevisionAuthor(sentTimestamp: Long): String { + return log(sentTimestamp, "Revisions for this message contained items with a different author than the parent item. Ignoring mismatched revisions.") + } + fun outgoingMessageWasSentButTimerNotStarted(sentTimestamp: Long): String { return log(sentTimestamp, "Outgoing expiring message was sent, but the timer wasn't started. Setting expireStartDate to dateReceived.") } 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 1a86ed2781..3337c19993 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 @@ -1741,19 +1741,24 @@ private fun ChatUpdateMessage.canOnlyBeAuthoredBySelf(): Boolean { } private fun List.repairRevisions(current: ChatItem.Builder): List { + val authorFiltered = this.filter { it.authorId == current.authorId } + if (authorFiltered.size != this.size) { + Log.w(TAG, ExportOddities.mismatchedRevisionAuthor(current.dateSent)) + } + return if (current.standardMessage != null) { - val filtered = this + val filtered = authorFiltered .filter { it.standardMessage != null } .map { it.withDowngradeVoiceNotes() } - if (this.size != filtered.size) { + if (authorFiltered.size != filtered.size) { Log.w(TAG, ExportOddities.mismatchedRevisionHistory(current.dateSent)) } filtered } else if (current.directStoryReplyMessage != null) { - val filtered = this.filter { it.directStoryReplyMessage != null } - if (this.size != filtered.size) { + val filtered = authorFiltered.filter { it.directStoryReplyMessage != null } + if (authorFiltered.size != filtered.size) { Log.w(TAG, ExportOddities.mismatchedRevisionHistory(current.dateSent)) } filtered