From ad49533e3397f41fb3d582b4e005253ed9dcb504 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 18 Jul 2019 11:53:11 -0300 Subject: [PATCH] Make TSInteraction.thread non-nil. --- ...nversationConfigurationSyncOperation.swift | 7 +- .../Notifications/AppNotifications.swift | 2 +- .../ColorPickerViewController.swift | 68 +++++++++++++------ .../ConversationViewController.m | 2 +- .../DebugUI/DebugUINotifications.swift | 5 +- .../DebugUI/DebugUIProfile.swift | 4 ++ .../DebugUI/DebugUISyncMessages.m | 13 +++- SignalMessaging/contacts/OWSSyncManager.m | 48 +++++++++---- .../src/Account/TSAccountManager.swift | 33 +++++++++ SignalServiceKit/src/Contacts/TSThread.h | 3 + .../Devices/OWSBlockedPhoneNumbersMessage.h | 7 +- .../Devices/OWSBlockedPhoneNumbersMessage.m | 9 +-- .../OWSPerMessageExpirationReadSyncMessage.h | 7 +- .../OWSPerMessageExpirationReadSyncMessage.m | 9 +-- .../OWSReadReceiptsForLinkedDevicesMessage.h | 5 +- .../OWSReadReceiptsForLinkedDevicesMessage.m | 4 +- .../src/Devices/OWSReceiptsForSenderMessage.h | 6 +- .../src/Devices/OWSReceiptsForSenderMessage.m | 6 +- .../src/Devices/OWSStickerPackSyncMessage.h | 4 +- .../src/Devices/OWSStickerPackSyncMessage.m | 6 +- .../Devices/OWSVerificationStateSyncMessage.h | 7 +- .../Devices/OWSVerificationStateSyncMessage.m | 9 +-- .../OWSOutgoingSentMessageTranscript.h | 5 +- .../OWSOutgoingSentMessageTranscript.m | 11 +-- .../DeviceSyncing/OWSOutgoingSyncMessage.h | 7 +- .../DeviceSyncing/OWSOutgoingSyncMessage.m | 8 +-- .../OWSSyncConfigurationMessage.h | 9 +-- .../OWSSyncConfigurationMessage.m | 11 +-- .../DeviceSyncing/OWSSyncContactsMessage.h | 7 +- .../DeviceSyncing/OWSSyncContactsMessage.m | 9 +-- .../DeviceSyncing/OWSSyncGroupsMessage.h | 2 +- .../DeviceSyncing/OWSSyncGroupsMessage.m | 4 +- .../OWSSyncGroupsRequestMessage.h | 4 +- .../OWSSyncGroupsRequestMessage.m | 2 +- ...DisappearingMessagesConfigurationMessage.h | 2 +- .../Interactions/OWSDynamicOutgoingMessage.h | 6 +- .../Interactions/OWSDynamicOutgoingMessage.m | 4 +- .../Interactions/OWSEndSessionMessage.h | 4 +- .../Interactions/OWSEndSessionMessage.m | 2 +- .../Messages/Interactions/TSErrorMessage.h | 16 +++-- .../Messages/Interactions/TSErrorMessage.m | 54 ++++++++++++--- .../TSErrorMessage_privateConstructor.h | 2 +- .../Messages/Interactions/TSIncomingMessage.h | 2 +- .../src/Messages/Interactions/TSInfoMessage.h | 4 +- .../src/Messages/Interactions/TSInteraction.h | 9 +-- .../src/Messages/Interactions/TSInteraction.m | 4 +- .../src/Messages/Interactions/TSMessage.h | 2 +- .../src/Messages/Interactions/TSMessage.m | 2 +- .../Messages/Interactions/TSOutgoingMessage.h | 12 ++-- .../Messages/Interactions/TSOutgoingMessage.m | 18 ++--- ...SInvalidIdentityKeyReceivingErrorMessage.m | 2 +- .../src/Messages/OWSBatchMessageProcessor.m | 2 +- .../src/Messages/OWSBlockingManager.m | 26 +++++-- .../src/Messages/OWSIdentityManager.m | 8 ++- .../src/Messages/OWSMessageDecrypter.m | 4 +- .../src/Messages/OWSMessageManager.m | 7 +- .../src/Messages/OWSMessageReceiver.m | 2 +- .../src/Messages/OWSMessageSender.m | 51 +++++++++++--- .../src/Messages/OWSOutgoingCallMessage.h | 2 +- .../src/Messages/OWSOutgoingCallMessage.m | 4 +- .../src/Messages/OWSOutgoingNullMessage.h | 2 +- .../src/Messages/OWSProfileKeyMessage.h | 4 +- .../src/Messages/OWSProfileKeyMessage.m | 4 +- .../src/Messages/OWSReadReceiptManager.m | 13 +++- .../Messages/Stickers/StickerManager.swift | 6 +- .../src/Network/WebSockets/OWSWebSocket.m | 2 +- .../src/Protocols/NotificationsProtocol.h | 3 +- SignalServiceKit/src/SignalServiceKit.h | 1 + .../TestUtils/NoopNotificationsManager.swift | 2 +- SignalServiceKit/src/Util/OWSError.h | 3 +- .../src/Util/PerMessageExpiration.swift | 7 +- 71 files changed, 446 insertions(+), 195 deletions(-) create mode 100644 SignalServiceKit/src/Account/TSAccountManager.swift diff --git a/Signal/src/Jobs/ConversationConfigurationSyncOperation.swift b/Signal/src/Jobs/ConversationConfigurationSyncOperation.swift index dba1f8a3c2..e9efe8efd3 100644 --- a/Signal/src/Jobs/ConversationConfigurationSyncOperation.swift +++ b/Signal/src/Jobs/ConversationConfigurationSyncOperation.swift @@ -64,8 +64,11 @@ class ConversationConfigurationSyncOperation: OWSOperation { // The current implementation works, but seems wasteful. // Does desktop handle single group sync correctly? // What does Android do? - let syncMessage: OWSSyncGroupsMessage = OWSSyncGroupsMessage() - + guard let thread = TSAccountManager.getOrCreateLocalThreadWithSneakyTransaction() else { + owsFailDebug("Missing thread.") + return + } + let syncMessage = OWSSyncGroupsMessage(thread: thread) var dataSource: DataSource? self.dbConnection.read { transaction in guard let messageData: Data = syncMessage.buildPlainTextAttachmentData(with: transaction.asAnyRead) else { diff --git a/Signal/src/UserInterface/Notifications/AppNotifications.swift b/Signal/src/UserInterface/Notifications/AppNotifications.swift index 9b50c019fd..1105225100 100644 --- a/Signal/src/UserInterface/Notifications/AppNotifications.swift +++ b/Signal/src/UserInterface/Notifications/AppNotifications.swift @@ -522,7 +522,7 @@ public class NotificationPresenter: NSObject, NotificationsProtocol { } } - public func notifyUser(forThreadlessErrorMessage errorMessage: TSErrorMessage, transaction: SDSAnyWriteTransaction) { + public func notifyUser(for errorMessage: ThreadlessErrorMessage, transaction: SDSAnyWriteTransaction) { let notificationBody = errorMessage.previewText(with: transaction) transaction.addCompletion { diff --git a/Signal/src/ViewControllers/ColorPickerViewController.swift b/Signal/src/ViewControllers/ColorPickerViewController.swift index 1156f07627..37e41f9f7f 100644 --- a/Signal/src/ViewControllers/ColorPickerViewController.swift +++ b/Signal/src/ViewControllers/ColorPickerViewController.swift @@ -135,6 +135,14 @@ protocol ColorPickerViewDelegate: class { class ColorPickerView: UIView, ColorViewDelegate { + // MARK: - Dependencies + + private var databaseStorage: SDSDatabaseStorage { + return SDSDatabaseStorage.shared + } + + // MARK: - + private let colorViews: [ColorView] let conversationStyle: ConversationStyle var outgoingMessageView = OWSMessageBubbleView(forAutoLayout: ()) @@ -219,19 +227,31 @@ class ColorPickerView: UIView, ColorViewDelegate { return headerView } + private var outgoingViewItem: MockConversationViewItem { + let thread = MockThread(contactAddress: SignalServiceAddress(phoneNumber: "+fake-id")) + let outgoingText = NSLocalizedString("COLOR_PICKER_DEMO_MESSAGE_1", comment: "The first of two messages demonstrating the chosen conversation color, by rendering this message in an outgoing message bubble.") + let outgoingItem = MockConversationViewItem(interaction: MockOutgoingMessage(messageBody: outgoingText, thread: thread)) + outgoingItem.displayableBodyText = DisplayableText.displayableText(outgoingText) + outgoingItem.interactionType = .outgoingMessage + return outgoingItem + } + + private var incomingViewItem: MockConversationViewItem { + let thread = MockThread(contactAddress: SignalServiceAddress(phoneNumber: "+fake-id")) + let incomingText = NSLocalizedString("COLOR_PICKER_DEMO_MESSAGE_2", comment: "The second of two messages demonstrating the chosen conversation color, by rendering this message in an incoming message bubble.") + let incomingItem = MockConversationViewItem(interaction: MockIncomingMessage(messageBody: incomingText, thread: thread)) + incomingItem.displayableBodyText = DisplayableText.displayableText(incomingText) + incomingItem.interactionType = .incomingMessage + return incomingItem + } + private func updateMockConversationView() { conversationStyle.viewWidth = max(bounds.size.width, kMinimumConversationWidth) mockConversationView.subviews.forEach { $0.removeFromSuperview() } // outgoing outgoingMessageView = OWSMessageBubbleView(forAutoLayout: ()) - let outgoingItem = MockConversationViewItem() - let outgoingText = NSLocalizedString("COLOR_PICKER_DEMO_MESSAGE_1", comment: "The first of two messages demonstrating the chosen conversation color, by rendering this message in an outgoing message bubble.") - outgoingItem.interaction = MockOutgoingMessage(messageBody: outgoingText) - outgoingItem.displayableBodyText = DisplayableText.displayableText(outgoingText) - outgoingItem.interactionType = .outgoingMessage - - outgoingMessageView.viewItem = outgoingItem + outgoingMessageView.viewItem = outgoingViewItem outgoingMessageView.cellMediaCache = NSCache() outgoingMessageView.conversationStyle = conversationStyle outgoingMessageView.configureViews() @@ -244,13 +264,7 @@ class ColorPickerView: UIView, ColorViewDelegate { // incoming incomingMessageView = OWSMessageBubbleView(forAutoLayout: ()) - let incomingItem = MockConversationViewItem() - let incomingText = NSLocalizedString("COLOR_PICKER_DEMO_MESSAGE_2", comment: "The second of two messages demonstrating the chosen conversation color, by rendering this message in an incoming message bubble.") - incomingItem.interaction = MockIncomingMessage(messageBody: incomingText) - incomingItem.displayableBodyText = DisplayableText.displayableText(incomingText) - incomingItem.interactionType = .incomingMessage - - incomingMessageView.viewItem = incomingItem + incomingMessageView.viewItem = incomingViewItem incomingMessageView.cellMediaCache = NSCache() incomingMessageView.conversationStyle = conversationStyle incomingMessageView.configureViews() @@ -295,9 +309,21 @@ class ColorPickerView: UIView, ColorViewDelegate { // MARK: Mock Classes for rendering demo conversation +@objc +private class MockThread: TSContactThread { + public override var shouldBeSaved: Bool { + return false + } + + override func anyWillInsert(with transaction: SDSAnyWriteTransaction) { + // no - op + owsFailDebug("shouldn't save mock thread") + } +} + @objc private class MockConversationViewItem: NSObject, ConversationViewItem { - var interaction: TSInteraction = TSMessage() + var interaction: TSInteraction var interactionType: OWSInteractionType = OWSInteractionType.unknown var quotedReply: OWSQuotedReplyModel? var isGroupThread: Bool = false @@ -341,7 +367,9 @@ private class MockConversationViewItem: NSObject, ConversationViewItem { var isFailedSticker: Bool = false var perMessageExpirationState: PerMessageExpirationState = .incomingExpired - override init() { + init(interaction: TSInteraction) { + self.interaction = interaction + super.init() } @@ -441,9 +469,9 @@ private class MockConversationViewItem: NSObject, ConversationViewItem { } private class MockIncomingMessage: TSIncomingMessage { - init(messageBody: String) { + init(messageBody: String, thread: TSThread) { super.init(incomingMessageWithTimestamp: NSDate.ows_millisecondTimeStamp(), - in: TSThread(), + in: thread, authorAddress: SignalServiceAddress(phoneNumber: "+fake-id"), sourceDeviceId: 1, messageBody: messageBody, @@ -476,9 +504,9 @@ private class MockIncomingMessage: TSIncomingMessage { } private class MockOutgoingMessage: TSOutgoingMessage { - init(messageBody: String) { + init(messageBody: String, thread: TSThread) { super.init(outgoingMessageWithTimestamp: NSDate.ows_millisecondTimeStamp(), - in: nil, + in: thread, messageBody: messageBody, attachmentIds: [], expiresInSeconds: 0, diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 7ff3929d23..3d27a10784 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -1862,7 +1862,7 @@ typedef enum : NSUInteger { [self.attachmentDownloads downloadAllAttachmentsForMessage:message transaction:transaction success:^(NSArray *attachmentStreams) { - OWSLogInfo(@"Successfully redownloaded attachment in thread: %@", message.thread); + OWSLogInfo(@"Successfully redownloaded attachment in thread: %@", message.threadWithSneakyTransaction); } failure:^(NSError *error) { OWSLogWarn(@"Failed to redownload message with error: %@", error); diff --git a/Signal/src/ViewControllers/DebugUI/DebugUINotifications.swift b/Signal/src/ViewControllers/DebugUI/DebugUINotifications.swift index b4ae2543d4..9baed7e0de 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUINotifications.swift +++ b/Signal/src/ViewControllers/DebugUI/DebugUINotifications.swift @@ -194,9 +194,8 @@ class DebugUINotifications: DebugUIPage { func notifyUserForThreadlessErrorMessage() -> Guarantee { return delayedNotificationDispatch { self.databaseStorage.write { transaction in - let errorMessage = TSErrorMessage.corruptedMessageInUnknownThread() - - self.notificationPresenter.notifyUser(forThreadlessErrorMessage: errorMessage, + let errorMessage = ThreadlessErrorMessage.corruptedMessageInUnknownThread() + self.notificationPresenter.notifyUser(for: errorMessage, transaction: transaction) } } diff --git a/Signal/src/ViewControllers/DebugUI/DebugUIProfile.swift b/Signal/src/ViewControllers/DebugUI/DebugUIProfile.swift index 7fb9a30a3a..b670bedeae 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUIProfile.swift +++ b/Signal/src/ViewControllers/DebugUI/DebugUIProfile.swift @@ -45,6 +45,10 @@ class DebugUIProfile: DebugUIPage { }, OWSTableItem(title: "Send Profile Key Message") { [weak self] in guard let strongSelf = self else { return } + guard let aThread = aThread else { + owsFailDebug("Missing thread.") + return + } // MJK TODO - should be safe to remove this senderTimestamp let message = OWSProfileKeyMessage(timestamp: NSDate.ows_millisecondTimeStamp(), in: aThread) diff --git a/Signal/src/ViewControllers/DebugUI/DebugUISyncMessages.m b/Signal/src/ViewControllers/DebugUI/DebugUISyncMessages.m index 03f4040594..5c3d751d12 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUISyncMessages.m +++ b/Signal/src/ViewControllers/DebugUI/DebugUISyncMessages.m @@ -108,7 +108,14 @@ NS_ASSUME_NONNULL_BEGIN + (void)sendGroupSyncMessage { - OWSSyncGroupsMessage *syncGroupsMessage = [[OWSSyncGroupsMessage alloc] init]; + TSThread *_Nullable thread = [TSAccountManager getOrCreateLocalThreadWithSneakyTransaction]; + if (thread == nil) { + OWSFailDebug(@"Missing thread."); + return; + } + + OWSSyncGroupsMessage *syncGroupsMessage = [[OWSSyncGroupsMessage alloc] initWithThread:thread]; + __block DataSource *dataSource; [self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { dataSource = [DataSourceValue @@ -116,6 +123,10 @@ NS_ASSUME_NONNULL_BEGIN buildPlainTextAttachmentDataWithTransaction:transaction.asAnyRead]]; }]; + if (syncGroupsMessage == nil || dataSource == nil) { + return; + } + [self.messageSenderJobQueue addMediaMessage:syncGroupsMessage dataSource:dataSource contentType:OWSMimeTypeApplicationOctetStream diff --git a/SignalMessaging/contacts/OWSSyncManager.m b/SignalMessaging/contacts/OWSSyncManager.m index ed4cd7130f..c6cf257884 100644 --- a/SignalMessaging/contacts/OWSSyncManager.m +++ b/SignalMessaging/contacts/OWSSyncManager.m @@ -12,6 +12,7 @@ #import #import #import +#import #import #import #import @@ -154,11 +155,17 @@ NSString *const kSyncManagerLastContactSyncKey = @"kTSStorageManagerOWSSyncManag return; } - OWSSyncContactsMessage *syncContactsMessage = - [[OWSSyncContactsMessage alloc] initWithSignalAccounts:self.contactsManager.signalAccounts - identityManager:self.identityManager - profileManager:self.profileManager]; + TSThread *_Nullable thread = [TSAccountManager getOrCreateLocalThreadWithSneakyTransaction]; + if (thread == nil) { + OWSFailDebug(@"Missing thread."); + return; + } + OWSSyncContactsMessage *syncContactsMessage = + [[OWSSyncContactsMessage alloc] initWithThread:thread + signalAccounts:self.contactsManager.signalAccounts + identityManager:self.identityManager + profileManager:self.profileManager]; __block NSData *_Nullable messageData; __block NSData *_Nullable lastMessageData; [self.readDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { @@ -242,14 +249,21 @@ NSString *const kSyncManagerLastContactSyncKey = @"kTSStorageManagerOWSSyncManag BOOL showUnidentifiedDeliveryIndicators = Environment.shared.preferences.shouldShowUnidentifiedDeliveryIndicators; BOOL showTypingIndicators = self.typingIndicators.areTypingIndicatorsEnabled; - [self.editingDatabaseConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { + [self.editingDatabaseConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + TSThread *_Nullable thread = [TSAccountManager getOrCreateLocalThreadWithTransaction:transaction.asAnyWrite]; + if (thread == nil) { + OWSFailDebug(@"Missing thread."); + return; + } + BOOL sendLinkPreviews = [SSKPreferences areLinkPreviewsEnabledWithTransaction:transaction.asAnyRead]; OWSSyncConfigurationMessage *syncConfigurationMessage = - [[OWSSyncConfigurationMessage alloc] initWithReadReceiptsEnabled:areReadReceiptsEnabled - showUnidentifiedDeliveryIndicators:showUnidentifiedDeliveryIndicators - showTypingIndicators:showTypingIndicators - sendLinkPreviews:sendLinkPreviews]; + [[OWSSyncConfigurationMessage alloc] initWithThread:thread + readReceiptsEnabled:areReadReceiptsEnabled + showUnidentifiedDeliveryIndicators:showUnidentifiedDeliveryIndicators + showTypingIndicators:showTypingIndicators + sendLinkPreviews:sendLinkPreviews]; [self.messageSenderJobQueue addMessage:syncConfigurationMessage transaction:transaction.asAnyWrite]; }]; @@ -273,10 +287,18 @@ NSString *const kSyncManagerLastContactSyncKey = @"kTSStorageManagerOWSSyncManag - (AnyPromise *)syncContactsForSignalAccounts:(NSArray *)signalAccounts { - OWSSyncContactsMessage *syncContactsMessage = - [[OWSSyncContactsMessage alloc] initWithSignalAccounts:signalAccounts - identityManager:self.identityManager - profileManager:self.profileManager]; + TSThread *_Nullable thread = [TSAccountManager getOrCreateLocalThreadWithSneakyTransaction]; + if (thread == nil) { + OWSFailDebug(@"Missing thread."); + NSError *error = OWSErrorWithCodeDescription(OWSErrorCodeMissingLocalThread, @"Missing local thread."); + return [AnyPromise promiseWithValue:error]; + } + + OWSSyncContactsMessage *syncContactsMessage = [[OWSSyncContactsMessage alloc] initWithThread:thread + signalAccounts:signalAccounts + identityManager:self.identityManager + profileManager:self.profileManager]; + __block DataSource *dataSource; [self.readDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { dataSource = [DataSourceValue diff --git a/SignalServiceKit/src/Account/TSAccountManager.swift b/SignalServiceKit/src/Account/TSAccountManager.swift new file mode 100644 index 0000000000..bb8415025d --- /dev/null +++ b/SignalServiceKit/src/Account/TSAccountManager.swift @@ -0,0 +1,33 @@ +// +// Copyright (c) 2019 Open Whisper Systems. All rights reserved. +// + +import Foundation + +@objc +public extension TSAccountManager { + + // MARK: - Dependencies + + class var databaseStorage: SDSDatabaseStorage { + return SDSDatabaseStorage.shared + } + + // MARK: - + + class func getOrCreateLocalThread(transaction: SDSAnyWriteTransaction) -> TSThread? { + guard let localAddress = self.localAddress else { + owsFailDebug("Missing localAddress.") + return nil + } + return TSContactThread.getOrCreateThread(withContactAddress: localAddress, transaction: transaction) + } + + class func getOrCreateLocalThreadWithSneakyTransaction() -> TSThread? { + var thread: TSThread? + databaseStorage.write { transaction in + thread = getOrCreateLocalThread(transaction: transaction) + } + return thread + } +} diff --git a/SignalServiceKit/src/Contacts/TSThread.h b/SignalServiceKit/src/Contacts/TSThread.h index d712ef6931..23525d354b 100644 --- a/SignalServiceKit/src/Contacts/TSThread.h +++ b/SignalServiceKit/src/Contacts/TSThread.h @@ -42,6 +42,9 @@ extern ConversationColorName const kConversationColorName_Default; @property (nonatomic, readonly) BOOL isArchivedByLegacyTimestampForSorting; @property (nonatomic, readonly) int64_t rowId; +// GRDB TODO: Promote this to BaseModel/TSYapDatabaseObject. +- (instancetype)init NS_UNAVAILABLE; + // --- CODE GENERATION MARKER // This snippet is generated by /Scripts/sds_codegen/sds_generate.py. Do not manually edit it, instead run `sds_codegen.sh`. diff --git a/SignalServiceKit/src/Devices/OWSBlockedPhoneNumbersMessage.h b/SignalServiceKit/src/Devices/OWSBlockedPhoneNumbersMessage.h index 54dc8554f9..82fc82e37e 100644 --- a/SignalServiceKit/src/Devices/OWSBlockedPhoneNumbersMessage.h +++ b/SignalServiceKit/src/Devices/OWSBlockedPhoneNumbersMessage.h @@ -10,9 +10,10 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithPhoneNumbers:(NSArray *)phoneNumbers - uuids:(NSArray *)uuids - groupIds:(NSArray *)groupIds NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithThread:(TSThread *)thread + phoneNumbers:(NSArray *)phoneNumbers + uuids:(NSArray *)uuids + groupIds:(NSArray *)groupIds NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; @end diff --git a/SignalServiceKit/src/Devices/OWSBlockedPhoneNumbersMessage.m b/SignalServiceKit/src/Devices/OWSBlockedPhoneNumbersMessage.m index 26caaaa8dc..0ef7d08ba0 100644 --- a/SignalServiceKit/src/Devices/OWSBlockedPhoneNumbersMessage.m +++ b/SignalServiceKit/src/Devices/OWSBlockedPhoneNumbersMessage.m @@ -22,11 +22,12 @@ NS_ASSUME_NONNULL_BEGIN return [super initWithCoder:coder]; } -- (instancetype)initWithPhoneNumbers:(NSArray *)phoneNumbers - uuids:(NSArray *)uuids - groupIds:(NSArray *)groupIds +- (instancetype)initWithThread:(TSThread *)thread + phoneNumbers:(NSArray *)phoneNumbers + uuids:(NSArray *)uuids + groupIds:(NSArray *)groupIds { - self = [super init]; + self = [super initWithThread:thread]; if (!self) { return self; } diff --git a/SignalServiceKit/src/Devices/OWSPerMessageExpirationReadSyncMessage.h b/SignalServiceKit/src/Devices/OWSPerMessageExpirationReadSyncMessage.h index a092eb4843..4e93dc42dd 100644 --- a/SignalServiceKit/src/Devices/OWSPerMessageExpirationReadSyncMessage.h +++ b/SignalServiceKit/src/Devices/OWSPerMessageExpirationReadSyncMessage.h @@ -17,9 +17,10 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; - (instancetype)initWithTimestamp:(uint64_t)timestamp NS_UNAVAILABLE; -- (instancetype)initWithSenderAddress:(SignalServiceAddress *)senderAddress - messageIdTimestamp:(uint64_t)messageIdtimestamp - readTimestamp:(uint64_t)readTimestamp NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithThread:(TSThread *)thread + senderAddress:(SignalServiceAddress *)senderAddress + messageIdTimestamp:(uint64_t)messageIdtimestamp + readTimestamp:(uint64_t)readTimestamp NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; diff --git a/SignalServiceKit/src/Devices/OWSPerMessageExpirationReadSyncMessage.m b/SignalServiceKit/src/Devices/OWSPerMessageExpirationReadSyncMessage.m index dd20a18739..213e49de1d 100644 --- a/SignalServiceKit/src/Devices/OWSPerMessageExpirationReadSyncMessage.m +++ b/SignalServiceKit/src/Devices/OWSPerMessageExpirationReadSyncMessage.m @@ -9,13 +9,14 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSPerMessageExpirationReadSyncMessage -- (instancetype)initWithSenderAddress:(SignalServiceAddress *)senderAddress - messageIdTimestamp:(uint64_t)messageIdTimestamp - readTimestamp:(uint64_t)readTimestamp +- (instancetype)initWithThread:(TSThread *)thread + senderAddress:(SignalServiceAddress *)senderAddress + messageIdTimestamp:(uint64_t)messageIdTimestamp + readTimestamp:(uint64_t)readTimestamp { OWSAssertDebug(senderAddress.isValid && messageIdTimestamp > 0); - self = [super initWithTimestamp:readTimestamp]; + self = [super initWithTimestamp:readTimestamp thread:thread]; if (!self) { return self; } diff --git a/SignalServiceKit/src/Devices/OWSReadReceiptsForLinkedDevicesMessage.h b/SignalServiceKit/src/Devices/OWSReadReceiptsForLinkedDevicesMessage.h index 5e2165be73..2cbc3e60f2 100644 --- a/SignalServiceKit/src/Devices/OWSReadReceiptsForLinkedDevicesMessage.h +++ b/SignalServiceKit/src/Devices/OWSReadReceiptsForLinkedDevicesMessage.h @@ -1,5 +1,5 @@ // -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// Copyright (c) 2019 Open Whisper Systems. All rights reserved. // #import "OWSOutgoingSyncMessage.h" @@ -12,7 +12,8 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithReadReceipts:(NSArray *)readReceipts NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithThread:(TSThread *)thread + readReceipts:(NSArray *)readReceipts NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; @end diff --git a/SignalServiceKit/src/Devices/OWSReadReceiptsForLinkedDevicesMessage.m b/SignalServiceKit/src/Devices/OWSReadReceiptsForLinkedDevicesMessage.m index 390fdee124..be1a442cf5 100644 --- a/SignalServiceKit/src/Devices/OWSReadReceiptsForLinkedDevicesMessage.m +++ b/SignalServiceKit/src/Devices/OWSReadReceiptsForLinkedDevicesMessage.m @@ -16,9 +16,9 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSReadReceiptsForLinkedDevicesMessage -- (instancetype)initWithReadReceipts:(NSArray *)readReceipts +- (instancetype)initWithThread:(TSThread *)thread readReceipts:(NSArray *)readReceipts { - self = [super init]; + self = [super initWithThread:thread]; if (!self) { return self; } diff --git a/SignalServiceKit/src/Devices/OWSReceiptsForSenderMessage.h b/SignalServiceKit/src/Devices/OWSReceiptsForSenderMessage.h index 26225fc222..5357f8457d 100644 --- a/SignalServiceKit/src/Devices/OWSReceiptsForSenderMessage.h +++ b/SignalServiceKit/src/Devices/OWSReceiptsForSenderMessage.h @@ -11,7 +11,7 @@ NS_ASSUME_NONNULL_BEGIN @interface OWSReceiptsForSenderMessage : TSOutgoingMessage - (instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSMutableArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds @@ -23,10 +23,10 @@ NS_ASSUME_NONNULL_BEGIN linkPreview:(nullable OWSLinkPreview *)linkPreview messageSticker:(nullable MessageSticker *)messageSticker NS_UNAVAILABLE; -+ (OWSReceiptsForSenderMessage *)deliveryReceiptsForSenderMessageWithThread:(nullable TSThread *)thread ++ (OWSReceiptsForSenderMessage *)deliveryReceiptsForSenderMessageWithThread:(TSThread *)thread messageTimestamps:(NSArray *)messageTimestamps; -+ (OWSReceiptsForSenderMessage *)readReceiptsForSenderMessageWithThread:(nullable TSThread *)thread ++ (OWSReceiptsForSenderMessage *)readReceiptsForSenderMessageWithThread:(TSThread *)thread messageTimestamps:(NSArray *)messageTimestamps; @end diff --git a/SignalServiceKit/src/Devices/OWSReceiptsForSenderMessage.m b/SignalServiceKit/src/Devices/OWSReceiptsForSenderMessage.m index 8e5e0728fe..7ba3c46dd3 100644 --- a/SignalServiceKit/src/Devices/OWSReceiptsForSenderMessage.m +++ b/SignalServiceKit/src/Devices/OWSReceiptsForSenderMessage.m @@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSReceiptsForSenderMessage -+ (OWSReceiptsForSenderMessage *)deliveryReceiptsForSenderMessageWithThread:(nullable TSThread *)thread ++ (OWSReceiptsForSenderMessage *)deliveryReceiptsForSenderMessageWithThread:(TSThread *)thread messageTimestamps:(NSArray *)messageTimestamps { return [[OWSReceiptsForSenderMessage alloc] initWithThread:thread @@ -29,7 +29,7 @@ NS_ASSUME_NONNULL_BEGIN receiptType:SSKProtoReceiptMessageTypeDelivery]; } -+ (OWSReceiptsForSenderMessage *)readReceiptsForSenderMessageWithThread:(nullable TSThread *)thread ++ (OWSReceiptsForSenderMessage *)readReceiptsForSenderMessageWithThread:(TSThread *)thread messageTimestamps:(NSArray *)messageTimestamps { return [[OWSReceiptsForSenderMessage alloc] initWithThread:thread @@ -37,7 +37,7 @@ NS_ASSUME_NONNULL_BEGIN receiptType:SSKProtoReceiptMessageTypeRead]; } -- (instancetype)initWithThread:(nullable TSThread *)thread +- (instancetype)initWithThread:(TSThread *)thread messageTimestamps:(NSArray *)messageTimestamps receiptType:(SSKProtoReceiptMessageType)receiptType { diff --git a/SignalServiceKit/src/Devices/OWSStickerPackSyncMessage.h b/SignalServiceKit/src/Devices/OWSStickerPackSyncMessage.h index e9cfb6208f..33b6ec6e99 100644 --- a/SignalServiceKit/src/Devices/OWSStickerPackSyncMessage.h +++ b/SignalServiceKit/src/Devices/OWSStickerPackSyncMessage.h @@ -16,7 +16,9 @@ typedef NS_ENUM(NSUInteger, StickerPackOperationType) { - (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithPacks:(NSArray *)packs operationType:(StickerPackOperationType)operationType; +- (instancetype)initWithThread:(TSThread *)thread + packs:(NSArray *)packs + operationType:(StickerPackOperationType)operationType; - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; @end diff --git a/SignalServiceKit/src/Devices/OWSStickerPackSyncMessage.m b/SignalServiceKit/src/Devices/OWSStickerPackSyncMessage.m index 662da331b6..069b51db06 100644 --- a/SignalServiceKit/src/Devices/OWSStickerPackSyncMessage.m +++ b/SignalServiceKit/src/Devices/OWSStickerPackSyncMessage.m @@ -23,9 +23,11 @@ NS_ASSUME_NONNULL_BEGIN return [super initWithCoder:coder]; } -- (instancetype)initWithPacks:(NSArray *)packs operationType:(StickerPackOperationType)operationType +- (instancetype)initWithThread:(TSThread *)thread + packs:(NSArray *)packs + operationType:(StickerPackOperationType)operationType { - self = [super init]; + self = [super initWithThread:thread]; if (!self) { return self; } diff --git a/SignalServiceKit/src/Devices/OWSVerificationStateSyncMessage.h b/SignalServiceKit/src/Devices/OWSVerificationStateSyncMessage.h index 5729a87a47..f346bd27ea 100644 --- a/SignalServiceKit/src/Devices/OWSVerificationStateSyncMessage.h +++ b/SignalServiceKit/src/Devices/OWSVerificationStateSyncMessage.h @@ -13,9 +13,10 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithVerificationState:(OWSVerificationState)verificationState - identityKey:(NSData *)identityKey - verificationForRecipientAddress:(SignalServiceAddress *)address NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithThread:(TSThread *)thread + verificationState:(OWSVerificationState)verificationState + identityKey:(NSData *)identityKey + verificationForRecipientAddress:(SignalServiceAddress *)address NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; // This is a clunky name, but we want to differentiate it from `recipientIdentifier` inherited from `TSOutgoingMessage` diff --git a/SignalServiceKit/src/Devices/OWSVerificationStateSyncMessage.m b/SignalServiceKit/src/Devices/OWSVerificationStateSyncMessage.m index 499678e001..8f3569e06f 100644 --- a/SignalServiceKit/src/Devices/OWSVerificationStateSyncMessage.m +++ b/SignalServiceKit/src/Devices/OWSVerificationStateSyncMessage.m @@ -22,9 +22,10 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSVerificationStateSyncMessage -- (instancetype)initWithVerificationState:(OWSVerificationState)verificationState - identityKey:(NSData *)identityKey - verificationForRecipientAddress:(SignalServiceAddress *)address +- (instancetype)initWithThread:(TSThread *)thread + verificationState:(OWSVerificationState)verificationState + identityKey:(NSData *)identityKey + verificationForRecipientAddress:(SignalServiceAddress *)address { OWSAssertDebug(identityKey.length == kIdentityKeyLength); OWSAssertDebug(address.isValid); @@ -33,7 +34,7 @@ NS_ASSUME_NONNULL_BEGIN // will figure that out on it's own. OWSAssertDebug(verificationState != OWSVerificationStateNoLongerVerified); - self = [super init]; + self = [super initWithThread:thread]; if (!self) { return self; } diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.h b/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.h index 168b46186f..0042c9b9ba 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.h +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.h @@ -17,8 +17,9 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; - (instancetype)initWithTimestamp:(uint64_t)timestamp NS_UNAVAILABLE; -- (instancetype)initWithOutgoingMessage:(TSOutgoingMessage *)message - isRecipientUpdate:(BOOL)isRecipientUpdate NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithThread:(TSThread *)thread + outgoingMessage:(TSOutgoingMessage *)message + isRecipientUpdate:(BOOL)isRecipientUpdate NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; @end diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.m b/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.m index fca1126849..cc176ccc0a 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.m +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.m @@ -40,12 +40,14 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSOutgoingSentMessageTranscript -- (instancetype)initWithOutgoingMessage:(TSOutgoingMessage *)message isRecipientUpdate:(BOOL)isRecipientUpdate +- (instancetype)initWithThread:(TSThread *)thread + outgoingMessage:(TSOutgoingMessage *)message + isRecipientUpdate:(BOOL)isRecipientUpdate { OWSAssertDebug(message); // The sync message's timestamp must match the original outgoing message's timestamp. - self = [super initWithTimestamp:message.timestamp]; + self = [super initWithTimestamp:message.timestamp thread:thread]; if (!self) { return self; @@ -54,8 +56,9 @@ NS_ASSUME_NONNULL_BEGIN _message = message; _isRecipientUpdate = isRecipientUpdate; - if ([message.thread isKindOfClass:[TSContactThread class]]) { - TSContactThread *contactThread = (TSContactThread *)message.thread; + TSThread *_Nullable messageThread = message.threadWithSneakyTransaction; + if ([messageThread isKindOfClass:[TSContactThread class]]) { + TSContactThread *contactThread = (TSContactThread *)messageThread; _sentRecipientAddress = contactThread.contactAddress; } diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSyncMessage.h b/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSyncMessage.h index 077d9e43f6..017d1498a0 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSyncMessage.h +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSyncMessage.h @@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN @interface OWSOutgoingSyncMessage : TSOutgoingMessage - (instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSMutableArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds @@ -26,8 +26,9 @@ NS_ASSUME_NONNULL_BEGIN linkPreview:(nullable OWSLinkPreview *)linkPreview messageSticker:(nullable MessageSticker *)messageSticker NS_UNAVAILABLE; -- (instancetype)init NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithTimestamp:(uint64_t)timestamp NS_DESIGNATED_INITIALIZER; +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)initWithThread:(TSThread *)thread NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithTimestamp:(uint64_t)timestamp thread:(TSThread *)thread NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; @end diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSyncMessage.m b/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSyncMessage.m index 007ca4d9ea..58bb52d10e 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSyncMessage.m +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSOutgoingSyncMessage.m @@ -17,11 +17,11 @@ NS_ASSUME_NONNULL_BEGIN return [super initWithCoder:coder]; } -- (instancetype)init +- (instancetype)initWithThread:(TSThread *)thread { // MJK TODO - remove SenderTimestamp self = [super initOutgoingMessageWithTimestamp:[NSDate ows_millisecondTimeStamp] - inThread:nil + inThread:thread messageBody:nil attachmentIds:[NSMutableArray new] expiresInSeconds:0 @@ -41,10 +41,10 @@ NS_ASSUME_NONNULL_BEGIN return self; } -- (instancetype)initWithTimestamp:(uint64_t)timestamp +- (instancetype)initWithTimestamp:(uint64_t)timestamp thread:(TSThread *)thread { self = [super initOutgoingMessageWithTimestamp:timestamp - inThread:nil + inThread:thread messageBody:nil attachmentIds:[NSMutableArray new] expiresInSeconds:0 diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncConfigurationMessage.h b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncConfigurationMessage.h index 4d88ff8bbe..4225a71509 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncConfigurationMessage.h +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncConfigurationMessage.h @@ -10,10 +10,11 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithReadReceiptsEnabled:(BOOL)readReceiptsEnabled - showUnidentifiedDeliveryIndicators:(BOOL)showUnidentifiedDeliveryIndicators - showTypingIndicators:(BOOL)showTypingIndicators - sendLinkPreviews:(BOOL)sendLinkPreviews NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithThread:(TSThread *)thread + readReceiptsEnabled:(BOOL)readReceiptsEnabled + showUnidentifiedDeliveryIndicators:(BOOL)showUnidentifiedDeliveryIndicators + showTypingIndicators:(BOOL)showTypingIndicators + sendLinkPreviews:(BOOL)sendLinkPreviews NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncConfigurationMessage.m b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncConfigurationMessage.m index f830ab2013..1d47e7e726 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncConfigurationMessage.m +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncConfigurationMessage.m @@ -18,12 +18,13 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSSyncConfigurationMessage -- (instancetype)initWithReadReceiptsEnabled:(BOOL)areReadReceiptsEnabled - showUnidentifiedDeliveryIndicators:(BOOL)showUnidentifiedDeliveryIndicators - showTypingIndicators:(BOOL)showTypingIndicators - sendLinkPreviews:(BOOL)sendLinkPreviews +- (instancetype)initWithThread:(TSThread *)thread + readReceiptsEnabled:(BOOL)areReadReceiptsEnabled + showUnidentifiedDeliveryIndicators:(BOOL)showUnidentifiedDeliveryIndicators + showTypingIndicators:(BOOL)showTypingIndicators + sendLinkPreviews:(BOOL)sendLinkPreviews { - self = [super init]; + self = [super initWithThread:thread]; if (!self) { return nil; } diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h index 28801c77fa..176ef810a1 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h @@ -16,9 +16,10 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithSignalAccounts:(NSArray *)signalAccounts - identityManager:(OWSIdentityManager *)identityManager - profileManager:(id)profileManager NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithThread:(TSThread *)thread + signalAccounts:(NSArray *)signalAccounts + identityManager:(OWSIdentityManager *)identityManager + profileManager:(id)profileManager NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m index 011f84782e..3b6d94c2d3 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m @@ -30,11 +30,12 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSSyncContactsMessage -- (instancetype)initWithSignalAccounts:(NSArray *)signalAccounts - identityManager:(OWSIdentityManager *)identityManager - profileManager:(id)profileManager +- (instancetype)initWithThread:(TSThread *)thread + signalAccounts:(NSArray *)signalAccounts + identityManager:(OWSIdentityManager *)identityManager + profileManager:(id)profileManager { - self = [super init]; + self = [super initWithThread:thread]; if (!self) { return self; } diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.h b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.h index 90f9bbe443..5e74f29750 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.h +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.h @@ -11,7 +11,7 @@ NS_ASSUME_NONNULL_BEGIN @interface OWSSyncGroupsMessage : OWSOutgoingSyncMessage -- (instancetype)init NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithThread:(TSThread *)thread NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; - (nullable NSData *)buildPlainTextAttachmentDataWithTransaction:(SDSAnyReadTransaction *)transaction; diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.m b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.m index 9d4369ff03..be90efcefd 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.m +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsMessage.m @@ -16,9 +16,9 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSSyncGroupsMessage -- (instancetype)init +- (instancetype)initWithThread:(TSThread *)thread { - return [super init]; + return [super initWithThread:thread]; } - (nullable instancetype)initWithCoder:(NSCoder *)coder diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsRequestMessage.h b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsRequestMessage.h index 8525314d42..ad9dbb9ed1 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsRequestMessage.h +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsRequestMessage.h @@ -9,7 +9,7 @@ NS_ASSUME_NONNULL_BEGIN @interface OWSSyncGroupsRequestMessage : TSOutgoingMessage - (instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSMutableArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds @@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN linkPreview:(nullable OWSLinkPreview *)linkPreview messageSticker:(nullable MessageSticker *)messageSticker NS_UNAVAILABLE; -- (instancetype)initWithThread:(nullable TSThread *)thread groupId:(NSData *)groupId; +- (instancetype)initWithThread:(TSThread *)thread groupId:(NSData *)groupId; @end diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsRequestMessage.m b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsRequestMessage.m index 794787111a..bac7eeffda 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsRequestMessage.m +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncGroupsRequestMessage.m @@ -18,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSSyncGroupsRequestMessage -- (instancetype)initWithThread:(nullable TSThread *)thread groupId:(NSData *)groupId +- (instancetype)initWithThread:(TSThread *)thread groupId:(NSData *)groupId { // MJK TODO - remove senderTimestamp self = [super initOutgoingMessageWithTimestamp:[NSDate ows_millisecondTimeStamp] diff --git a/SignalServiceKit/src/Messages/Interactions/OWSDisappearingMessagesConfigurationMessage.h b/SignalServiceKit/src/Messages/Interactions/OWSDisappearingMessagesConfigurationMessage.h index 9c039a2081..654ebba8dd 100644 --- a/SignalServiceKit/src/Messages/Interactions/OWSDisappearingMessagesConfigurationMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/OWSDisappearingMessagesConfigurationMessage.h @@ -12,7 +12,7 @@ NS_ASSUME_NONNULL_BEGIN // MJK TODO - remove senderTimestamp - (instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSMutableArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds diff --git a/SignalServiceKit/src/Messages/Interactions/OWSDynamicOutgoingMessage.h b/SignalServiceKit/src/Messages/Interactions/OWSDynamicOutgoingMessage.h index c5191a5386..35399a0725 100644 --- a/SignalServiceKit/src/Messages/Interactions/OWSDynamicOutgoingMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/OWSDynamicOutgoingMessage.h @@ -15,7 +15,7 @@ typedef NSData *_Nonnull (^DynamicOutgoingMessageBlock)(SignalRecipient *); @interface OWSDynamicOutgoingMessage : TSOutgoingMessage - (instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSMutableArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds @@ -27,10 +27,10 @@ typedef NSData *_Nonnull (^DynamicOutgoingMessageBlock)(SignalRecipient *); linkPreview:(nullable OWSLinkPreview *)linkPreview messageSticker:(nullable MessageSticker *)messageSticker NS_UNAVAILABLE; -- (instancetype)initWithPlainTextDataBlock:(DynamicOutgoingMessageBlock)block thread:(nullable TSThread *)thread; +- (instancetype)initWithPlainTextDataBlock:(DynamicOutgoingMessageBlock)block thread:(TSThread *)thread; - (instancetype)initWithPlainTextDataBlock:(DynamicOutgoingMessageBlock)block timestamp:(uint64_t)timestamp - thread:(nullable TSThread *)thread; + thread:(TSThread *)thread; @end diff --git a/SignalServiceKit/src/Messages/Interactions/OWSDynamicOutgoingMessage.m b/SignalServiceKit/src/Messages/Interactions/OWSDynamicOutgoingMessage.m index 15f427264f..e2adc6146c 100644 --- a/SignalServiceKit/src/Messages/Interactions/OWSDynamicOutgoingMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/OWSDynamicOutgoingMessage.m @@ -18,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSDynamicOutgoingMessage -- (instancetype)initWithPlainTextDataBlock:(DynamicOutgoingMessageBlock)block thread:(nullable TSThread *)thread +- (instancetype)initWithPlainTextDataBlock:(DynamicOutgoingMessageBlock)block thread:(TSThread *)thread { return [self initWithPlainTextDataBlock:block timestamp:[NSDate ows_millisecondTimeStamp] thread:thread]; } @@ -26,7 +26,7 @@ NS_ASSUME_NONNULL_BEGIN // MJK TODO can we remove sender timestamp? - (instancetype)initWithPlainTextDataBlock:(DynamicOutgoingMessageBlock)block timestamp:(uint64_t)timestamp - thread:(nullable TSThread *)thread + thread:(TSThread *)thread { self = [super initOutgoingMessageWithTimestamp:timestamp inThread:thread diff --git a/SignalServiceKit/src/Messages/Interactions/OWSEndSessionMessage.h b/SignalServiceKit/src/Messages/Interactions/OWSEndSessionMessage.h index 2799beb3f7..fbe47d1cbd 100644 --- a/SignalServiceKit/src/Messages/Interactions/OWSEndSessionMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/OWSEndSessionMessage.h @@ -10,7 +10,7 @@ NS_SWIFT_NAME(EndSessionMessage) @interface OWSEndSessionMessage : TSOutgoingMessage - (instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSMutableArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds @@ -23,7 +23,7 @@ NS_SWIFT_NAME(EndSessionMessage) messageSticker:(nullable MessageSticker *)messageSticker NS_UNAVAILABLE; // MJK TODO can we remove the sender timestamp? -- (instancetype)initWithTimestamp:(uint64_t)timestamp inThread:(nullable TSThread *)thread NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread NS_DESIGNATED_INITIALIZER; - (instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; @end diff --git a/SignalServiceKit/src/Messages/Interactions/OWSEndSessionMessage.m b/SignalServiceKit/src/Messages/Interactions/OWSEndSessionMessage.m index eee1824b72..211ed30e79 100644 --- a/SignalServiceKit/src/Messages/Interactions/OWSEndSessionMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/OWSEndSessionMessage.m @@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN return [super initWithCoder:coder]; } -- (instancetype)initWithTimestamp:(uint64_t)timestamp inThread:(nullable TSThread *)thread +- (instancetype)initWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread { return [super initOutgoingMessageWithTimestamp:timestamp inThread:thread diff --git a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.h b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.h index d9e2fef864..063d878766 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.h @@ -27,10 +27,18 @@ typedef NS_ENUM(int32_t, TSErrorMessageType) { TSErrorMessageGroupCreationFailed, }; +@interface ThreadlessErrorMessage : NSObject + ++ (ThreadlessErrorMessage *)corruptedMessageInUnknownThread; + +@end + +#pragma mark - + @interface TSErrorMessage : TSMessage - (instancetype)initMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds @@ -41,7 +49,7 @@ typedef NS_ENUM(int32_t, TSErrorMessageType) { messageSticker:(nullable MessageSticker *)messageSticker NS_UNAVAILABLE; - (instancetype)initWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds @@ -50,7 +58,7 @@ typedef NS_ENUM(int32_t, TSErrorMessageType) { - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; - (instancetype)initWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread failedMessageType:(TSErrorMessageType)errorMessageType address:(nullable SignalServiceAddress *)address NS_DESIGNATED_INITIALIZER; @@ -91,8 +99,6 @@ NS_SWIFT_NAME(init(uniqueId:receivedAtTimestamp:sortId:timestamp:uniqueThreadId: + (instancetype)corruptedMessageWithEnvelope:(SSKProtoEnvelope *)envelope withTransaction:(YapDatabaseReadWriteTransaction *)transaction; -+ (instancetype)corruptedMessageInUnknownThread; - + (instancetype)invalidVersionWithEnvelope:(SSKProtoEnvelope *)envelope withTransaction:(YapDatabaseReadWriteTransaction *)transaction; diff --git a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m index 2b534e8bdc..5335b288ff 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m @@ -16,6 +16,48 @@ NS_ASSUME_NONNULL_BEGIN NSUInteger TSErrorMessageSchemaVersion = 2; +@interface ThreadlessErrorMessage () + +@property (nonatomic, readonly) TSErrorMessageType errorType; + +@end + +#pragma mark - + +@implementation ThreadlessErrorMessage + +- (instancetype)initWithErrorType:(TSErrorMessageType)errorType +{ + self = [super init]; + if (!self) { + return self; + } + + _errorType = errorType; + + return self; +} + ++ (ThreadlessErrorMessage *)corruptedMessageInUnknownThread +{ + return [[self alloc] initWithErrorType:TSErrorMessageInvalidMessage]; +} + +- (NSString *)previewTextWithTransaction:(SDSAnyReadTransaction *)transaction +{ + switch (_errorType) { + case TSErrorMessageInvalidMessage: + return NSLocalizedString(@"ERROR_MESSAGE_INVALID_MESSAGE", @""); + default: + OWSFailDebug(@"Unknown error type."); + return NSLocalizedString(@"ERROR_MESSAGE_UNKNOWN_ERROR", @""); + } +} + +@end + +#pragma mark - + @interface TSErrorMessage () @property (nonatomic, getter=wasRead) BOOL read; @@ -57,7 +99,7 @@ NSUInteger TSErrorMessageSchemaVersion = 2; } - (instancetype)initWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread failedMessageType:(TSErrorMessageType)errorMessageType address:(nullable SignalServiceAddress *)address { @@ -89,7 +131,7 @@ NSUInteger TSErrorMessageSchemaVersion = 2; } - (instancetype)initWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread failedMessageType:(TSErrorMessageType)errorMessageType { return [self initWithTimestamp:timestamp inThread:thread failedMessageType:errorMessageType address:nil]; @@ -229,14 +271,6 @@ perMessageExpirationDurationSeconds:perMessageExpirationDurationSeconds failedMessageType:TSErrorMessageInvalidMessage]; } -+ (instancetype)corruptedMessageInUnknownThread -{ - // MJK TODO - Seems like we could safely remove this timestamp - return [[self alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - inThread:nil - failedMessageType:TSErrorMessageInvalidMessage]; -} - + (instancetype)invalidVersionWithEnvelope:(SSKProtoEnvelope *)envelope withTransaction:(YapDatabaseReadWriteTransaction *)transaction { diff --git a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage_privateConstructor.h b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage_privateConstructor.h index 9f4f6d8336..781fd44449 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage_privateConstructor.h +++ b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage_privateConstructor.h @@ -9,7 +9,7 @@ NS_ASSUME_NONNULL_BEGIN @interface TSErrorMessage () - (instancetype)initWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread failedMessageType:(TSErrorMessageType)errorMessageType NS_DESIGNATED_INITIALIZER; @end diff --git a/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h b/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h index a842106e36..056c152b43 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h @@ -19,7 +19,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) BOOL wasReceivedByUD; - (instancetype)initMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds diff --git a/SignalServiceKit/src/Messages/Interactions/TSInfoMessage.h b/SignalServiceKit/src/Messages/Interactions/TSInfoMessage.h index ed63475a77..09d7582dd8 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSInfoMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSInfoMessage.h @@ -34,7 +34,7 @@ typedef NS_ENUM(NSInteger, TSInfoMessageType) { @property (atomic, readonly, nullable) SignalServiceAddress *unregisteredAddress; - (instancetype)initMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds @@ -96,7 +96,7 @@ NS_SWIFT_NAME(init(uniqueId:receivedAtTimestamp:sortId:timestamp:uniqueThreadId: unregisteredAddress:(SignalServiceAddress *)unregisteredAddress; - (instancetype)initWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds diff --git a/SignalServiceKit/src/Messages/Interactions/TSInteraction.h b/SignalServiceKit/src/Messages/Interactions/TSInteraction.h index e4dc95151f..e3c3d4438a 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSInteraction.h +++ b/SignalServiceKit/src/Messages/Interactions/TSInteraction.h @@ -22,7 +22,7 @@ typedef NS_ENUM(NSInteger, OWSInteractionType) { NSString *NSStringFromOWSInteractionType(OWSInteractionType value); -@protocol OWSPreviewText +@protocol OWSPreviewText - (NSString *)previewTextWithTransaction:(SDSAnyReadTransaction *)transaction; @@ -32,6 +32,8 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value); @interface TSInteraction : BaseModel +- (instancetype)init NS_UNAVAILABLE; + - (instancetype)initWithUniqueId:(NSString *)uniqueId timestamp:(uint64_t)timestamp inThread:(TSThread *)thread; - (instancetype)initInteractionWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread; @@ -55,9 +57,6 @@ NS_SWIFT_NAME(init(uniqueId:receivedAtTimestamp:sortId:timestamp:uniqueThreadId: @property (nonatomic, readonly) NSString *uniqueThreadId; -// GRDB TODO: Remove. -@property (nonatomic, readonly) TSThread *thread; - @property (nonatomic, readonly) uint64_t timestamp; @property (nonatomic, readonly) uint64_t sortId; @property (nonatomic, readonly) uint64_t receivedAtTimestamp; @@ -66,6 +65,8 @@ NS_SWIFT_NAME(init(uniqueId:receivedAtTimestamp:sortId:timestamp:uniqueThreadId: - (OWSInteractionType)interactionType; +- (TSThread *)threadWithSneakyTransaction; + - (TSThread *)threadWithTransaction:(SDSAnyReadTransaction *)transaction NS_SWIFT_NAME(thread(transaction:)); /** diff --git a/SignalServiceKit/src/Messages/Interactions/TSInteraction.m b/SignalServiceKit/src/Messages/Interactions/TSInteraction.m index 97208082a0..d77805e215 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSInteraction.m +++ b/SignalServiceKit/src/Messages/Interactions/TSInteraction.m @@ -86,6 +86,7 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) inThread:(TSThread *)thread { OWSAssertDebug(timestamp > 0); + OWSAssertDebug(thread); self = [super initWithUniqueId:uniqueId]; @@ -178,8 +179,7 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) #pragma mark Thread -// GRDB TODO: Remove. -- (TSThread *)thread +- (TSThread *)threadWithSneakyTransaction { __block TSThread *thread; [self.databaseStorage readWithBlock:^(SDSAnyReadTransaction *transaction) { diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.h b/SignalServiceKit/src/Messages/Interactions/TSMessage.h index 1175f1a9b7..3b62f05f67 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.h @@ -49,7 +49,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initInteractionWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread NS_UNAVAILABLE; - (instancetype)initMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.m b/SignalServiceKit/src/Messages/Interactions/TSMessage.m index ac6dd82b10..c9a5cfb8b5 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.m @@ -66,7 +66,7 @@ static const NSUInteger OWSMessageSchemaVersion = 4; @implementation TSMessage - (instancetype)initMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds diff --git a/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.h b/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.h index aaf4681dd7..ab96a31e69 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.h @@ -80,7 +80,7 @@ typedef NS_ENUM(NSInteger, TSGroupMetaMessage) { @interface TSOutgoingMessage : TSMessage - (instancetype)initMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds @@ -92,7 +92,7 @@ typedef NS_ENUM(NSInteger, TSGroupMetaMessage) { // MJK TODO - Can we remove the sender timestamp param? - (instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSMutableArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds @@ -151,16 +151,16 @@ NS_SWIFT_NAME(init(uniqueId:receivedAtTimestamp:sortId:timestamp:uniqueThreadId: - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; -+ (instancetype)outgoingMessageInThread:(nullable TSThread *)thread ++ (instancetype)outgoingMessageInThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentId:(nullable NSString *)attachmentId; -+ (instancetype)outgoingMessageInThread:(nullable TSThread *)thread ++ (instancetype)outgoingMessageInThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentId:(nullable NSString *)attachmentId expiresInSeconds:(uint32_t)expiresInSeconds; -+ (instancetype)outgoingMessageInThread:(nullable TSThread *)thread ++ (instancetype)outgoingMessageInThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentId:(nullable NSString *)attachmentId expiresInSeconds:(uint32_t)expiresInSeconds @@ -168,7 +168,7 @@ NS_SWIFT_NAME(init(uniqueId:receivedAtTimestamp:sortId:timestamp:uniqueThreadId: linkPreview:(nullable OWSLinkPreview *)linkPreview messageSticker:(nullable MessageSticker *)messageSticker; -+ (instancetype)outgoingMessageInThread:(nullable TSThread *)thread ++ (instancetype)outgoingMessageInThread:(TSThread *)thread groupMetaMessage:(TSGroupMetaMessage)groupMetaMessage expiresInSeconds:(uint32_t)expiresInSeconds; diff --git a/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.m b/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.m index d429209e1f..4abc802a98 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.m @@ -358,7 +358,7 @@ perMessageExpirationDurationSeconds:perMessageExpirationDurationSeconds return SSKEnvironment.shared.migrationDBConnection; } -+ (instancetype)outgoingMessageInThread:(nullable TSThread *)thread ++ (instancetype)outgoingMessageInThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentId:(nullable NSString *)attachmentId { @@ -371,7 +371,7 @@ perMessageExpirationDurationSeconds:perMessageExpirationDurationSeconds messageSticker:nil]; } -+ (instancetype)outgoingMessageInThread:(nullable TSThread *)thread ++ (instancetype)outgoingMessageInThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentId:(nullable NSString *)attachmentId expiresInSeconds:(uint32_t)expiresInSeconds @@ -385,7 +385,7 @@ perMessageExpirationDurationSeconds:perMessageExpirationDurationSeconds messageSticker:nil]; } -+ (instancetype)outgoingMessageInThread:(nullable TSThread *)thread ++ (instancetype)outgoingMessageInThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentId:(nullable NSString *)attachmentId expiresInSeconds:(uint32_t)expiresInSeconds @@ -414,7 +414,7 @@ perMessageExpirationDurationSeconds:perMessageExpirationDurationSeconds perMessageExpirationDurationSeconds:0]; } -+ (instancetype)outgoingMessageInThread:(nullable TSThread *)thread ++ (instancetype)outgoingMessageInThread:(TSThread *)thread groupMetaMessage:(TSGroupMetaMessage)groupMetaMessage expiresInSeconds:(uint32_t)expiresInSeconds { @@ -435,7 +435,7 @@ perMessageExpirationDurationSeconds:perMessageExpirationDurationSeconds } - (instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSMutableArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds @@ -1062,7 +1062,7 @@ perMessageExpirationDurationSeconds:perMessageExpirationDurationSeconds - (nullable SSKProtoDataMessageBuilder *)dataMessageBuilder { - TSThread *thread = self.thread; + TSThread *thread = self.threadWithSneakyTransaction; OWSAssertDebug(thread); SSKProtoDataMessageBuilder *builder = [SSKProtoDataMessage builder]; @@ -1311,14 +1311,16 @@ perMessageExpirationDurationSeconds:perMessageExpirationDurationSeconds // recipientId is nil when building "sent" sync messages for messages sent to groups. - (nullable SSKProtoDataMessage *)buildDataMessage:(SignalServiceAddress *_Nullable)address { - OWSAssertDebug(self.thread); + OWSAssertDebug(self.threadWithSneakyTransaction); SSKProtoDataMessageBuilder *_Nullable builder = [self dataMessageBuilder]; if (!builder) { OWSFailDebug(@"could not build protobuf."); return nil; } - [ProtoUtils addLocalProfileKeyIfNecessary:self.thread address:address dataMessageBuilder:builder]; + [ProtoUtils addLocalProfileKeyIfNecessary:self.threadWithSneakyTransaction + address:address + dataMessageBuilder:builder]; NSError *error; SSKProtoDataMessage *_Nullable dataProto = [builder buildAndReturnError:&error]; diff --git a/SignalServiceKit/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeyReceivingErrorMessage.m b/SignalServiceKit/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeyReceivingErrorMessage.m index ef06a7ae1e..6ac7c74e15 100644 --- a/SignalServiceKit/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeyReceivingErrorMessage.m +++ b/SignalServiceKit/src/Messages/InvalidKeyMessages/TSInvalidIdentityKeyReceivingErrorMessage.m @@ -175,7 +175,7 @@ perMessageExpirationDurationSeconds:perMessageExpirationDurationSeconds // Decrypt this and any old messages for the newly accepted key NSArray *messagesToDecrypt = - [self.thread receivedMessagesForInvalidKey:newKey]; + [self.threadWithSneakyTransaction receivedMessagesForInvalidKey:newKey]; for (TSInvalidIdentityKeyReceivingErrorMessage *errorMessage in messagesToDecrypt) { [SSKEnvironment.shared.messageReceiver handleReceivedEnvelopeData:errorMessage.envelopeData]; diff --git a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m index 560cbf1701..582e390a7e 100644 --- a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m +++ b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m @@ -300,7 +300,7 @@ NS_ASSUME_NONNULL_BEGIN void (^reportFailure)(SDSAnyWriteTransaction *transaction) = ^(SDSAnyWriteTransaction *transaction) { // TODO: Add analytics. - TSErrorMessage *errorMessage = [TSErrorMessage corruptedMessageInUnknownThread]; + ThreadlessErrorMessage *errorMessage = [ThreadlessErrorMessage corruptedMessageInUnknownThread]; [SSKEnvironment.shared.notificationsManager notifyUserForThreadlessErrorMessage:errorMessage transaction:transaction]; }; diff --git a/SignalServiceKit/src/Messages/OWSBlockingManager.m b/SignalServiceKit/src/Messages/OWSBlockingManager.m index 6aa8c824ec..5e6e31e670 100644 --- a/SignalServiceKit/src/Messages/OWSBlockingManager.m +++ b/SignalServiceKit/src/Messages/OWSBlockingManager.m @@ -48,6 +48,15 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan @implementation OWSBlockingManager +#pragma mark - Dependencies + +- (SDSDatabaseStorage *)databaseStorage +{ + return SDSDatabaseStorage.shared; +} + +#pragma mark - + + (instancetype)sharedManager { OWSAssertDebug(SSKEnvironment.shared.blockingManager); @@ -437,10 +446,19 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan OWSAssertDebug(blockedUUIDs); OWSAssertDebug(blockedGroupIds); - OWSBlockedPhoneNumbersMessage *message = - [[OWSBlockedPhoneNumbersMessage alloc] initWithPhoneNumbers:blockedPhoneNumbers - uuids:blockedUUIDs - groupIds:blockedGroupIds]; + __block TSThread *_Nullable thread; + [self.databaseStorage writeWithBlock:^(SDSAnyWriteTransaction *transaction) { + thread = [TSAccountManager getOrCreateLocalThreadWithTransaction:transaction]; + }]; + if (thread == nil) { + OWSFailDebug(@"Missing thread."); + return; + } + + OWSBlockedPhoneNumbersMessage *message = [[OWSBlockedPhoneNumbersMessage alloc] initWithThread:thread + phoneNumbers:blockedPhoneNumbers + uuids:blockedUUIDs + groupIds:blockedGroupIds]; [self.messageSender sendMessage:message success:^{ diff --git a/SignalServiceKit/src/Messages/OWSIdentityManager.m b/SignalServiceKit/src/Messages/OWSIdentityManager.m index c73a1e5ac7..40a0ee91ac 100644 --- a/SignalServiceKit/src/Messages/OWSIdentityManager.m +++ b/SignalServiceKit/src/Messages/OWSIdentityManager.m @@ -597,6 +597,11 @@ NSString *const kNSNotificationName_IdentityStateDidChange = @"kNSNotificationNa - (void)syncQueuedVerificationStates { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + TSThread *_Nullable thread = [TSAccountManager getOrCreateLocalThreadWithSneakyTransaction]; + if (thread == nil) { + OWSFailDebug(@"Missing thread."); + return; + } NSMutableArray *messages = [NSMutableArray new]; [self.databaseQueue readWithBlock:^(SDSAnyReadTransaction *transaction) { [self.queuedVerificationStateSyncMessagesKeyValueStore @@ -645,7 +650,8 @@ NSString *const kNSNotificationName_IdentityStateDidChange = @"kNSNotificationNa } OWSVerificationStateSyncMessage *message = [[OWSVerificationStateSyncMessage alloc] - initWithVerificationState:recipientIdentity + initWithThread:thread + verificationState:recipientIdentity .verificationState identityKey:identityKey verificationForRecipientAddress:address]; diff --git a/SignalServiceKit/src/Messages/OWSMessageDecrypter.m b/SignalServiceKit/src/Messages/OWSMessageDecrypter.m index bb3af918d1..71a691b9b0 100644 --- a/SignalServiceKit/src/Messages/OWSMessageDecrypter.m +++ b/SignalServiceKit/src/Messages/OWSMessageDecrypter.m @@ -304,7 +304,7 @@ NSError *EnsureDecryptError(NSError *_Nullable error, NSString *fallbackErrorDes OWSProdFail([OWSAnalyticsEvents messageManagerErrorInvalidProtocolMessage]); [self.databaseStorage writeWithBlock:^(SDSAnyWriteTransaction *transaction) { - TSErrorMessage *errorMessage = [TSErrorMessage corruptedMessageInUnknownThread]; + ThreadlessErrorMessage *errorMessage = [ThreadlessErrorMessage corruptedMessageInUnknownThread]; [SSKEnvironment.shared.notificationsManager notifyUserForThreadlessErrorMessage:errorMessage transaction:transaction]; }]; @@ -604,7 +604,7 @@ NSError *EnsureDecryptError(NSError *_Nullable error, NSString *fallbackErrorDes TSErrorMessage *errorMessage; if (!envelope.sourceAddress.isValid) { - TSErrorMessage *errorMessage = [TSErrorMessage corruptedMessageInUnknownThread]; + ThreadlessErrorMessage *errorMessage = [ThreadlessErrorMessage corruptedMessageInUnknownThread]; [SSKEnvironment.shared.notificationsManager notifyUserForThreadlessErrorMessage:errorMessage transaction:transaction]; return; diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 2c3eac65c2..a20f41e412 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -971,7 +971,12 @@ NS_ASSUME_NONNULL_BEGIN [[self.syncManager syncAllContacts] retainUntilComplete]; }); } else if (syncMessage.request.unwrappedType == SSKProtoSyncMessageRequestTypeGroups) { - OWSSyncGroupsMessage *syncGroupsMessage = [[OWSSyncGroupsMessage alloc] init]; + TSThread *_Nullable thread = [TSAccountManager getOrCreateLocalThreadWithTransaction:transaction]; + if (thread == nil) { + OWSFailDebug(@"Missing thread."); + return; + } + OWSSyncGroupsMessage *syncGroupsMessage = [[OWSSyncGroupsMessage alloc] initWithThread:thread]; NSData *_Nullable syncData = [syncGroupsMessage buildPlainTextAttachmentDataWithTransaction:transaction]; if (!syncData) { OWSFailDebug(@"Failed to serialize groups sync message."); diff --git a/SignalServiceKit/src/Messages/OWSMessageReceiver.m b/SignalServiceKit/src/Messages/OWSMessageReceiver.m index 476e6c19b8..4b94d0f031 100644 --- a/SignalServiceKit/src/Messages/OWSMessageReceiver.m +++ b/SignalServiceKit/src/Messages/OWSMessageReceiver.m @@ -417,7 +417,7 @@ NSString *const OWSMessageDecryptJobFinderExtensionGroup = @"OWSMessageProcessin // TODO: Add analytics. [self.databaseStorage writeWithBlock:^(SDSAnyWriteTransaction *transaction) { - TSErrorMessage *errorMessage = [TSErrorMessage corruptedMessageInUnknownThread]; + ThreadlessErrorMessage *errorMessage = [ThreadlessErrorMessage corruptedMessageInUnknownThread]; [SSKEnvironment.shared.notificationsManager notifyUserForThreadlessErrorMessage:errorMessage transaction:transaction]; }]; diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 157dd43932..e6e7b2e6ba 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -210,7 +210,7 @@ void AssertIsOnSendingQueue() { if (SSKAppExpiry.isExpired) { OWSLogWarn(@"Unable to send because the application has expired."); - NSError *error = OWSErrorWithCodeDescription(OWSErrorCodeAppExired, + NSError *error = OWSErrorWithCodeDescription(OWSErrorCodeAppExpired, NSLocalizedString( @"ERROR_SENDING_EXPIRED", @"Error indicating a send failure due to an expired application.")); error.isRetryable = NO; @@ -706,7 +706,9 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; failureHandlerParam(error); }; - TSThread *_Nullable thread = message.thread; + // GRDB TODO: Make this non-nil. + TSThread *_Nullable thread = [self threadForMessageWithSneakyTransaction:message]; + OWSAssertDebug(thread != nil); BOOL isSyncMessage = [message isKindOfClass:[OWSOutgoingSyncMessage class]]; if (!thread && !isSyncMessage) { @@ -843,6 +845,28 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; [sendPromise retainUntilComplete]; } +- (nullable TSThread *)threadForMessageWithSneakyTransaction:(TSMessage *)message +{ + __block TSThread *_Nullable thread = nil; + [self.databaseStorage writeWithBlock:^(SDSAnyWriteTransaction *transaction) { + thread = [message threadWithTransaction:transaction]; + OWSAssertDebug(thread != nil); + + // For some legacy sync messages, thread may be nil. + // In this case, we should use the "local" thread. + BOOL isSyncMessage = [message isKindOfClass:[OWSOutgoingSyncMessage class]]; + if (thread == nil && isSyncMessage) { + thread = [TSAccountManager getOrCreateLocalThreadWithTransaction:transaction]; + if (thread == nil) { + OWSFailDebug(@"Could not restore thread for sync message."); + } else { + OWSLogInfo(@"Thread restored for sync message."); + } + } + }]; + return thread; +} + - (void)unregisteredRecipient:(SignalRecipient *)recipient message:(TSOutgoingMessage *)message thread:(TSThread *)thread @@ -1429,7 +1453,9 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; failure:(RetryableFailureHandler)failure { dispatch_block_t success = ^{ - TSThread *_Nullable thread = message.thread; + // GRDB TODO: Make this non-nil. + TSThread *_Nullable thread = [self threadForMessageWithSneakyTransaction:message]; + OWSAssertDebug(thread != nil); TSContactThread *_Nullable contactThread; if ([thread isKindOfClass:[TSContactThread class]]) { @@ -1459,7 +1485,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; return; } TSOutgoingMessage *latestMessage = (TSOutgoingMessage *)latestCopy; - [[OWSDisappearingMessagesJob sharedJob] startAnyExpirationForMessage:message + [[OWSDisappearingMessagesJob sharedJob] startAnyExpirationForMessage:latestMessage expirationStartedAt:[NSDate ows_millisecondTimeStamp] transaction:transaction]; @@ -1493,17 +1519,26 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; success:(void (^)(void))success failure:(RetryableFailureHandler)failure { - OWSOutgoingSentMessageTranscript *sentMessageTranscript = - [[OWSOutgoingSentMessageTranscript alloc] initWithOutgoingMessage:message isRecipientUpdate:isRecipientUpdate]; - SignalServiceAddress *localAddress = self.tsAccountManager.localAddress; + __block TSThread *_Nullable thread; __block SignalRecipient *recipient; [self.databaseStorage writeWithBlock:^(SDSAnyWriteTransaction *transaction) { + thread = [TSAccountManager getOrCreateLocalThreadWithTransaction:transaction]; + recipient = [SignalRecipient markRecipientAsRegisteredAndGet:localAddress transaction:transaction]; }]; + if (thread == nil) { + OWSFailDebug(@"Missing thread."); + return; + } + + OWSOutgoingSentMessageTranscript *sentMessageTranscript = + [[OWSOutgoingSentMessageTranscript alloc] initWithThread:thread + outgoingMessage:message + isRecipientUpdate:isRecipientUpdate]; OWSMessageSend *messageSend = [[OWSMessageSend alloc] initWithMessage:sentMessageTranscript - thread:message.thread + thread:message.threadWithSneakyTransaction recipient:recipient senderCertificate:nil udAccess:nil diff --git a/SignalServiceKit/src/Messages/OWSOutgoingCallMessage.h b/SignalServiceKit/src/Messages/OWSOutgoingCallMessage.h index a32778ba30..49137ca22f 100644 --- a/SignalServiceKit/src/Messages/OWSOutgoingCallMessage.h +++ b/SignalServiceKit/src/Messages/OWSOutgoingCallMessage.h @@ -19,7 +19,7 @@ NS_ASSUME_NONNULL_BEGIN @interface OWSOutgoingCallMessage : TSOutgoingMessage - (instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSMutableArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds diff --git a/SignalServiceKit/src/Messages/OWSOutgoingCallMessage.m b/SignalServiceKit/src/Messages/OWSOutgoingCallMessage.m index 0a74dd66c7..09f94896fe 100644 --- a/SignalServiceKit/src/Messages/OWSOutgoingCallMessage.m +++ b/SignalServiceKit/src/Messages/OWSOutgoingCallMessage.m @@ -151,7 +151,9 @@ NS_ASSUME_NONNULL_BEGIN [builder setBusy:self.busyMessage]; } - [ProtoUtils addLocalProfileKeyIfNecessary:self.thread address:address callMessageBuilder:builder]; + [ProtoUtils addLocalProfileKeyIfNecessary:self.threadWithSneakyTransaction + address:address + callMessageBuilder:builder]; NSError *error; SSKProtoCallMessage *_Nullable result = [builder buildAndReturnError:&error]; diff --git a/SignalServiceKit/src/Messages/OWSOutgoingNullMessage.h b/SignalServiceKit/src/Messages/OWSOutgoingNullMessage.h index f16ff37c17..9a815ab6d9 100644 --- a/SignalServiceKit/src/Messages/OWSOutgoingNullMessage.h +++ b/SignalServiceKit/src/Messages/OWSOutgoingNullMessage.h @@ -12,7 +12,7 @@ NS_ASSUME_NONNULL_BEGIN @interface OWSOutgoingNullMessage : TSOutgoingMessage - (instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSMutableArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds diff --git a/SignalServiceKit/src/Messages/OWSProfileKeyMessage.h b/SignalServiceKit/src/Messages/OWSProfileKeyMessage.h index ee6247183f..504fb33845 100644 --- a/SignalServiceKit/src/Messages/OWSProfileKeyMessage.h +++ b/SignalServiceKit/src/Messages/OWSProfileKeyMessage.h @@ -9,7 +9,7 @@ NS_ASSUME_NONNULL_BEGIN @interface OWSProfileKeyMessage : TSOutgoingMessage - (instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread + inThread:(TSThread *)thread messageBody:(nullable NSString *)body attachmentIds:(NSMutableArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds @@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN linkPreview:(nullable OWSLinkPreview *)linkPreview messageSticker:(nullable MessageSticker *)messageSticker NS_UNAVAILABLE; -- (instancetype)initWithTimestamp:(uint64_t)timestamp inThread:(nullable TSThread *)thread NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; @end diff --git a/SignalServiceKit/src/Messages/OWSProfileKeyMessage.m b/SignalServiceKit/src/Messages/OWSProfileKeyMessage.m index ec8deaf982..261d6feb69 100644 --- a/SignalServiceKit/src/Messages/OWSProfileKeyMessage.m +++ b/SignalServiceKit/src/Messages/OWSProfileKeyMessage.m @@ -12,7 +12,7 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSProfileKeyMessage -- (instancetype)initWithTimestamp:(uint64_t)timestamp inThread:(nullable TSThread *)thread +- (instancetype)initWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread { return [super initOutgoingMessageWithTimestamp:timestamp inThread:thread @@ -46,7 +46,7 @@ NS_ASSUME_NONNULL_BEGIN - (nullable SSKProtoDataMessage *)buildDataMessage:(SignalServiceAddress *_Nullable)address { - OWSAssertDebug(self.thread); + OWSAssertDebug(self.threadWithSneakyTransaction != nil); SSKProtoDataMessageBuilder *_Nullable builder = [self dataMessageBuilder]; if (!builder) { diff --git a/SignalServiceKit/src/Messages/OWSReadReceiptManager.m b/SignalServiceKit/src/Messages/OWSReadReceiptManager.m index 77f95cc826..89c60713b8 100644 --- a/SignalServiceKit/src/Messages/OWSReadReceiptManager.m +++ b/SignalServiceKit/src/Messages/OWSReadReceiptManager.m @@ -282,10 +282,17 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE [self.toLinkedDevicesReadReceiptMap allValues]; [self.toLinkedDevicesReadReceiptMap removeAllObjects]; if (readReceiptsForLinkedDevices.count > 0) { - OWSReadReceiptsForLinkedDevicesMessage *message = - [[OWSReadReceiptsForLinkedDevicesMessage alloc] initWithReadReceipts:readReceiptsForLinkedDevices]; - [self.databaseStorage writeWithBlock:^(SDSAnyWriteTransaction *transaction) { + TSThread *_Nullable thread = [TSAccountManager getOrCreateLocalThreadWithTransaction:transaction]; + if (thread == nil) { + OWSFailDebug(@"Missing thread."); + return; + } + + OWSReadReceiptsForLinkedDevicesMessage *message = + [[OWSReadReceiptsForLinkedDevicesMessage alloc] initWithThread:thread + readReceipts:readReceiptsForLinkedDevices]; + [self.messageSenderJobQueue addMessage:message transaction:transaction]; }]; } diff --git a/SignalServiceKit/src/Messages/Stickers/StickerManager.swift b/SignalServiceKit/src/Messages/Stickers/StickerManager.swift index 7cbaf9e77f..c3736395a3 100644 --- a/SignalServiceKit/src/Messages/Stickers/StickerManager.swift +++ b/SignalServiceKit/src/Messages/Stickers/StickerManager.swift @@ -1057,8 +1057,12 @@ public class StickerManager: NSObject { guard tsAccountManager.isRegisteredAndReady else { return } + guard let thread = TSAccountManager.getOrCreateLocalThread(transaction: transaction) else { + owsFailDebug("Missing thread.") + return + } - let message = OWSStickerPackSyncMessage(packs: packs, operationType: operationType) + let message = OWSStickerPackSyncMessage(thread: thread, packs: packs, operationType: operationType) self.messageSenderJobQueue.add(message: message, transaction: transaction) } diff --git a/SignalServiceKit/src/Network/WebSockets/OWSWebSocket.m b/SignalServiceKit/src/Network/WebSockets/OWSWebSocket.m index 0c5056bc8b..7b2e2dd3e3 100644 --- a/SignalServiceKit/src/Network/WebSockets/OWSWebSocket.m +++ b/SignalServiceKit/src/Network/WebSockets/OWSWebSocket.m @@ -798,7 +798,7 @@ NSString *const kNSNotification_OWSWebSocketStateDidChange = @"kNSNotification_O if (!success) { [self.databaseStorage writeWithBlock:^(SDSAnyWriteTransaction *transaction) { - TSErrorMessage *errorMessage = [TSErrorMessage corruptedMessageInUnknownThread]; + ThreadlessErrorMessage *errorMessage = [ThreadlessErrorMessage corruptedMessageInUnknownThread]; [self.notificationsManager notifyUserForThreadlessErrorMessage:errorMessage transaction:transaction]; }]; diff --git a/SignalServiceKit/src/Protocols/NotificationsProtocol.h b/SignalServiceKit/src/Protocols/NotificationsProtocol.h index f94b894a12..d166ec88d0 100644 --- a/SignalServiceKit/src/Protocols/NotificationsProtocol.h +++ b/SignalServiceKit/src/Protocols/NotificationsProtocol.h @@ -10,6 +10,7 @@ NS_ASSUME_NONNULL_BEGIN @class TSIncomingMessage; @class TSInfoMessage; @class TSThread; +@class ThreadlessErrorMessage; @protocol ContactsManagerProtocol; @@ -28,7 +29,7 @@ NS_ASSUME_NONNULL_BEGIN wantsSound:(BOOL)wantsSound transaction:(SDSAnyWriteTransaction *)transaction; -- (void)notifyUserForThreadlessErrorMessage:(TSErrorMessage *)errorMessage +- (void)notifyUserForThreadlessErrorMessage:(ThreadlessErrorMessage *)errorMessage transaction:(SDSAnyWriteTransaction *)transaction; - (void)clearAllNotifications; diff --git a/SignalServiceKit/src/SignalServiceKit.h b/SignalServiceKit/src/SignalServiceKit.h index b3d0bf6237..1abfb09b56 100644 --- a/SignalServiceKit/src/SignalServiceKit.h +++ b/SignalServiceKit/src/SignalServiceKit.h @@ -35,6 +35,7 @@ #import #import #import +#import #import #import #import diff --git a/SignalServiceKit/src/TestUtils/NoopNotificationsManager.swift b/SignalServiceKit/src/TestUtils/NoopNotificationsManager.swift index 0c96bf78af..7a1b31fdf7 100644 --- a/SignalServiceKit/src/TestUtils/NoopNotificationsManager.swift +++ b/SignalServiceKit/src/TestUtils/NoopNotificationsManager.swift @@ -17,7 +17,7 @@ public class NoopNotificationsManager: NSObject, NotificationsProtocol { Logger.warn("skipping notification for: \(infoMessage.description)") } - public func notifyUser(forThreadlessErrorMessage errorMessage: TSErrorMessage, transaction: SDSAnyWriteTransaction) { + public func notifyUser(for errorMessage: ThreadlessErrorMessage, transaction: SDSAnyWriteTransaction) { Logger.warn("skipping notification for: \(errorMessage.description)") } diff --git a/SignalServiceKit/src/Util/OWSError.h b/SignalServiceKit/src/Util/OWSError.h index ce75088dda..7afea50bb0 100644 --- a/SignalServiceKit/src/Util/OWSError.h +++ b/SignalServiceKit/src/Util/OWSError.h @@ -57,7 +57,8 @@ typedef NS_ENUM(NSInteger, OWSErrorCode) { OWSErrorCodeUploadFailed, OWSErrorCodeInvalidStickerData, OWSErrorCodeAttachmentDownloadFailed, - OWSErrorCodeAppExired, + OWSErrorCodeAppExpired, + OWSErrorCodeMissingLocalThread, }; extern NSString *const OWSErrorRecipientAddressKey; diff --git a/SignalServiceKit/src/Util/PerMessageExpiration.swift b/SignalServiceKit/src/Util/PerMessageExpiration.swift index ce84ded061..5fef5b287f 100644 --- a/SignalServiceKit/src/Util/PerMessageExpiration.swift +++ b/SignalServiceKit/src/Util/PerMessageExpiration.swift @@ -240,10 +240,15 @@ public class PerMessageExpiration: NSObject { owsFailDebug("Could not send sync message; no local number.") return } + guard let thread = TSAccountManager.getOrCreateLocalThread(transaction: transaction) else { + owsFailDebug("Missing thread.") + return + } let messageIdTimestamp: UInt64 = message.timestamp let readTimestamp: UInt64 = nowMs() - let syncMessage = OWSPerMessageExpirationReadSyncMessage(senderAddress: senderAddress, + let syncMessage = OWSPerMessageExpirationReadSyncMessage(thread: thread, + senderAddress: senderAddress, messageIdTimestamp: messageIdTimestamp, readTimestamp: readTimestamp) messageSenderJobQueue.add(message: syncMessage, transaction: transaction)