diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 68a20d28c..033c1976f 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -528,12 +528,18 @@ NS_ASSUME_NONNULL_BEGIN } // Send delivery receipts for "valid data" messages received via UD. - BOOL wasReceivedByUD = envelope.type == SSKProtoEnvelopeTypeUnidentifiedSender; + 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 @@ -1121,7 +1127,7 @@ 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 = envelope.type == SSKProtoEnvelopeTypeUnidentifiedSender; + BOOL wasReceivedByUD = [self wasReceivedByUD:envelope]; if (dataMessage.group.type == SSKProtoGroupContextTypeRequestInfo) { [self handleGroupInfoRequest:envelope dataMessage:dataMessage transaction:transaction]; diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 7c5b6655b..53c359a67 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1053,6 +1053,25 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; } } + for (NSDictionary *deviceMessage in deviceMessages) { + NSNumber *_Nullable messageType = deviceMessage[@"type"]; + OWSAssertDebug(messageType); + BOOL hasValidMessageType; + if (messageSend.isUDSend) { + hasValidMessageType = [messageType isEqualToNumber:@(TSUnidentifiedSenderMessageType)]; + } else { + hasValidMessageType = ([messageType isEqualToNumber:@(TSEncryptedWhisperMessageType)] || + [messageType isEqualToNumber:@(TSPreKeyWhisperMessageType)]); + } + + if (!hasValidMessageType) { + OWSFailDebug(@"Invalid message type: %@", messageType); + NSError *error = OWSErrorMakeFailedToSendOutgoingMessageError(); + [error setIsRetryable:NO]; + return messageSend.failure(error); + } + } + if (deviceMessages.count == 0) { // This might happen: //