From 401cd72af0b7584e11264e78f35f021dd44150f2 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 22 Jan 2025 15:37:02 -0500 Subject: [PATCH] Filter out invalid dlist members on backup export. --- .../securesms/backup/v2/ArchiveErrorCases.kt | 4 ++++ .../DistributionListTablesArchiveExtensions.kt | 4 ++-- .../exporters/DistributionListArchiveExporter.kt | 16 +++++++++++++--- .../v2/processor/RecipientArchiveProcessor.kt | 2 +- 4 files changed, 20 insertions(+), 6 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 d67ecee517..b32bc21bb0 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 @@ -106,6 +106,10 @@ object ExportOddities { return log(0, "Distribution list had a privacy mode of ALL_EXCEPT with no members. Exporting at ALL.") } + fun distributionListHadSelfAsMember(): String { + return log(0, "Distribution list had self as a member. Removing it.") + } + private fun log(sentTimestamp: Long, message: String): String { return "[ODDITY][$sentTimestamp] $message" } diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/DistributionListTablesArchiveExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/DistributionListTablesArchiveExtensions.kt index 2bd60d1f90..aa5e66dd06 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/DistributionListTablesArchiveExtensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/DistributionListTablesArchiveExtensions.kt @@ -13,13 +13,13 @@ import org.thoughtcrime.securesms.database.model.DistributionListId import org.thoughtcrime.securesms.database.model.DistributionListPrivacyMode import org.thoughtcrime.securesms.recipients.RecipientId -fun DistributionListTables.getAllForBackup(): DistributionListArchiveExporter { +fun DistributionListTables.getAllForBackup(selfRecipientId: RecipientId): DistributionListArchiveExporter { val cursor = readableDatabase .select() .from(DistributionListTables.ListTable.TABLE_NAME) .run() - return DistributionListArchiveExporter(cursor, this) + return DistributionListArchiveExporter(cursor, this, selfRecipientId) } fun DistributionListTables.getMembersForBackup(id: DistributionListId): List { diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/DistributionListArchiveExporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/DistributionListArchiveExporter.kt index b89e87e094..a48499da3a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/DistributionListArchiveExporter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/DistributionListArchiveExporter.kt @@ -31,7 +31,8 @@ private val TAG = Log.tag(DistributionListArchiveExporter::class) class DistributionListArchiveExporter( private val cursor: Cursor, - private val distributionListTables: DistributionListTables + private val distributionListTables: DistributionListTables, + private val selfRecipientId: RecipientId ) : Iterator, Closeable { override fun hasNext(): Boolean { @@ -65,13 +66,14 @@ class DistributionListArchiveExporter( deletionTimestamp = record.deletedAtTimestamp ) } else { + val members = record.members.toRemoteMemberList(selfRecipientId) DistributionListItem( distributionId = record.distributionId.asUuid().toByteArray().toByteString(), distributionList = DistributionList( name = record.name, allowReplies = record.allowsReplies, - privacyMode = record.privacyMode.toBackupPrivacyMode(record.members.size), - memberRecipientIds = record.members.map { it.toLong() } + privacyMode = record.privacyMode.toBackupPrivacyMode(members.size), + memberRecipientIds = members ) ) } @@ -101,3 +103,11 @@ private fun DistributionListPrivacyMode.toBackupPrivacyMode(memberCount: Int): D } } } + +private fun List.toRemoteMemberList(selfRecipientId: RecipientId): List { + val filtered = this.filter { it != selfRecipientId }.map { it.toLong() } + if (filtered.size != this.size) { + Log.w(TAG, ExportOddities.distributionListHadSelfAsMember()) + } + return filtered +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/RecipientArchiveProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/RecipientArchiveProcessor.kt index e8fe24dac8..fcac5a15ba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/RecipientArchiveProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/RecipientArchiveProcessor.kt @@ -66,7 +66,7 @@ object RecipientArchiveProcessor { } } - db.distributionListTables.getAllForBackup().use { reader -> + db.distributionListTables.getAllForBackup(selfRecipientId).use { reader -> for (recipient in reader) { exportState.recipientIds.add(recipient.id) emitter.emit(Frame(recipient = recipient))