diff --git a/SignalServiceKit/src/Loki/Protocol/Meta/SessionMetaProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Meta/SessionMetaProtocol.swift index 4cbd80999..fd374342e 100644 --- a/SignalServiceKit/src/Loki/Protocol/Meta/SessionMetaProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Meta/SessionMetaProtocol.swift @@ -27,13 +27,7 @@ public final class SessionMetaProtocol : NSObject { } public static func getDestinationsForOutgoingSyncMessage() -> Set { - var result: Set = [] - storage.dbReadConnection.read { transaction in - // Aim the message at all linked devices, including this one - // TODO: Should we exclude the current device? - result = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: getUserHexEncodedPublicKey(), in: transaction) - } - return result + return MultiDeviceProtocol.getUserLinkedDevices() } @objc(getDestinationsForOutgoingGroupMessage:inThread:) @@ -53,7 +47,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(MultiDeviceProtocol.getUserLinkedDevices()) } return result } @@ -73,6 +69,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 +78,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/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift index 7f08b485a..e3fe35df2 100644 --- a/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift @@ -259,6 +259,14 @@ public final class MultiDeviceProtocol : NSObject { } // MARK: - General + public static func getUserLinkedDevices() -> Set { + var result: Set = [] + storage.dbReadConnection.read { transaction in + result = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: getUserHexEncodedPublicKey(), in: transaction) + } + return result + } + @objc public static func isSlaveThread(_ thread: TSThread) -> Bool { guard let thread = thread as? TSContactThread else { return false } var isSlaveThread = false diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index c129e6887..e5c0f6549 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 *userHexEncodedPublicKey = 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 *userMasterHexEncodedPublicKey; + [OWSPrimaryStorage.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + userMasterHexEncodedPublicKey = [LKDatabaseUtilities getMasterHexEncodedPublicKeyFor:userHexEncodedPublicKey in:transaction] ?: userHexEncodedPublicKey; + }]; + if ([recipientIds containsObject:userMasterHexEncodedPublicKey]) { + OWSFailDebug(@"Message send recipients should not include self."); + } } else if ([thread isKindOfClass:[TSContactThread class]]) { NSString *recipientContactId = ((TSContactThread *)thread).contactIdentifier;