Filter out invalid dlist members on backup export.

This commit is contained in:
Greyson Parrelli 2025-01-22 15:37:02 -05:00
parent ab88018f36
commit 401cd72af0
4 changed files with 20 additions and 6 deletions

View file

@ -106,6 +106,10 @@ object ExportOddities {
return log(0, "Distribution list had a privacy mode of ALL_EXCEPT with no members. Exporting at ALL.") 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 { private fun log(sentTimestamp: Long, message: String): String {
return "[ODDITY][$sentTimestamp] $message" return "[ODDITY][$sentTimestamp] $message"
} }

View file

@ -13,13 +13,13 @@ import org.thoughtcrime.securesms.database.model.DistributionListId
import org.thoughtcrime.securesms.database.model.DistributionListPrivacyMode import org.thoughtcrime.securesms.database.model.DistributionListPrivacyMode
import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.recipients.RecipientId
fun DistributionListTables.getAllForBackup(): DistributionListArchiveExporter { fun DistributionListTables.getAllForBackup(selfRecipientId: RecipientId): DistributionListArchiveExporter {
val cursor = readableDatabase val cursor = readableDatabase
.select() .select()
.from(DistributionListTables.ListTable.TABLE_NAME) .from(DistributionListTables.ListTable.TABLE_NAME)
.run() .run()
return DistributionListArchiveExporter(cursor, this) return DistributionListArchiveExporter(cursor, this, selfRecipientId)
} }
fun DistributionListTables.getMembersForBackup(id: DistributionListId): List<RecipientId> { fun DistributionListTables.getMembersForBackup(id: DistributionListId): List<RecipientId> {

View file

@ -31,7 +31,8 @@ private val TAG = Log.tag(DistributionListArchiveExporter::class)
class DistributionListArchiveExporter( class DistributionListArchiveExporter(
private val cursor: Cursor, private val cursor: Cursor,
private val distributionListTables: DistributionListTables private val distributionListTables: DistributionListTables,
private val selfRecipientId: RecipientId
) : Iterator<ArchiveRecipient>, Closeable { ) : Iterator<ArchiveRecipient>, Closeable {
override fun hasNext(): Boolean { override fun hasNext(): Boolean {
@ -65,13 +66,14 @@ class DistributionListArchiveExporter(
deletionTimestamp = record.deletedAtTimestamp deletionTimestamp = record.deletedAtTimestamp
) )
} else { } else {
val members = record.members.toRemoteMemberList(selfRecipientId)
DistributionListItem( DistributionListItem(
distributionId = record.distributionId.asUuid().toByteArray().toByteString(), distributionId = record.distributionId.asUuid().toByteArray().toByteString(),
distributionList = DistributionList( distributionList = DistributionList(
name = record.name, name = record.name,
allowReplies = record.allowsReplies, allowReplies = record.allowsReplies,
privacyMode = record.privacyMode.toBackupPrivacyMode(record.members.size), privacyMode = record.privacyMode.toBackupPrivacyMode(members.size),
memberRecipientIds = record.members.map { it.toLong() } memberRecipientIds = members
) )
) )
} }
@ -101,3 +103,11 @@ private fun DistributionListPrivacyMode.toBackupPrivacyMode(memberCount: Int): D
} }
} }
} }
private fun List<RecipientId>.toRemoteMemberList(selfRecipientId: RecipientId): List<Long> {
val filtered = this.filter { it != selfRecipientId }.map { it.toLong() }
if (filtered.size != this.size) {
Log.w(TAG, ExportOddities.distributionListHadSelfAsMember())
}
return filtered
}

View file

@ -66,7 +66,7 @@ object RecipientArchiveProcessor {
} }
} }
db.distributionListTables.getAllForBackup().use { reader -> db.distributionListTables.getAllForBackup(selfRecipientId).use { reader ->
for (recipient in reader) { for (recipient in reader) {
exportState.recipientIds.add(recipient.id) exportState.recipientIds.add(recipient.id)
emitter.emit(Frame(recipient = recipient)) emitter.emit(Frame(recipient = recipient))