From 0d0359ee120abcce3e96a052dda93bed71fc6b4e Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Mon, 19 Nov 2018 10:59:10 -0600 Subject: [PATCH] Fix crash due to empty authorId on old messages --- .../src/Contacts/Threads/TSContactThread.h | 2 ++ .../src/Contacts/Threads/TSContactThread.m | 2 +- .../Messages/Interactions/TSIncomingMessage.h | 3 --- .../Messages/Interactions/TSIncomingMessage.m | 26 +++++-------------- .../Messages/Interactions/TSQuotedMessage.m | 2 +- .../src/Messages/OWSDisappearingMessagesJob.m | 2 +- .../src/Messages/OWSReadReceiptManager.m | 6 ++--- 7 files changed, 15 insertions(+), 28 deletions(-) diff --git a/SignalServiceKit/src/Contacts/Threads/TSContactThread.h b/SignalServiceKit/src/Contacts/Threads/TSContactThread.h index 87001b9b3..761ee4947 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSContactThread.h +++ b/SignalServiceKit/src/Contacts/Threads/TSContactThread.h @@ -6,6 +6,8 @@ NS_ASSUME_NONNULL_BEGIN +extern NSString *const TSContactThreadPrefix; + @interface TSContactThread : TSThread @property (nonatomic) BOOL hasDismissedOffers; diff --git a/SignalServiceKit/src/Contacts/Threads/TSContactThread.m b/SignalServiceKit/src/Contacts/Threads/TSContactThread.m index 1ea415e15..96e808e9f 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSContactThread.m +++ b/SignalServiceKit/src/Contacts/Threads/TSContactThread.m @@ -13,7 +13,7 @@ NS_ASSUME_NONNULL_BEGIN -#define TSContactThreadPrefix @"c" +NSString *const TSContactThreadPrefix = @"c"; @implementation TSContactThread diff --git a/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h b/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h index 9ad4fcd23..3c75540f8 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h @@ -77,11 +77,8 @@ NS_ASSUME_NONNULL_BEGIN // This will be 0 for messages created before we were tracking sourceDeviceId @property (nonatomic, readonly) UInt32 sourceDeviceId; -// NOTE: Use messageAuthorId instead wherever possible. @property (nonatomic, readonly) NSString *authorId; -- (NSString *)messageAuthorId; - // convenience method for expiring a message which was just read - (void)markAsReadNowWithSendReadReceipt:(BOOL)sendReadReceipt transaction:(YapDatabaseReadWriteTransaction *)transaction; diff --git a/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.m b/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.m index 7af4f3da4..fa6d44483 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.m @@ -35,6 +35,11 @@ NS_ASSUME_NONNULL_BEGIN return self; } + if (_authorId == nil) { + OWSAssertDebug([self.uniqueThreadId hasPrefix:TSContactThreadPrefix]); + _authorId = [TSContactThread contactIdFromThreadId:self.uniqueThreadId]; + } + return self; } @@ -88,10 +93,9 @@ NS_ASSUME_NONNULL_BEGIN if ([interaction isKindOfClass:[TSIncomingMessage class]]) { TSIncomingMessage *message = (TSIncomingMessage *)interaction; - NSString *messageAuthorId = message.messageAuthorId; - OWSAssertDebug(messageAuthorId.length > 0); + OWSAssertDebug(message.authorId > 0); - if ([messageAuthorId isEqualToString:authorId]) { + if ([message.authorId isEqualToString:authorId]) { foundMessage = message; } } @@ -101,22 +105,6 @@ NS_ASSUME_NONNULL_BEGIN return foundMessage; } -// TODO get rid of this method and instead populate authorId in initWithCoder: -- (NSString *)messageAuthorId -{ - // authorId isn't set on all legacy messages, so we take - // extra measures to ensure we obtain a valid value. - NSString *messageAuthorId; - if (self.authorId) { - // Group Thread - messageAuthorId = self.authorId; - } else { - // Contact Thread - messageAuthorId = [TSContactThread contactIdFromThreadId:self.uniqueThreadId]; - } - OWSAssertDebug(messageAuthorId.length > 0); - return messageAuthorId; -} - (OWSInteractionType)interactionType { diff --git a/SignalServiceKit/src/Messages/Interactions/TSQuotedMessage.m b/SignalServiceKit/src/Messages/Interactions/TSQuotedMessage.m index e1c60161d..b814c40e6 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSQuotedMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSQuotedMessage.m @@ -236,7 +236,7 @@ NS_ASSUME_NONNULL_BEGIN if ([interaction isKindOfClass:[TSIncomingMessage class]]) { TSIncomingMessage *incomingMessage = (TSIncomingMessage *)interaction; - return [authorId isEqual:incomingMessage.messageAuthorId]; + return [authorId isEqual:incomingMessage.authorId]; } else if ([interaction isKindOfClass:[TSOutgoingMessage class]]) { return [authorId isEqual:[TSAccountManager localNumber]]; } else { diff --git a/SignalServiceKit/src/Messages/OWSDisappearingMessagesJob.m b/SignalServiceKit/src/Messages/OWSDisappearingMessagesJob.m index 63c3d2cd9..31665a853 100644 --- a/SignalServiceKit/src/Messages/OWSDisappearingMessagesJob.m +++ b/SignalServiceKit/src/Messages/OWSDisappearingMessagesJob.m @@ -200,7 +200,7 @@ void AssertIsOnDisappearingMessagesQueue() if ([message isKindOfClass:[TSIncomingMessage class]]) { TSIncomingMessage *incomingMessage = (TSIncomingMessage *)message; remoteContactName = - [contactsManager displayNameForPhoneIdentifier:incomingMessage.messageAuthorId transaction:transaction]; + [contactsManager displayNameForPhoneIdentifier:incomingMessage.authorId transaction:transaction]; } [self becomeConsistentWithDisappearingDuration:message.expiresInSeconds diff --git a/SignalServiceKit/src/Messages/OWSReadReceiptManager.m b/SignalServiceKit/src/Messages/OWSReadReceiptManager.m index b106fbb3b..af641b766 100644 --- a/SignalServiceKit/src/Messages/OWSReadReceiptManager.m +++ b/SignalServiceKit/src/Messages/OWSReadReceiptManager.m @@ -268,7 +268,7 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE NSString *threadUniqueId = message.uniqueThreadId; OWSAssertDebug(threadUniqueId.length > 0); - NSString *messageAuthorId = message.messageAuthorId; + NSString *messageAuthorId = message.authorId; OWSAssertDebug(messageAuthorId.length > 0); OWSLinkedDeviceReadReceipt *newReadReceipt = @@ -286,7 +286,7 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE self.toLinkedDevicesReadReceiptMap[threadUniqueId] = newReadReceipt; } - if ([message.messageAuthorId isEqualToString:[TSAccountManager localNumber]]) { + if ([message.authorId isEqualToString:[TSAccountManager localNumber]]) { OWSLogVerbose(@"Ignoring read receipt for self-sender."); return; } @@ -379,7 +379,7 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE OWSAssertDebug(message); OWSAssertDebug(transaction); - NSString *senderId = message.messageAuthorId; + NSString *senderId = message.authorId; uint64_t timestamp = message.timestamp; if (senderId.length < 1 || timestamp < 1) { OWSFailDebug(@"Invalid incoming message: %@ %llu", senderId, timestamp);