parent
113aa1f200
commit
ecb2c951a8
|
@ -45,6 +45,9 @@ public enum KeychainError: Error {
|
||||||
/// Item not found.
|
/// Item not found.
|
||||||
case notFound
|
case notFound
|
||||||
|
|
||||||
|
/// Operation cancelled or unauthorized.
|
||||||
|
case userCancelled
|
||||||
|
|
||||||
// /// Unexpected item type returned.
|
// /// Unexpected item type returned.
|
||||||
// case typeMismatch
|
// case typeMismatch
|
||||||
}
|
}
|
||||||
|
@ -100,8 +103,14 @@ public class Keychain {
|
||||||
guard password != currentPassword else {
|
guard password != currentPassword else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} catch {
|
} catch let e as KeychainError {
|
||||||
// no pre-existing password
|
|
||||||
|
// rethrow cancelation
|
||||||
|
if e == .userCancelled {
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise, no pre-existing password
|
||||||
}
|
}
|
||||||
|
|
||||||
removePassword(for: username)
|
removePassword(for: username)
|
||||||
|
@ -154,8 +163,14 @@ public class Keychain {
|
||||||
query[kSecReturnData as String] = true
|
query[kSecReturnData as String] = true
|
||||||
|
|
||||||
var result: AnyObject?
|
var result: AnyObject?
|
||||||
let status = SecItemCopyMatching(query as CFDictionary, &result)
|
switch SecItemCopyMatching(query as CFDictionary, &result) {
|
||||||
guard (status == errSecSuccess) else {
|
case errSecSuccess:
|
||||||
|
break
|
||||||
|
|
||||||
|
case errSecUserCanceled:
|
||||||
|
throw KeychainError.userCancelled
|
||||||
|
|
||||||
|
default:
|
||||||
throw KeychainError.notFound
|
throw KeychainError.notFound
|
||||||
}
|
}
|
||||||
guard let data = result as? Data else {
|
guard let data = result as? Data else {
|
||||||
|
@ -183,8 +198,14 @@ public class Keychain {
|
||||||
query[kSecReturnPersistentRef as String] = true
|
query[kSecReturnPersistentRef as String] = true
|
||||||
|
|
||||||
var result: AnyObject?
|
var result: AnyObject?
|
||||||
let status = SecItemCopyMatching(query as CFDictionary, &result)
|
switch SecItemCopyMatching(query as CFDictionary, &result) {
|
||||||
guard (status == errSecSuccess) else {
|
case errSecSuccess:
|
||||||
|
break
|
||||||
|
|
||||||
|
case errSecUserCanceled:
|
||||||
|
throw KeychainError.userCancelled
|
||||||
|
|
||||||
|
default:
|
||||||
throw KeychainError.notFound
|
throw KeychainError.notFound
|
||||||
}
|
}
|
||||||
guard let data = result as? Data else {
|
guard let data = result as? Data else {
|
||||||
|
@ -209,8 +230,14 @@ public class Keychain {
|
||||||
query[kSecReturnData as String] = true
|
query[kSecReturnData as String] = true
|
||||||
|
|
||||||
var result: AnyObject?
|
var result: AnyObject?
|
||||||
let status = SecItemCopyMatching(query as CFDictionary, &result)
|
switch SecItemCopyMatching(query as CFDictionary, &result) {
|
||||||
guard (status == errSecSuccess) else {
|
case errSecSuccess:
|
||||||
|
break
|
||||||
|
|
||||||
|
case errSecUserCanceled:
|
||||||
|
throw KeychainError.userCancelled
|
||||||
|
|
||||||
|
default:
|
||||||
throw KeychainError.notFound
|
throw KeychainError.notFound
|
||||||
}
|
}
|
||||||
guard let data = result as? Data else {
|
guard let data = result as? Data else {
|
||||||
|
@ -246,7 +273,7 @@ public class Keychain {
|
||||||
query.removeValue(forKey: kSecAttrService as String)
|
query.removeValue(forKey: kSecAttrService as String)
|
||||||
|
|
||||||
let status = SecItemAdd(query as CFDictionary, nil)
|
let status = SecItemAdd(query as CFDictionary, nil)
|
||||||
guard (status == errSecSuccess) else {
|
guard status == errSecSuccess else {
|
||||||
throw KeychainError.add
|
throw KeychainError.add
|
||||||
}
|
}
|
||||||
return try publicKey(withIdentifier: identifier)
|
return try publicKey(withIdentifier: identifier)
|
||||||
|
@ -271,8 +298,14 @@ public class Keychain {
|
||||||
query.removeValue(forKey: kSecAttrService as String)
|
query.removeValue(forKey: kSecAttrService as String)
|
||||||
|
|
||||||
var result: AnyObject?
|
var result: AnyObject?
|
||||||
let status = SecItemCopyMatching(query as CFDictionary, &result)
|
switch SecItemCopyMatching(query as CFDictionary, &result) {
|
||||||
guard (status == errSecSuccess) else {
|
case errSecSuccess:
|
||||||
|
break
|
||||||
|
|
||||||
|
case errSecUserCanceled:
|
||||||
|
throw KeychainError.userCancelled
|
||||||
|
|
||||||
|
default:
|
||||||
throw KeychainError.notFound
|
throw KeychainError.notFound
|
||||||
}
|
}
|
||||||
// guard let key = result as? SecKey else {
|
// guard let key = result as? SecKey else {
|
||||||
|
|
Loading…
Reference in New Issue