From ff4364586b146aadb66e59b0111b375fb4aee637 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 24 Sep 2024 12:41:27 -0400 Subject: [PATCH] Fix issue with attachments failing to download. --- .../database/AttachmentTableTest_deduping.kt | 10 ++++++++++ .../securesms/database/AttachmentTable.kt | 2 ++ .../helpers/SignalDatabaseMigrations.kt | 13 ++++++++----- .../migration/V250_ClearUploadTimestampV2.kt | 19 +++++++++++++++++++ ...x.kt => V251_ArchiveTransferStateIndex.kt} | 4 +++- ...V252_AttachmentOffloadRestoredAtColumn.kt} | 14 +++++++++++++- 6 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V250_ClearUploadTimestampV2.kt rename app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/{V248_ArchiveTransferStateIndex.kt => V251_ArchiveTransferStateIndex.kt} (80%) rename app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/{V249_AttachmentOffloadRestoredAtColumn.kt => V252_AttachmentOffloadRestoredAtColumn.kt} (54%) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest_deduping.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest_deduping.kt index e5598f1f26..17912fd2de 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest_deduping.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest_deduping.kt @@ -253,6 +253,15 @@ class AttachmentTableTest_deduping { assertDoesNotHaveRemoteFields(id2) assertArchiveFieldsMatch(id1, id2) + + upload(id2) + + assertDataFilesAreTheSame(id1, id2) + assertDataHashStartMatches(id1, id2) + assertDataHashEndMatches(id1, id2) + assertSkipTransform(id1, true) + assertSkipTransform(id2, true) + assertRemoteFieldsMatch(id1, id2) } // This isn't so much "desirable behavior" as it is documenting how things work. @@ -653,6 +662,7 @@ class AttachmentTableTest_deduping { } fun upload(attachmentId: AttachmentId, uploadTimestamp: Long = System.currentTimeMillis()) { + SignalDatabase.attachments.createKeyIvIfNecessary(attachmentId) SignalDatabase.attachments.finalizeAttachmentAfterUpload(attachmentId, createUploadResult(attachmentId, uploadTimestamp)) val attachment = SignalDatabase.attachments.getAttachment(attachmentId)!! diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt index 831c9a21e8..51e36fbfa3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt @@ -1250,6 +1250,8 @@ class AttachmentTable( TRANSFER_STATE to TRANSFER_PROGRESS_DONE, CDN_NUMBER to uploadResult.cdnNumber, REMOTE_LOCATION to uploadResult.remoteId.toString(), + REMOTE_KEY to Base64.encodeWithPadding(uploadResult.key), + REMOTE_IV to uploadResult.iv, REMOTE_DIGEST to uploadResult.digest, REMOTE_INCREMENTAL_DIGEST to uploadResult.incrementalDigest, REMOTE_INCREMENTAL_DIGEST_CHUNK_SIZE to uploadResult.incrementalDigestChunkSize, diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt index c22ff752e5..5ea30a9f17 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt @@ -106,8 +106,9 @@ import org.thoughtcrime.securesms.database.helpers.migration.V244_AttachmentRemo import org.thoughtcrime.securesms.database.helpers.migration.V245_DeletionTimestampOnCallLinks import org.thoughtcrime.securesms.database.helpers.migration.V246_DropThumbnailCdnFromAttachments import org.thoughtcrime.securesms.database.helpers.migration.V247_ClearUploadTimestamp -import org.thoughtcrime.securesms.database.helpers.migration.V248_ArchiveTransferStateIndex -import org.thoughtcrime.securesms.database.helpers.migration.V249_AttachmentOffloadRestoredAtColumn +import org.thoughtcrime.securesms.database.helpers.migration.V250_ClearUploadTimestampV2 +import org.thoughtcrime.securesms.database.helpers.migration.V251_ArchiveTransferStateIndex +import org.thoughtcrime.securesms.database.helpers.migration.V252_AttachmentOffloadRestoredAtColumn /** * Contains all of the database migrations for [SignalDatabase]. Broken into a separate file for cleanliness. @@ -216,11 +217,13 @@ object SignalDatabaseMigrations { 245 to V245_DeletionTimestampOnCallLinks, 246 to V246_DropThumbnailCdnFromAttachments, 247 to V247_ClearUploadTimestamp, - 248 to V248_ArchiveTransferStateIndex, - 249 to V249_AttachmentOffloadRestoredAtColumn + // 248 and 249 were originally in 7.18.0, but are now skipped because we needed to hotfix 7.17.6 after 7.18.0 was already released. + 250 to V250_ClearUploadTimestampV2, + 251 to V251_ArchiveTransferStateIndex, + 252 to V252_AttachmentOffloadRestoredAtColumn ) - const val DATABASE_VERSION = 249 + const val DATABASE_VERSION = 252 @JvmStatic fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V250_ClearUploadTimestampV2.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V250_ClearUploadTimestampV2.kt new file mode 100644 index 0000000000..1225d5a87c --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V250_ClearUploadTimestampV2.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.database.helpers.migration + +import android.app.Application +import net.zetetic.database.sqlcipher.SQLiteDatabase + +/** + * Turns out we need to run [V247_ClearUploadTimestamp] again, because there was another situation where we had mismatching transit data across duplicates. + */ +@Suppress("ClassName") +object V250_ClearUploadTimestampV2 : SignalDatabaseMigration { + override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + db.execSQL("UPDATE attachment SET upload_timestamp = 1 WHERE upload_timestamp > 0") + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V248_ArchiveTransferStateIndex.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V251_ArchiveTransferStateIndex.kt similarity index 80% rename from app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V248_ArchiveTransferStateIndex.kt rename to app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V251_ArchiveTransferStateIndex.kt index ffc2755375..ec4e9f52c4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V248_ArchiveTransferStateIndex.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V251_ArchiveTransferStateIndex.kt @@ -10,9 +10,11 @@ import net.zetetic.database.sqlcipher.SQLiteDatabase /** * Adds an index to improve the perf of counting and filtering attachment rows by their transfer state. + * + * Important: May be ran twice depending on people's upgrade path during the beta. */ @Suppress("ClassName") -object V248_ArchiveTransferStateIndex : SignalDatabaseMigration { +object V251_ArchiveTransferStateIndex : SignalDatabaseMigration { override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { db.execSQL("CREATE INDEX IF NOT EXISTS attachment_archive_transfer_state ON attachment (archive_transfer_state)") } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V249_AttachmentOffloadRestoredAtColumn.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V252_AttachmentOffloadRestoredAtColumn.kt similarity index 54% rename from app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V249_AttachmentOffloadRestoredAtColumn.kt rename to app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V252_AttachmentOffloadRestoredAtColumn.kt index e0e51beba0..c16e0c1c76 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V249_AttachmentOffloadRestoredAtColumn.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V252_AttachmentOffloadRestoredAtColumn.kt @@ -7,13 +7,25 @@ package org.thoughtcrime.securesms.database.helpers.migration import android.app.Application import net.zetetic.database.sqlcipher.SQLiteDatabase +import org.signal.core.util.SqlUtil +import org.signal.core.util.logging.Log /** * Adds the offload_restored_at column to attachments. + * + * Important: May be ran twice depending on people's upgrade path during the beta. */ @Suppress("ClassName") -object V249_AttachmentOffloadRestoredAtColumn : SignalDatabaseMigration { +object V252_AttachmentOffloadRestoredAtColumn : SignalDatabaseMigration { + + private val TAG = Log.tag(V252_AttachmentOffloadRestoredAtColumn::class) + override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + if (SqlUtil.columnExists(db, "attachment", "offload_restored_at")) { + Log.i(TAG, "Already ran migration!") + return + } + db.execSQL("ALTER TABLE attachment ADD COLUMN offload_restored_at INTEGER DEFAULT 0;") } }