Merge pull request #188 from loki-project/closed-group-fix

Fix sending messages to our devices in groups.
This commit is contained in:
Niels Andriesse 2020-05-08 11:16:13 +10:00 committed by GitHub
commit 139aa2f85a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 9 deletions

View File

@ -27,13 +27,7 @@ public final class SessionMetaProtocol : NSObject {
}
public static func getDestinationsForOutgoingSyncMessage() -> Set<String> {
var result: Set<String> = []
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

View File

@ -259,6 +259,14 @@ public final class MultiDeviceProtocol : NSObject {
}
// MARK: - General
public static func getUserLinkedDevices() -> Set<String> {
var result: Set<String> = []
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

View File

@ -506,12 +506,21 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
OWSAssertDebug(message);
OWSAssertDebug(errorHandle);
NSString *userHexEncodedPublicKey = self.tsAccountManager.localNumber;
__block NSMutableSet<NSString *> *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;