diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt index b1a529179d..d67ecee517 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ArchiveErrorCases.kt @@ -51,6 +51,22 @@ object ExportSkips { return log(sentTimestamp, "Direct story reply has no body.") } + fun invalidChatItemStickerPackId(sentTimestamp: Long): String { + return log(sentTimestamp, "Sticker message had an invalid packId.") + } + + fun invalidChatItemStickerPackKey(sentTimestamp: Long): String { + return log(sentTimestamp, "Sticker message had an invalid packKey.") + } + + fun invalidStickerPackId(): String { + return log(0, "Sticker pack had an invalid packId.") + } + + fun invalidStickerPackKey(): String { + return log(0, "Sticker pack had an invalid packKey.") + } + private fun log(sentTimestamp: Long, message: String): String { return "[SKIP][$sentTimestamp] $message" } diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt index 4075879326..5255404141 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ChatItemArchiveExporter.kt @@ -306,7 +306,7 @@ class ChatItemArchiveExporter( val sticker = attachments?.firstOrNull { dbAttachment -> dbAttachment.isSticker } if (sticker?.stickerLocator != null) { - builder.stickerMessage = sticker.toRemoteStickerMessage(mediaArchiveEnabled = mediaArchiveEnabled, reactions = extraData.reactionsById[id]) + builder.stickerMessage = sticker.toRemoteStickerMessage(sentTimestamp = record.dateSent, mediaArchiveEnabled = mediaArchiveEnabled, reactions = extraData.reactionsById[id]) } else { val standardMessage = record.toRemoteStandardMessage( db = db, @@ -964,12 +964,27 @@ private fun BackupMessageRecord.toRemoteGiftBadgeUpdate(): BackupGiftBadge? { ) } -private fun DatabaseAttachment.toRemoteStickerMessage(mediaArchiveEnabled: Boolean, reactions: List?): StickerMessage { +private fun DatabaseAttachment.toRemoteStickerMessage(sentTimestamp: Long, mediaArchiveEnabled: Boolean, reactions: List?): StickerMessage? { val stickerLocator = this.stickerLocator!! + + val packId = try { + Hex.fromStringCondensed(stickerLocator.packId) + } catch (e: IOException) { + Log.w(TAG, ExportSkips.invalidChatItemStickerPackId(sentTimestamp)) + return null + } + + val packKey = try { + Hex.fromStringCondensed(stickerLocator.packKey) + } catch (e: IOException) { + Log.w(TAG, ExportSkips.invalidChatItemStickerPackKey(sentTimestamp)) + return null + } + return StickerMessage( sticker = Sticker( - packId = Hex.fromStringCondensed(stickerLocator.packId).toByteString(), - packKey = Hex.fromStringCondensed(stickerLocator.packKey).toByteString(), + packId = packId.toByteString(), + packKey = packKey.toByteString(), stickerId = stickerLocator.stickerId, emoji = stickerLocator.emoji, data_ = this.toRemoteMessageAttachment(mediaArchiveEnabled).pointer diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/StickerArchiveProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/StickerArchiveProcessor.kt index 8151a0a363..48689feaaf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/StickerArchiveProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/StickerArchiveProcessor.kt @@ -8,6 +8,8 @@ package org.thoughtcrime.securesms.backup.v2.processor import okio.ByteString.Companion.toByteString import org.signal.core.util.Hex import org.signal.core.util.insertInto +import org.signal.core.util.logging.Log +import org.thoughtcrime.securesms.backup.v2.ExportSkips import org.thoughtcrime.securesms.backup.v2.proto.Frame import org.thoughtcrime.securesms.backup.v2.proto.StickerPack import org.thoughtcrime.securesms.backup.v2.stream.BackupFrameEmitter @@ -18,6 +20,9 @@ import org.thoughtcrime.securesms.database.StickerTable.StickerPackRecordReader import org.thoughtcrime.securesms.database.model.StickerPackRecord import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.jobs.StickerPackDownloadJob +import java.io.IOException + +private val TAG = Log.tag(StickerArchiveProcessor::class) /** * Handles importing/exporting [StickerPack] frames for an archive. @@ -25,13 +30,12 @@ import org.thoughtcrime.securesms.jobs.StickerPackDownloadJob object StickerArchiveProcessor { fun export(db: SignalDatabase, emitter: BackupFrameEmitter) { StickerPackRecordReader(db.stickerTable.getAllStickerPacks()).use { reader -> - var record: StickerPackRecord? = reader.getNext() - while (record != null) { - if (record.isInstalled) { - val frame = record.toBackupFrame() + var record: StickerPackRecord? = null + while (reader.getNext()?.let { record = it } != null) { + if (record!!.isInstalled) { + val frame = record!!.toBackupFrame() ?: continue emitter.emit(frame) } - record = reader.getNext() } } } @@ -62,12 +66,24 @@ object StickerArchiveProcessor { } } -private fun StickerPackRecord.toBackupFrame(): Frame { - val packIdBytes = Hex.fromStringCondensed(packId) - val packKey = Hex.fromStringCondensed(packKey) +private fun StickerPackRecord.toBackupFrame(): Frame? { + val packIdBytes = try { + Hex.fromStringCondensed(this.packId) + } catch (e: IOException) { + Log.w(TAG, ExportSkips.invalidStickerPackId()) + return null + } + + val packKeyBytes = try { + Hex.fromStringCondensed(this.packKey) + } catch (e: IOException) { + Log.w(TAG, ExportSkips.invalidStickerPackKey()) + return null + } + val pack = StickerPack( packId = packIdBytes.toByteString(), - packKey = packKey.toByteString() + packKey = packKeyBytes.toByteString() ) return Frame(stickerPack = pack) }