diff --git a/Podfile b/Podfile index 40634aed5..b719f1437 100644 --- a/Podfile +++ b/Podfile @@ -9,10 +9,9 @@ def shared_pods pod 'SQLCipher', :git => 'https://github.com/sqlcipher/sqlcipher.git', :commit => 'd5c2bec' # pod 'YapDatabase/SQLCipher', path: '../YapDatabase' pod 'YapDatabase/SQLCipher', :git => 'https://github.com/signalapp/YapDatabase.git', branch: 'signal-release' - # pod 'AxolotlKit', path: '../SignalProtocolKit' - pod 'SignalServiceKit', path: '.' pod 'AxolotlKit', git: 'https://github.com/signalapp/SignalProtocolKit.git' # pod 'AxolotlKit', path: '../SignalProtocolKit' + pod 'SignalServiceKit', path: '.' pod 'HKDFKit', git: 'https://github.com/signalapp/HKDFKit.git' # pod 'HKDFKit', path: '../HKDFKit' pod 'Curve25519Kit', git: 'https://github.com/signalapp/Curve25519Kit' diff --git a/Podfile.lock b/Podfile.lock index 4b4aa7064..12a0d8224 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -19,7 +19,7 @@ PODS: - CocoaLumberjack - Curve25519Kit (~> 2.1.0) - HKDFKit (~> 0.0.3) - - ProtocolBuffers (~> 1.9.8) + - SwiftProtobuf - CocoaLumberjack (3.4.2): - CocoaLumberjack/Default (= 3.4.2) - CocoaLumberjack/Extensions (= 3.4.2) @@ -44,7 +44,6 @@ PODS: - PromiseKit/CorePromise - PromiseKit/UIKit (4.5.2): - PromiseKit/CorePromise - - ProtocolBuffers (1.9.11) - PureLayout (3.0.2) - Reachability (3.2) - SAMKeychain (1.5.3) @@ -161,7 +160,6 @@ SPEC REPOS: - libPhoneNumber-iOS - Mantle - PromiseKit - - ProtocolBuffers - PureLayout - Reachability - SAMKeychain @@ -192,7 +190,7 @@ EXTERNAL SOURCES: CHECKOUT OPTIONS: AxolotlKit: - :commit: 54d5f90558578bb96ebfa9688b3905093b489e31 + :commit: 1fbdd114afe5ca981324892f22242d3a7a47794d :git: https://github.com/signalapp/SignalProtocolKit.git Curve25519Kit: :commit: ced146699622ebd3d282bbfce3d492db4456e9aa @@ -216,7 +214,7 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: AFNetworking: b6f891fdfaed196b46c7a83cf209e09697b94057 ATAppUpdater: a9f7027060959d47e58733d3b48f6b9a28cb8de1 - AxolotlKit: 7cfd2e71329b8dc398734e95b936450a2081fd60 + AxolotlKit: 07bd978ea931d113939de88d3d2d354896680ceb CocoaLumberjack: db7cc9e464771f12054c22ff6947c5a58d43a0fd Curve25519Kit: 76d0859ecb34704f7732847812363f83b23a6a59 GRKOpenSSLFramework: 8a3735ad41e7dc1daff460467bccd32ca5d6ae3e @@ -224,7 +222,6 @@ SPEC CHECKSUMS: libPhoneNumber-iOS: e444379ac18bbfbdefad571da735b2cd7e096caa Mantle: 2fa750afa478cd625a94230fbf1c13462f29395b PromiseKit: 743e497a5f505a470d3bbbf4ce0663c1268af0a4 - ProtocolBuffers: d509225eb2ea43d9582a59e94348fcf86e2abd65 PureLayout: 4d550abe49a94f24c2808b9b95db9131685fe4cd Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c @@ -236,6 +233,6 @@ SPEC CHECKSUMS: YapDatabase: b418a4baa6906e8028748938f9159807fd039af4 YYImage: 1e1b62a9997399593e4b9c4ecfbbabbf1d3f3b54 -PODFILE CHECKSUM: aa9ff0d7d6d50852127963f4b8aa60d8d1eff8d3 +PODFILE CHECKSUM: 0c3d5978b54712391b5b90835b9554277b07fa23 COCOAPODS: 1.5.3 diff --git a/Scripts/ProtoWrappers.py b/Scripts/ProtoWrappers.py index c1dc7878b..3fab30fc7 100755 --- a/Scripts/ProtoWrappers.py +++ b/Scripts/ProtoWrappers.py @@ -375,6 +375,11 @@ class MessageContext(BaseContext): writer.push_context(self.proto_name, self.swift_name) + if self.args.add_log_tag: + writer.add('fileprivate static let logTag = "%s"' % self.swift_name) + writer.add('fileprivate let logTag = "%s"' % self.swift_name) + writer.newline() + for child in self.enums: child.generate(writer) @@ -606,6 +611,17 @@ public func serializedData() throws -> Data { writer.pop_indent() writer.add('}') writer.newline() + + # description + writer.add('@objc public override var description: String {') + writer.push_indent() + writer.add('var fields = [String]()') + for field in self.fields(): + writer.add('fields.append("%s: \(proto.%s)")' % ( field.name_swift, field.name_swift, ) ) + writer.add('return "[" + fields.joined(separator: ", ") + "]"') + writer.pop_indent() + writer.add('}') + writer.newline() writer.pop_context() @@ -710,13 +726,24 @@ public func serializedData() throws -> Data { writer.add('}') writer.newline() - # build() func + # buildSerializedData() func writer.add('@objc public func buildSerializedData() throws -> Data {') writer.push_indent() writer.add('return try %s.parseProto(proto).serializedData()' % self.swift_name) writer.pop_indent() writer.add('}') writer.newline() + + # description + writer.add('@objc public override var description: String {') + writer.push_indent() + writer.add('var fields = [String]()') + for field in self.fields(): + writer.add('fields.append("%s: \(proto.%s)")' % ( field.name_swift, field.name_swift, ) ) + writer.add('return "[" + fields.joined(separator: ", ") + "]"') + writer.pop_indent() + writer.add('}') + writer.newline() writer.pop_context() @@ -1096,6 +1123,7 @@ if __name__ == "__main__": parser.add_argument('--wrapper-prefix', help='name prefix for generated wrappers.') parser.add_argument('--proto-prefix', help='name prefix for proto bufs.') parser.add_argument('--dst-dir', help='path to the destination directory.') + parser.add_argument('--add-log-tag', action='store_true', help='add log tag properties.') parser.add_argument('--verbose', action='store_true', help='enables verbose logging') args = parser.parse_args() diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 947fd900b..78f25d347 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -3015,7 +3015,6 @@ "${BUILT_PRODUCTS_DIR}/HKDFKit/HKDFKit.framework", "${BUILT_PRODUCTS_DIR}/Mantle/Mantle.framework", "${BUILT_PRODUCTS_DIR}/PromiseKit/PromiseKit.framework", - "${BUILT_PRODUCTS_DIR}/ProtocolBuffers/ProtocolBuffers.framework", "${BUILT_PRODUCTS_DIR}/PureLayout/PureLayout.framework", "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework", "${BUILT_PRODUCTS_DIR}/SAMKeychain/SAMKeychain.framework", @@ -3039,7 +3038,6 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/HKDFKit.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Mantle.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PromiseKit.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ProtocolBuffers.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PureLayout.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SAMKeychain.framework", @@ -3090,7 +3088,6 @@ "${BUILT_PRODUCTS_DIR}/HKDFKit/HKDFKit.framework", "${BUILT_PRODUCTS_DIR}/Mantle/Mantle.framework", "${BUILT_PRODUCTS_DIR}/PromiseKit/PromiseKit.framework", - "${BUILT_PRODUCTS_DIR}/ProtocolBuffers/ProtocolBuffers.framework", "${BUILT_PRODUCTS_DIR}/PureLayout/PureLayout.framework", "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework", "${BUILT_PRODUCTS_DIR}/SAMKeychain/SAMKeychain.framework", @@ -3112,7 +3109,6 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/HKDFKit.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Mantle.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PromiseKit.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ProtocolBuffers.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PureLayout.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SAMKeychain.framework", diff --git a/Signal/SignalUBSan.supp b/Signal/SignalUBSan.supp index 24a5e07fa..5a59495c4 100644 --- a/Signal/SignalUBSan.supp +++ b/Signal/SignalUBSan.supp @@ -1,11 +1,6 @@ # See https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#runtime-suppressions # for details. -# protobuf lib -shift-base:CodedInputStream.m -# generated protos -bool:WhisperTextProtocol.pb.m - # YapDatabase bool:YapDatabaseAutoViewTransaction.m diff --git a/Signal/src/Jobs/ConversationConfigurationSyncOperation.swift b/Signal/src/Jobs/ConversationConfigurationSyncOperation.swift index 6c7681073..627bf6ec4 100644 --- a/Signal/src/Jobs/ConversationConfigurationSyncOperation.swift +++ b/Signal/src/Jobs/ConversationConfigurationSyncOperation.swift @@ -64,9 +64,12 @@ class ConversationConfigurationSyncOperation: OWSOperation { identityManager: self.identityManager, profileManager: self.profileManager) - var dataSource: DataSource? = nil + var dataSource: DataSource? self.dbConnection.readWrite { transaction in - let messageData: Data = syncMessage.buildPlainTextAttachmentData(with: transaction) + guard let messageData: Data = syncMessage.buildPlainTextAttachmentData(with: transaction) else { + owsFail("\(self.logTag) could not serialize sync contacts data") + return + } dataSource = DataSourceValue.dataSource(withSyncMessageData: messageData) } @@ -85,9 +88,12 @@ class ConversationConfigurationSyncOperation: OWSOperation { // What does Android do? let syncMessage: OWSSyncGroupsMessage = OWSSyncGroupsMessage() - var dataSource: DataSource? = nil + var dataSource: DataSource? self.dbConnection.read { transaction in - let messageData: Data = syncMessage.buildPlainTextAttachmentData(with: transaction) + guard let messageData: Data = syncMessage.buildPlainTextAttachmentData(with: transaction) else { + owsFail("\(self.logTag) could not serialize sync groups data") + return + } dataSource = DataSourceValue.dataSource(withSyncMessageData: messageData) } diff --git a/Signal/src/Jobs/MultiDeviceProfileKeyUpdateJob.swift b/Signal/src/Jobs/MultiDeviceProfileKeyUpdateJob.swift index c8f3df93e..7f6b1a4a9 100644 --- a/Signal/src/Jobs/MultiDeviceProfileKeyUpdateJob.swift +++ b/Signal/src/Jobs/MultiDeviceProfileKeyUpdateJob.swift @@ -48,9 +48,13 @@ import SignalMessaging identityManager: self.identityManager, profileManager: self.profileManager) - var dataSource: DataSource? = nil + var dataSource: DataSource? self.editingDatabaseConnection.readWrite { transaction in - dataSource = DataSourceValue.dataSource(withSyncMessageData: syncContactsMessage.buildPlainTextAttachmentData(with: transaction)) + guard let messageData: Data = syncContactsMessage.buildPlainTextAttachmentData(with: transaction) else { + owsFail("\(self.logTag) could not serialize sync contacts data") + return + } + dataSource = DataSourceValue.dataSource(withSyncMessageData: messageData) } guard let attachmentDataSource = dataSource else { diff --git a/Signal/test/util/ProtoParsingTest.m b/Signal/test/util/ProtoParsingTest.m index 2f25c6f3e..91432e28f 100644 --- a/Signal/test/util/ProtoParsingTest.m +++ b/Signal/test/util/ProtoParsingTest.m @@ -2,9 +2,95 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // +#import +#import +#import +#import +#import +#import #import #import +NS_ASSUME_NONNULL_BEGIN + +@class CNContact; + +@interface TestContactsManager : NSObject + +@end + +#pragma mark - + +@implementation TestContactsManager + +- (NSString *)displayNameForPhoneIdentifier:(NSString *_Nullable)phoneNumber +{ + return phoneNumber; +} + +- (NSArray *)signalAccounts +{ + return @[]; +} + +- (BOOL)isSystemContact:(NSString *)recipientId +{ + return YES; +} + +- (BOOL)isSystemContactWithSignalAccount:(NSString *)recipientId +{ + return YES; +} + +- (NSComparisonResult)compareSignalAccount:(SignalAccount *)left withSignalAccount:(SignalAccount *)right +{ + return NSOrderedSame; +} + +- (nullable CNContact *)cnContactWithId:(nullable NSString *)contactId +{ + return nil; +} + +- (nullable NSData *)avatarDataForCNContactId:(nullable NSString *)contactId +{ + return nil; +} + +- (nullable UIImage *)avatarImageForCNContactId:(nullable NSString *)contactId +{ + return nil; +} + +@end + +#pragma mark - + +@interface FakeContact : NSObject + +@property (nullable, nonatomic) NSString *firstName; +@property (nullable, nonatomic) NSString *lastName; +@property (nonatomic) NSString *fullName; +@property (nonatomic) NSString *comparableNameFirstLast; +@property (nonatomic) NSString *comparableNameLastFirst; +@property (nonatomic) NSArray *parsedPhoneNumbers; +@property (nonatomic) NSArray *userTextPhoneNumbers; +@property (nonatomic) NSArray *emails; +@property (nonatomic) NSString *uniqueId; +@property (nonatomic) BOOL isSignalContact; +@property (nonatomic) NSString *cnContactId; + +@end + +#pragma mark - + +@implementation FakeContact + +@end + +#pragma mark - + @interface ProtoParsingTest : XCTestCase @end @@ -31,4 +117,58 @@ XCTAssertNotNil(error); } +- (void)testProtoStreams +{ + NSArray *signalAccounts = @[ + [[SignalAccount alloc] initWithRecipientId:@"+13213214321"], + [[SignalAccount alloc] initWithRecipientId:@"+13213214322"], + [[SignalAccount alloc] initWithRecipientId:@"+13213214323"], + ]; + NSData *_Nullable streamData = [self dataForSyncingContacts:signalAccounts]; + XCTAssertNotNil(streamData); + + XCTAssertEqualObjects(streamData.hexadecimalString, + @"1b0a0c2b31333231333231343332311209416c69636520426f6240001b0a0c2b31333231333231343332321209416c69636520426f624" + @"0001b0a0c2b31333231333231343332331209416c69636520426f624000"); +} + +- (nullable NSData *)dataForSyncingContacts:(NSArray *)signalAccounts +{ + TestContactsManager *contactsManager = [TestContactsManager new]; + NSOutputStream *dataOutputStream = [NSOutputStream outputStreamToMemory]; + [dataOutputStream open]; + OWSContactsOutputStream *contactsOutputStream = + [[OWSContactsOutputStream alloc] initWithOutputStream:dataOutputStream]; + + for (SignalAccount *signalAccount in signalAccounts) { + OWSRecipientIdentity *_Nullable recipientIdentity = nil; + // NSData *_Nullable profileKeyData = [Randomness generateRandomBytes:32]; + NSData *_Nullable profileKeyData = nil; + OWSDisappearingMessagesConfiguration *_Nullable disappearingMessagesConfiguration = nil; + NSString *_Nullable conversationColorName = @"fake color name"; + + FakeContact *fakeContact = [FakeContact new]; + fakeContact.cnContactId = @"123"; + fakeContact.fullName = @"Alice Bob"; + signalAccount.contact = (Contact *)fakeContact; + + [contactsOutputStream writeSignalAccount:signalAccount + recipientIdentity:recipientIdentity + profileKeyData:profileKeyData + contactsManager:contactsManager + conversationColorName:conversationColorName + disappearingMessagesConfiguration:disappearingMessagesConfiguration]; + } + + [dataOutputStream close]; + + if (contactsOutputStream.hasError) { + return nil; + } + + return [dataOutputStream propertyForKey:NSStreamDataWrittenToMemoryStreamKey]; +} + @end + +NS_ASSUME_NONNULL_END diff --git a/SignalMessaging/contacts/OWSContactsSyncing.m b/SignalMessaging/contacts/OWSContactsSyncing.m index dbd5f4fd0..d7f5ee694 100644 --- a/SignalMessaging/contacts/OWSContactsSyncing.m +++ b/SignalMessaging/contacts/OWSContactsSyncing.m @@ -124,14 +124,19 @@ NSString *const kOWSPrimaryStorageOWSContactsSyncingLastMessageKey identityManager:self.identityManager profileManager:self.profileManager]; - __block NSData *messageData; - __block NSData *lastMessageData; + __block NSData *_Nullable messageData; + __block NSData *_Nullable lastMessageData; [self.editingDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { messageData = [syncContactsMessage buildPlainTextAttachmentDataWithTransaction:transaction]; lastMessageData = [transaction objectForKey:kOWSPrimaryStorageOWSContactsSyncingLastMessageKey inCollection:kOWSPrimaryStorageOWSContactsSyncingCollection]; }]; + if (!messageData) { + OWSFail(@"%@ Failed to serialize contacts sync message.", self.logTag); + return; + } + if (lastMessageData && [lastMessageData isEqual:messageData]) { // Ignore redundant contacts sync message. return; diff --git a/SignalServiceKit/src/Devices/OWSChunkedOutputStream.h b/SignalServiceKit/src/Devices/OWSChunkedOutputStream.h index e545b4f19..617fa793b 100644 --- a/SignalServiceKit/src/Devices/OWSChunkedOutputStream.h +++ b/SignalServiceKit/src/Devices/OWSChunkedOutputStream.h @@ -1,15 +1,21 @@ -// Copyright © 2016 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// NS_ASSUME_NONNULL_BEGIN -@class PBCodedOutputStream; - @interface OWSChunkedOutputStream : NSObject -@property (nonatomic, readonly) PBCodedOutputStream *delegateStream; +// Indicates whether any write failed. +@property (nonatomic, readonly) BOOL hasError; -+ (instancetype)streamWithOutputStream:(NSOutputStream *)output; -- (void)flush; +- (instancetype)init NS_UNAVAILABLE; + +- (instancetype)initWithOutputStream:(NSOutputStream *)outputStream; + +// Returns NO on error. +- (BOOL)writeData:(NSData *)data; +- (BOOL)writeUInt32:(UInt32)value; @end diff --git a/SignalServiceKit/src/Devices/OWSChunkedOutputStream.m b/SignalServiceKit/src/Devices/OWSChunkedOutputStream.m index b7e3dec6a..96f39696d 100644 --- a/SignalServiceKit/src/Devices/OWSChunkedOutputStream.m +++ b/SignalServiceKit/src/Devices/OWSChunkedOutputStream.m @@ -1,34 +1,69 @@ -// Copyright © 2016 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// #import "OWSChunkedOutputStream.h" -#import +#import "NSData+OWS.h" NS_ASSUME_NONNULL_BEGIN -@implementation OWSChunkedOutputStream +@interface OWSChunkedOutputStream () -+ (instancetype)streamWithOutputStream:(NSOutputStream *)output -{ - return [[self alloc] initWithOutputStream:output]; -} +@property (nonatomic, readonly) NSOutputStream *outputStream; +@property (nonatomic) BOOL hasError; + +@end + +#pragma mark - + +@implementation OWSChunkedOutputStream - (instancetype)initWithOutputStream:(NSOutputStream *)outputStream { - self = [super init]; - if (!self) { - return self; + if (self = [super init]) { + OWSAssert(outputStream); + _outputStream = outputStream; } - _delegateStream = [PBCodedOutputStream streamWithOutputStream:outputStream]; - return self; } -- (void)flush +- (BOOL)writeByte:(uint8_t)value { - [self.delegateStream flush]; + NSInteger written = [self.outputStream write:&value maxLength:sizeof(value)]; + if (written != sizeof(value)) { + OWSFail(@"%@ could not write to output stream.", self.logTag); + self.hasError = YES; + return NO; + } + return YES; } +- (BOOL)writeData:(NSData *)data +{ + OWSAssert(data); + NSInteger written = [self.outputStream write:data.bytes maxLength:data.length]; + if (written != data.length) { + OWSFail(@"%@ could not write to output stream.", self.logTag); + self.hasError = YES; + return NO; + } + return YES; +} + +- (BOOL)writeUInt32:(UInt32)value +{ + while (YES) { + if (value <= 0x7F) { + return [self writeByte:value]; + } else { + if (![self writeByte:((value & 0x7F) | 0x80)]) { + return NO; + } + value >>= 7; + } + } +} @end diff --git a/SignalServiceKit/src/Devices/OWSContactsOutputStream.m b/SignalServiceKit/src/Devices/OWSContactsOutputStream.m index de69dc79d..be5b836aa 100644 --- a/SignalServiceKit/src/Devices/OWSContactsOutputStream.m +++ b/SignalServiceKit/src/Devices/OWSContactsOutputStream.m @@ -7,13 +7,13 @@ #import "ContactsManagerProtocol.h" #import "Cryptography.h" #import "MIMETypeUtil.h" +#import "NSData+OWS.h" #import "NSData+keyVersionByte.h" #import "OWSBlockingManager.h" #import "OWSDisappearingMessagesConfiguration.h" #import "OWSRecipientIdentity.h" #import "SignalAccount.h" #import "TSContactThread.h" -#import #import NS_ASSUME_NONNULL_BEGIN @@ -96,11 +96,11 @@ disappearingMessagesConfiguration:(nullable OWSDisappearingMessagesConfiguration } uint32_t contactDataLength = (uint32_t)contactData.length; - [self.delegateStream writeRawVarint32:contactDataLength]; - [self.delegateStream writeRawData:contactData]; + [self writeUInt32:contactDataLength]; + [self writeData:contactData]; if (avatarPng) { - [self.delegateStream writeRawData:avatarPng]; + [self writeData:avatarPng]; } } diff --git a/SignalServiceKit/src/Devices/OWSGroupsOutputStream.m b/SignalServiceKit/src/Devices/OWSGroupsOutputStream.m index 5de134fd9..4651d4e0a 100644 --- a/SignalServiceKit/src/Devices/OWSGroupsOutputStream.m +++ b/SignalServiceKit/src/Devices/OWSGroupsOutputStream.m @@ -7,7 +7,6 @@ #import "OWSDisappearingMessagesConfiguration.h" #import "TSGroupModel.h" #import "TSGroupThread.h" -#import #import NS_ASSUME_NONNULL_BEGIN @@ -69,11 +68,11 @@ NS_ASSUME_NONNULL_BEGIN uint32_t groupDataLength = (uint32_t)groupData.length; - [self.delegateStream writeRawVarint32:groupDataLength]; - [self.delegateStream writeRawData:groupData]; + [self writeUInt32:groupDataLength]; + [self writeData:groupData]; if (avatarPng) { - [self.delegateStream writeRawData:avatarPng]; + [self writeData:avatarPng]; } } diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h index e536c1685..89b3c8862 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h @@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; -- (NSData *)buildPlainTextAttachmentDataWithTransaction:(YapDatabaseReadTransaction *)transaction; +- (nullable NSData *)buildPlainTextAttachmentDataWithTransaction:(YapDatabaseReadTransaction *)transaction; @end diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m index 53592f334..be1369a20 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m @@ -79,7 +79,7 @@ NS_ASSUME_NONNULL_BEGIN return syncMessageBuilder; } -- (NSData *)buildPlainTextAttachmentDataWithTransaction:(YapDatabaseReadTransaction *)transaction +- (nullable NSData *)buildPlainTextAttachmentDataWithTransaction:(YapDatabaseReadTransaction *)transaction { id contactsManager = TextSecureKitEnv.sharedEnv.contactsManager; @@ -88,7 +88,8 @@ NS_ASSUME_NONNULL_BEGIN // and uploading with streams). NSOutputStream *dataOutputStream = [NSOutputStream outputStreamToMemory]; [dataOutputStream open]; - OWSContactsOutputStream *contactsOutputStream = [OWSContactsOutputStream streamWithOutputStream:dataOutputStream]; + OWSContactsOutputStream *contactsOutputStream = + [[OWSContactsOutputStream alloc] initWithOutputStream:dataOutputStream]; for (SignalAccount *signalAccount in self.signalAccounts) { OWSRecipientIdentity *_Nullable recipientIdentity = @@ -115,9 +116,13 @@ NS_ASSUME_NONNULL_BEGIN disappearingMessagesConfiguration:disappearingMessagesConfiguration]; } - [contactsOutputStream flush]; [dataOutputStream close]; + if (contactsOutputStream.hasError) { + OWSFail(@"%@ Could not write contacts sync stream.", self.logTag); + return nil; + } + return [dataOutputStream propertyForKey:NSStreamDataWrittenToMemoryStreamKey]; } diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.h b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.h index aab2b8775..7f5ba902f 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.h +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.h @@ -13,7 +13,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; -- (NSData *)buildPlainTextAttachmentDataWithTransaction:(YapDatabaseReadTransaction *)transaction; +- (nullable NSData *)buildPlainTextAttachmentDataWithTransaction:(YapDatabaseReadTransaction *)transaction; @end diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.m b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.m index c7bd39091..1e3918ff0 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.m +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.m @@ -57,14 +57,14 @@ NS_ASSUME_NONNULL_BEGIN return syncMessageBuilder; } -- (NSData *)buildPlainTextAttachmentDataWithTransaction:(YapDatabaseReadTransaction *)transaction +- (nullable NSData *)buildPlainTextAttachmentDataWithTransaction:(YapDatabaseReadTransaction *)transaction { // TODO use temp file stream to avoid loading everything into memory at once // First though, we need to re-engineer our attachment process to accept streams (encrypting with stream, // and uploading with streams). NSOutputStream *dataOutputStream = [NSOutputStream outputStreamToMemory]; [dataOutputStream open]; - OWSGroupsOutputStream *groupsOutputStream = [OWSGroupsOutputStream streamWithOutputStream:dataOutputStream]; + OWSGroupsOutputStream *groupsOutputStream = [[OWSGroupsOutputStream alloc] initWithOutputStream:dataOutputStream]; [TSGroupThread enumerateCollectionObjectsWithTransaction:transaction @@ -80,9 +80,13 @@ NS_ASSUME_NONNULL_BEGIN [groupsOutputStream writeGroup:groupThread transaction:transaction]; }]; - [groupsOutputStream flush]; [dataOutputStream close]; + if (groupsOutputStream.hasError) { + OWSFail(@"%@ Could not write groups sync stream.", self.logTag); + return nil; + } + return [dataOutputStream propertyForKey:NSStreamDataWrittenToMemoryStreamKey]; } diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 956fee353..555eb4af1 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -661,9 +661,15 @@ NS_ASSUME_NONNULL_BEGIN [[OWSSyncContactsMessage alloc] initWithSignalAccounts:self.contactsManager.signalAccounts identityManager:self.identityManager profileManager:self.profileManager]; - DataSource *dataSource = [DataSourceValue - dataSourceWithSyncMessageData:[syncContactsMessage - buildPlainTextAttachmentDataWithTransaction:transaction]]; + __block NSData *_Nullable syncData; + [self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + syncData = [syncContactsMessage buildPlainTextAttachmentDataWithTransaction:transaction]; + }]; + if (!syncData) { + OWSFail(@"%@ Failed to serialize contacts sync message.", self.logTag); + return; + } + DataSource *dataSource = [DataSourceValue dataSourceWithSyncMessageData:syncData]; [self.messageSender enqueueTemporaryAttachment:dataSource contentType:OWSMimeTypeApplicationOctetStream inMessage:syncContactsMessage @@ -676,19 +682,31 @@ NS_ASSUME_NONNULL_BEGIN }]; }); } else if (syncMessage.request.type == SSKProtoSyncMessageRequestTypeGroups) { - OWSSyncGroupsMessage *syncGroupsMessage = [[OWSSyncGroupsMessage alloc] init]; - DataSource *dataSource = [DataSourceValue - dataSourceWithSyncMessageData:[syncGroupsMessage - buildPlainTextAttachmentDataWithTransaction:transaction]]; - [self.messageSender enqueueTemporaryAttachment:dataSource - contentType:OWSMimeTypeApplicationOctetStream - inMessage:syncGroupsMessage - success:^{ - DDLogInfo(@"%@ Successfully sent Groups response syncMessage.", self.logTag); - } - failure:^(NSError *error) { - DDLogError(@"%@ Failed to send Groups response syncMessage with error: %@", self.logTag, error); + // We respond asynchronously. + // + // In rare cases this means we won't respond to the sync request, but that's + // acceptable. + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + OWSSyncGroupsMessage *syncGroupsMessage = [[OWSSyncGroupsMessage alloc] init]; + __block NSData *_Nullable syncData; + [self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + syncData = [syncGroupsMessage buildPlainTextAttachmentDataWithTransaction:transaction]; }]; + if (!syncData) { + OWSFail(@"%@ Failed to serialize groups sync message.", self.logTag); + return; + } + DataSource *dataSource = [DataSourceValue dataSourceWithSyncMessageData:syncData]; + [self.messageSender enqueueTemporaryAttachment:dataSource + contentType:OWSMimeTypeApplicationOctetStream + inMessage:syncGroupsMessage + success:^{ + DDLogInfo(@"%@ Successfully sent Groups response syncMessage.", self.logTag); + } + failure:^(NSError *error) { + DDLogError(@"%@ Failed to send Groups response syncMessage with error: %@", self.logTag, error); + }]; + }); } else if (syncMessage.request.type == SSKProtoSyncMessageRequestTypeBlocked) { DDLogInfo(@"%@ Received request for block list", self.logTag); [_blockingManager syncBlockedPhoneNumbers]; diff --git a/SignalServiceKit/src/Protos/Generated/FingerprintProto.swift b/SignalServiceKit/src/Protos/Generated/FingerprintProto.swift index a77eaf179..d7d8f38f0 100644 --- a/SignalServiceKit/src/Protos/Generated/FingerprintProto.swift +++ b/SignalServiceKit/src/Protos/Generated/FingerprintProto.swift @@ -43,6 +43,12 @@ public enum FingerprintProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try FingerprintProtoLogicalFingerprint.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("identityData: \(proto.identityData)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: FingerprintProtos_LogicalFingerprint @@ -88,6 +94,12 @@ public enum FingerprintProtoError: Error { identityData: identityData) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("identityData: \(proto.identityData)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - FingerprintProtoLogicalFingerprints @@ -130,6 +142,14 @@ public enum FingerprintProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try FingerprintProtoLogicalFingerprints.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("version: \(proto.version)") + fields.append("localFingerprint: \(proto.localFingerprint)") + fields.append("remoteFingerprint: \(proto.remoteFingerprint)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: FingerprintProtos_LogicalFingerprints @@ -195,4 +215,12 @@ public enum FingerprintProtoError: Error { remoteFingerprint: remoteFingerprint) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("version: \(proto.version)") + fields.append("localFingerprint: \(proto.localFingerprint)") + fields.append("remoteFingerprint: \(proto.remoteFingerprint)") + return "[" + fields.joined(separator: ", ") + "]" + } } diff --git a/SignalServiceKit/src/Protos/Generated/ProvisioningProto.swift b/SignalServiceKit/src/Protos/Generated/ProvisioningProto.swift index ecee3b145..edef7ee1c 100644 --- a/SignalServiceKit/src/Protos/Generated/ProvisioningProto.swift +++ b/SignalServiceKit/src/Protos/Generated/ProvisioningProto.swift @@ -47,6 +47,13 @@ public enum ProvisioningProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try ProvisioningProtoProvisionEnvelope.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("publicKey: \(proto.publicKey)") + fields.append("body: \(proto.body)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: ProvisioningProtos_ProvisionEnvelope @@ -102,6 +109,13 @@ public enum ProvisioningProtoError: Error { body: body) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("publicKey: \(proto.publicKey)") + fields.append("body: \(proto.body)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - ProvisioningProtoProvisionMessage @@ -160,6 +174,18 @@ public enum ProvisioningProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try ProvisioningProtoProvisionMessage.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("identityKeyPublic: \(proto.identityKeyPublic)") + fields.append("identityKeyPrivate: \(proto.identityKeyPrivate)") + fields.append("number: \(proto.number)") + fields.append("provisioningCode: \(proto.provisioningCode)") + fields.append("userAgent: \(proto.userAgent)") + fields.append("profileKey: \(proto.profileKey)") + fields.append("readReceipts: \(proto.readReceipts)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: ProvisioningProtos_ProvisionMessage @@ -265,4 +291,16 @@ public enum ProvisioningProtoError: Error { readReceipts: readReceipts) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("identityKeyPublic: \(proto.identityKeyPublic)") + fields.append("identityKeyPrivate: \(proto.identityKeyPrivate)") + fields.append("number: \(proto.number)") + fields.append("provisioningCode: \(proto.provisioningCode)") + fields.append("userAgent: \(proto.userAgent)") + fields.append("profileKey: \(proto.profileKey)") + fields.append("readReceipts: \(proto.readReceipts)") + return "[" + fields.joined(separator: ", ") + "]" + } } diff --git a/SignalServiceKit/src/Protos/Generated/SSKProto.swift b/SignalServiceKit/src/Protos/Generated/SSKProto.swift index 9c2f8c991..e112b4002 100644 --- a/SignalServiceKit/src/Protos/Generated/SSKProto.swift +++ b/SignalServiceKit/src/Protos/Generated/SSKProto.swift @@ -97,6 +97,18 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoEnvelope.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("type: \(proto.type)") + fields.append("source: \(proto.source)") + fields.append("sourceDevice: \(proto.sourceDevice)") + fields.append("relay: \(proto.relay)") + fields.append("timestamp: \(proto.timestamp)") + fields.append("legacyMessage: \(proto.legacyMessage)") + fields.append("content: \(proto.content)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_Envelope @@ -202,6 +214,18 @@ public enum SSKProtoError: Error { timestamp: timestamp) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("type: \(proto.type)") + fields.append("source: \(proto.source)") + fields.append("sourceDevice: \(proto.sourceDevice)") + fields.append("relay: \(proto.relay)") + fields.append("timestamp: \(proto.timestamp)") + fields.append("legacyMessage: \(proto.legacyMessage)") + fields.append("content: \(proto.content)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoContent @@ -252,6 +276,16 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoContent.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("dataMessage: \(proto.dataMessage)") + fields.append("syncMessage: \(proto.syncMessage)") + fields.append("callMessage: \(proto.callMessage)") + fields.append("nullMessage: \(proto.nullMessage)") + fields.append("receiptMessage: \(proto.receiptMessage)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_Content @@ -315,27 +349,27 @@ public enum SSKProtoError: Error { } fileprivate class func parseProto(_ proto: SignalServiceProtos_Content) throws -> SSKProtoContent { - var dataMessage: SSKProtoDataMessage? = nil + var dataMessage: SSKProtoDataMessage? if proto.hasDataMessage { dataMessage = try SSKProtoDataMessage.parseProto(proto.dataMessage) } - var syncMessage: SSKProtoSyncMessage? = nil + var syncMessage: SSKProtoSyncMessage? if proto.hasSyncMessage { syncMessage = try SSKProtoSyncMessage.parseProto(proto.syncMessage) } - var callMessage: SSKProtoCallMessage? = nil + var callMessage: SSKProtoCallMessage? if proto.hasCallMessage { callMessage = try SSKProtoCallMessage.parseProto(proto.callMessage) } - var nullMessage: SSKProtoNullMessage? = nil + var nullMessage: SSKProtoNullMessage? if proto.hasNullMessage { nullMessage = try SSKProtoNullMessage.parseProto(proto.nullMessage) } - var receiptMessage: SSKProtoReceiptMessage? = nil + var receiptMessage: SSKProtoReceiptMessage? if proto.hasReceiptMessage { receiptMessage = try SSKProtoReceiptMessage.parseProto(proto.receiptMessage) } @@ -352,6 +386,16 @@ public enum SSKProtoError: Error { receiptMessage: receiptMessage) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("dataMessage: \(proto.dataMessage)") + fields.append("syncMessage: \(proto.syncMessage)") + fields.append("callMessage: \(proto.callMessage)") + fields.append("nullMessage: \(proto.nullMessage)") + fields.append("receiptMessage: \(proto.receiptMessage)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoCallMessageOffer @@ -390,6 +434,13 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoCallMessageOffer.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + fields.append("sessionDescription: \(proto.sessionDescription)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_CallMessage.Offer @@ -445,6 +496,13 @@ public enum SSKProtoError: Error { sessionDescription: sessionDescription) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + fields.append("sessionDescription: \(proto.sessionDescription)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoCallMessageAnswer @@ -483,6 +541,13 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoCallMessageAnswer.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + fields.append("sessionDescription: \(proto.sessionDescription)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_CallMessage.Answer @@ -538,6 +603,13 @@ public enum SSKProtoError: Error { sessionDescription: sessionDescription) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + fields.append("sessionDescription: \(proto.sessionDescription)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoCallMessageIceUpdate @@ -584,6 +656,15 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoCallMessageIceUpdate.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + fields.append("sdpMid: \(proto.sdpMid)") + fields.append("sdpMlineIndex: \(proto.sdpMlineIndex)") + fields.append("sdp: \(proto.sdp)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_CallMessage.IceUpdate @@ -659,6 +740,15 @@ public enum SSKProtoError: Error { sdp: sdp) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + fields.append("sdpMid: \(proto.sdpMid)") + fields.append("sdpMlineIndex: \(proto.sdpMlineIndex)") + fields.append("sdp: \(proto.sdp)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoCallMessageBusy @@ -693,6 +783,12 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoCallMessageBusy.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_CallMessage.Busy @@ -738,6 +834,12 @@ public enum SSKProtoError: Error { id: id) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoCallMessageHangup @@ -772,6 +874,12 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoCallMessageHangup.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_CallMessage.Hangup @@ -817,6 +925,12 @@ public enum SSKProtoError: Error { id: id) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoCallMessage @@ -877,6 +991,17 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoCallMessage.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("offer: \(proto.offer)") + fields.append("answer: \(proto.answer)") + fields.append("iceUpdate: \(proto.iceUpdate)") + fields.append("hangup: \(proto.hangup)") + fields.append("busy: \(proto.busy)") + fields.append("profileKey: \(proto.profileKey)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_CallMessage @@ -947,12 +1072,12 @@ public enum SSKProtoError: Error { } fileprivate class func parseProto(_ proto: SignalServiceProtos_CallMessage) throws -> SSKProtoCallMessage { - var offer: SSKProtoCallMessageOffer? = nil + var offer: SSKProtoCallMessageOffer? if proto.hasOffer { offer = try SSKProtoCallMessageOffer.parseProto(proto.offer) } - var answer: SSKProtoCallMessageAnswer? = nil + var answer: SSKProtoCallMessageAnswer? if proto.hasAnswer { answer = try SSKProtoCallMessageAnswer.parseProto(proto.answer) } @@ -960,12 +1085,12 @@ public enum SSKProtoError: Error { var iceUpdate: [SSKProtoCallMessageIceUpdate] = [] iceUpdate = try proto.iceUpdate.map { try SSKProtoCallMessageIceUpdate.parseProto($0) } - var hangup: SSKProtoCallMessageHangup? = nil + var hangup: SSKProtoCallMessageHangup? if proto.hasHangup { hangup = try SSKProtoCallMessageHangup.parseProto(proto.hangup) } - var busy: SSKProtoCallMessageBusy? = nil + var busy: SSKProtoCallMessageBusy? if proto.hasBusy { busy = try SSKProtoCallMessageBusy.parseProto(proto.busy) } @@ -982,6 +1107,17 @@ public enum SSKProtoError: Error { busy: busy) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("offer: \(proto.offer)") + fields.append("answer: \(proto.answer)") + fields.append("iceUpdate: \(proto.iceUpdate)") + fields.append("hangup: \(proto.hangup)") + fields.append("busy: \(proto.busy)") + fields.append("profileKey: \(proto.profileKey)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoDataMessageQuoteQuotedAttachment @@ -1046,6 +1182,15 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoDataMessageQuoteQuotedAttachment.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("contentType: \(proto.contentType)") + fields.append("fileName: \(proto.fileName)") + fields.append("thumbnail: \(proto.thumbnail)") + fields.append("flags: \(proto.flags)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_DataMessage.Quote.QuotedAttachment @@ -1108,7 +1253,7 @@ public enum SSKProtoError: Error { } fileprivate class func parseProto(_ proto: SignalServiceProtos_DataMessage.Quote.QuotedAttachment) throws -> SSKProtoDataMessageQuoteQuotedAttachment { - var thumbnail: SSKProtoAttachmentPointer? = nil + var thumbnail: SSKProtoAttachmentPointer? if proto.hasThumbnail { thumbnail = try SSKProtoAttachmentPointer.parseProto(proto.thumbnail) } @@ -1121,6 +1266,15 @@ public enum SSKProtoError: Error { thumbnail: thumbnail) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("contentType: \(proto.contentType)") + fields.append("fileName: \(proto.fileName)") + fields.append("thumbnail: \(proto.thumbnail)") + fields.append("flags: \(proto.flags)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoDataMessageQuote @@ -1173,6 +1327,15 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoDataMessageQuote.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + fields.append("author: \(proto.author)") + fields.append("text: \(proto.text)") + fields.append("attachments: \(proto.attachments)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_DataMessage.Quote @@ -1246,6 +1409,15 @@ public enum SSKProtoError: Error { attachments: attachments) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + fields.append("author: \(proto.author)") + fields.append("text: \(proto.text)") + fields.append("attachments: \(proto.attachments)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoDataMessageContactName @@ -1300,6 +1472,17 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoDataMessageContactName.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("givenName: \(proto.givenName)") + fields.append("familyName: \(proto.familyName)") + fields.append("prefix: \(proto.prefix)") + fields.append("suffix: \(proto.suffix)") + fields.append("middleName: \(proto.middleName)") + fields.append("displayName: \(proto.displayName)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_DataMessage.Contact.Name @@ -1395,6 +1578,17 @@ public enum SSKProtoError: Error { let result = SSKProtoDataMessageContactName(proto: proto) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("givenName: \(proto.givenName)") + fields.append("familyName: \(proto.familyName)") + fields.append("prefix: \(proto.prefix)") + fields.append("suffix: \(proto.suffix)") + fields.append("middleName: \(proto.middleName)") + fields.append("displayName: \(proto.displayName)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoDataMessageContactPhone @@ -1464,6 +1658,14 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoDataMessageContactPhone.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("value: \(proto.value)") + fields.append("type: \(proto.type)") + fields.append("label: \(proto.label)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_DataMessage.Contact.Phone @@ -1526,6 +1728,14 @@ public enum SSKProtoError: Error { let result = SSKProtoDataMessageContactPhone(proto: proto) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("value: \(proto.value)") + fields.append("type: \(proto.type)") + fields.append("label: \(proto.label)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoDataMessageContactEmail @@ -1595,6 +1805,14 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoDataMessageContactEmail.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("value: \(proto.value)") + fields.append("type: \(proto.type)") + fields.append("label: \(proto.label)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_DataMessage.Contact.Email @@ -1657,6 +1875,14 @@ public enum SSKProtoError: Error { let result = SSKProtoDataMessageContactEmail(proto: proto) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("value: \(proto.value)") + fields.append("type: \(proto.type)") + fields.append("label: \(proto.label)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoDataMessageContactPostalAddress @@ -1747,6 +1973,20 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoDataMessageContactPostalAddress.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("type: \(proto.type)") + fields.append("label: \(proto.label)") + fields.append("street: \(proto.street)") + fields.append("pobox: \(proto.pobox)") + fields.append("neighborhood: \(proto.neighborhood)") + fields.append("city: \(proto.city)") + fields.append("region: \(proto.region)") + fields.append("postcode: \(proto.postcode)") + fields.append("country: \(proto.country)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_DataMessage.Contact.PostalAddress @@ -1869,6 +2109,20 @@ public enum SSKProtoError: Error { let result = SSKProtoDataMessageContactPostalAddress(proto: proto) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("type: \(proto.type)") + fields.append("label: \(proto.label)") + fields.append("street: \(proto.street)") + fields.append("pobox: \(proto.pobox)") + fields.append("neighborhood: \(proto.neighborhood)") + fields.append("city: \(proto.city)") + fields.append("region: \(proto.region)") + fields.append("postcode: \(proto.postcode)") + fields.append("country: \(proto.country)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoDataMessageContactAvatar @@ -1907,6 +2161,13 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoDataMessageContactAvatar.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("avatar: \(proto.avatar)") + fields.append("isProfile: \(proto.isProfile)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_DataMessage.Contact.Avatar @@ -1949,7 +2210,7 @@ public enum SSKProtoError: Error { } fileprivate class func parseProto(_ proto: SignalServiceProtos_DataMessage.Contact.Avatar) throws -> SSKProtoDataMessageContactAvatar { - var avatar: SSKProtoAttachmentPointer? = nil + var avatar: SSKProtoAttachmentPointer? if proto.hasAvatar { avatar = try SSKProtoAttachmentPointer.parseProto(proto.avatar) } @@ -1962,6 +2223,13 @@ public enum SSKProtoError: Error { avatar: avatar) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("avatar: \(proto.avatar)") + fields.append("isProfile: \(proto.isProfile)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoDataMessageContact @@ -2034,6 +2302,17 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoDataMessageContact.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("name: \(proto.name)") + fields.append("number: \(proto.number)") + fields.append("email: \(proto.email)") + fields.append("address: \(proto.address)") + fields.append("avatar: \(proto.avatar)") + fields.append("organization: \(proto.organization)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_DataMessage.Contact @@ -2098,7 +2377,7 @@ public enum SSKProtoError: Error { } fileprivate class func parseProto(_ proto: SignalServiceProtos_DataMessage.Contact) throws -> SSKProtoDataMessageContact { - var name: SSKProtoDataMessageContactName? = nil + var name: SSKProtoDataMessageContactName? if proto.hasName { name = try SSKProtoDataMessageContactName.parseProto(proto.name) } @@ -2112,7 +2391,7 @@ public enum SSKProtoError: Error { var address: [SSKProtoDataMessageContactPostalAddress] = [] address = try proto.address.map { try SSKProtoDataMessageContactPostalAddress.parseProto($0) } - var avatar: SSKProtoDataMessageContactAvatar? = nil + var avatar: SSKProtoDataMessageContactAvatar? if proto.hasAvatar { avatar = try SSKProtoDataMessageContactAvatar.parseProto(proto.avatar) } @@ -2129,6 +2408,17 @@ public enum SSKProtoError: Error { avatar: avatar) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("name: \(proto.name)") + fields.append("number: \(proto.number)") + fields.append("email: \(proto.email)") + fields.append("address: \(proto.address)") + fields.append("avatar: \(proto.avatar)") + fields.append("organization: \(proto.organization)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoDataMessage @@ -2231,6 +2521,20 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoDataMessage.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("body: \(proto.body)") + fields.append("attachments: \(proto.attachments)") + fields.append("group: \(proto.group)") + fields.append("flags: \(proto.flags)") + fields.append("expireTimer: \(proto.expireTimer)") + fields.append("profileKey: \(proto.profileKey)") + fields.append("timestamp: \(proto.timestamp)") + fields.append("quote: \(proto.quote)") + fields.append("contact: \(proto.contact)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_DataMessage @@ -2325,12 +2629,12 @@ public enum SSKProtoError: Error { var attachments: [SSKProtoAttachmentPointer] = [] attachments = try proto.attachments.map { try SSKProtoAttachmentPointer.parseProto($0) } - var group: SSKProtoGroupContext? = nil + var group: SSKProtoGroupContext? if proto.hasGroup { group = try SSKProtoGroupContext.parseProto(proto.group) } - var quote: SSKProtoDataMessageQuote? = nil + var quote: SSKProtoDataMessageQuote? if proto.hasQuote { quote = try SSKProtoDataMessageQuote.parseProto(proto.quote) } @@ -2349,6 +2653,20 @@ public enum SSKProtoError: Error { contact: contact) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("body: \(proto.body)") + fields.append("attachments: \(proto.attachments)") + fields.append("group: \(proto.group)") + fields.append("flags: \(proto.flags)") + fields.append("expireTimer: \(proto.expireTimer)") + fields.append("profileKey: \(proto.profileKey)") + fields.append("timestamp: \(proto.timestamp)") + fields.append("quote: \(proto.quote)") + fields.append("contact: \(proto.contact)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoNullMessage @@ -2383,6 +2701,12 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoNullMessage.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("padding: \(proto.padding)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_NullMessage @@ -2428,6 +2752,12 @@ public enum SSKProtoError: Error { let result = SSKProtoNullMessage(proto: proto) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("padding: \(proto.padding)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoReceiptMessage @@ -2493,6 +2823,13 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoReceiptMessage.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("type: \(proto.type)") + fields.append("timestamp: \(proto.timestamp)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_ReceiptMessage @@ -2542,6 +2879,13 @@ public enum SSKProtoError: Error { type: type) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("type: \(proto.type)") + fields.append("timestamp: \(proto.timestamp)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoVerified @@ -2612,6 +2956,15 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoVerified.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("destination: \(proto.destination)") + fields.append("identityKey: \(proto.identityKey)") + fields.append("state: \(proto.state)") + fields.append("nullMessage: \(proto.nullMessage)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_Verified @@ -2684,6 +3037,15 @@ public enum SSKProtoError: Error { destination: destination) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("destination: \(proto.destination)") + fields.append("identityKey: \(proto.identityKey)") + fields.append("state: \(proto.state)") + fields.append("nullMessage: \(proto.nullMessage)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoSyncMessageSent @@ -2730,6 +3092,15 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoSyncMessageSent.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("destination: \(proto.destination)") + fields.append("timestamp: \(proto.timestamp)") + fields.append("message: \(proto.message)") + fields.append("expirationStartTimestamp: \(proto.expirationStartTimestamp)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_SyncMessage.Sent @@ -2789,7 +3160,7 @@ public enum SSKProtoError: Error { } fileprivate class func parseProto(_ proto: SignalServiceProtos_SyncMessage.Sent) throws -> SSKProtoSyncMessageSent { - var message: SSKProtoDataMessage? = nil + var message: SSKProtoDataMessage? if proto.hasMessage { message = try SSKProtoDataMessage.parseProto(proto.message) } @@ -2802,6 +3173,15 @@ public enum SSKProtoError: Error { message: message) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("destination: \(proto.destination)") + fields.append("timestamp: \(proto.timestamp)") + fields.append("message: \(proto.message)") + fields.append("expirationStartTimestamp: \(proto.expirationStartTimestamp)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoSyncMessageContacts @@ -2840,6 +3220,13 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoSyncMessageContacts.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("blob: \(proto.blob)") + fields.append("isComplete: \(proto.isComplete)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_SyncMessage.Contacts @@ -2892,6 +3279,13 @@ public enum SSKProtoError: Error { blob: blob) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("blob: \(proto.blob)") + fields.append("isComplete: \(proto.isComplete)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoSyncMessageGroups @@ -2926,6 +3320,12 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoSyncMessageGroups.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("blob: \(proto.blob)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_SyncMessage.Groups @@ -2961,7 +3361,7 @@ public enum SSKProtoError: Error { } fileprivate class func parseProto(_ proto: SignalServiceProtos_SyncMessage.Groups) throws -> SSKProtoSyncMessageGroups { - var blob: SSKProtoAttachmentPointer? = nil + var blob: SSKProtoAttachmentPointer? if proto.hasBlob { blob = try SSKProtoAttachmentPointer.parseProto(proto.blob) } @@ -2974,6 +3374,12 @@ public enum SSKProtoError: Error { blob: blob) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("blob: \(proto.blob)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoSyncMessageBlocked @@ -3014,6 +3420,12 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoSyncMessageBlocked.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("numbers: \(proto.numbers)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_SyncMessage.Blocked @@ -3053,6 +3465,12 @@ public enum SSKProtoError: Error { let result = SSKProtoSyncMessageBlocked(proto: proto) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("numbers: \(proto.numbers)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoSyncMessageRequest @@ -3117,6 +3535,12 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoSyncMessageRequest.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("type: \(proto.type)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_SyncMessage.Request @@ -3162,6 +3586,12 @@ public enum SSKProtoError: Error { type: type) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("type: \(proto.type)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoSyncMessageRead @@ -3200,6 +3630,13 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoSyncMessageRead.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("sender: \(proto.sender)") + fields.append("timestamp: \(proto.timestamp)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_SyncMessage.Read @@ -3255,6 +3692,13 @@ public enum SSKProtoError: Error { timestamp: timestamp) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("sender: \(proto.sender)") + fields.append("timestamp: \(proto.timestamp)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoSyncMessageConfiguration @@ -3289,6 +3733,12 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoSyncMessageConfiguration.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("readReceipts: \(proto.readReceipts)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_SyncMessage.Configuration @@ -3331,6 +3781,12 @@ public enum SSKProtoError: Error { let result = SSKProtoSyncMessageConfiguration(proto: proto) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("readReceipts: \(proto.readReceipts)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoSyncMessage @@ -3403,6 +3859,20 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoSyncMessage.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("sent: \(proto.sent)") + fields.append("contacts: \(proto.contacts)") + fields.append("groups: \(proto.groups)") + fields.append("request: \(proto.request)") + fields.append("read: \(proto.read)") + fields.append("blocked: \(proto.blocked)") + fields.append("verified: \(proto.verified)") + fields.append("configuration: \(proto.configuration)") + fields.append("padding: \(proto.padding)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_SyncMessage @@ -3494,22 +3964,22 @@ public enum SSKProtoError: Error { } fileprivate class func parseProto(_ proto: SignalServiceProtos_SyncMessage) throws -> SSKProtoSyncMessage { - var sent: SSKProtoSyncMessageSent? = nil + var sent: SSKProtoSyncMessageSent? if proto.hasSent { sent = try SSKProtoSyncMessageSent.parseProto(proto.sent) } - var contacts: SSKProtoSyncMessageContacts? = nil + var contacts: SSKProtoSyncMessageContacts? if proto.hasContacts { contacts = try SSKProtoSyncMessageContacts.parseProto(proto.contacts) } - var groups: SSKProtoSyncMessageGroups? = nil + var groups: SSKProtoSyncMessageGroups? if proto.hasGroups { groups = try SSKProtoSyncMessageGroups.parseProto(proto.groups) } - var request: SSKProtoSyncMessageRequest? = nil + var request: SSKProtoSyncMessageRequest? if proto.hasRequest { request = try SSKProtoSyncMessageRequest.parseProto(proto.request) } @@ -3517,17 +3987,17 @@ public enum SSKProtoError: Error { var read: [SSKProtoSyncMessageRead] = [] read = try proto.read.map { try SSKProtoSyncMessageRead.parseProto($0) } - var blocked: SSKProtoSyncMessageBlocked? = nil + var blocked: SSKProtoSyncMessageBlocked? if proto.hasBlocked { blocked = try SSKProtoSyncMessageBlocked.parseProto(proto.blocked) } - var verified: SSKProtoVerified? = nil + var verified: SSKProtoVerified? if proto.hasVerified { verified = try SSKProtoVerified.parseProto(proto.verified) } - var configuration: SSKProtoSyncMessageConfiguration? = nil + var configuration: SSKProtoSyncMessageConfiguration? if proto.hasConfiguration { configuration = try SSKProtoSyncMessageConfiguration.parseProto(proto.configuration) } @@ -3547,6 +4017,20 @@ public enum SSKProtoError: Error { configuration: configuration) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("sent: \(proto.sent)") + fields.append("contacts: \(proto.contacts)") + fields.append("groups: \(proto.groups)") + fields.append("request: \(proto.request)") + fields.append("read: \(proto.read)") + fields.append("blocked: \(proto.blocked)") + fields.append("verified: \(proto.verified)") + fields.append("configuration: \(proto.configuration)") + fields.append("padding: \(proto.padding)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoAttachmentPointer @@ -3635,6 +4119,21 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoAttachmentPointer.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + fields.append("contentType: \(proto.contentType)") + fields.append("key: \(proto.key)") + fields.append("size: \(proto.size)") + fields.append("thumbnail: \(proto.thumbnail)") + fields.append("digest: \(proto.digest)") + fields.append("fileName: \(proto.fileName)") + fields.append("flags: \(proto.flags)") + fields.append("width: \(proto.width)") + fields.append("height: \(proto.height)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_AttachmentPointer @@ -3758,6 +4257,21 @@ public enum SSKProtoError: Error { id: id) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + fields.append("contentType: \(proto.contentType)") + fields.append("key: \(proto.key)") + fields.append("size: \(proto.size)") + fields.append("thumbnail: \(proto.thumbnail)") + fields.append("digest: \(proto.digest)") + fields.append("fileName: \(proto.fileName)") + fields.append("flags: \(proto.flags)") + fields.append("width: \(proto.width)") + fields.append("height: \(proto.height)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoGroupContext @@ -3844,6 +4358,16 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoGroupContext.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + fields.append("type: \(proto.type)") + fields.append("name: \(proto.name)") + fields.append("members: \(proto.members)") + fields.append("avatar: \(proto.avatar)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_GroupContext @@ -3911,7 +4435,7 @@ public enum SSKProtoError: Error { } let type = SSKProtoGroupContextTypeWrap(proto.type) - var avatar: SSKProtoAttachmentPointer? = nil + var avatar: SSKProtoAttachmentPointer? if proto.hasAvatar { avatar = try SSKProtoAttachmentPointer.parseProto(proto.avatar) } @@ -3926,6 +4450,16 @@ public enum SSKProtoError: Error { avatar: avatar) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + fields.append("type: \(proto.type)") + fields.append("name: \(proto.name)") + fields.append("members: \(proto.members)") + fields.append("avatar: \(proto.avatar)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoContactDetailsAvatar @@ -3964,6 +4498,13 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoContactDetailsAvatar.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("contentType: \(proto.contentType)") + fields.append("length: \(proto.length)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_ContactDetails.Avatar @@ -4016,6 +4557,13 @@ public enum SSKProtoError: Error { let result = SSKProtoContactDetailsAvatar(proto: proto) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("contentType: \(proto.contentType)") + fields.append("length: \(proto.length)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoContactDetails @@ -4078,6 +4626,19 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoContactDetails.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("number: \(proto.number)") + fields.append("name: \(proto.name)") + fields.append("avatar: \(proto.avatar)") + fields.append("color: \(proto.color)") + fields.append("verified: \(proto.verified)") + fields.append("profileKey: \(proto.profileKey)") + fields.append("blocked: \(proto.blocked)") + fields.append("expireTimer: \(proto.expireTimer)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_ContactDetails @@ -4173,12 +4734,12 @@ public enum SSKProtoError: Error { } let number = proto.number - var avatar: SSKProtoContactDetailsAvatar? = nil + var avatar: SSKProtoContactDetailsAvatar? if proto.hasAvatar { avatar = try SSKProtoContactDetailsAvatar.parseProto(proto.avatar) } - var verified: SSKProtoVerified? = nil + var verified: SSKProtoVerified? if proto.hasVerified { verified = try SSKProtoVerified.parseProto(proto.verified) } @@ -4193,6 +4754,19 @@ public enum SSKProtoError: Error { verified: verified) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("number: \(proto.number)") + fields.append("name: \(proto.name)") + fields.append("avatar: \(proto.avatar)") + fields.append("color: \(proto.color)") + fields.append("verified: \(proto.verified)") + fields.append("profileKey: \(proto.profileKey)") + fields.append("blocked: \(proto.blocked)") + fields.append("expireTimer: \(proto.expireTimer)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoGroupDetailsAvatar @@ -4231,6 +4805,13 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoGroupDetailsAvatar.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("contentType: \(proto.contentType)") + fields.append("length: \(proto.length)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_GroupDetails.Avatar @@ -4283,6 +4864,13 @@ public enum SSKProtoError: Error { let result = SSKProtoGroupDetailsAvatar(proto: proto) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("contentType: \(proto.contentType)") + fields.append("length: \(proto.length)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SSKProtoGroupDetails @@ -4347,6 +4935,18 @@ public enum SSKProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SSKProtoGroupDetails.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + fields.append("name: \(proto.name)") + fields.append("members: \(proto.members)") + fields.append("avatar: \(proto.avatar)") + fields.append("active: \(proto.active)") + fields.append("expireTimer: \(proto.expireTimer)") + fields.append("color: \(proto.color)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: SignalServiceProtos_GroupDetails @@ -4429,7 +5029,7 @@ public enum SSKProtoError: Error { } let id = proto.id - var avatar: SSKProtoGroupDetailsAvatar? = nil + var avatar: SSKProtoGroupDetailsAvatar? if proto.hasAvatar { avatar = try SSKProtoGroupDetailsAvatar.parseProto(proto.avatar) } @@ -4443,4 +5043,16 @@ public enum SSKProtoError: Error { avatar: avatar) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("id: \(proto.id)") + fields.append("name: \(proto.name)") + fields.append("members: \(proto.members)") + fields.append("avatar: \(proto.avatar)") + fields.append("active: \(proto.active)") + fields.append("expireTimer: \(proto.expireTimer)") + fields.append("color: \(proto.color)") + return "[" + fields.joined(separator: ", ") + "]" + } } diff --git a/SignalServiceKit/src/Protos/Generated/SignalIOSProto.swift b/SignalServiceKit/src/Protos/Generated/SignalIOSProto.swift index cbc0432f9..e063f4376 100644 --- a/SignalServiceKit/src/Protos/Generated/SignalIOSProto.swift +++ b/SignalServiceKit/src/Protos/Generated/SignalIOSProto.swift @@ -77,6 +77,13 @@ public enum SignalIOSProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SignalIOSProtoBackupSnapshotBackupEntity.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("type: \(proto.type)") + fields.append("entityData: \(proto.entityData)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: IOSProtos_BackupSnapshot.BackupEntity @@ -132,6 +139,13 @@ public enum SignalIOSProtoError: Error { entityData: entityData) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("type: \(proto.type)") + fields.append("entityData: \(proto.entityData)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - SignalIOSProtoBackupSnapshot @@ -172,6 +186,12 @@ public enum SignalIOSProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try SignalIOSProtoBackupSnapshot.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("entity: \(proto.entity)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: IOSProtos_BackupSnapshot @@ -215,4 +235,10 @@ public enum SignalIOSProtoError: Error { entity: entity) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("entity: \(proto.entity)") + return "[" + fields.joined(separator: ", ") + "]" + } } diff --git a/SignalServiceKit/src/Protos/Generated/WebSocketProto.swift b/SignalServiceKit/src/Protos/Generated/WebSocketProto.swift index fea71afbf..7fb3aaa59 100644 --- a/SignalServiceKit/src/Protos/Generated/WebSocketProto.swift +++ b/SignalServiceKit/src/Protos/Generated/WebSocketProto.swift @@ -65,6 +65,16 @@ public enum WebSocketProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try WebSocketProtoWebSocketRequestMessage.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("verb: \(proto.verb)") + fields.append("path: \(proto.path)") + fields.append("body: \(proto.body)") + fields.append("headers: \(proto.headers)") + fields.append("requestID: \(proto.requestID)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: WebSocketProtos_WebSocketRequestMessage @@ -144,6 +154,16 @@ public enum WebSocketProtoError: Error { requestID: requestID) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("verb: \(proto.verb)") + fields.append("path: \(proto.path)") + fields.append("body: \(proto.body)") + fields.append("headers: \(proto.headers)") + fields.append("requestID: \(proto.requestID)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - WebSocketProtoWebSocketResponseMessage @@ -200,6 +220,16 @@ public enum WebSocketProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try WebSocketProtoWebSocketResponseMessage.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("requestID: \(proto.requestID)") + fields.append("status: \(proto.status)") + fields.append("message: \(proto.message)") + fields.append("headers: \(proto.headers)") + fields.append("body: \(proto.body)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: WebSocketProtos_WebSocketResponseMessage @@ -279,6 +309,16 @@ public enum WebSocketProtoError: Error { status: status) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("requestID: \(proto.requestID)") + fields.append("status: \(proto.status)") + fields.append("message: \(proto.message)") + fields.append("headers: \(proto.headers)") + fields.append("body: \(proto.body)") + return "[" + fields.joined(separator: ", ") + "]" + } } // MARK: - WebSocketProtoWebSocketMessage @@ -345,6 +385,14 @@ public enum WebSocketProtoError: Error { @objc public func buildSerializedData() throws -> Data { return try WebSocketProtoWebSocketMessage.parseProto(proto).serializedData() } + + @objc public override var description: String { + var fields = [String]() + fields.append("type: \(proto.type)") + fields.append("request: \(proto.request)") + fields.append("response: \(proto.response)") + return "[" + fields.joined(separator: ", ") + "]" + } } fileprivate let proto: WebSocketProtos_WebSocketMessage @@ -396,12 +444,12 @@ public enum WebSocketProtoError: Error { } let type = WebSocketProtoWebSocketMessageTypeWrap(proto.type) - var request: WebSocketProtoWebSocketRequestMessage? = nil + var request: WebSocketProtoWebSocketRequestMessage? if proto.hasRequest { request = try WebSocketProtoWebSocketRequestMessage.parseProto(proto.request) } - var response: WebSocketProtoWebSocketResponseMessage? = nil + var response: WebSocketProtoWebSocketResponseMessage? if proto.hasResponse { response = try WebSocketProtoWebSocketResponseMessage.parseProto(proto.response) } @@ -416,4 +464,12 @@ public enum WebSocketProtoError: Error { response: response) return result } + + @objc public override var description: String { + var fields = [String]() + fields.append("type: \(proto.type)") + fields.append("request: \(proto.request)") + fields.append("response: \(proto.response)") + return "[" + fields.joined(separator: ", ") + "]" + } }