From dddbc9b2ab4082f7bc19641b26ddd5e685e0f63f Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Fri, 2 Sep 2022 19:17:02 +0200
Subject: [PATCH 1/4] Refactor

---
 .../Messenger/Functions/MessengerDestroy.swift                | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift
index 4ed8cf2c..1ea6f3d3 100644
--- a/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift
@@ -15,10 +15,8 @@ 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)
-- 
GitLab


From 0498cb3121d2c04b7cf11b30040e75cdb99f4b2b Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Fri, 2 Sep 2022 19:21:26 +0200
Subject: [PATCH 2/4] Add remove function to PasswordStorage

---
 Sources/XXClient/Helpers/PasswordStorage.swift | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/Sources/XXClient/Helpers/PasswordStorage.swift b/Sources/XXClient/Helpers/PasswordStorage.swift
index bf84f6dd..a1c36884 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")
   )
 }
-- 
GitLab


From 211057738550cca2d9ed3d9319c9d0b80ab7870a Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Fri, 2 Sep 2022 19:21:56 +0200
Subject: [PATCH 3/4] Update PasswordStorage.keychain implementation

---
 .../Utils/PasswordStorage+Keychain.swift             | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/Sources/XXMessengerClient/Utils/PasswordStorage+Keychain.swift b/Sources/XXMessengerClient/Utils/PasswordStorage+Keychain.swift
index 0a062cc6..fdf61fe7 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)
       }
     )
   }()
-- 
GitLab


From 637d1b4f8f46c408c382e11eba0029caf2c3cfbb Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Fri, 2 Sep 2022 19:27:48 +0200
Subject: [PATCH 4/4] Remove password in MessengerDestroy

---
 .../Functions/MessengerDestroy.swift          |  1 +
 .../Functions/MessengerDestroyTests.swift     | 32 +++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift
index 1ea6f3d3..65a718df 100644
--- a/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerDestroy.swift
@@ -23,6 +23,7 @@ extension MessengerDestroy {
       env.e2e.set(nil)
       env.cMix.set(nil)
       try env.fileManager.removeDirectory(env.storageDir)
+      try env.passwordStorage.remove()
     }
   }
 }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerDestroyTests.swift
index a91e3285..36745d02 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])
+  }
 }
-- 
GitLab