From cbeb4548605dc60f03a77d164a36ceb199292af3 Mon Sep 17 00:00:00 2001 From: Mikunj Date: Fri, 8 May 2020 09:53:16 +1000 Subject: [PATCH] Fix sending messages to our devices in groups. Fix sync messages. --- .../Protocol/Meta/SessionMetaProtocol.swift | 23 ++++++++++++------- .../src/Messages/OWSMessageSender.m | 9 ++++++++ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/SignalServiceKit/src/Loki/Protocol/Meta/SessionMetaProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Meta/SessionMetaProtocol.swift index 4cbd80999..bc4c1749e 100644 --- a/SignalServiceKit/src/Loki/Protocol/Meta/SessionMetaProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Meta/SessionMetaProtocol.swift @@ -21,12 +21,7 @@ public final class SessionMetaProtocol : NSObject { // MARK: - Sending // MARK: Message Destination - @objc(getDestinationsForOutgoingSyncMessage) - public static func objc_getDestinationsForOutgoingSyncMessage() -> NSMutableSet { - return NSMutableSet(set: getDestinationsForOutgoingSyncMessage()) - } - - public static func getDestinationsForOutgoingSyncMessage() -> Set { + private static func getOurDevices() -> Set { var result: Set = [] storage.dbReadConnection.read { transaction in // Aim the message at all linked devices, including this one @@ -36,6 +31,15 @@ public final class SessionMetaProtocol : NSObject { return result } + @objc(getDestinationsForOutgoingSyncMessage) + public static func objc_getDestinationsForOutgoingSyncMessage() -> NSMutableSet { + return NSMutableSet(set: getDestinationsForOutgoingSyncMessage()) + } + + public static func getDestinationsForOutgoingSyncMessage() -> Set { + return getOurDevices() + } + @objc(getDestinationsForOutgoingGroupMessage:inThread:) public static func objc_getDestinations(for outgoingGroupMessage: TSOutgoingMessage, in thread: TSThread) -> NSMutableSet { return NSMutableSet(set: getDestinations(for: outgoingGroupMessage, in: thread)) @@ -53,7 +57,9 @@ public final class SessionMetaProtocol : NSObject { } } } else { - result = Set(outgoingGroupMessage.sendingRecipientIds()).intersection(thread.groupModel.groupMemberIds) // This is what Signal does + result = Set(outgoingGroupMessage.sendingRecipientIds()) + .intersection(thread.groupModel.groupMemberIds) + .subtracting(getOurDevices()) } return result } @@ -73,6 +79,7 @@ public final class SessionMetaProtocol : NSObject { // MARK: Transcripts @objc(shouldSendTranscriptForMessage:in:) public static func shouldSendTranscript(for message: TSOutgoingMessage, in thread: TSThread) -> Bool { + guard message.shouldSyncTranscript() else { return false } let isOpenGroupMessage = (thread as? TSGroupThread)?.isPublicChat == true let wouldSignalRequireTranscript = (AreRecipientUpdatesEnabled() || !message.hasSyncedTranscript) guard wouldSignalRequireTranscript && !isOpenGroupMessage else { return false } @@ -81,7 +88,7 @@ public final class SessionMetaProtocol : NSObject { usesMultiDevice = !storage.getDeviceLinks(for: getUserHexEncodedPublicKey(), in: transaction).isEmpty || UserDefaults.standard[.masterHexEncodedPublicKey] != nil } - return usesMultiDevice && isThreadNoteToSelf(thread) + return usesMultiDevice } // MARK: Typing Indicators diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index cbfd9b8a5..280247da1 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -506,12 +506,21 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; OWSAssertDebug(message); OWSAssertDebug(errorHandle); + NSString *hexEncodedPublicKey = self.tsAccountManager.localNumber; + __block NSMutableSet *recipientIds = [NSMutableSet new]; if ([message isKindOfClass:[OWSOutgoingSyncMessage class]]) { recipientIds = [LKSessionMetaProtocol getDestinationsForOutgoingSyncMessage]; } else if (thread.isGroupThread) { TSGroupThread *groupThread = (TSGroupThread *)thread; recipientIds = [LKSessionMetaProtocol getDestinationsForOutgoingGroupMessage:message inThread:thread]; + __block NSString *masterHexEncodedPublicKey; + [OWSPrimaryStorage.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + masterHexEncodedPublicKey = [LKDatabaseUtilities getMasterHexEncodedPublicKeyFor:hexEncodedPublicKey in:transaction] ?: hexEncodedPublicKey; + }]; + if ([recipientIds containsObject:masterHexEncodedPublicKey]) { + OWSFailDebug(@"Message send recipients should not include self."); + } } else if ([thread isKindOfClass:[TSContactThread class]]) { NSString *recipientContactId = ((TSContactThread *)thread).contactIdentifier;