diff --git a/Riot/Modules/SetPinCode/PinCodePreferences.swift b/Riot/Modules/SetPinCode/PinCodePreferences.swift index 1aeb5aa65..7785df60f 100644 --- a/Riot/Modules/SetPinCode/PinCodePreferences.swift +++ b/Riot/Modules/SetPinCode/PinCodePreferences.swift @@ -32,6 +32,7 @@ final class PinCodePreferences: NSObject { static let pin: String = "pin" static let biometricsEnabled: String = "biometricsEnabled" static let canUseBiometricsToUnlock: String = "canUseBiometricsToUnlock" + static let numberOfPinFailures: String = "numberOfPinFailures" } static let shared = PinCodePreferences() @@ -39,7 +40,7 @@ final class PinCodePreferences: NSObject { /// Store. Defaults to `KeychainStore` private let store: KeyValueStore - override init() { + override private init() { store = KeychainStore(withKeychain: Keychain(service: PinConstants.pinCodeKeychainService, accessGroup: BuildSettings.keychainAccessGroup)) super.init() @@ -129,6 +130,23 @@ final class PinCodePreferences: NSObject { } } + var numberOfPinFailures: Int { + get { + do { + return try store.integer(forKey: StoreKeys.numberOfPinFailures) ?? 0 + } catch let error { + NSLog("[PinCodePreferences] Error when reading numberOfPinFailures from store: \(error)") + return 0 + } + } set { + do { + try store.set(newValue, forKey: StoreKeys.numberOfPinFailures) + } catch let error { + NSLog("[PinCodePreferences] Error when storing numberOfPinFailures to the store: \(error)") + } + } + } + var isBiometricsSet: Bool { return biometricsEnabled == true } @@ -171,5 +189,7 @@ final class PinCodePreferences: NSObject { func reset() { pin = nil biometricsEnabled = nil + canUseBiometricsToUnlock = nil + numberOfPinFailures = 0 } } diff --git a/Riot/Modules/SetPinCode/SetPinCoordinator.swift b/Riot/Modules/SetPinCode/SetPinCoordinator.swift index 1137d9d16..f58f2fc06 100644 --- a/Riot/Modules/SetPinCode/SetPinCoordinator.swift +++ b/Riot/Modules/SetPinCode/SetPinCoordinator.swift @@ -53,7 +53,8 @@ final class SetPinCoordinator: SetPinCoordinatorType { private func getRootCoordinator() -> Coordinator & Presentable { switch viewMode { case .unlock: - if pinCodePreferences.isBiometricsSet { + let canUseBiometricsToUnlock = pinCodePreferences.canUseBiometricsToUnlock ?? true + if pinCodePreferences.isBiometricsSet && canUseBiometricsToUnlock { return createSetupBiometricsCoordinator() } else { return createEnterPinCodeCoordinator()