Skip to content

Commit 934da7e

Browse files
authored
Bugfix/dx 1973 fix synchronisation conversation view (#7)
1 parent b7d4bbb commit 934da7e

5 files changed

Lines changed: 47 additions & 80 deletions

File tree

Sources/DXProtocol/Session/Session.swift

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,8 @@ public struct Session: Codable {
109109

110110
try identityStore.saveIdentity(theirIdentityKey, for: address)
111111

112-
let lock = SessionLock(address: address)
113-
lock.lock()
114-
defer { lock.unlock() }
112+
try sessionStore.lockSession(for: address)
113+
defer { sessionStore.unlockSession(for: address) }
115114

116115
var session = try sessionStore.loadSession(for: address)
117116
if nil == session {
@@ -159,9 +158,8 @@ public struct Session: Codable {
159158
throw DXError.untrustedIdentity("Abort processing PreKey Message for untrusted identity")
160159
}
161160

162-
let lock = SessionLock(address: address)
163-
lock.lock()
164-
defer { lock.unlock() }
161+
try sessionStore.lockSession(for: address)
162+
defer { sessionStore.unlockSession(for: address) }
165163

166164
let theirBaseKey = message.senderBaseKey
167165
let messageVersion = Int(message.messageVersion)
@@ -235,9 +233,8 @@ public struct Session: Codable {
235233
for address: ProtocolAddress,
236234
sessionStore: SessionStorable,
237235
identityStore: IdentityKeyStorable) throws -> MessageContainer {
238-
let lock = SessionLock(address: address)
239-
lock.lock()
240-
defer { lock.unlock() }
236+
try sessionStore.lockSession(for: address)
237+
defer { sessionStore.unlockSession(for: address) }
241238

242239
guard var session = try sessionStore.loadSession(for: address) else {
243240
throw DXError.sessionNotFound("Failed to find session while encrypting message")
@@ -327,9 +324,8 @@ extension Session {
327324
identityStore: IdentityKeyStorable,
328325
preKeyStore: PreKeyStorable,
329326
signedPreKeyStore: SignedPreKeyStorable) throws -> Data {
330-
let lock = SessionLock(address: address)
331-
lock.lock()
332-
defer { lock.unlock() }
327+
try sessionStore.lockSession(for: address)
328+
defer { sessionStore.unlockSession(for: address) }
333329

334330
var session = try self.processPreKeyMessage(
335331
preKeyMessage,
@@ -367,9 +363,8 @@ extension Session {
367363
from address: ProtocolAddress,
368364
sessionStore: SessionStorable,
369365
identityStore: IdentityKeyStorable) throws -> Data {
370-
let lock = SessionLock(address: address)
371-
lock.lock()
372-
defer { lock.unlock() }
366+
try sessionStore.lockSession(for: address)
367+
defer { sessionStore.unlockSession(for: address) }
373368

374369
guard var session = try sessionStore.loadSession(for: address) else {
375370
throw DXError.sessionNotFound("Failed to find session while decrypting message")

Sources/DXProtocol/Session/SessionLock.swift

Lines changed: 0 additions & 31 deletions
This file was deleted.

Sources/DXProtocol/Session/SessionLockStorage.swift

Lines changed: 0 additions & 34 deletions
This file was deleted.

Sources/DXProtocol/Store/SessionStorable.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@ import Foundation
2727
/// `SessionStorable` protocol declares a set of methods allowing to store
2828
/// the sessions according to DX Protocol
2929
public protocol SessionStorable: AnyObject {
30+
/// Attempts to acquire a lock on session, blocking an execution until the lock can be acquired
31+
/// - Parameter address: The address of the remote client the session is associated with
32+
/// - Throws: Throws if the operation failed to be performed
33+
func lockSession(for address: ProtocolAddress) throws
34+
35+
/// Relinquishes a previously acquired lock on session
36+
/// - Parameter address: The address of the remote client the session is associated with
37+
func unlockSession(for address: ProtocolAddress)
38+
3039
/// Returns a session for a given user's address.
3140
/// - Parameter address: The address of the remote client
3241
/// - Returns: The session, or nil if session does not exist

Tests/DXProtocolTests/Mocks/InMemoryTestKeysStore.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ final class InMemoryTestKeysStore: IdentityKeyStorable, PreKeyStorable, SignedPr
3232
private var prekeyMap: [UUID: OneTimePreKeyPair] = [:]
3333
private var signedPrekeyMap: [UUID: SignedPreKeyPair] = [:]
3434
private var sessionMap: [ProtocolAddress: Session] = [:]
35+
36+
private let queue = DispatchQueue(label: "TestKeysStoreQueue")
37+
private var storage: [ProtocolAddress: NSRecursiveLock] = [:]
3538

3639
private var isIdentityTrusted: Bool
3740

@@ -128,6 +131,16 @@ final class InMemoryTestKeysStore: IdentityKeyStorable, PreKeyStorable, SignedPr
128131
}
129132

130133
// MARK: - SessionStorable
134+
135+
public func lockSession(for address: ProtocolAddress) throws {
136+
let lock = self.lock(for: address)
137+
lock.lock()
138+
}
139+
140+
public func unlockSession(for address: ProtocolAddress) {
141+
let lock = self.lock(for: address)
142+
lock.unlock()
143+
}
131144

132145
public func loadSession(for address: ProtocolAddress) throws -> Session? {
133146
return sessionMap[address]
@@ -145,4 +158,19 @@ final class InMemoryTestKeysStore: IdentityKeyStorable, PreKeyStorable, SignedPr
145158
public func storeSession(_ record: Session, for address: ProtocolAddress) throws {
146159
sessionMap[address] = record
147160
}
161+
162+
// MARK: - Private
163+
164+
private func lock(for address: ProtocolAddress) -> NSRecursiveLock {
165+
self.queue.sync {
166+
var result: NSRecursiveLock
167+
if let lock = self.storage[address] {
168+
result = lock
169+
} else {
170+
result = NSRecursiveLock()
171+
self.storage[address] = result
172+
}
173+
return result
174+
}
175+
}
148176
}

0 commit comments

Comments
 (0)