diff --git a/Sources/XXClient/Helpers/PasswordStorage.swift b/Sources/XXClient/Helpers/PasswordStorage.swift index bf84f6dd4338a62fcd1604f924099a52a36b9e36..a1c36884d0f905a0294c680aecd7d4bbe5cad049 100644 --- a/Sources/XXClient/Helpers/PasswordStorage.swift +++ b/Sources/XXClient/Helpers/PasswordStorage.swift @@ -8,19 +8,23 @@ public struct PasswordStorage { public init( save: @escaping (Data) throws -> Void, - load: @escaping () throws -> Data + load: @escaping () throws -> Data, + remove: @escaping () throws -> Void ) { self.save = save self.load = load + self.remove = remove } public var save: (Data) throws -> Void public var load: () throws -> Data + public var remove: () throws -> Void } extension PasswordStorage { public static let unimplemented = PasswordStorage( save: XCTUnimplemented("\(Self.self).save"), - load: XCTUnimplemented("\(Self.self).load") + load: XCTUnimplemented("\(Self.self).load"), + remove: XCTUnimplemented("\(Self.self).remove") ) } diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift index 4ed8cf2c41243bd7ae6ce9ac59d6ca69a2f3490c..65a718dffa7c33c246de7a8b371c749433f2898b 100644 --- a/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift +++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift @@ -15,16 +15,15 @@ extension MessengerDestroy { if cMix.networkFollowerStatus() == .running { try cMix.stopNetworkFollower() } - var hasRunningProcesses = cMix.hasRunningProcesses() - while hasRunningProcesses { + while cMix.hasRunningProcesses() { env.sleep(1) - hasRunningProcesses = cMix.hasRunningProcesses() } } env.ud.set(nil) env.e2e.set(nil) env.cMix.set(nil) try env.fileManager.removeDirectory(env.storageDir) + try env.passwordStorage.remove() } } } diff --git a/Sources/XXMessengerClient/Utils/PasswordStorage+Keychain.swift b/Sources/XXMessengerClient/Utils/PasswordStorage+Keychain.swift index 0a062cc628cf037491a37ba8639e1f2529f209e8..fdf61fe7209e6255da2268c9caa9b120b143f5b4 100644 --- a/Sources/XXMessengerClient/Utils/PasswordStorage+Keychain.swift +++ b/Sources/XXMessengerClient/Utils/PasswordStorage+Keychain.swift @@ -3,18 +3,20 @@ import XXClient extension PasswordStorage { public static let keychain: PasswordStorage = { - let keychain = KeychainAccess.Keychain( - service: "xx.network.client.messenger" - ) + let keychain = KeychainAccess.Keychain(service: "xx.network.client.messenger") + let key = "password" return PasswordStorage( save: { password in - keychain[data: "password"] = password + keychain[data: key] = password }, load: { - guard let password = keychain[data: "password"] else { + guard let password = keychain[data: key] else { throw MissingPasswordError() } return password + }, + remove: { + try keychain.remove(key) } ) }() diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift index a91e32851de507ef96e354b4458228625aa352d1..36745d028934142b59912d341649e1519b435e1e 100644 --- a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift +++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift @@ -13,6 +13,7 @@ final class MessengerDestroyTests: XCTestCase { var didSetUD: [UserDiscovery?] = [] var didSetE2E: [E2E?] = [] var didSetCMix: [CMix?] = [] + var didRemovePassword = 0 var env: MessengerEnvironment = .unimplemented env.cMix.get = { @@ -28,6 +29,7 @@ final class MessengerDestroyTests: XCTestCase { env.e2e.set = { didSetE2E.append($0) } env.cMix.set = { didSetCMix.append($0) } env.fileManager.removeDirectory = { didRemoveDirectory.append($0) } + env.passwordStorage.remove = { didRemovePassword += 1 } let destroy: MessengerDestroy = .live(env) try destroy() @@ -38,11 +40,13 @@ final class MessengerDestroyTests: XCTestCase { XCTAssertNoDifference(didSetE2E.map { $0 == nil }, [true]) XCTAssertNoDifference(didSetCMix.map { $0 == nil }, [true]) XCTAssertNoDifference(didRemoveDirectory, [storageDir]) + XCTAssertNoDifference(didRemovePassword, 1) } func testStopNetworkFollowerFailure() { struct Error: Swift.Error, Equatable {} let error = Error() + var env: MessengerEnvironment = .unimplemented env.cMix.get = { var cMix: CMix = .unimplemented @@ -79,4 +83,32 @@ final class MessengerDestroyTests: XCTestCase { XCTAssertNoDifference(didSetE2E.map { $0 == nil }, [true]) XCTAssertNoDifference(didSetCMix.map { $0 == nil }, [true]) } + + func testRemovePasswordFailure() { + struct Error: Swift.Error, Equatable {} + let error = Error() + let storageDir = "test-storage-dir" + var didRemoveDirectory: [String] = [] + var didSetUD: [UserDiscovery?] = [] + var didSetE2E: [E2E?] = [] + var didSetCMix: [CMix?] = [] + + var env: MessengerEnvironment = .unimplemented + env.cMix.get = { nil } + env.ud.set = { didSetUD.append($0) } + env.e2e.set = { didSetE2E.append($0) } + env.cMix.set = { didSetCMix.append($0) } + env.storageDir = storageDir + env.fileManager.removeDirectory = { didRemoveDirectory.append($0) } + env.passwordStorage.remove = { throw error } + let destroy: MessengerDestroy = .live(env) + + XCTAssertThrowsError(try destroy()) { err in + XCTAssertEqual(err as? Error, error) + } + XCTAssertNoDifference(didSetUD.map { $0 == nil }, [true]) + XCTAssertNoDifference(didSetE2E.map { $0 == nil }, [true]) + XCTAssertNoDifference(didSetCMix.map { $0 == nil }, [true]) + XCTAssertNoDifference(didRemoveDirectory, [storageDir]) + } }