Convert incoming messages from self into outgoing messages in backup export

This commit is contained in:
Harry 2024-12-06 09:18:02 -08:00 committed by GitHub
parent 8b49b1ee22
commit 3312ce6e5e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 34 additions and 5 deletions

View File

@ -126,10 +126,32 @@ extension MessageBackupTSIncomingMessageArchiver: MessageBackupTSMessageEditHist
return errorResult
}
let incomingMessageDetails: BackupProto_ChatItem.IncomingMessageDetails = buildIncomingMessageDetails(
incomingMessage,
editRecord: editRecord
)
let directionalDetails: BackupProto_ChatItem.OneOf_DirectionalDetails
if author == context.recipientContext.localRecipientId {
// Incoming messages from self are not allowed in backups
// but have been observed in real-world databases.
// If we encounter these, fudge them a bit and pretend
// they were outgoing messages.
var outgoingDetails = BackupProto_ChatItem.OutgoingMessageDetails()
var sendStatus = BackupProto_SendStatus()
sendStatus.recipientID = context.recipientContext.localRecipientId.value
sendStatus.timestamp = incomingMessage.receivedAtTimestamp
var viewedStatus = BackupProto_SendStatus.Viewed()
viewedStatus.sealedSender = incomingMessage.wasReceivedByUD
sendStatus.deliveryStatus = .viewed(viewedStatus)
outgoingDetails.sendStatus = [sendStatus]
directionalDetails = .outgoing(outgoingDetails)
partialErrors.append(.archiveFrameError(
.incomingMessageFromSelf,
incomingMessage.uniqueInteractionId
))
} else {
let incomingMessageDetails: BackupProto_ChatItem.IncomingMessageDetails = buildIncomingMessageDetails(
incomingMessage,
editRecord: editRecord
)
directionalDetails = .incoming(incomingMessageDetails)
}
let expireStartDate: UInt64?
if incomingMessage.expireStartedAt > 0 {
@ -140,7 +162,7 @@ extension MessageBackupTSIncomingMessageArchiver: MessageBackupTSMessageEditHist
let details = Details(
author: author,
directionalDetails: .incoming(incomingMessageDetails),
directionalDetails: directionalDetails,
dateCreated: incomingMessage.timestamp,
expireStartDate: expireStartDate,
expiresInMs: UInt64(incomingMessage.expiresInSeconds) * 1000,

View File

@ -60,6 +60,8 @@ extension MessageBackup {
/// An incoming message has an invalid or missing author address information,
/// causing the message to be skipped.
case invalidIncomingMessageAuthor
/// An incoming message came from the self recipient.
case incomingMessageFromSelf
/// An outgoing message has an invalid or missing recipient address information,
/// causing the message to be skipped.
case invalidOutgoingMessageRecipient
@ -257,6 +259,7 @@ extension MessageBackup {
.distributionListMissingDeletionTimestamp,
.invalidDistributionListMemberAddress,
.invalidIncomingMessageAuthor,
.incomingMessageFromSelf,
.invalidOutgoingMessageRecipient,
.invalidQuoteAuthor,
.linkPreviewMissingUrl,
@ -374,6 +377,10 @@ extension MessageBackup {
// We've seen real world databases with invalid link previews; we
// just drop these on export and just issue a warning.
return .warning
case .incomingMessageFromSelf:
// We've seen real world databases with messages from self; we
// fudge these into outgoing messages on export and issue a warning.
return .warning
}
}
}