Add better "unimplemented" handling for unrecognized frame types

This commit is contained in:
Sasha Weiss 2024-04-01 15:26:25 -07:00 committed by GitHub
parent 34f6206ad8
commit dbff017cde
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 128 additions and 21 deletions

View File

@ -960,7 +960,7 @@
66CD25642B06949C00139E17 /* MessageBackupAccountDataArchiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66CD25632B06949C00139E17 /* MessageBackupAccountDataArchiver.swift */; };
66CD25662B0695F400139E17 /* MessageBackupChatArchiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66CD25652B0695F400139E17 /* MessageBackupChatArchiver.swift */; };
66CD25682B06960F00139E17 /* MessageBackupChatItemArchiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66CD25672B06960F00139E17 /* MessageBackupChatItemArchiver.swift */; };
66CD256A2B06963200139E17 /* CloudBackupStickerPackArchiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66CD25692B06963200139E17 /* CloudBackupStickerPackArchiver.swift */; };
66CD256A2B06963200139E17 /* MessageBackupStickerPackArchiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66CD25692B06963200139E17 /* MessageBackupStickerPackArchiver.swift */; };
66CD256C2B06967900139E17 /* MessageBackupCallArchiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66CD256B2B06967900139E17 /* MessageBackupCallArchiver.swift */; };
66CD256E2B06E14F00139E17 /* MessageBackupContactRecipientArchiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66CD256D2B06E14F00139E17 /* MessageBackupContactRecipientArchiver.swift */; };
66CD25702B06E29B00139E17 /* MessageBackupRecipientDestinationArchiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66CD256F2B06E29B00139E17 /* MessageBackupRecipientDestinationArchiver.swift */; };
@ -1659,6 +1659,7 @@
D90D4D802BBB45880097C573 /* BackupProtoThreadMergeChatUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D90D4D712BBB45880097C573 /* BackupProtoThreadMergeChatUpdate.swift */; };
D90D4D812BBB45880097C573 /* BackupProtoSessionSwitchoverChatUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D90D4D722BBB45880097C573 /* BackupProtoSessionSwitchoverChatUpdate.swift */; };
D90D4D822BBB45880097C573 /* BackupProtoStandardMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D90D4D732BBB45880097C573 /* BackupProtoStandardMessage.swift */; };
D90D4D842BBB61680097C573 /* MessageBackupEmptyFrameId.swift in Sources */ = {isa = PBXBuildFile; fileRef = D90D4D832BBB61680097C573 /* MessageBackupEmptyFrameId.swift */; };
D9106DFF2AC1FEFD007ABFE6 /* EmptyForCodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9106DFE2AC1FEFD007ABFE6 /* EmptyForCodable.swift */; };
D9106E022AC20066007ABFE6 /* EmptyForCodableTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9106E002AC20061007ABFE6 /* EmptyForCodableTest.swift */; };
D9170EEA290C57BF00CD813A /* CVViewState+Banners.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9170EE9290C57BF00CD813A /* CVViewState+Banners.swift */; };
@ -3886,7 +3887,7 @@
66CD25632B06949C00139E17 /* MessageBackupAccountDataArchiver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageBackupAccountDataArchiver.swift; sourceTree = "<group>"; };
66CD25652B0695F400139E17 /* MessageBackupChatArchiver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageBackupChatArchiver.swift; sourceTree = "<group>"; };
66CD25672B06960F00139E17 /* MessageBackupChatItemArchiver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageBackupChatItemArchiver.swift; sourceTree = "<group>"; };
66CD25692B06963200139E17 /* CloudBackupStickerPackArchiver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudBackupStickerPackArchiver.swift; sourceTree = "<group>"; };
66CD25692B06963200139E17 /* MessageBackupStickerPackArchiver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageBackupStickerPackArchiver.swift; sourceTree = "<group>"; };
66CD256B2B06967900139E17 /* MessageBackupCallArchiver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageBackupCallArchiver.swift; sourceTree = "<group>"; };
66CD256D2B06E14F00139E17 /* MessageBackupContactRecipientArchiver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageBackupContactRecipientArchiver.swift; sourceTree = "<group>"; };
66CD256F2B06E29B00139E17 /* MessageBackupRecipientDestinationArchiver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageBackupRecipientDestinationArchiver.swift; sourceTree = "<group>"; };
@ -4579,6 +4580,7 @@
D90D4D712BBB45880097C573 /* BackupProtoThreadMergeChatUpdate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackupProtoThreadMergeChatUpdate.swift; sourceTree = "<group>"; };
D90D4D722BBB45880097C573 /* BackupProtoSessionSwitchoverChatUpdate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackupProtoSessionSwitchoverChatUpdate.swift; sourceTree = "<group>"; };
D90D4D732BBB45880097C573 /* BackupProtoStandardMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackupProtoStandardMessage.swift; sourceTree = "<group>"; };
D90D4D832BBB61680097C573 /* MessageBackupEmptyFrameId.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageBackupEmptyFrameId.swift; sourceTree = "<group>"; };
D9106DFE2AC1FEFD007ABFE6 /* EmptyForCodable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyForCodable.swift; sourceTree = "<group>"; };
D9106E002AC20061007ABFE6 /* EmptyForCodableTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyForCodableTest.swift; sourceTree = "<group>"; };
D9170EE9290C57BF00CD813A /* CVViewState+Banners.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CVViewState+Banners.swift"; sourceTree = "<group>"; };
@ -7463,6 +7465,7 @@
66CD25572B0685CF00139E17 /* Archivers */,
66CD25732B08079C00139E17 /* FileStreams */,
66CD25902B0EC20800139E17 /* MessageBackupConstants.swift */,
D90D4D832BBB61680097C573 /* MessageBackupEmptyFrameId.swift */,
C1A0F79C2B9F57340009DC0D /* MessageBackupKeyMaterial.swift */,
C1A0F79E2B9F59920009DC0D /* MessageBackupKeyMaterialImpl.swift */,
665C0D5F2ADF57D000539A37 /* MessageBackupManager+Shims.swift */,
@ -7845,7 +7848,7 @@
66CD255F2B06888800139E17 /* StickerPack */ = {
isa = PBXGroup;
children = (
66CD25692B06963200139E17 /* CloudBackupStickerPackArchiver.swift */,
66CD25692B06963200139E17 /* MessageBackupStickerPackArchiver.swift */,
);
path = StickerPack;
sourceTree = "<group>";
@ -13536,7 +13539,6 @@
F9C5CCF2289453B300548EEE /* ChunkedInputStream.swift in Sources */,
C1EB623C2BADEE56006D99CB /* ChunkedInputStreamTransform.swift in Sources */,
C1CF83D02B96C85E00CDC9C4 /* ChunkedOutputStreamTransform.swift in Sources */,
66CD256A2B06963200139E17 /* CloudBackupStickerPackArchiver.swift in Sources */,
F9C5CDFC289453B400548EEE /* Collection+OWS.swift in Sources */,
72345D1D2B9A1984000237B3 /* CommonStrings.swift in Sources */,
66E1AD552B8D033E00C56B7B /* ConcreteTSResource.swift in Sources */,
@ -13773,6 +13775,7 @@
66CD25912B0EC20800139E17 /* MessageBackupConstants.swift in Sources */,
6619A1CB2B2D176E004B38FE /* MessageBackupContactAddress.swift in Sources */,
66CD256E2B06E14F00139E17 /* MessageBackupContactRecipientArchiver.swift in Sources */,
D90D4D842BBB61680097C573 /* MessageBackupEmptyFrameId.swift in Sources */,
662590D12B5B525E001FDCDD /* MessageBackupErrors.swift in Sources */,
66CD257B2B08374600139E17 /* MessageBackupGroupRecipientArchiver.swift in Sources */,
662590BF2B56ECA8001FDCDD /* MessageBackupGroupUpdateMessageArchiver.swift in Sources */,
@ -13794,6 +13797,7 @@
6605B9822B19547C00E8A68A /* MessageBackupReactionArchiver.swift in Sources */,
66CD25622B06948900139E17 /* MessageBackupRecipientArchiver.swift in Sources */,
66CD25702B06E29B00139E17 /* MessageBackupRecipientDestinationArchiver.swift in Sources */,
66CD256A2B06963200139E17 /* MessageBackupStickerPackArchiver.swift in Sources */,
66CD258F2B0EB4AC00139E17 /* MessageBackupTSIncomingMessageArchiver.swift in Sources */,
66CD25932B0EC55100139E17 /* MessageBackupTSMessageContentsArchiver.swift in Sources */,
66CD25952B0EC5EC00139E17 /* MessageBackupTSOutgoingMessageArchiver.swift in Sources */,

View File

@ -3,7 +3,22 @@
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
extension MessageBackup {
/// An identifier for the ``BackupProtoAccountData`` backup frame.
///
/// Uses a singleton pattern, as there is only ever one account data frame
/// in a backup.
struct AccountDataId: MessageBackupLoggableId {
static let localUser = AccountDataId()
private init() {}
// MARK: MessageBackupLoggableId
public var typeLogString: String { "BackupProtoAccountData" }
public var idLogString: String { "localUser" }
}
}
public protocol MessageBackupAccountDataArchiver: MessageBackupProtoArchiver {

View File

@ -3,7 +3,31 @@
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
extension MessageBackup {
/// An identifier for a ``BackupProtoCall`` backup frame.
struct CallId: MessageBackupLoggableId {
let callId: UInt64
let conversationRecipientId: MessageBackup.RecipientId
init(
callId: UInt64,
conversationRecipientId: MessageBackup.RecipientId
) {
self.callId = callId
self.conversationRecipientId = conversationRecipientId
}
// MARK: MessageBackupLoggableId
public var typeLogString: String { "BackupProtoCall" }
public var idLogString: String {
/// Since call IDs are a cross-client identifier, we don't want to
/// log them directly.
let callIdHash = callId.hashValue
return "Call ID hash: \(callIdHash), conversation: \(conversationRecipientId)"
}
}
}
public protocol MessageBackupCallArchiver: MessageBackupProtoArchiver {

View File

@ -163,6 +163,9 @@ extension MessageBackup {
case sequenceOfRequestsAndCancelsWithLocalAci
/// An unrecognized BackupProtoGroupChangeChatUpdate.
case unrecognizedGroupUpdate
/// A frame was entirely missing its enclosed item.
case frameMissingItem
}
}
@ -270,6 +273,8 @@ extension MessageBackup.RestoreFrameErrorType {
return "Collapsed sequence of requests and cancels with local user's aci"
case .unrecognizedGroupUpdate:
return "Unrecognized group update type"
case .frameMissingItem:
return "Backup frame missing enclosed item"
}
case .referencedChatThreadNotFound(let threadUniqueId):
return "Referenced thread with id not found: \(threadUniqueId.value)"
@ -654,7 +659,8 @@ extension MessageBackup {
.groupUpdateMessageInNonGroupChat,
.emptyGroupUpdates,
.sequenceOfRequestsAndCancelsWithLocalAci,
.unrecognizedGroupUpdate:
.unrecognizedGroupUpdate,
.frameMissingItem:
// Collapse these by the id of the containing frame.
return idLogString
}

View File

@ -1,10 +0,0 @@
//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
public protocol MessageBackupStickerPackArchiver: MessageBackupProtoArchiver {
}

View File

@ -0,0 +1,28 @@
//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
public extension MessageBackup {
/// An identifier for a ``BackupProtoStickerPack`` backup frame.
struct StickerPackId: MessageBackupLoggableId {
let value: Data
init(_ value: Data) {
self.value = value
}
// MARK: MessageBackupLoggableId
public var typeLogString: String { "BackupProtoStickPack" }
public var idLogString: String {
/// Since sticker pack IDs are a cross-client identifier, we don't
/// want to log them directly.
return "\(value.hashValue)"
}
}
}
public protocol MessageBackupStickerPackArchiver: MessageBackupProtoArchiver {
}

View File

@ -0,0 +1,21 @@
//
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
extension MessageBackup {
/// An identifier for an empty ``BackupProtoFrame``.
///
/// Uses a singleton pattern, as frames do not contain their own ID and
/// consequently all empty frames are equivalent.
struct EmptyFrameId: MessageBackupLoggableId {
static let shared = EmptyFrameId()
private init() {}
// MARK: MessageBackupLoggableId
var typeLogString: String { "MessageBackupFrame" }
var idLogString: String { "Empty" }
}
}

View File

@ -285,15 +285,34 @@ public class MessageBackupManagerImpl: MessageBackupManager {
}
case .account(let backupProtoAccountData):
// TODO: Not yet implemented.
break
try processRestoreFrameErrors(errors: [
.unimplemented(MessageBackup.AccountDataId.localUser)
])
case .call(let backupProtoCall):
// TODO: Not yet implemented.
break
try processRestoreFrameErrors(errors: [
.unimplemented(MessageBackup.CallId(
callId: backupProtoCall.callId,
conversationRecipientId: MessageBackup.RecipientId(
integerLiteral: backupProtoCall.conversationRecipientId
)
))
])
case .stickerPack(let backupProtoStickerPack):
// TODO: Not yet implemented.
break
try processRestoreFrameErrors(errors: [
.unimplemented(MessageBackup.StickerPackId(
backupProtoStickerPack.id
))
])
case nil:
throw OWSAssertionError("Frame missing item!")
owsFailDebug("Frame missing item!")
try processRestoreFrameErrors(errors: [
.invalidProtoData(
MessageBackup.EmptyFrameId.shared,
.frameMissingItem
)
])
}
}