55
66package org.thoughtcrime.securesms.backup.v2
77
8+ import org.signal.core.util.isNotNullOrBlank
89import org.signal.libsignal.messagebackup.MessageBackup
910import org.signal.libsignal.messagebackup.ValidationError
11+ import org.thoughtcrime.securesms.database.SignalDatabase
1012import org.thoughtcrime.securesms.keyvalue.SignalStore
13+ import org.thoughtcrime.securesms.util.isStory
14+ import org.thoughtcrime.securesms.util.isStoryReaction
1115import org.whispersystems.signalservice.api.backup.MessageBackupKey
1216import java.io.File
1317import java.io.IOException
@@ -31,13 +35,61 @@ object ArchiveValidator {
3135 } catch (e: IOException ) {
3236 ValidationResult .ReadError (e)
3337 } catch (e: ValidationError ) {
34- ValidationResult .ValidationError (e)
38+ val sentTimestamp = " \\ d{10,}+" .toRegex().find(e.message ? : " " )?.value?.toLongOrNull()
39+ ValidationResult .ValidationError (
40+ exception = e,
41+ messageDetails = sentTimestamp?.let { fetchMessageDetails(it) } ? : emptyList()
42+ )
43+ }
44+ }
45+
46+ private fun fetchMessageDetails (sentTimestamp : Long ): List <MessageDetails > {
47+ val messages = SignalDatabase .messages.getMessagesBySentTimestamp(sentTimestamp)
48+ return messages.map {
49+ MessageDetails (
50+ messageId = it.id,
51+ dateSent = it.dateSent,
52+ threadId = it.threadId,
53+ threadRecipientId = SignalDatabase .threads.getRecipientForThreadId(it.threadId)?.id?.toLong() ? : 0L ,
54+ type = it.type,
55+ fromRecipientId = it.fromRecipient.id.toLong(),
56+ toRecipientId = it.toRecipient.id.toLong(),
57+ hasBody = it.body.isNotNullOrBlank(),
58+ hasExtras = it.messageExtras != null ,
59+ outgoing = it.isOutgoing,
60+ viewOnce = it.isViewOnce,
61+ isStory = it.isStory(),
62+ isStoryReaction = it.isStoryReaction(),
63+ originalMessageId = it.originalMessageId?.id ? : 0 ,
64+ isLatestRevision = it.isLatestRevision
65+ )
3566 }
3667 }
3768
3869 sealed interface ValidationResult {
3970 data object Success : ValidationResult
4071 data class ReadError (val exception : IOException ) : ValidationResult
41- data class ValidationError (val exception : org.signal.libsignal.messagebackup.ValidationError ) : ValidationResult
72+ data class ValidationError (
73+ val exception : org.signal.libsignal.messagebackup.ValidationError ,
74+ val messageDetails : List <MessageDetails >
75+ ) : ValidationResult
4276 }
77+
78+ data class MessageDetails (
79+ val messageId : Long ,
80+ val dateSent : Long ,
81+ val threadId : Long ,
82+ val threadRecipientId : Long ,
83+ val type : Long ,
84+ val fromRecipientId : Long ,
85+ val toRecipientId : Long ,
86+ val hasBody : Boolean ,
87+ val hasExtras : Boolean ,
88+ val outgoing : Boolean ,
89+ val viewOnce : Boolean ,
90+ val isStory : Boolean ,
91+ val isStoryReaction : Boolean ,
92+ val originalMessageId : Long ,
93+ val isLatestRevision : Boolean
94+ )
4395}
0 commit comments