diff --git a/SignalServiceKit/src/Loki/Protocol/Closed Groups/ClosedGroupsProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Closed Groups/ClosedGroupsProtocol.swift index 6109865c0..62b915812 100644 --- a/SignalServiceKit/src/Loki/Protocol/Closed Groups/ClosedGroupsProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Closed Groups/ClosedGroupsProtocol.swift @@ -32,21 +32,19 @@ public final class ClosedGroupsProtocol : NSObject { return !thread.isUserAdmin(inGroup: hexEncodedPublicKey, transaction: transaction) } - @objc(establishSessionsIfNeededWithClosedGroupMembers:in:) - public static func establishSessionsIfNeeded(with closedGroupMembers: [String], in thread: TSGroupThread) { - storage.dbReadWriteConnection.readWrite { transaction in - closedGroupMembers.forEach { hexEncodedPublicKey in - guard hexEncodedPublicKey != getUserHexEncodedPublicKey() else { return } - let hasSession = storage.containsSession(hexEncodedPublicKey, deviceId: Int32(OWSDevicePrimaryDeviceId), protocolContext: transaction) - guard !hasSession else { return } - let thread = TSContactThread.getOrCreateThread(withContactId: hexEncodedPublicKey, transaction: transaction) - thread.save(with: transaction) - let sessionRequestMessage = SessionRequestMessage(thread: thread) - let messageSenderJobQueue = SSKEnvironment.shared.messageSenderJobQueue - // This has to happen sync to ensure that session requests get sent before AFRs do (it's - // asssumed that the master device first syncs closed groups first and contacts after that). - messageSenderJobQueue.add(message: sessionRequestMessage, transaction: transaction) - } + @objc(establishSessionsIfNeededWithClosedGroupMembers:in:using:) + public static func establishSessionsIfNeeded(with closedGroupMembers: [String], in thread: TSGroupThread, using transaction: YapDatabaseReadWriteTransaction) { + closedGroupMembers.forEach { hexEncodedPublicKey in + guard hexEncodedPublicKey != getUserHexEncodedPublicKey() else { return } + let hasSession = storage.containsSession(hexEncodedPublicKey, deviceId: Int32(OWSDevicePrimaryDeviceId), protocolContext: transaction) + guard !hasSession else { return } + let thread = TSContactThread.getOrCreateThread(withContactId: hexEncodedPublicKey, transaction: transaction) + thread.save(with: transaction) + let sessionRequestMessage = SessionRequestMessage(thread: thread) + let messageSenderJobQueue = SSKEnvironment.shared.messageSenderJobQueue + // This has to happen sync to ensure that session requests get sent before AFRs do (it's + // asssumed that the master device first syncs closed groups first and contacts after that). + messageSenderJobQueue.add(message: sessionRequestMessage, transaction: transaction) } } } diff --git a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift index e9b338d6b..32ba9b714 100644 --- a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift @@ -136,7 +136,7 @@ public final class SyncMessagesProtocol : NSObject { newGroupThread.groupModel = newGroupModel // TODO: Should this use the setGroupModel method on TSGroupThread? newGroupThread.save(with: transaction) // Try to establish sessions with all members for which none exists yet when a group is created or updated - ClosedGroupsProtocol.establishSessionsIfNeeded(with: members, in: newGroupThread) + ClosedGroupsProtocol.establishSessionsIfNeeded(with: members, in: newGroupThread, using: transaction) OWSDisappearingMessagesJob.shared().becomeConsistent(withDisappearingDuration: transcript.dataMessage.expireTimer, thread: newGroupThread, createdByRemoteRecipientId: nil, createdInExistingGroup: true, transaction: transaction) let groupUpdatedMessage = TSInfoMessage(timestamp: NSDate.ows_millisecondTimeStamp(), in: newGroupThread, messageType: .typeGroupUpdate, customMessage: groupUpdatedMessageDescription) groupUpdatedMessage.save(with: transaction) @@ -207,7 +207,7 @@ public final class SyncMessagesProtocol : NSObject { thread = TSGroupThread.getOrCreateThread(with: groupModel, transaction: transaction) thread.save(with: transaction) } - ClosedGroupsProtocol.establishSessionsIfNeeded(with: groupModel.groupMemberIds, in: thread) + ClosedGroupsProtocol.establishSessionsIfNeeded(with: groupModel.groupMemberIds, in: thread, using: transaction) } } diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index d00c4b2fe..8fb9f0caa 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1342,7 +1342,7 @@ NS_ASSUME_NONNULL_BEGIN BOOL wasCurrentUserRemovedFromGroup = [removedMemberIds containsObject:userMasterHexEncodedPublicKey]; if (!wasCurrentUserRemovedFromGroup) { // Loki: Try to establish sessions with all members when a group is created or updated - [LKClosedGroupsProtocol establishSessionsIfNeededWithClosedGroupMembers:newMemberIds.allObjects in:newGroupThread]; + [LKClosedGroupsProtocol establishSessionsIfNeededWithClosedGroupMembers:newMemberIds.allObjects in:newGroupThread using:transaction]; } [[OWSDisappearingMessagesJob sharedJob] becomeConsistentWithDisappearingDuration:dataMessage.expireTimer