Fix keychain error escaping catch block (#326)

This commit is contained in:
Davide De Rosa 2023-07-06 11:03:31 +01:00 committed by GitHub
parent fc52725ed1
commit d69899bbc0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 9 deletions

View File

@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## Unreleased
### Fixed
- Keychain may fail to set password. [#327](https://github.com/passepartoutvpn/tunnelkit/issues/327)
## 6.1.0 (2023-07-05)
### Changed

View File

@ -82,7 +82,7 @@ public class Keychain {
- Parameter userDefined: Optional user-defined data.
- Parameter label: An optional label.
- Returns: The reference to the password.
- Throws: `KeychainError.add` if unable to add the password to the keychain.
- Throws: `TunnelKitManagerError.keychain` if unable to add the password to the keychain.
**/
@discardableResult
public func set(password: String, for username: String, context: String, userDefined: String? = nil, label: String? = nil) throws -> Data {
@ -92,14 +92,20 @@ public class Keychain {
return try passwordReference(for: username, context: context)
}
removePassword(for: username, context: context)
} catch let error as KeychainError {
} catch let error as TunnelKitManagerError {
// rethrow cancelation
if error == .userCancelled {
// this is a well-known error from password() or passwordReference(), keep going
// rethrow cancellation
if case .keychain(.userCancelled) = error {
throw error
}
// otherwise, no pre-existing password
} catch {
// IMPORTANT: rethrow any other unknown error (leave this code explicit)
throw error
}
var query = [String: Any]()
@ -144,7 +150,7 @@ public class Keychain {
- Parameter context: The context.
- Parameter userDefined: Optional user-defined data.
- Returns: The password for the input username.
- Throws: `KeychainError.notFound` if unable to find the password in the keychain.
- Throws: `TunnelKitManagerError.keychain` if unable to find the password in the keychain.
**/
public func password(for username: String, context: String, userDefined: String? = nil) throws -> String {
var query = [String: Any]()
@ -181,7 +187,7 @@ public class Keychain {
- Parameter context: The context.
- Parameter userDefined: Optional user-defined data.
- Returns: The password reference for the input username.
- Throws: `KeychainError.notFound` if unable to find the password in the keychain.
- Throws: `TunnelKitManagerError.keychain` if unable to find the password in the keychain.
**/
public func passwordReference(for username: String, context: String, userDefined: String? = nil) throws -> Data {
var query = [String: Any]()
@ -213,7 +219,7 @@ public class Keychain {
- Parameter reference: The password reference.
- Returns: The password for the input reference.
- Throws: `KeychainError.notFound` if unable to find the password in the keychain.
- Throws: `TunnelKitManagerError.keychain` if unable to find the password in the keychain.
**/
public static func password(forReference reference: Data) throws -> String {
var query = [String: Any]()
@ -250,7 +256,7 @@ public class Keychain {
- Parameter identifier: The unique identifier.
- Parameter data: The public key data.
- Returns: The `SecKey` object representing the public key.
- Throws: `KeychainError.add` if unable to add the public key to the keychain.
- Throws: `TunnelKitManagerError.keychain` if unable to add the public key to the keychain.
**/
public func add(publicKeyWithIdentifier identifier: String, data: Data) throws -> SecKey {
var query = [String: Any]()
@ -275,7 +281,7 @@ public class Keychain {
- Parameter identifier: The unique identifier.
- Returns: The `SecKey` object representing the public key.
- Throws: `KeychainError.notFound` if unable to find the public key in the keychain.
- Throws: `TunnelKitManagerError.keychain` if unable to find the public key in the keychain.
**/
public func publicKey(withIdentifier identifier: String) throws -> SecKey {
var query = [String: Any]()