Update to latest backup protos; Bump to libsignal v0.73.1

This commit is contained in:
Cody Henthorne
2025-05-30 14:09:30 -04:00
parent 340b94f849
commit 13ddd067ef
261 changed files with 368 additions and 94 deletions

View File

@@ -54,6 +54,7 @@ import org.signal.core.util.readToSingleObject
import org.signal.core.util.requireBlob
import org.signal.core.util.requireBoolean
import org.signal.core.util.requireInt
import org.signal.core.util.requireIntOrNull
import org.signal.core.util.requireLong
import org.signal.core.util.requireNonNullBlob
import org.signal.core.util.requireNonNullString
@@ -264,7 +265,7 @@ class AttachmentTable(
$UPLOAD_TIMESTAMP INTEGER DEFAULT 0,
$DATA_HASH_START TEXT DEFAULT NULL,
$DATA_HASH_END TEXT DEFAULT NULL,
$ARCHIVE_CDN INTEGER DEFAULT 0,
$ARCHIVE_CDN INTEGER DEFAULT NULL,
$ARCHIVE_TRANSFER_FILE TEXT DEFAULT NULL,
$ARCHIVE_TRANSFER_STATE INTEGER DEFAULT ${ArchiveTransferState.NONE.value},
$THUMBNAIL_FILE TEXT DEFAULT NULL,
@@ -705,7 +706,7 @@ class AttachmentTable(
.update(TABLE_NAME)
.values(
ARCHIVE_TRANSFER_STATE to ArchiveTransferState.NONE.value,
ARCHIVE_CDN to 0
ARCHIVE_CDN to null
)
.where("$REMOTE_DIGEST = ?", digest)
.run()
@@ -1977,7 +1978,7 @@ class AttachmentTable(
displayOrder = jsonObject.getInt(DISPLAY_ORDER),
uploadTimestamp = jsonObject.getLong(UPLOAD_TIMESTAMP),
dataHash = jsonObject.getString(DATA_HASH_END),
archiveCdn = jsonObject.getInt(ARCHIVE_CDN),
archiveCdn = if (jsonObject.isNull(ARCHIVE_CDN)) null else jsonObject.getInt(ARCHIVE_CDN),
thumbnailRestoreState = ThumbnailRestoreState.deserialize(jsonObject.getInt(THUMBNAIL_RESTORE_STATE)),
archiveTransferState = ArchiveTransferState.deserialize(jsonObject.getInt(ARCHIVE_TRANSFER_STATE)),
uuid = UuidUtil.parseOrNull(jsonObject.getString(ATTACHMENT_UUID))
@@ -2064,7 +2065,7 @@ class AttachmentTable(
writableDatabase
.update(TABLE_NAME)
.values(
ARCHIVE_CDN to 0
ARCHIVE_CDN to null
)
.where(query.where, query.whereArgs)
.run()
@@ -2075,7 +2076,7 @@ class AttachmentTable(
writableDatabase
.updateAll(TABLE_NAME)
.values(
ARCHIVE_CDN to 0,
ARCHIVE_CDN to null,
ARCHIVE_TRANSFER_STATE to ArchiveTransferState.NONE.value
)
.run()
@@ -2630,7 +2631,7 @@ class AttachmentTable(
displayOrder = cursor.requireInt(DISPLAY_ORDER),
uploadTimestamp = cursor.requireLong(UPLOAD_TIMESTAMP),
dataHash = cursor.requireString(DATA_HASH_END),
archiveCdn = cursor.requireInt(ARCHIVE_CDN),
archiveCdn = cursor.requireIntOrNull(ARCHIVE_CDN),
thumbnailRestoreState = ThumbnailRestoreState.deserialize(cursor.requireInt(THUMBNAIL_RESTORE_STATE)),
archiveTransferState = ArchiveTransferState.deserialize(cursor.requireInt(ARCHIVE_TRANSFER_STATE)),
uuid = UuidUtil.parseOrNull(cursor.requireString(ATTACHMENT_UUID))
@@ -2658,7 +2659,7 @@ class AttachmentTable(
hashEnd = this.requireString(DATA_HASH_END),
transformProperties = TransformProperties.parse(this.requireString(TRANSFORM_PROPERTIES)),
uploadTimestamp = this.requireLong(UPLOAD_TIMESTAMP),
archiveCdn = this.requireInt(ARCHIVE_CDN),
archiveCdn = this.requireIntOrNull(ARCHIVE_CDN),
archiveTransferState = this.requireInt(ARCHIVE_TRANSFER_STATE),
thumbnailFile = this.requireString(THUMBNAIL_FILE),
thumbnailRandom = this.requireBlob(THUMBNAIL_RANDOM),
@@ -2726,7 +2727,7 @@ class AttachmentTable(
val hashEnd: String?,
val transformProperties: TransformProperties,
val uploadTimestamp: Long,
val archiveCdn: Int,
val archiveCdn: Int?,
val archiveTransferState: Int,
val thumbnailFile: String?,
val thumbnailRandom: ByteArray?,

View File

@@ -15,6 +15,7 @@ import org.signal.core.util.readToList
import org.signal.core.util.readToSet
import org.signal.core.util.requireBoolean
import org.signal.core.util.requireInt
import org.signal.core.util.requireIntOrNull
import org.signal.core.util.requireNonNullBlob
import org.signal.core.util.requireNonNullString
import org.signal.core.util.select
@@ -257,7 +258,7 @@ class BackupMediaSnapshotTable(context: Context, database: SignalDatabase) : Dat
class ArchiveMediaItem(
val mediaId: String,
val thumbnailMediaId: String,
val cdn: Int,
val cdn: Int?,
val digest: ByteArray
)
@@ -268,7 +269,7 @@ class BackupMediaSnapshotTable(context: Context, database: SignalDatabase) : Dat
class MediaEntry(
val mediaId: String,
val cdn: Int,
val cdn: Int?,
val digest: ByteArray,
val isThumbnail: Boolean
) {
@@ -276,7 +277,7 @@ class BackupMediaSnapshotTable(context: Context, database: SignalDatabase) : Dat
fun fromCursor(cursor: Cursor): MediaEntry {
return MediaEntry(
mediaId = cursor.requireNonNullString(MEDIA_ID),
cdn = cursor.requireInt(CDN),
cdn = cursor.requireIntOrNull(CDN),
digest = cursor.requireNonNullBlob(REMOTE_DIGEST),
isThumbnail = cursor.requireBoolean(IS_THUMBNAIL)
)

View File

@@ -130,6 +130,7 @@ import org.thoughtcrime.securesms.database.helpers.migration.V272_UpdateUnreadCo
import org.thoughtcrime.securesms.database.helpers.migration.V273_FixUnreadOriginalMessages
import org.thoughtcrime.securesms.database.helpers.migration.V274_BackupMediaSnapshotLastSeenOnRemote
import org.thoughtcrime.securesms.database.helpers.migration.V275_EnsureDefaultAllChatsFolder
import org.thoughtcrime.securesms.database.helpers.migration.V276_AttachmentCdnDefaultValueMigration
import org.thoughtcrime.securesms.database.SQLiteDatabase as SignalSqliteDatabase
/**
@@ -265,10 +266,11 @@ object SignalDatabaseMigrations {
272 to V272_UpdateUnreadCountIndices,
273 to V273_FixUnreadOriginalMessages,
274 to V274_BackupMediaSnapshotLastSeenOnRemote,
275 to V275_EnsureDefaultAllChatsFolder
275 to V275_EnsureDefaultAllChatsFolder,
276 to V276_AttachmentCdnDefaultValueMigration
)
const val DATABASE_VERSION = 275
const val DATABASE_VERSION = 276
@JvmStatic
fun migrate(context: Application, db: SignalSqliteDatabase, oldVersion: Int, newVersion: Int) {

View File

@@ -0,0 +1,108 @@
/*
* 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.Stopwatch
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.database.SQLiteDatabase
/**
* We want to be able to distinguish between an unset CDN (null) and CDN 0. But we default the current CDN values to zero.
* This migration updates things so that the CDN columns default to null. We also consider all current CDN 0's to actually be unset values.
*/
object V276_AttachmentCdnDefaultValueMigration : SignalDatabaseMigration {
private val TAG = Log.tag(V276_AttachmentCdnDefaultValueMigration::class)
override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
val stopwatch = Stopwatch("v276")
db.execSQL("UPDATE attachment SET archive_cdn = NULL WHERE archive_cdn = 0")
stopwatch.split("fix-old-data")
db.execSQL(
"""
CREATE TABLE attachment_tmp (
_id INTEGER PRIMARY KEY AUTOINCREMENT,
message_id INTEGER,
content_type TEXT,
remote_key TEXT,
remote_location TEXT,
remote_digest BLOB,
remote_incremental_digest BLOB,
remote_incremental_digest_chunk_size INTEGER DEFAULT 0,
cdn_number INTEGER DEFAULT 0,
transfer_state INTEGER,
transfer_file TEXT DEFAULT NULL,
data_file TEXT,
data_size INTEGER,
data_random BLOB,
file_name TEXT,
fast_preflight_id TEXT,
voice_note INTEGER DEFAULT 0,
borderless INTEGER DEFAULT 0,
video_gif INTEGER DEFAULT 0,
quote INTEGER DEFAULT 0,
width INTEGER DEFAULT 0,
height INTEGER DEFAULT 0,
caption TEXT DEFAULT NULL,
sticker_pack_id TEXT DEFAULT NULL,
sticker_pack_key DEFAULT NULL,
sticker_id INTEGER DEFAULT -1,
sticker_emoji STRING DEFAULT NULL,
blur_hash TEXT DEFAULT NULL,
transform_properties TEXT DEFAULT NULL,
display_order INTEGER DEFAULT 0,
upload_timestamp INTEGER DEFAULT 0,
data_hash_start TEXT DEFAULT NULL,
data_hash_end TEXT DEFAULT NULL,
archive_cdn INTEGER DEFAULT NULL,
archive_transfer_file TEXT DEFAULT NULL,
archive_transfer_state INTEGER DEFAULT 0,
thumbnail_file TEXT DEFAULT NULL,
thumbnail_random BLOB DEFAULT NULL,
thumbnail_restore_state INTEGER DEFAULT 0,
attachment_uuid TEXT DEFAULT NULL,
remote_iv BLOB DEFAULT NULL,
offload_restored_at INTEGER DEFAULT 0
)
"""
)
stopwatch.split("create-new-table")
db.execSQL("INSERT INTO attachment_tmp SELECT * FROM attachment")
stopwatch.split("copy-data")
db.execSQL("DROP TABLE attachment")
stopwatch.split("drop-table")
db.execSQL("ALTER TABLE attachment_tmp RENAME TO attachment")
stopwatch.split("rename-table")
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_message_id_index ON attachment (message_id);")
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_transfer_state_index ON attachment (transfer_state);")
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_sticker_pack_id_index ON attachment (sticker_pack_id);")
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_data_hash_start_index ON attachment (data_hash_start);")
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_data_hash_end_index ON attachment (data_hash_end);")
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_data_index ON attachment (data_file);")
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_archive_transfer_state ON attachment (archive_transfer_state);")
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_remote_digest_index ON attachment (remote_digest);")
stopwatch.split("create-indexes")
db.execSQL(
"""
CREATE TRIGGER msl_attachment_delete AFTER DELETE ON attachment
BEGIN
DELETE FROM msl_payload WHERE _id IN (SELECT payload_id FROM msl_message WHERE msl_message.message_id = old.message_id);
END
"""
)
stopwatch.split("create-triggers")
stopwatch.stop(TAG)
}
}