Fix simultaneous session request bug
This commit is contained in:
parent
2cf278f150
commit
19a214f653
|
@ -126,6 +126,9 @@
|
|||
<Test
|
||||
Identifier = "OWSSignalAddressTest">
|
||||
</Test>
|
||||
<Test
|
||||
Identifier = "OWSUDManagerTest">
|
||||
</Test>
|
||||
<Test
|
||||
Identifier = "PhoneNumberTest">
|
||||
</Test>
|
||||
|
|
|
@ -1,6 +1,18 @@
|
|||
|
||||
public extension OWSPrimaryStorage {
|
||||
|
||||
// MARK: Session Requests
|
||||
private static let sessionRequestTimestampCollection = "LokiSessionRequestTimestampCollection"
|
||||
|
||||
public func setSessionRequestTimestamp(for publicKey: String, to timestamp: Date, in transaction: YapDatabaseReadWriteTransaction) {
|
||||
transaction.setDate(timestamp, forKey: publicKey, inCollection: OWSPrimaryStorage.sessionRequestTimestampCollection)
|
||||
}
|
||||
|
||||
public func getSessionRequestTimestamp(for publicKey: String, in transaction: YapDatabaseReadTransaction) -> Date? {
|
||||
transaction.date(forKey: publicKey, inCollection: OWSPrimaryStorage.sessionRequestTimestampCollection)
|
||||
}
|
||||
|
||||
// MARK: Multi Device
|
||||
private static var deviceLinkCache: Set<DeviceLink> = []
|
||||
|
||||
private func getDeviceLinkCollection(for masterHexEncodedPublicKey: String) -> String {
|
||||
|
@ -62,7 +74,8 @@ public extension OWSPrimaryStorage {
|
|||
public func getMasterHexEncodedPublicKey(for slaveHexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> String? {
|
||||
return getDeviceLink(for: slaveHexEncodedPublicKey, in: transaction)?.master.hexEncodedPublicKey
|
||||
}
|
||||
|
||||
|
||||
// MARK: Open Groups
|
||||
public func getUserCount(for publicChat: LokiPublicChat, in transaction: YapDatabaseReadTransaction) -> Int? {
|
||||
return transaction.object(forKey: publicChat.id, inCollection: "LokiPublicChatUserCountCollection") as? Int
|
||||
}
|
||||
|
|
|
@ -41,9 +41,10 @@ public final class ClosedGroupsProtocol : NSObject {
|
|||
let thread = TSContactThread.getOrCreateThread(withContactId: hexEncodedPublicKey, transaction: transaction)
|
||||
thread.save(with: transaction)
|
||||
let sessionRequestMessage = SessionRequestMessage(thread: thread)
|
||||
storage.setSessionRequestTimestamp(for: hexEncodedPublicKey, to: Date(), in: transaction)
|
||||
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).
|
||||
// asssumed that the master device syncs closed groups first and contacts after that).
|
||||
messageSenderJobQueue.add(message: sessionRequestMessage, transaction: transaction)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -55,7 +55,6 @@ public final class SessionMetaProtocol : NSObject {
|
|||
}
|
||||
|
||||
// MARK: Note to Self
|
||||
|
||||
@objc(isThreadNoteToSelf:)
|
||||
public static func isThreadNoteToSelf(_ thread: TSThread) -> Bool {
|
||||
guard let thread = thread as? TSContactThread else { return false }
|
||||
|
|
|
@ -145,6 +145,7 @@ public final class SessionManagementProtocol : NSObject {
|
|||
storage.dbReadWriteConnection.readWrite { transaction in
|
||||
let thread = TSContactThread.getOrCreateThread(withContactId: hexEncodedPublicKey, transaction: transaction)
|
||||
let sessionRequestMessage = SessionRequestMessage(thread: thread)
|
||||
storage.setSessionRequestTimestamp(for: hexEncodedPublicKey, to: Date(), in: transaction)
|
||||
let messageSenderJobQueue = SSKEnvironment.shared.messageSenderJobQueue
|
||||
messageSenderJobQueue.add(message: sessionRequestMessage, transaction: transaction)
|
||||
}
|
||||
|
@ -192,6 +193,11 @@ public final class SessionManagementProtocol : NSObject {
|
|||
public static func handleSessionRequestMessage(_ dataMessage: SSKProtoDataMessage, wrappedIn envelope: SSKProtoEnvelope, using transaction: YapDatabaseReadWriteTransaction) {
|
||||
// The envelope source is set during UD decryption
|
||||
let hexEncodedPublicKey = envelope.source!
|
||||
if let sentSessionRequestTimestamp = storage.getSessionRequestTimestamp(for: hexEncodedPublicKey, in: transaction),
|
||||
envelope.timestamp < NSDate.ows_millisecondsSince1970(for: sentSessionRequestTimestamp) {
|
||||
// We sent a session request after this one was sent
|
||||
return
|
||||
}
|
||||
var closedGroupMembers: Set<String> = []
|
||||
TSGroupThread.enumerateCollectionObjects(with: transaction) { object, _ in
|
||||
guard let group = object as? TSGroupThread, group.groupModel.groupType == .closedGroup,
|
||||
|
|
Loading…
Reference in New Issue