Bladeren bron

clear keychain on reinstall of DC

cyberta 3 jaren geleden
bovenliggende
commit
f1ba3767af

+ 1 - 0
DcCore/DcCore/Extensions/UserDefaults+Extensions.swift

@@ -1,6 +1,7 @@
 import Foundation
 public extension UserDefaults {
     static var hasExtensionAttemptedToSend = "hasExtensionAttemptedToSend"
+    static var hasSavedKeyToKeychain = "hasSavedKeyToKeychain"
     static var shared: UserDefaults? {
         return UserDefaults(suiteName: "group.chat.delta.ios")
     }

+ 10 - 2
DcCore/DcCore/Helper/KeychainManager.swift

@@ -17,6 +17,15 @@ public class KeychainManager {
         return secret
     }
 
+    public static func deleteDBSecret() -> Bool {
+        let query = [kSecClass as String: kSecClassGenericPassword,
+                     kSecAttrAccount as String: "dc_db"
+                    ] as CFDictionary
+
+        let status = SecItemDelete(query)
+        return status == errSecSuccess
+    }
+
     private static func createRandomPassword() -> String {
         let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY1234567890"
         return String((0..<36).map { _ in letters.randomElement()! })
@@ -33,7 +42,7 @@ public class KeychainManager {
         
         let status = SecItemAdd(keychainItemQuery, &ref)
         guard status == errSecSuccess else { throw KeychainError.unhandledError(status: status) }
-        
+        UserDefaults.shared?.set(true, forKey: UserDefaults.hasSavedKeyToKeychain)
         if let result = ref as? NSDictionary,
             let password = result[kSecValueData] as? String {
             return password
@@ -41,7 +50,6 @@ public class KeychainManager {
         
         return try queryDBSecret()
     }
-    
 
     private static func queryDBSecret() throws -> String {
         let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword,

+ 6 - 0
deltachat-ios/AppDelegate.swift

@@ -62,6 +62,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
         dcAccounts.openDatabase()
         migrateToDcAccounts()
 
+        if let sharedUserDefaults = UserDefaults.shared, !sharedUserDefaults.bool(forKey: UserDefaults.hasSavedKeyToKeychain) {
+            // we can assume a fresh install -> reset the keychain for the case the app was removed and reinstalled
+            if !KeychainManager.deleteDBSecret() {
+                logger.warning("Failed to delete DB secret")
+            }
+        }
         let passphrase: String
         do {
             passphrase = try KeychainManager.getDBSecret()