From 30e2c0113c24c1f2da07c831e965b9a9210707ec Mon Sep 17 00:00:00 2001 From: Artur Guseinov Date: Wed, 1 Nov 2023 20:56:40 +0800 Subject: [PATCH 1/2] Update method migration --- .../Keychain/KeychainStorage.swift | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/Sources/WalletConnectKMS/Keychain/KeychainStorage.swift b/Sources/WalletConnectKMS/Keychain/KeychainStorage.swift index f52f4c828..bd9d19798 100644 --- a/Sources/WalletConnectKMS/Keychain/KeychainStorage.swift +++ b/Sources/WalletConnectKMS/Keychain/KeychainStorage.swift @@ -55,7 +55,7 @@ public final class KeychainStorage: KeychainStorageProtocol { case errSecSuccess: return item as? Data case errSecItemNotFound: - return tryMigrateAttrAccessible(key: key) // TODO: Replace with nil once migration period ends + return tryMigrateAttrAccessibleOnRead(key: key) // TODO: Replace with nil once migration period ends default: throw KeychainError(status) } @@ -70,8 +70,13 @@ public final class KeychainStorage: KeychainStorageProtocol { let attributes = [kSecValueData: data] let status = secItem.update(query as CFDictionary, attributes as CFDictionary) - - guard status == errSecSuccess else { + + switch status { + case errSecSuccess: + return + case errSecItemNotFound: + tryMigrateAttrAccessibleOnUpdate(data: data, key: key) // TODO: Remove once migration period ends + default: throw KeychainError(status) } } @@ -108,7 +113,7 @@ public final class KeychainStorage: KeychainStorageProtocol { ] } - private func tryMigrateAttrAccessible(key: String) -> Data? { + private func tryMigrateAttrAccessibleOnRead(key: String) -> Data? { var updateQuery = buildBaseServiceQuery(for: key) updateQuery[kSecAttrAccessible] = kSecAttrAccessibleWhenUnlockedThisDeviceOnly @@ -127,4 +132,21 @@ public final class KeychainStorage: KeychainStorageProtocol { return item as? Data } + + private func tryMigrateAttrAccessibleOnUpdate(data: Data, key: String) { + var updateAccessQuery = buildBaseServiceQuery(for: key) + updateAccessQuery[kSecAttrAccessible] = kSecAttrAccessibleWhenUnlockedThisDeviceOnly + + let accessAttributes = [kSecAttrAccessible: kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly] + let accessStatus = secItem.update(updateAccessQuery as CFDictionary, accessAttributes as CFDictionary) + + guard accessStatus == errSecSuccess else { + return + } + + let updateQuery = buildBaseServiceQuery(for: key) + let updateAttributes = [kSecValueData: data] + + _ = secItem.update(updateQuery as CFDictionary, updateAttributes as CFDictionary) + } } From 2ded5402af7b794a7c28af0a7177f94353653a7f Mon Sep 17 00:00:00 2001 From: Artur Guseinov Date: Wed, 1 Nov 2023 21:46:45 +0800 Subject: [PATCH 2/2] testUpdateItemNotFoundFails test fixed --- .../WalletConnectKMS/Keychain/KeychainStorage.swift | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Sources/WalletConnectKMS/Keychain/KeychainStorage.swift b/Sources/WalletConnectKMS/Keychain/KeychainStorage.swift index bd9d19798..d354cad91 100644 --- a/Sources/WalletConnectKMS/Keychain/KeychainStorage.swift +++ b/Sources/WalletConnectKMS/Keychain/KeychainStorage.swift @@ -75,7 +75,7 @@ public final class KeychainStorage: KeychainStorageProtocol { case errSecSuccess: return case errSecItemNotFound: - tryMigrateAttrAccessibleOnUpdate(data: data, key: key) // TODO: Remove once migration period ends + try tryMigrateAttrAccessibleOnUpdate(data: data, key: key) // TODO: Remove once migration period ends default: throw KeychainError(status) } @@ -133,7 +133,7 @@ public final class KeychainStorage: KeychainStorageProtocol { return item as? Data } - private func tryMigrateAttrAccessibleOnUpdate(data: Data, key: String) { + private func tryMigrateAttrAccessibleOnUpdate(data: Data, key: String) throws { var updateAccessQuery = buildBaseServiceQuery(for: key) updateAccessQuery[kSecAttrAccessible] = kSecAttrAccessibleWhenUnlockedThisDeviceOnly @@ -141,12 +141,16 @@ public final class KeychainStorage: KeychainStorageProtocol { let accessStatus = secItem.update(updateAccessQuery as CFDictionary, accessAttributes as CFDictionary) guard accessStatus == errSecSuccess else { - return + throw KeychainError.itemNotFound } let updateQuery = buildBaseServiceQuery(for: key) let updateAttributes = [kSecValueData: data] - _ = secItem.update(updateQuery as CFDictionary, updateAttributes as CFDictionary) + let updateStatus = secItem.update(updateQuery as CFDictionary, updateAttributes as CFDictionary) + + guard updateStatus == errSecSuccess else { + throw KeychainError.itemNotFound + } } }