mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-19 16:19:33 +01:00
Do not include release notes in chat exports.
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -3168,6 +3168,10 @@ class AttachmentTable(
|
||||
}
|
||||
|
||||
private fun buildAttachmentsThatNeedUploadQuery(transferStateFilter: String = "$ARCHIVE_TRANSFER_STATE IN (${ArchiveTransferState.NONE.value}, ${ArchiveTransferState.TEMPORARY_FAILURE.value})"): String {
|
||||
val notReleaseChannelClause = SignalStore.releaseChannel.releaseChannelRecipientId?.let {
|
||||
"(${MessageTable.TABLE_NAME}.${MessageTable.FROM_RECIPIENT_ID} != ${it.toLong()}) AND"
|
||||
} ?: ""
|
||||
|
||||
return """
|
||||
$transferStateFilter AND
|
||||
$DATA_FILE NOT NULL AND
|
||||
@@ -3176,6 +3180,7 @@ class AttachmentTable(
|
||||
$TRANSFER_STATE = $TRANSFER_PROGRESS_DONE AND
|
||||
(${MessageTable.STORY_TYPE} = 0 OR ${MessageTable.STORY_TYPE} IS NULL) AND
|
||||
(${MessageTable.TABLE_NAME}.${MessageTable.EXPIRES_IN} <= 0 OR ${MessageTable.TABLE_NAME}.${MessageTable.EXPIRES_IN} > ${ChatItemArchiveExporter.EXPIRATION_CUTOFF.inWholeMilliseconds}) AND
|
||||
$notReleaseChannelClause
|
||||
$CONTENT_TYPE != '${MediaUtil.LONG_TEXT}' AND
|
||||
${MessageTable.TABLE_NAME}.${MessageTable.VIEW_ONCE} = 0
|
||||
"""
|
||||
|
||||
@@ -151,6 +151,7 @@ import org.thoughtcrime.securesms.database.helpers.migration.V294_RemoveLastReso
|
||||
import org.thoughtcrime.securesms.database.helpers.migration.V295_AddLastRestoreKeyTypeTableIfMissingMigration
|
||||
import org.thoughtcrime.securesms.database.helpers.migration.V296_RemovePollVoteConstraint
|
||||
import org.thoughtcrime.securesms.database.helpers.migration.V297_AddPinnedMessageColumns
|
||||
import org.thoughtcrime.securesms.database.helpers.migration.V298_DoNotBackupReleaseNotes
|
||||
import org.thoughtcrime.securesms.database.SQLiteDatabase as SignalSqliteDatabase
|
||||
|
||||
/**
|
||||
@@ -308,10 +309,11 @@ object SignalDatabaseMigrations {
|
||||
294 to V294_RemoveLastResortKeyTupleColumnConstraintMigration,
|
||||
295 to V295_AddLastRestoreKeyTypeTableIfMissingMigration,
|
||||
296 to V296_RemovePollVoteConstraint,
|
||||
297 to V297_AddPinnedMessageColumns
|
||||
297 to V297_AddPinnedMessageColumns,
|
||||
298 to V298_DoNotBackupReleaseNotes
|
||||
)
|
||||
|
||||
const val DATABASE_VERSION = 297
|
||||
const val DATABASE_VERSION = 298
|
||||
|
||||
@JvmStatic
|
||||
fun migrate(context: Application, db: SignalSqliteDatabase, oldVersion: Int, newVersion: Int) {
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright 2025 Signal Messenger, LLC
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
package org.thoughtcrime.securesms.database.helpers.migration
|
||||
|
||||
import android.app.Application
|
||||
import org.signal.core.util.SqlUtil
|
||||
import org.signal.core.util.logging.Log
|
||||
import org.signal.core.util.requireLong
|
||||
import org.thoughtcrime.securesms.database.KeyValueDatabase
|
||||
import org.thoughtcrime.securesms.database.SQLiteDatabase
|
||||
|
||||
object V298_DoNotBackupReleaseNotes : SignalDatabaseMigration {
|
||||
|
||||
private val TAG = Log.tag(V298_DoNotBackupReleaseNotes::class.java)
|
||||
|
||||
override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
|
||||
val releaseNoteRecipientId = getReleaseNoteRecipientId(context) ?: return
|
||||
migrateWithRecipientId(db, releaseNoteRecipientId)
|
||||
}
|
||||
|
||||
fun migrateWithRecipientId(db: SQLiteDatabase, releaseNoteRecipientId: Long) {
|
||||
db.execSQL(
|
||||
"""
|
||||
UPDATE attachment
|
||||
SET archive_transfer_state = 0
|
||||
WHERE message_id IN (
|
||||
SELECT _id FROM message WHERE from_recipient_id = $releaseNoteRecipientId
|
||||
)
|
||||
"""
|
||||
)
|
||||
}
|
||||
|
||||
private fun getReleaseNoteRecipientId(context: Application): Long? {
|
||||
return if (KeyValueDatabase.exists(context)) {
|
||||
val keyValueDatabase = KeyValueDatabase.getInstance(context).readableDatabase
|
||||
keyValueDatabase.query("key_value", arrayOf("value"), "key = ?", SqlUtil.buildArgs("releasechannel.recipient_id"), null, null, null).use { cursor ->
|
||||
if (cursor.moveToFirst()) {
|
||||
cursor.requireLong("value")
|
||||
} else {
|
||||
Log.w(TAG, "Release note channel recipient ID not found in KV database!")
|
||||
null
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Log.w(TAG, "Pre-KV database, not doing anything.")
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user