Filter out invalid dlist members on backup export.
This commit is contained in:
parent
ab88018f36
commit
401cd72af0
4 changed files with 20 additions and 6 deletions
|
@ -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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -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> {
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Add table
Reference in a new issue