Only allow revisions on standard and direct-story-reply messages

This commit is contained in:
Sasha Weiss 2025-01-28 12:58:43 -08:00 committed by GitHub
parent cdd53152dd
commit fe1d755d37
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 50 additions and 2 deletions

View File

@ -161,6 +161,39 @@ final class MessageBackupTSMessageEditHistoryArchiver<MessageType: TSMessage>
context: MessageBackup.ChatArchivingContext,
builder: Builder
) -> MessageBackup.ArchiveInteractionResult<Void> {
let unexpectedRevisionsMessageType: ArchiveFrameError.ErrorType.UnexpectedRevisionsMessageType?
switch latestRevisionDetails.chatItemType {
case .remoteDeletedMessage:
// Remote-deleted messages with edit history delete the contents of
// their prior revisions, but leave the revisions around as
// placeholders. We don't want to archive those, nor do we need to
// produce an error, so we bail early.
return .success(())
case .standardMessage, .directStoryReplyMessage:
// These message types are the only ones expected/allowed to have
// edit history we want to archive. If we unexpectedly find it on
// another message type, we'll drop it and record an error.
unexpectedRevisionsMessageType = nil
case .contactMessage:
unexpectedRevisionsMessageType = .contactMessgae
case .stickerMessage:
unexpectedRevisionsMessageType = .stickerMessage
case .updateMessage:
unexpectedRevisionsMessageType = .updateMessage
case .paymentNotification:
unexpectedRevisionsMessageType = .paymentNotification
case .giftBadge:
unexpectedRevisionsMessageType = .giftBadge
case .viewOnceMessage:
unexpectedRevisionsMessageType = .viewOnceMessage
}
if let unexpectedRevisionsMessageType {
return .partialFailure((), [.archiveFrameError(
.unexpectedRevisionsOnMessage(unexpectedRevisionsMessageType),
latestRevisionMessage.uniqueInteractionId
)])
}
var partialErrors = [ArchiveFrameError]()
/// The edit history, from oldest revision to newest. This ordering

View File

@ -14,6 +14,16 @@ extension MessageBackup {
/// Error while archiving a single frame.
public struct ArchiveFrameError<AppIdType: MessageBackupLoggableId>: MessageBackupLoggableError {
public enum ErrorType {
/// Message types for which edit history is unexpected.
public enum UnexpectedRevisionsMessageType {
case contactMessgae
case stickerMessage
case updateMessage
case paymentNotification
case giftBadge
case viewOnceMessage
}
/// An error occurred serializing the proto.
/// - Note
/// Logging the raw error is safe, as it'll just contain proto field
@ -216,6 +226,9 @@ extension MessageBackup {
case adHocCallDoesNotHaveCallLinkAsConversationId
/// An ad hoc call has an invalid start timestamp.
case invalidAdHocCallTimestamp
/// A message unexpectedly had edit history.
case unexpectedRevisionsOnMessage(UnexpectedRevisionsMessageType)
}
private let type: ErrorType
@ -331,7 +344,8 @@ extension MessageBackup {
.unviewedViewOnceMessageTooManyAttachments,
.callLinkRestrictionsUnknown,
.adHocCallDoesNotHaveCallLinkAsConversationId,
.invalidAdHocCallTimestamp:
.invalidAdHocCallTimestamp,
.unexpectedRevisionsOnMessage:
// Log any others as we see them.
return nil
}
@ -396,7 +410,8 @@ extension MessageBackup {
.unviewedViewOnceMessageTooManyAttachments,
.callLinkRestrictionsUnknown,
.adHocCallDoesNotHaveCallLinkAsConversationId,
.invalidAdHocCallTimestamp:
.invalidAdHocCallTimestamp,
.unexpectedRevisionsOnMessage:
return .error
case .contactThreadMissingAddress:
// We've seen real-world databases with TSContactThreads that