Save app passcode in Keychain and migrate existing passcode from SharedDefaults
This commit is contained in:
parent
cc493cb490
commit
8e8501abb0
3 changed files with 18 additions and 11 deletions
|
|
@ -159,7 +159,7 @@ class SettingsTableViewController: UITableViewController, UITabBarControllerDele
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||||
if tableView.cellForRow(at: indexPath) == passcodeTableViewCell {
|
if tableView.cellForRow(at: indexPath) == passcodeTableViewCell {
|
||||||
if SharedDefaults[.passcodeKey] != nil{
|
if passcodeLock.hasPasscode {
|
||||||
showPasscodeActionSheet()
|
showPasscodeActionSheet()
|
||||||
} else {
|
} else {
|
||||||
setPasscodeLock()
|
setPasscodeLock()
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ public extension DefaultsKeys {
|
||||||
static let pgpPublicKeyArmor = DefaultsKey<String?>("pgpPublicKeyArmor")
|
static let pgpPublicKeyArmor = DefaultsKey<String?>("pgpPublicKeyArmor")
|
||||||
static let pgpPrivateKeyArmor = DefaultsKey<String?>("pgpPrivateKeyArmor")
|
static let pgpPrivateKeyArmor = DefaultsKey<String?>("pgpPrivateKeyArmor")
|
||||||
static let gitSSHPrivateKeyArmor = DefaultsKey<String?>("gitSSHPrivateKeyArmor")
|
static let gitSSHPrivateKeyArmor = DefaultsKey<String?>("gitSSHPrivateKeyArmor")
|
||||||
|
static let passcodeKey = DefaultsKey<String?>("passcodeKey")
|
||||||
|
|
||||||
static let gitURL = DefaultsKey<URL?>("gitURL")
|
static let gitURL = DefaultsKey<URL?>("gitURL")
|
||||||
static let gitAuthenticationMethod = DefaultsKey<String?>("gitAuthenticationMethod")
|
static let gitAuthenticationMethod = DefaultsKey<String?>("gitAuthenticationMethod")
|
||||||
|
|
@ -33,7 +34,6 @@ public extension DefaultsKeys {
|
||||||
static let lastSyncedTime = DefaultsKey<Date?>("lastSyncedTime")
|
static let lastSyncedTime = DefaultsKey<Date?>("lastSyncedTime")
|
||||||
|
|
||||||
static let isTouchIDOn = DefaultsKey<Bool>("isTouchIDOn", defaultValue: false)
|
static let isTouchIDOn = DefaultsKey<Bool>("isTouchIDOn", defaultValue: false)
|
||||||
static let passcodeKey = DefaultsKey<String?>("passcodeKey")
|
|
||||||
|
|
||||||
static let isHideUnknownOn = DefaultsKey<Bool>("isHideUnknownOn", defaultValue: false)
|
static let isHideUnknownOn = DefaultsKey<Bool>("isHideUnknownOn", defaultValue: false)
|
||||||
static let isHideOTPOn = DefaultsKey<Bool>("isHideOTPOn", defaultValue: false)
|
static let isHideOTPOn = DefaultsKey<Bool>("isHideOTPOn", defaultValue: false)
|
||||||
|
|
|
||||||
|
|
@ -6,15 +6,20 @@
|
||||||
// Copyright © 2017 Yishi Lin. All rights reserved.
|
// Copyright © 2017 Yishi Lin. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
public class PasscodeLock {
|
||||||
import LocalAuthentication
|
|
||||||
|
|
||||||
open class PasscodeLock {
|
|
||||||
public static let shared = PasscodeLock()
|
public static let shared = PasscodeLock()
|
||||||
|
|
||||||
fileprivate let passcodeKey = "passcode.lock.passcode"
|
private static let identifier = Globals.bundleIdentifier + "passcode"
|
||||||
fileprivate var passcode: String? {
|
|
||||||
return SharedDefaults[.passcodeKey]
|
/// Cached passcode to avoid frequent access to Keychain
|
||||||
|
private var passcode: String? = AppKeychain.get(for: PasscodeLock.identifier)
|
||||||
|
|
||||||
|
/// Constructor used to migrate passcode from SharedDefaults to Keychain
|
||||||
|
private init() {
|
||||||
|
if let passcode = SharedDefaults[.passcodeKey] {
|
||||||
|
save(passcode: passcode)
|
||||||
|
SharedDefaults[.passcodeKey] = nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public var hasPasscode: Bool {
|
public var hasPasscode: Bool {
|
||||||
|
|
@ -22,7 +27,8 @@ open class PasscodeLock {
|
||||||
}
|
}
|
||||||
|
|
||||||
public func save(passcode: String) {
|
public func save(passcode: String) {
|
||||||
SharedDefaults[.passcodeKey] = passcode
|
AppKeychain.add(string: passcode, for: PasscodeLock.identifier)
|
||||||
|
self.passcode = passcode
|
||||||
}
|
}
|
||||||
|
|
||||||
public func check(passcode: String) -> Bool {
|
public func check(passcode: String) -> Bool {
|
||||||
|
|
@ -30,6 +36,7 @@ open class PasscodeLock {
|
||||||
}
|
}
|
||||||
|
|
||||||
public func delete() {
|
public func delete() {
|
||||||
SharedDefaults[.passcodeKey] = nil
|
AppKeychain.removeContent(for: PasscodeLock.identifier)
|
||||||
|
passcode = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue