chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
import Foundation
|
||||
|
||||
#if os(macOS)
|
||||
import Darwin
|
||||
import LocalAuthentication
|
||||
import Security
|
||||
|
||||
enum KeychainNoUIQuery {
|
||||
private static let uiFailPolicy = KeychainNoUIQuery.resolveUIFailPolicy()
|
||||
|
||||
static func apply(to query: inout [String: Any]) {
|
||||
let context = LAContext()
|
||||
context.interactionNotAllowed = true
|
||||
query[kSecUseAuthenticationContext as String] = context
|
||||
|
||||
// Keep explicit UI-fail policy for legacy keychain behavior on macOS where
|
||||
// `interactionNotAllowed` alone can still surface Allow/Deny prompts.
|
||||
query[kSecUseAuthenticationUI as String] = self.uiFailPolicy as CFString
|
||||
}
|
||||
|
||||
static func uiFailPolicyForTesting() -> String {
|
||||
self.uiFailPolicy
|
||||
}
|
||||
|
||||
private static func resolveUIFailPolicy() -> String {
|
||||
// Resolve the Security symbol at runtime to preserve the true constant value
|
||||
// without directly referencing deprecated API at compile time.
|
||||
let securityPath = "/System/Library/Frameworks/Security.framework/Security"
|
||||
guard let handle = dlopen(securityPath, RTLD_NOW) else {
|
||||
return "u_AuthUIF"
|
||||
}
|
||||
defer { dlclose(handle) }
|
||||
|
||||
guard let symbol = dlsym(handle, "kSecUseAuthenticationUIFail") else {
|
||||
return "u_AuthUIF"
|
||||
}
|
||||
let valuePointer = symbol.assumingMemoryBound(to: CFString?.self)
|
||||
return (valuePointer.pointee as String?) ?? "u_AuthUIF"
|
||||
}
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user