diff --git a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m index 9a738ff52..cdbc69fb5 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m +++ b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m @@ -3925,6 +3925,7 @@ typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transac [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [SSKEnvironment.shared.batchMessageProcessor enqueueEnvelopeData:envelopeData plaintextData:plaintextData + wasReceivedByUD:NO transaction:transaction]; }]; } diff --git a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.h b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.h index c9664e5aa..bcfd201bf 100644 --- a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.h +++ b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.h @@ -22,6 +22,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)enqueueEnvelopeData:(NSData *)envelopeData plaintextData:(NSData *_Nullable)plaintextData + wasReceivedByUD:(BOOL)wasReceivedByUD transaction:(YapDatabaseReadWriteTransaction *)transaction; @end diff --git a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m index 1ac05f937..ab7ee923a 100644 --- a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m +++ b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m @@ -33,9 +33,11 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) NSDate *createdAt; @property (nonatomic, readonly) NSData *envelopeData; @property (nonatomic, readonly, nullable) NSData *plaintextData; +@property (nonatomic, readonly) BOOL wasReceivedByUD; - (instancetype)initWithEnvelopeData:(NSData *)envelopeData - plaintextData:(NSData *_Nullable)plaintextData NS_DESIGNATED_INITIALIZER; + plaintextData:(NSData *_Nullable)plaintextData + wasReceivedByUD:(BOOL)wasReceivedByUD NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; - (instancetype)initWithUniqueId:(NSString *_Nullable)uniqueId NS_UNAVAILABLE; @@ -52,7 +54,9 @@ NS_ASSUME_NONNULL_BEGIN return @"OWSBatchMessageProcessingJob"; } -- (instancetype)initWithEnvelopeData:(NSData *)envelopeData plaintextData:(NSData *_Nullable)plaintextData +- (instancetype)initWithEnvelopeData:(NSData *)envelopeData + plaintextData:(NSData *_Nullable)plaintextData + wasReceivedByUD:(BOOL)wasReceivedByUD { OWSAssertDebug(envelopeData); @@ -63,6 +67,7 @@ NS_ASSUME_NONNULL_BEGIN _envelopeData = envelopeData; _plaintextData = plaintextData; + _wasReceivedByUD = wasReceivedByUD; _createdAt = [NSDate new]; return self; @@ -148,13 +153,15 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo - (void)addJobWithEnvelopeData:(NSData *)envelopeData plaintextData:(NSData *_Nullable)plaintextData + wasReceivedByUD:(BOOL)wasReceivedByUD transaction:(YapDatabaseReadWriteTransaction *)transaction { OWSAssertDebug(envelopeData); OWSAssertDebug(transaction); - OWSMessageContentJob *job = - [[OWSMessageContentJob alloc] initWithEnvelopeData:envelopeData plaintextData:plaintextData]; + OWSMessageContentJob *job = [[OWSMessageContentJob alloc] initWithEnvelopeData:envelopeData + plaintextData:plaintextData + wasReceivedByUD:wasReceivedByUD]; [job saveWithTransaction:transaction]; } @@ -318,13 +325,17 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo - (void)enqueueEnvelopeData:(NSData *)envelopeData plaintextData:(NSData *_Nullable)plaintextData + wasReceivedByUD:(BOOL)wasReceivedByUD transaction:(YapDatabaseReadWriteTransaction *)transaction { OWSAssertDebug(envelopeData); OWSAssertDebug(transaction); // We need to persist the decrypted envelope data ASAP to prevent data loss. - [self.finder addJobWithEnvelopeData:envelopeData plaintextData:plaintextData transaction:transaction]; + [self.finder addJobWithEnvelopeData:envelopeData + plaintextData:plaintextData + wasReceivedByUD:wasReceivedByUD + transaction:transaction]; } - (void)drainQueue @@ -407,6 +418,7 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo } else { [self.messageManager throws_processEnvelope:envelope plaintextData:job.plaintextData + wasReceivedByUD:job.wasReceivedByUD transaction:transaction]; } } @catch (NSException *exception) { @@ -485,6 +497,7 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo - (void)enqueueEnvelopeData:(NSData *)envelopeData plaintextData:(NSData *_Nullable)plaintextData + wasReceivedByUD:(BOOL)wasReceivedByUD transaction:(YapDatabaseReadWriteTransaction *)transaction { if (envelopeData.length < 1) { @@ -494,7 +507,10 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo OWSAssert(transaction); // We need to persist the decrypted envelope data ASAP to prevent data loss. - [self.processingQueue enqueueEnvelopeData:envelopeData plaintextData:plaintextData transaction:transaction]; + [self.processingQueue enqueueEnvelopeData:envelopeData + plaintextData:plaintextData + wasReceivedByUD:wasReceivedByUD + transaction:transaction]; // The new envelope won't be visible to the finder until this transaction commits, // so drainQueue in the transaction completion. diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.h b/SignalServiceKit/src/Messages/OWSMessageManager.h index fb274d060..b06fb4aa1 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.h +++ b/SignalServiceKit/src/Messages/OWSMessageManager.h @@ -21,6 +21,7 @@ NS_ASSUME_NONNULL_BEGIN // processEnvelope: can be called from any thread. - (void)throws_processEnvelope:(SSKProtoEnvelope *)envelope plaintextData:(NSData *_Nullable)plaintextData + wasReceivedByUD:(BOOL)wasReceivedByUD transaction:(YapDatabaseReadWriteTransaction *)transaction; // This should be invoked by the main app when the app is ready. diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 1ae6b2805..b18c487f4 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -226,6 +226,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)throws_processEnvelope:(SSKProtoEnvelope *)envelope plaintextData:(NSData *_Nullable)plaintextData + wasReceivedByUD:(BOOL)wasReceivedByUD transaction:(YapDatabaseReadWriteTransaction *)transaction { if (!envelope) { @@ -268,7 +269,10 @@ NS_ASSUME_NONNULL_BEGIN OWSFailDebug(@"missing decrypted data for envelope: %@", [self descriptionForEnvelope:envelope]); return; } - [self throws_handleEnvelope:envelope plaintextData:plaintextData transaction:transaction]; + [self throws_handleEnvelope:envelope + plaintextData:plaintextData + wasReceivedByUD:wasReceivedByUD + transaction:transaction]; break; case SSKProtoEnvelopeTypeReceipt: OWSAssertDebug(!plaintextData); @@ -359,6 +363,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)throws_handleEnvelope:(SSKProtoEnvelope *)envelope plaintextData:(NSData *)plaintextData + wasReceivedByUD:(BOOL)wasReceivedByUD transaction:(YapDatabaseReadWriteTransaction *)transaction { if (!envelope) { @@ -413,7 +418,10 @@ NS_ASSUME_NONNULL_BEGIN [[OWSDeviceManager sharedManager] setHasReceivedSyncMessage]; } else if (contentProto.dataMessage) { - [self handleIncomingEnvelope:envelope withDataMessage:contentProto.dataMessage transaction:transaction]; + [self handleIncomingEnvelope:envelope + withDataMessage:contentProto.dataMessage + wasReceivedByUD:wasReceivedByUD + transaction:transaction]; } else if (contentProto.callMessage) { [self handleIncomingEnvelope:envelope withCallMessage:contentProto.callMessage]; } else if (contentProto.typingMessage) { @@ -436,7 +444,10 @@ NS_ASSUME_NONNULL_BEGIN } OWSLogInfo(@"handling message: ", [self descriptionForDataMessage:dataMessageProto]); - [self handleIncomingEnvelope:envelope withDataMessage:dataMessageProto transaction:transaction]; + [self handleIncomingEnvelope:envelope + withDataMessage:dataMessageProto + wasReceivedByUD:wasReceivedByUD + transaction:transaction]; } else { OWSProdInfoWEnvelope([OWSAnalyticsEvents messageManagerErrorEnvelopeNoActionablePayload], envelope); } @@ -444,6 +455,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)handleIncomingEnvelope:(SSKProtoEnvelope *)envelope withDataMessage:(SSKProtoDataMessage *)dataMessage + wasReceivedByUD:(BOOL)wasReceivedByUD transaction:(YapDatabaseReadWriteTransaction *)transaction { if (!envelope) { @@ -526,9 +538,15 @@ NS_ASSUME_NONNULL_BEGIN } else if ((dataMessage.flags & SSKProtoDataMessageFlagsProfileKeyUpdate) != 0) { [self handleProfileKeyMessageWithEnvelope:envelope dataMessage:dataMessage]; } else if (dataMessage.attachments.count > 0) { - [self handleReceivedMediaWithEnvelope:envelope dataMessage:dataMessage transaction:transaction]; + [self handleReceivedMediaWithEnvelope:envelope + dataMessage:dataMessage + wasReceivedByUD:wasReceivedByUD + transaction:transaction]; } else { - [self handleReceivedTextMessageWithEnvelope:envelope dataMessage:dataMessage transaction:transaction]; + [self handleReceivedTextMessageWithEnvelope:envelope + dataMessage:dataMessage + wasReceivedByUD:wasReceivedByUD + transaction:transaction]; if ([self isDataMessageGroupAvatarUpdate:dataMessage]) { OWSLogVerbose(@"Data message had group avatar attachment"); @@ -537,18 +555,11 @@ NS_ASSUME_NONNULL_BEGIN } // Send delivery receipts for "valid data" messages received via UD. - BOOL wasReceivedByUD = [self wasReceivedByUD:envelope]; if (wasReceivedByUD) { [self.outgoingReceiptManager enqueueDeliveryReceiptForEnvelope:envelope]; } } -- (BOOL)wasReceivedByUD:(SSKProtoEnvelope *)envelope -{ - return ( - envelope.type == SSKProtoEnvelopeTypeUnidentifiedSender && (!envelope.hasSource || envelope.source.length < 1)); -} - - (void)sendGroupInfoRequest:(NSData *)groupId envelope:(SSKProtoEnvelope *)envelope transaction:(YapDatabaseReadWriteTransaction *)transaction @@ -761,6 +772,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)handleReceivedMediaWithEnvelope:(SSKProtoEnvelope *)envelope dataMessage:(SSKProtoDataMessage *)dataMessage + wasReceivedByUD:(BOOL)wasReceivedByUD transaction:(YapDatabaseReadWriteTransaction *)transaction { if (!envelope) { @@ -782,8 +794,9 @@ NS_ASSUME_NONNULL_BEGIN return; } - TSIncomingMessage *_Nullable message = - [self handleReceivedEnvelope:envelope withDataMessage:dataMessage transaction:transaction]; + TSIncomingMessage *_Nullable message = [self handleReceivedEnvelope:envelope withDataMessage:dataMessage + wasReceivedByUD:wasReceivedByUD + transaction:transaction]; if (!message) { return; @@ -1037,6 +1050,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)handleReceivedTextMessageWithEnvelope:(SSKProtoEnvelope *)envelope dataMessage:(SSKProtoDataMessage *)dataMessage + wasReceivedByUD:(BOOL)wasReceivedByUD transaction:(YapDatabaseReadWriteTransaction *)transaction { if (!envelope) { @@ -1052,7 +1066,10 @@ NS_ASSUME_NONNULL_BEGIN return; } - [self handleReceivedEnvelope:envelope withDataMessage:dataMessage transaction:transaction]; + [self handleReceivedEnvelope:envelope + withDataMessage:dataMessage + wasReceivedByUD:wasReceivedByUD + transaction:transaction]; } - (void)handleGroupInfoRequest:(SSKProtoEnvelope *)envelope @@ -1135,6 +1152,7 @@ NS_ASSUME_NONNULL_BEGIN - (TSIncomingMessage *_Nullable)handleReceivedEnvelope:(SSKProtoEnvelope *)envelope withDataMessage:(SSKProtoDataMessage *)dataMessage + wasReceivedByUD:(BOOL)wasReceivedByUD transaction:(YapDatabaseReadWriteTransaction *)transaction { if (!envelope) { @@ -1155,7 +1173,6 @@ NS_ASSUME_NONNULL_BEGIN NSData *groupId = dataMessage.group ? dataMessage.group.id : nil; OWSContact *_Nullable contact = [OWSContacts contactForDataMessage:dataMessage transaction:transaction]; NSNumber *_Nullable serverTimestamp = (envelope.hasServerTimestamp ? @(envelope.serverTimestamp) : nil); - BOOL wasReceivedByUD = [self wasReceivedByUD:envelope]; if (dataMessage.group.type == SSKProtoGroupContextTypeRequestInfo) { [self handleGroupInfoRequest:envelope dataMessage:dataMessage transaction:transaction]; diff --git a/SignalServiceKit/src/Messages/OWSMessageReceiver.m b/SignalServiceKit/src/Messages/OWSMessageReceiver.m index 4b484414d..8c558c5e5 100644 --- a/SignalServiceKit/src/Messages/OWSMessageReceiver.m +++ b/SignalServiceKit/src/Messages/OWSMessageReceiver.m @@ -335,6 +335,12 @@ NSString *const OWSMessageDecryptJobFinderExtensionGroup = @"OWSMessageProcessin }]; } +- (BOOL)wasReceivedByUD:(SSKProtoEnvelope *)envelope +{ + return ( + envelope.type == SSKProtoEnvelopeTypeUnidentifiedSender && (!envelope.hasSource || envelope.source.length < 1)); +} + - (void)processJob:(OWSMessageDecryptJob *)job completion:(void (^)(BOOL))completion { AssertOnDispatchQueue(self.serialQueue); @@ -358,6 +364,10 @@ NSString *const OWSMessageDecryptJobFinderExtensionGroup = @"OWSMessageProcessin return; } + // We use the original envelope for this check; + // the decryption process might rewrite the envelope. + BOOL wasReceivedByUD = [self wasReceivedByUD:envelope]; + [self.messageDecrypter decryptEnvelope:envelope envelopeData:job.envelopeData successBlock:^(OWSMessageDecryptResult *result, YapDatabaseReadWriteTransaction *transaction) { @@ -371,6 +381,7 @@ NSString *const OWSMessageDecryptJobFinderExtensionGroup = @"OWSMessageProcessin // since the envelope may be altered by the decryption process in the UD case. [self.batchMessageProcessor enqueueEnvelopeData:result.envelopeData plaintextData:result.plaintextData + wasReceivedByUD:wasReceivedByUD transaction:transaction]; dispatch_async(self.serialQueue, ^{