Fixes #2470 - Allow verifiying a session through entering the recovery key

This commit is contained in:
Stefan Ceriu
2024-02-19 10:10:25 +02:00
committed by Stefan Ceriu
parent 46f0cf45bd
commit 023e10edf2
17 changed files with 73 additions and 32 deletions
@@ -25,5 +25,5 @@ struct MockUserSession: UserSessionProtocol {
let clientProxy: ClientProxyProtocol
let mediaProvider: MediaProviderProtocol
let voiceMessageMediaManager: VoiceMessageMediaManagerProtocol
var sessionSecurityStatePublisher: AnyPublisher<SessionSecurityState, Never> = CurrentValueSubject<SessionSecurityState, Never>(.init(verificationState: .verified, recoveryState: .enabled)).eraseToAnyPublisher()
var sessionSecurityStatePublisher = CurrentValueSubject<SessionSecurityState, Never>(.init(verificationState: .verified, recoveryState: .enabled)).asCurrentValuePublisher()
}
@@ -51,22 +51,16 @@ class UserSession: UserSessionProtocol {
}
}
let sessionSecurityStatePublisher: AnyPublisher<SessionSecurityState, Never>
let sessionSecurityStateSubject = CurrentValueSubject<SessionSecurityState, Never>(.init(verificationState: .unknown, recoveryState: .unknown))
var sessionSecurityStatePublisher: CurrentValuePublisher<SessionSecurityState, Never> {
sessionSecurityStateSubject.asCurrentValuePublisher()
}
init(clientProxy: ClientProxyProtocol, mediaProvider: MediaProviderProtocol, voiceMessageMediaManager: VoiceMessageMediaManagerProtocol) {
self.clientProxy = clientProxy
self.mediaProvider = mediaProvider
self.voiceMessageMediaManager = voiceMessageMediaManager
sessionSecurityStatePublisher = Publishers.CombineLatest(sessionVerificationStateSubject, clientProxy.secureBackupController.recoveryState)
.map {
MXLog.info("Session security state changed, verificationState: \($0), recoveryState: \($1)")
return SessionSecurityState(verificationState: $0, recoveryState: $1)
}
.removeDuplicates()
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
clientProxy.callbacks
.receive(on: DispatchQueue.main)
.sink { [weak self] callback in
@@ -88,6 +82,18 @@ class UserSession: UserSessionProtocol {
break
}
}
Publishers.CombineLatest(sessionVerificationStateSubject, clientProxy.secureBackupController.recoveryState)
.map {
MXLog.info("Session security state changed, verificationState: \($0), recoveryState: \($1)")
return SessionSecurityState(verificationState: $0, recoveryState: $1)
}
.removeDuplicates()
.receive(on: DispatchQueue.main)
.sink { [weak self] value in
self?.sessionSecurityStateSubject.send(value)
}
.store(in: &cancellables)
}
// MARK: - Private
@@ -42,7 +42,7 @@ protocol UserSessionProtocol {
var mediaProvider: MediaProviderProtocol { get }
var voiceMessageMediaManager: VoiceMessageMediaManagerProtocol { get }
var sessionSecurityStatePublisher: AnyPublisher<SessionSecurityState, Never> { get }
var sessionSecurityStatePublisher: CurrentValuePublisher<SessionSecurityState, Never> { get }
var sessionVerificationController: SessionVerificationControllerProxyProtocol? { get }
var callbacks: PassthroughSubject<UserSessionCallback, Never> { get }