mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 01:20:12 +00:00
Rotate the session directory each time a new client is built for authentication.
This commit is contained in:
@@ -23,7 +23,7 @@ enum FileManagerError: Error {
|
|||||||
extension FileManager {
|
extension FileManager {
|
||||||
func directoryExists(at url: URL) -> Bool {
|
func directoryExists(at url: URL) -> Bool {
|
||||||
var isDirectory: ObjCBool = false
|
var isDirectory: ObjCBool = false
|
||||||
guard fileExists(atPath: url.path(), isDirectory: &isDirectory) else {
|
guard fileExists(atPath: url.path(percentEncoded: false), isDirectory: &isDirectory) else {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return isDirectory.boolValue
|
return isDirectory.boolValue
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import MatrixRustSDK
|
|||||||
|
|
||||||
class AuthenticationService: AuthenticationServiceProtocol {
|
class AuthenticationService: AuthenticationServiceProtocol {
|
||||||
private var client: Client?
|
private var client: Client?
|
||||||
private let sessionDirectory: URL
|
private var sessionDirectory: URL
|
||||||
private let passphrase: String
|
private let passphrase: String
|
||||||
|
|
||||||
private let userSessionStore: UserSessionStoreProtocol
|
private let userSessionStore: UserSessionStoreProtocol
|
||||||
@@ -139,7 +139,11 @@ class AuthenticationService: AuthenticationServiceProtocol {
|
|||||||
// MARK: - Private
|
// MARK: - Private
|
||||||
|
|
||||||
private func makeClientBuilder() -> ClientBuilder {
|
private func makeClientBuilder() -> ClientBuilder {
|
||||||
ClientBuilder
|
// Use a fresh session directory each time the user enters a different server
|
||||||
|
// so that caches (e.g. server versions) are always fresh for the new server.
|
||||||
|
rotateSessionDirectory()
|
||||||
|
|
||||||
|
return ClientBuilder
|
||||||
.baseBuilder(httpProxy: appSettings.websiteURL.globalProxy,
|
.baseBuilder(httpProxy: appSettings.websiteURL.globalProxy,
|
||||||
slidingSync: appSettings.simplifiedSlidingSyncEnabled ? .simplified : .discovered,
|
slidingSync: appSettings.simplifiedSlidingSyncEnabled ? .simplified : .discovered,
|
||||||
slidingSyncProxy: appSettings.slidingSyncProxyURL,
|
slidingSyncProxy: appSettings.slidingSyncProxyURL,
|
||||||
@@ -149,6 +153,14 @@ class AuthenticationService: AuthenticationServiceProtocol {
|
|||||||
.passphrase(passphrase: passphrase)
|
.passphrase(passphrase: passphrase)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func rotateSessionDirectory() {
|
||||||
|
if FileManager.default.directoryExists(at: sessionDirectory) {
|
||||||
|
try? FileManager.default.removeItem(at: sessionDirectory)
|
||||||
|
}
|
||||||
|
|
||||||
|
sessionDirectory = .sessionsBaseDirectory.appending(component: UUID().uuidString)
|
||||||
|
}
|
||||||
|
|
||||||
private func userSession(for client: Client) async -> Result<UserSessionProtocol, AuthenticationServiceError> {
|
private func userSession(for client: Client) async -> Result<UserSessionProtocol, AuthenticationServiceError> {
|
||||||
switch await userSessionStore.userSession(for: client, sessionDirectory: sessionDirectory, passphrase: passphrase) {
|
switch await userSessionStore.userSession(for: client, sessionDirectory: sessionDirectory, passphrase: passphrase) {
|
||||||
case .success(let clientProxy):
|
case .success(let clientProxy):
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import Foundation
|
|||||||
import MatrixRustSDK
|
import MatrixRustSDK
|
||||||
|
|
||||||
final class QRCodeLoginService: QRCodeLoginServiceProtocol {
|
final class QRCodeLoginService: QRCodeLoginServiceProtocol {
|
||||||
private let sessionDirectory: URL
|
private var sessionDirectory: URL
|
||||||
private let passphrase: String
|
private let passphrase: String
|
||||||
|
|
||||||
private let userSessionStore: UserSessionStoreProtocol
|
private let userSessionStore: UserSessionStoreProtocol
|
||||||
@@ -57,16 +57,10 @@ final class QRCodeLoginService: QRCodeLoginServiceProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
let client = try await ClientBuilder
|
let client = try await makeClientBuilder().buildWithQrCode(qrCodeData: qrData,
|
||||||
.baseBuilder(httpProxy: appSettings.websiteURL.globalProxy,
|
oidcConfiguration: appSettings.oidcConfiguration.rustValue,
|
||||||
slidingSync: appSettings.simplifiedSlidingSyncEnabled ? .simplified : .discovered,
|
progressListener: listener)
|
||||||
slidingSyncProxy: appSettings.slidingSyncProxyURL,
|
return await userSession(for: client)
|
||||||
sessionDelegate: userSessionStore.clientSessionDelegate,
|
|
||||||
appHooks: appHooks)
|
|
||||||
.sessionPath(path: sessionDirectory.path(percentEncoded: false))
|
|
||||||
.passphrase(passphrase: passphrase)
|
|
||||||
.buildWithQrCode(qrCodeData: qrData, oidcConfiguration: appSettings.oidcConfiguration.rustValue, progressListener: listener)
|
|
||||||
return await login(client: client)
|
|
||||||
} catch let error as HumanQrLoginError {
|
} catch let error as HumanQrLoginError {
|
||||||
MXLog.error("QRCode login error: \(error)")
|
MXLog.error("QRCode login error: \(error)")
|
||||||
return .failure(error.serviceError)
|
return .failure(error.serviceError)
|
||||||
@@ -76,7 +70,32 @@ final class QRCodeLoginService: QRCodeLoginServiceProtocol {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func login(client: Client) async -> Result<UserSessionProtocol, QRCodeLoginServiceError> {
|
// MARK: - Private
|
||||||
|
|
||||||
|
private func makeClientBuilder() -> ClientBuilder {
|
||||||
|
// Use a fresh session directory each time the user scans a QR code to ensure caches
|
||||||
|
// (e.g. server versions) are always fresh in case a different server is used.
|
||||||
|
rotateSessionDirectory()
|
||||||
|
|
||||||
|
return ClientBuilder
|
||||||
|
.baseBuilder(httpProxy: appSettings.websiteURL.globalProxy,
|
||||||
|
slidingSync: appSettings.simplifiedSlidingSyncEnabled ? .simplified : .discovered,
|
||||||
|
slidingSyncProxy: appSettings.slidingSyncProxyURL,
|
||||||
|
sessionDelegate: userSessionStore.clientSessionDelegate,
|
||||||
|
appHooks: appHooks)
|
||||||
|
.sessionPath(path: sessionDirectory.path(percentEncoded: false))
|
||||||
|
.passphrase(passphrase: passphrase)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func rotateSessionDirectory() {
|
||||||
|
if FileManager.default.directoryExists(at: sessionDirectory) {
|
||||||
|
try? FileManager.default.removeItem(at: sessionDirectory)
|
||||||
|
}
|
||||||
|
|
||||||
|
sessionDirectory = .sessionsBaseDirectory.appending(component: UUID().uuidString)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func userSession(for client: Client) async -> Result<UserSessionProtocol, QRCodeLoginServiceError> {
|
||||||
switch await userSessionStore.userSession(for: client, sessionDirectory: sessionDirectory, passphrase: passphrase) {
|
switch await userSessionStore.userSession(for: client, sessionDirectory: sessionDirectory, passphrase: passphrase) {
|
||||||
case .success(let session):
|
case .success(let session):
|
||||||
return .success(session)
|
return .success(session)
|
||||||
|
|||||||
Reference in New Issue
Block a user