From 31a5aa9dd75f478f36165f190a9c27693b43022a Mon Sep 17 00:00:00 2001 From: Thomas Avery <43214426+Thomas-Avery@users.noreply.github.com> Date: Mon, 16 Sep 2024 09:59:25 -0500 Subject: [PATCH] [PM-12011] Fix Unlock with biometrics on the Safari browser extension (#11040) * Add biometricUnlockAvailable to SafariWebExtensionHandler --- .../safari/SafariWebExtensionHandler.swift | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/apps/browser/src/safari/safari/SafariWebExtensionHandler.swift b/apps/browser/src/safari/safari/SafariWebExtensionHandler.swift index b0688e3beb..1768ce6b15 100644 --- a/apps/browser/src/safari/safari/SafariWebExtensionHandler.swift +++ b/apps/browser/src/safari/safari/SafariWebExtensionHandler.swift @@ -88,12 +88,9 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { return case "biometricUnlock": - var error: NSError? let laContext = LAContext() - laContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) - - if let e = error, e.code != kLAErrorBiometryLockout { + if(!laContext.isBiometricsAvailable()){ response.userInfo = [ SFExtensionMessageKey: [ "message": [ @@ -162,6 +159,20 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { } return + case "biometricUnlockAvailable": + let laContext = LAContext() + var isAvailable = laContext.isBiometricsAvailable(); + + response.userInfo = [ + SFExtensionMessageKey: [ + "message": [ + "command": "biometricUnlockAvailable", + "response": isAvailable ? "available" : "not available", + "timestamp": Int64(NSDate().timeIntervalSince1970 * 1000), + ], + ], + ] + break default: return } @@ -194,6 +205,20 @@ func jsonDeserialize(json: String?) -> T? { } } +extension LAContext { + func isBiometricsAvailable() -> Bool { + var error: NSError? + + self.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) + + if let e = error, e.code != kLAErrorBiometryLockout { + return false; + } else { + return true; + } + } +} + class DownloadFileMessage: Decodable, Encodable { var fileName: String var blobData: String?