Do not include release notes in chat exports.

This commit is contained in:
Greyson Parrelli
2025-12-11 14:07:18 -05:00
parent 10133b16b3
commit e930a0f8ac
24 changed files with 266 additions and 46 deletions

View File

@@ -5,19 +5,17 @@
package org.thoughtcrime.securesms.backup.v2.database
import org.signal.core.util.SqlUtil
import org.signal.core.util.forEach
import org.signal.core.util.requireInt
import org.signal.core.util.requireLong
import org.signal.core.util.select
import org.thoughtcrime.securesms.backup.v2.ExportState
import org.thoughtcrime.securesms.backup.v2.exporters.ChatArchiveExporter
import org.thoughtcrime.securesms.database.MessageTable
import org.thoughtcrime.securesms.database.RecipientTable
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.database.ThreadTable
fun ThreadTable.getThreadsForBackup(db: SignalDatabase, exportState: ExportState, includeImageWallpapers: Boolean): ChatArchiveExporter {
val notReleaseNoteClause = exportState.releaseNoteRecipientId?.let {
"AND ${ThreadTable.TABLE_NAME}.${ThreadTable.RECIPIENT_ID} != $it"
} ?: ""
//language=sql
val query = """
SELECT
@@ -37,39 +35,9 @@ fun ThreadTable.getThreadsForBackup(db: SignalDatabase, exportState: ExportState
LEFT OUTER JOIN ${RecipientTable.TABLE_NAME} ON ${ThreadTable.TABLE_NAME}.${ThreadTable.RECIPIENT_ID} = ${RecipientTable.TABLE_NAME}.${RecipientTable.ID}
WHERE
${RecipientTable.TABLE_NAME}.${RecipientTable.TYPE} NOT IN (${RecipientTable.RecipientType.DISTRIBUTION_LIST.id}, ${RecipientTable.RecipientType.CALL_LINK.id})
$notReleaseNoteClause
"""
val cursor = readableDatabase.query(query)
return ChatArchiveExporter(cursor, db, exportState, includeImageWallpapers)
}
fun ThreadTable.getThreadGroupStatus(messageIds: Collection<Long>): Map<Long, Boolean> {
if (messageIds.isEmpty()) {
return emptyMap()
}
val out: MutableMap<Long, Boolean> = mutableMapOf()
val query = SqlUtil.buildFastCollectionQuery("${MessageTable.TABLE_NAME}.${MessageTable.ID}", messageIds)
readableDatabase
.select(
"${MessageTable.TABLE_NAME}.${MessageTable.ID}",
"${RecipientTable.TABLE_NAME}.${RecipientTable.TYPE}"
)
.from(
"""
${MessageTable.TABLE_NAME}
INNER JOIN ${ThreadTable.TABLE_NAME} ON ${MessageTable.TABLE_NAME}.${MessageTable.THREAD_ID} = ${ThreadTable.TABLE_NAME}.${ThreadTable.ID}
INNER JOIN ${RecipientTable.TABLE_NAME} ON ${ThreadTable.TABLE_NAME}.${ThreadTable.RECIPIENT_ID} = ${RecipientTable.TABLE_NAME}.${RecipientTable.ID}
"""
)
.where(query.where, query.whereArgs)
.run()
.forEach { cursor ->
val messageId = cursor.requireLong(MessageTable.ID)
val type = cursor.requireInt(RecipientTable.TYPE)
out[messageId] = type != RecipientTable.RecipientType.INDIVIDUAL.id
}
return out
}

View File

@@ -182,7 +182,7 @@ class ChatItemArchiveExporter(
val builder = record.toBasicChatItemBuilder(selfRecipientId, extraData.groupReceiptsById[id], exportState, backupStartTime)
transformTimer.emit("basic")
if (builder == null) {
if (builder == null || builder.authorId == exportState.releaseNoteRecipientId) {
continue
}
@@ -1639,7 +1639,7 @@ private fun ChatItem.validateChatItem(exportState: ExportState, selfRecipientId:
return null
}
if (this.incoming != null && this.authorId != exportState.releaseNoteRecipientId && exportState.recipientIdToAci[this.authorId] == null && exportState.recipientIdToE164[this.authorId] == null) {
if (this.incoming != null && exportState.recipientIdToAci[this.authorId] == null && exportState.recipientIdToE164[this.authorId] == null) {
Log.w(TAG, ExportSkips.incomingMessageAuthorDoesNotHaveAciOrE164(this.dateSent))
return null
}