Update SwiftyUserDefaults to current version 5.0.0
This commit is contained in:
parent
b60ce3b003
commit
a2edf41d33
26 changed files with 145 additions and 149 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
language: objective-c
|
language: objective-c
|
||||||
osx_image: xcode11
|
osx_image: xcode11.3
|
||||||
addons:
|
addons:
|
||||||
homebrew:
|
homebrew:
|
||||||
packages:
|
packages:
|
||||||
|
|
|
||||||
|
|
@ -4,4 +4,4 @@ github "leonbreedt/FavIcon" "3.0.6"
|
||||||
github "mattrubin/Base32" "1.1.2+xcode10.2"
|
github "mattrubin/Base32" "1.1.2+xcode10.2"
|
||||||
github "mattrubin/OneTimePassword" "3.2.0"
|
github "mattrubin/OneTimePassword" "3.2.0"
|
||||||
github "mssun/objective-git" "0.15"
|
github "mssun/objective-git" "0.15"
|
||||||
github "radex/SwiftyUserDefaults" "4.0.0"
|
github "radex/SwiftyUserDefaults" "5.0.0"
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ class AddPasswordTableViewController: PasswordEditorTableViewController {
|
||||||
[[.type: PasswordEditorCellType.additionsCell, .title: "additions"]],
|
[[.type: PasswordEditorCellType.additionsCell, .title: "additions"]],
|
||||||
[[.type: PasswordEditorCellType.scanQRCodeCell]]
|
[[.type: PasswordEditorCellType.scanQRCodeCell]]
|
||||||
]
|
]
|
||||||
if PasswordGeneratorFlavour.from(SharedDefaults[.passwordGeneratorFlavor]) == .RANDOM {
|
if PasswordGeneratorFlavour.from(Defaults.passwordGeneratorFlavor) == .RANDOM {
|
||||||
tableData[1].append([.type: PasswordEditorCellType.passwordLengthCell, .title: "passwordlength"])
|
tableData[1].append([.type: PasswordEditorCellType.passwordLengthCell, .title: "passwordlength"])
|
||||||
}
|
}
|
||||||
tableData[1].append([.type: PasswordEditorCellType.memorablePasswordGeneratorCell])
|
tableData[1].append([.type: PasswordEditorCellType.memorablePasswordGeneratorCell])
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ class AdvancedSettingsTableViewController: UITableViewController {
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
encryptInASCIIArmoredSwitch.isOn = SharedDefaults[.encryptInArmored]
|
encryptInASCIIArmoredSwitch.isOn = Defaults.encryptInArmored
|
||||||
encryptInASCIIArmoredTableViewCell.accessoryView = encryptInASCIIArmoredSwitch
|
encryptInASCIIArmoredTableViewCell.accessoryView = encryptInASCIIArmoredSwitch
|
||||||
encryptInASCIIArmoredTableViewCell.selectionStyle = .none
|
encryptInASCIIArmoredTableViewCell.selectionStyle = .none
|
||||||
setGitSignatureText()
|
setGitSignatureText()
|
||||||
|
|
@ -39,7 +39,7 @@ class AdvancedSettingsTableViewController: UITableViewController {
|
||||||
let gitSignatureEmail = passwordStore.gitSignatureForNow?.email ?? ""
|
let gitSignatureEmail = passwordStore.gitSignatureForNow?.email ?? ""
|
||||||
self.gitSignatureTableViewCell.detailTextLabel?.font = UIFont.preferredFont(forTextStyle: .footnote)
|
self.gitSignatureTableViewCell.detailTextLabel?.font = UIFont.preferredFont(forTextStyle: .footnote)
|
||||||
self.gitSignatureTableViewCell.detailTextLabel?.text = "\(gitSignatureName) <\(gitSignatureEmail)>"
|
self.gitSignatureTableViewCell.detailTextLabel?.text = "\(gitSignatureName) <\(gitSignatureEmail)>"
|
||||||
if SharedDefaults[.gitSignatureName] == nil && SharedDefaults[.gitSignatureEmail] == nil {
|
if Defaults.gitSignatureName == nil && Defaults.gitSignatureEmail == nil {
|
||||||
self.gitSignatureTableViewCell.detailTextLabel?.font = UIFont.preferredFont(forTextStyle: .body)
|
self.gitSignatureTableViewCell.detailTextLabel?.font = UIFont.preferredFont(forTextStyle: .body)
|
||||||
gitSignatureTableViewCell.detailTextLabel?.text = "NotSet".localize()
|
gitSignatureTableViewCell.detailTextLabel?.text = "NotSet".localize()
|
||||||
}
|
}
|
||||||
|
|
@ -78,15 +78,15 @@ class AdvancedSettingsTableViewController: UITableViewController {
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func encryptInASCIIArmoredAction(_ sender: Any?) {
|
@objc func encryptInASCIIArmoredAction(_ sender: Any?) {
|
||||||
SharedDefaults[.encryptInArmored] = encryptInASCIIArmoredSwitch.isOn
|
Defaults.encryptInArmored = encryptInASCIIArmoredSwitch.isOn
|
||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func saveGitConfigSetting(segue: UIStoryboardSegue) {
|
@IBAction func saveGitConfigSetting(segue: UIStoryboardSegue) {
|
||||||
if let controller = segue.source as? GitConfigSettingTableViewController {
|
if let controller = segue.source as? GitConfigSettingTableViewController {
|
||||||
if let gitSignatureName = controller.nameTextField.text,
|
if let gitSignatureName = controller.nameTextField.text,
|
||||||
let gitSignatureEmail = controller.emailTextField.text {
|
let gitSignatureEmail = controller.emailTextField.text {
|
||||||
SharedDefaults[.gitSignatureName] = gitSignatureName.isEmpty ? nil : gitSignatureName
|
Defaults.gitSignatureName = gitSignatureName.isEmpty ? nil : gitSignatureName
|
||||||
SharedDefaults[.gitSignatureEmail] = gitSignatureEmail.isEmpty ? nil : gitSignatureEmail
|
Defaults.gitSignatureEmail = gitSignatureEmail.isEmpty ? nil : gitSignatureEmail
|
||||||
}
|
}
|
||||||
setGitSignatureText()
|
setGitSignatureText()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ class EditPasswordTableViewController: PasswordEditorTableViewController {
|
||||||
[[.type: PasswordEditorCellType.scanQRCodeCell],
|
[[.type: PasswordEditorCellType.scanQRCodeCell],
|
||||||
[.type: PasswordEditorCellType.deletePasswordCell]]
|
[.type: PasswordEditorCellType.deletePasswordCell]]
|
||||||
]
|
]
|
||||||
if PasswordGeneratorFlavour.from(SharedDefaults[.passwordGeneratorFlavor]) == .RANDOM {
|
if PasswordGeneratorFlavour.from(Defaults.passwordGeneratorFlavor) == .RANDOM {
|
||||||
tableData[1].append([.type: PasswordEditorCellType.passwordLengthCell, .title: "passwordlength"])
|
tableData[1].append([.type: PasswordEditorCellType.passwordLengthCell, .title: "passwordlength"])
|
||||||
}
|
}
|
||||||
tableData[1].append([.type: PasswordEditorCellType.memorablePasswordGeneratorCell])
|
tableData[1].append([.type: PasswordEditorCellType.memorablePasswordGeneratorCell])
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ class GeneralSettingsTableViewController: BasicStaticTableViewController {
|
||||||
uiSwitch.onTintColor = Colors.systemBlue
|
uiSwitch.onTintColor = Colors.systemBlue
|
||||||
uiSwitch.sizeToFit()
|
uiSwitch.sizeToFit()
|
||||||
uiSwitch.addTarget(self, action: #selector(rememberPGPPassphraseSwitchAction(_:)), for: UIControl.Event.valueChanged)
|
uiSwitch.addTarget(self, action: #selector(rememberPGPPassphraseSwitchAction(_:)), for: UIControl.Event.valueChanged)
|
||||||
uiSwitch.isOn = SharedDefaults[.isRememberPGPPassphraseOn]
|
uiSwitch.isOn = Defaults.isRememberPGPPassphraseOn
|
||||||
return uiSwitch
|
return uiSwitch
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|
@ -42,7 +42,7 @@ class GeneralSettingsTableViewController: BasicStaticTableViewController {
|
||||||
uiSwitch.onTintColor = Colors.systemBlue
|
uiSwitch.onTintColor = Colors.systemBlue
|
||||||
uiSwitch.sizeToFit()
|
uiSwitch.sizeToFit()
|
||||||
uiSwitch.addTarget(self, action: #selector(rememberGitCredentialPassphraseSwitchAction(_:)), for: UIControl.Event.valueChanged)
|
uiSwitch.addTarget(self, action: #selector(rememberGitCredentialPassphraseSwitchAction(_:)), for: UIControl.Event.valueChanged)
|
||||||
uiSwitch.isOn = SharedDefaults[.isRememberGitCredentialPassphraseOn]
|
uiSwitch.isOn = Defaults.isRememberGitCredentialPassphraseOn
|
||||||
return uiSwitch
|
return uiSwitch
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|
@ -51,7 +51,7 @@ class GeneralSettingsTableViewController: BasicStaticTableViewController {
|
||||||
uiSwitch.onTintColor = Colors.systemBlue
|
uiSwitch.onTintColor = Colors.systemBlue
|
||||||
uiSwitch.sizeToFit()
|
uiSwitch.sizeToFit()
|
||||||
uiSwitch.addTarget(self, action: #selector(showFolderSwitchAction(_:)), for: UIControl.Event.valueChanged)
|
uiSwitch.addTarget(self, action: #selector(showFolderSwitchAction(_:)), for: UIControl.Event.valueChanged)
|
||||||
uiSwitch.isOn = SharedDefaults[.isShowFolderOn]
|
uiSwitch.isOn = Defaults.isShowFolderOn
|
||||||
return uiSwitch
|
return uiSwitch
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|
@ -60,7 +60,7 @@ class GeneralSettingsTableViewController: BasicStaticTableViewController {
|
||||||
uiSwitch.onTintColor = Colors.systemBlue
|
uiSwitch.onTintColor = Colors.systemBlue
|
||||||
uiSwitch.sizeToFit()
|
uiSwitch.sizeToFit()
|
||||||
uiSwitch.addTarget(self, action: #selector(hidePasswordImagesSwitchAction(_:)), for: UIControl.Event.valueChanged)
|
uiSwitch.addTarget(self, action: #selector(hidePasswordImagesSwitchAction(_:)), for: UIControl.Event.valueChanged)
|
||||||
uiSwitch.isOn = SharedDefaults[.isHidePasswordImagesOn]
|
uiSwitch.isOn = Defaults.isHidePasswordImagesOn
|
||||||
return uiSwitch
|
return uiSwitch
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|
@ -105,7 +105,7 @@ class GeneralSettingsTableViewController: BasicStaticTableViewController {
|
||||||
accessoryView.addSubview(hideUnknownSwitch)
|
accessoryView.addSubview(hideUnknownSwitch)
|
||||||
cell.accessoryView = accessoryView
|
cell.accessoryView = accessoryView
|
||||||
cell.selectionStyle = .none
|
cell.selectionStyle = .none
|
||||||
hideUnknownSwitch.isOn = SharedDefaults[.isHideUnknownOn]
|
hideUnknownSwitch.isOn = Defaults.isHideUnknownOn
|
||||||
case "HideOtpFields".localize():
|
case "HideOtpFields".localize():
|
||||||
cell.accessoryType = .none
|
cell.accessoryType = .none
|
||||||
let detailButton = UIButton(type: .detailDisclosure)
|
let detailButton = UIButton(type: .detailDisclosure)
|
||||||
|
|
@ -117,7 +117,7 @@ class GeneralSettingsTableViewController: BasicStaticTableViewController {
|
||||||
accessoryView.addSubview(hideOTPSwitch)
|
accessoryView.addSubview(hideOTPSwitch)
|
||||||
cell.accessoryView = accessoryView
|
cell.accessoryView = accessoryView
|
||||||
cell.selectionStyle = .none
|
cell.selectionStyle = .none
|
||||||
hideOTPSwitch.isOn = SharedDefaults[.isHideOTPOn]
|
hideOTPSwitch.isOn = Defaults.isHideOTPOn
|
||||||
case "RememberPgpKeyPassphrase".localize():
|
case "RememberPgpKeyPassphrase".localize():
|
||||||
cell.accessoryType = .none
|
cell.accessoryType = .none
|
||||||
cell.selectionStyle = .none
|
cell.selectionStyle = .none
|
||||||
|
|
@ -141,10 +141,10 @@ class GeneralSettingsTableViewController: BasicStaticTableViewController {
|
||||||
accessoryView.addSubview(hidePasswordImagesSwitch)
|
accessoryView.addSubview(hidePasswordImagesSwitch)
|
||||||
cell.accessoryView = accessoryView
|
cell.accessoryView = accessoryView
|
||||||
cell.selectionStyle = .none
|
cell.selectionStyle = .none
|
||||||
hidePasswordImagesSwitch.isOn = SharedDefaults[.isHidePasswordImagesOn]
|
hidePasswordImagesSwitch.isOn = Defaults.isHidePasswordImagesOn
|
||||||
case "PasswordGeneratorFlavor".localize():
|
case "PasswordGeneratorFlavor".localize():
|
||||||
cell.accessoryType = .disclosureIndicator
|
cell.accessoryType = .disclosureIndicator
|
||||||
cell.detailTextLabel?.text = PasswordGeneratorFlavour.from(SharedDefaults[.passwordGeneratorFlavor]).name
|
cell.detailTextLabel?.text = PasswordGeneratorFlavour.from(Defaults.passwordGeneratorFlavor).name
|
||||||
default: break
|
default: break
|
||||||
}
|
}
|
||||||
return cell
|
return cell
|
||||||
|
|
@ -163,7 +163,7 @@ class GeneralSettingsTableViewController: BasicStaticTableViewController {
|
||||||
let optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
|
let optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
|
||||||
var randomFlavorActionTitle = ""
|
var randomFlavorActionTitle = ""
|
||||||
var appleFlavorActionTitle = ""
|
var appleFlavorActionTitle = ""
|
||||||
if SharedDefaults[.passwordGeneratorFlavor] == PasswordGeneratorFlavour.RANDOM.rawValue {
|
if Defaults.passwordGeneratorFlavor == PasswordGeneratorFlavour.RANDOM.rawValue {
|
||||||
randomFlavorActionTitle = "✓ " + "RandomString".localize()
|
randomFlavorActionTitle = "✓ " + "RandomString".localize()
|
||||||
appleFlavorActionTitle = "ApplesKeychainStyle".localize()
|
appleFlavorActionTitle = "ApplesKeychainStyle".localize()
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -171,12 +171,12 @@ class GeneralSettingsTableViewController: BasicStaticTableViewController {
|
||||||
appleFlavorActionTitle = "✓ " + "ApplesKeychainStyle".localize()
|
appleFlavorActionTitle = "✓ " + "ApplesKeychainStyle".localize()
|
||||||
}
|
}
|
||||||
let randomFlavorAction = UIAlertAction(title: randomFlavorActionTitle, style: .default) { _ in
|
let randomFlavorAction = UIAlertAction(title: randomFlavorActionTitle, style: .default) { _ in
|
||||||
SharedDefaults[.passwordGeneratorFlavor] = PasswordGeneratorFlavour.RANDOM.rawValue
|
Defaults.passwordGeneratorFlavor = PasswordGeneratorFlavour.RANDOM.rawValue
|
||||||
sourceCell.detailTextLabel?.text = PasswordGeneratorFlavour.RANDOM.name
|
sourceCell.detailTextLabel?.text = PasswordGeneratorFlavour.RANDOM.name
|
||||||
}
|
}
|
||||||
|
|
||||||
let appleFlavorAction = UIAlertAction(title: appleFlavorActionTitle, style: .default) { _ in
|
let appleFlavorAction = UIAlertAction(title: appleFlavorActionTitle, style: .default) { _ in
|
||||||
SharedDefaults[.passwordGeneratorFlavor] = PasswordGeneratorFlavour.APPLE.rawValue
|
Defaults.passwordGeneratorFlavor = PasswordGeneratorFlavour.APPLE.rawValue
|
||||||
sourceCell.detailTextLabel?.text = PasswordGeneratorFlavour.APPLE.name
|
sourceCell.detailTextLabel?.text = PasswordGeneratorFlavour.APPLE.name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -209,24 +209,24 @@ class GeneralSettingsTableViewController: BasicStaticTableViewController {
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func hideUnknownSwitchAction(_ sender: Any?) {
|
@objc func hideUnknownSwitchAction(_ sender: Any?) {
|
||||||
SharedDefaults[.isHideUnknownOn] = hideUnknownSwitch.isOn
|
Defaults.isHideUnknownOn = hideUnknownSwitch.isOn
|
||||||
NotificationCenter.default.post(name: .passwordDetailDisplaySettingChanged, object: nil)
|
NotificationCenter.default.post(name: .passwordDetailDisplaySettingChanged, object: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func hideOTPSwitchAction(_ sender: Any?) {
|
@objc func hideOTPSwitchAction(_ sender: Any?) {
|
||||||
SharedDefaults[.isHideOTPOn] = hideOTPSwitch.isOn
|
Defaults.isHideOTPOn = hideOTPSwitch.isOn
|
||||||
NotificationCenter.default.post(name: .passwordDetailDisplaySettingChanged, object: nil)
|
NotificationCenter.default.post(name: .passwordDetailDisplaySettingChanged, object: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func rememberPGPPassphraseSwitchAction(_ sender: Any?) {
|
@objc func rememberPGPPassphraseSwitchAction(_ sender: Any?) {
|
||||||
SharedDefaults[.isRememberPGPPassphraseOn] = rememberPGPPassphraseSwitch.isOn
|
Defaults.isRememberPGPPassphraseOn = rememberPGPPassphraseSwitch.isOn
|
||||||
if rememberPGPPassphraseSwitch.isOn == false {
|
if rememberPGPPassphraseSwitch.isOn == false {
|
||||||
AppKeychain.shared.removeContent(for: Globals.pgpKeyPassphrase)
|
AppKeychain.shared.removeContent(for: Globals.pgpKeyPassphrase)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func rememberGitCredentialPassphraseSwitchAction(_ sender: Any?) {
|
@objc func rememberGitCredentialPassphraseSwitchAction(_ sender: Any?) {
|
||||||
SharedDefaults[.isRememberGitCredentialPassphraseOn] = rememberGitCredentialPassphraseSwitch.isOn
|
Defaults.isRememberGitCredentialPassphraseOn = rememberGitCredentialPassphraseSwitch.isOn
|
||||||
if rememberGitCredentialPassphraseSwitch.isOn == false {
|
if rememberGitCredentialPassphraseSwitch.isOn == false {
|
||||||
passwordStore.gitSSHPrivateKeyPassphrase = nil
|
passwordStore.gitSSHPrivateKeyPassphrase = nil
|
||||||
passwordStore.gitPassword = nil
|
passwordStore.gitPassword = nil
|
||||||
|
|
@ -234,12 +234,12 @@ class GeneralSettingsTableViewController: BasicStaticTableViewController {
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func showFolderSwitchAction(_ sender: Any?) {
|
@objc func showFolderSwitchAction(_ sender: Any?) {
|
||||||
SharedDefaults[.isShowFolderOn] = showFolderSwitch.isOn
|
Defaults.isShowFolderOn = showFolderSwitch.isOn
|
||||||
NotificationCenter.default.post(name: .passwordDisplaySettingChanged, object: nil)
|
NotificationCenter.default.post(name: .passwordDisplaySettingChanged, object: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func hidePasswordImagesSwitchAction(_ sender: Any?) {
|
@objc func hidePasswordImagesSwitchAction(_ sender: Any?) {
|
||||||
SharedDefaults[.isHidePasswordImagesOn] = hidePasswordImagesSwitch.isOn
|
Defaults.isHidePasswordImagesOn = hidePasswordImagesSwitch.isOn
|
||||||
NotificationCenter.default.post(name: .passwordDetailDisplaySettingChanged, object: nil)
|
NotificationCenter.default.post(name: .passwordDetailDisplaySettingChanged, object: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
import SwiftyUserDefaults
|
|
||||||
import passKit
|
import passKit
|
||||||
|
|
||||||
class GitConfigSettingTableViewController: UITableViewController {
|
class GitConfigSettingTableViewController: UITableViewController {
|
||||||
|
|
@ -23,8 +22,8 @@ class GitConfigSettingTableViewController: UITableViewController {
|
||||||
let signature = passwordStore.gitSignatureForNow
|
let signature = passwordStore.gitSignatureForNow
|
||||||
nameTextField.placeholder = signature?.name ?? ""
|
nameTextField.placeholder = signature?.name ?? ""
|
||||||
emailTextField.placeholder = signature?.email ?? ""
|
emailTextField.placeholder = signature?.email ?? ""
|
||||||
nameTextField.text = SharedDefaults[.gitSignatureName]
|
nameTextField.text = Defaults.gitSignatureName
|
||||||
emailTextField.text = SharedDefaults[.gitSignatureEmail]
|
emailTextField.text = Defaults.gitSignatureEmail
|
||||||
}
|
}
|
||||||
|
|
||||||
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
|
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
|
||||||
|
|
|
||||||
|
|
@ -65,8 +65,8 @@ class GitSSHKeyArmorSettingTableViewController: AutoCellHeightUITableViewControl
|
||||||
} catch {
|
} catch {
|
||||||
Utils.alert(title: "CannotSave".localize(), message: "CannotSaveSshKey".localize(), controller: self, completion: nil)
|
Utils.alert(title: "CannotSave".localize(), message: "CannotSaveSshKey".localize(), controller: self, completion: nil)
|
||||||
}
|
}
|
||||||
SharedDefaults[.gitSSHKeySource] = .armor
|
Defaults.gitSSHKeySource = .armor
|
||||||
SharedDefaults[.gitAuthenticationMethod] = .key
|
Defaults.gitAuthenticationMethod = .key
|
||||||
self.navigationController!.popViewController(animated: true)
|
self.navigationController!.popViewController(animated: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,32 +27,32 @@ class GitServerSettingTableViewController: UITableViewController {
|
||||||
private var sshLabel: UILabel?
|
private var sshLabel: UILabel?
|
||||||
private let passwordStore = PasswordStore.shared
|
private let passwordStore = PasswordStore.shared
|
||||||
private var gitAuthenticationMethod: GitAuthenticationMethod {
|
private var gitAuthenticationMethod: GitAuthenticationMethod {
|
||||||
get { SharedDefaults[.gitAuthenticationMethod] }
|
get { Defaults.gitAuthenticationMethod }
|
||||||
set {
|
set {
|
||||||
SharedDefaults[.gitAuthenticationMethod] = newValue
|
Defaults.gitAuthenticationMethod = newValue
|
||||||
updateAuthenticationMethodCheckView(for: newValue)
|
updateAuthenticationMethodCheckView(for: newValue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private var gitUrl: URL {
|
private var gitUrl: URL {
|
||||||
get { SharedDefaults[.gitURL] }
|
get { Defaults.gitURL }
|
||||||
set { SharedDefaults[.gitURL] = newValue }
|
set { Defaults.gitURL = newValue }
|
||||||
}
|
}
|
||||||
private var gitBranchName: String {
|
private var gitBranchName: String {
|
||||||
get { SharedDefaults[.gitBranchName] }
|
get { Defaults.gitBranchName }
|
||||||
set { SharedDefaults[.gitBranchName] = newValue }
|
set { Defaults.gitBranchName = newValue }
|
||||||
}
|
}
|
||||||
private var gitUsername: String {
|
private var gitUsername: String {
|
||||||
get { SharedDefaults[.gitUsername] }
|
get { Defaults.gitUsername }
|
||||||
set { SharedDefaults[.gitUsername] = newValue }
|
set { Defaults.gitUsername = newValue }
|
||||||
}
|
}
|
||||||
private var gitCredential: GitCredential {
|
private var gitCredential: GitCredential {
|
||||||
get {
|
get {
|
||||||
switch SharedDefaults[.gitAuthenticationMethod] {
|
switch Defaults.gitAuthenticationMethod {
|
||||||
case .password:
|
case .password:
|
||||||
return GitCredential(credential: .http(userName: SharedDefaults[.gitUsername]))
|
return GitCredential(credential: .http(userName: Defaults.gitUsername))
|
||||||
case .key:
|
case .key:
|
||||||
let privateKey: String = AppKeychain.shared.get(for: SshKey.PRIVATE.getKeychainKey()) ?? ""
|
let privateKey: String = AppKeychain.shared.get(for: SshKey.PRIVATE.getKeychainKey()) ?? ""
|
||||||
return GitCredential(credential: .ssh(userName: SharedDefaults[.gitUsername], privateKey: privateKey))
|
return GitCredential(credential: .ssh(userName: Defaults.gitUsername, privateKey: privateKey))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -158,7 +158,7 @@ class GitServerSettingTableViewController: UITableViewController {
|
||||||
|
|
||||||
private func cloneAndSegueIfSuccess() {
|
private func cloneAndSegueIfSuccess() {
|
||||||
// Remember git credential password/passphrase temporarily, ask whether users want this after a successful clone.
|
// Remember git credential password/passphrase temporarily, ask whether users want this after a successful clone.
|
||||||
SharedDefaults[.isRememberGitCredentialPassphraseOn] = true
|
Defaults.isRememberGitCredentialPassphraseOn = true
|
||||||
DispatchQueue.global(qos: .userInitiated).async() {
|
DispatchQueue.global(qos: .userInitiated).async() {
|
||||||
do {
|
do {
|
||||||
let transferProgressBlock: (UnsafePointer<git_transfer_progress>, UnsafeMutablePointer<ObjCBool>) -> Void = { (git_transfer_progress, _) in
|
let transferProgressBlock: (UnsafePointer<git_transfer_progress>, UnsafeMutablePointer<ObjCBool>) -> Void = { (git_transfer_progress, _) in
|
||||||
|
|
@ -183,13 +183,13 @@ class GitServerSettingTableViewController: UITableViewController {
|
||||||
let savePassphraseAlert: UIAlertController = {
|
let savePassphraseAlert: UIAlertController = {
|
||||||
let alert = UIAlertController(title: "Done".localize(), message: "WantToSaveGitCredential?".localize(), preferredStyle: .alert)
|
let alert = UIAlertController(title: "Done".localize(), message: "WantToSaveGitCredential?".localize(), preferredStyle: .alert)
|
||||||
alert.addAction(UIAlertAction(title: "No".localize(), style: .default) { _ in
|
alert.addAction(UIAlertAction(title: "No".localize(), style: .default) { _ in
|
||||||
SharedDefaults[.isRememberGitCredentialPassphraseOn] = false
|
Defaults.isRememberGitCredentialPassphraseOn = false
|
||||||
self.passwordStore.gitPassword = nil
|
self.passwordStore.gitPassword = nil
|
||||||
self.passwordStore.gitSSHPrivateKeyPassphrase = nil
|
self.passwordStore.gitSSHPrivateKeyPassphrase = nil
|
||||||
self.performSegue(withIdentifier: "saveGitServerSettingSegue", sender: self)
|
self.performSegue(withIdentifier: "saveGitServerSettingSegue", sender: self)
|
||||||
})
|
})
|
||||||
alert.addAction(UIAlertAction(title: "Yes".localize(), style: .destructive) {_ in
|
alert.addAction(UIAlertAction(title: "Yes".localize(), style: .destructive) {_ in
|
||||||
SharedDefaults[.isRememberGitCredentialPassphraseOn] = true
|
Defaults.isRememberGitCredentialPassphraseOn = true
|
||||||
self.performSegue(withIdentifier: "saveGitServerSettingSegue", sender: self)
|
self.performSegue(withIdentifier: "saveGitServerSettingSegue", sender: self)
|
||||||
})
|
})
|
||||||
return alert
|
return alert
|
||||||
|
|
@ -221,7 +221,7 @@ class GitServerSettingTableViewController: UITableViewController {
|
||||||
var armorActionTitle = "AsciiArmorEncryptedKey".localize()
|
var armorActionTitle = "AsciiArmorEncryptedKey".localize()
|
||||||
var fileActionTitle = "ITunesFileSharing".localize()
|
var fileActionTitle = "ITunesFileSharing".localize()
|
||||||
|
|
||||||
switch SharedDefaults[.gitSSHKeySource] {
|
switch Defaults.gitSSHKeySource {
|
||||||
case .url: urlActionTitle = "✓ \(urlActionTitle)"
|
case .url: urlActionTitle = "✓ \(urlActionTitle)"
|
||||||
case .armor: armorActionTitle = "✓ \(armorActionTitle)"
|
case .armor: armorActionTitle = "✓ \(armorActionTitle)"
|
||||||
case .file: fileActionTitle = "✓ \(fileActionTitle)"
|
case .file: fileActionTitle = "✓ \(fileActionTitle)"
|
||||||
|
|
@ -244,7 +244,7 @@ class GitServerSettingTableViewController: UITableViewController {
|
||||||
let action = UIAlertAction(title: fileActionTitle, style: .default) { _ in
|
let action = UIAlertAction(title: fileActionTitle, style: .default) { _ in
|
||||||
do {
|
do {
|
||||||
try self.passwordStore.gitSSHKeyImportFromFileSharing()
|
try self.passwordStore.gitSSHKeyImportFromFileSharing()
|
||||||
SharedDefaults[.gitSSHKeySource] = .file
|
Defaults.gitSSHKeySource = .file
|
||||||
SVProgressHUD.showSuccess(withStatus: "Imported".localize())
|
SVProgressHUD.showSuccess(withStatus: "Imported".localize())
|
||||||
SVProgressHUD.dismiss(withDelay: 1)
|
SVProgressHUD.dismiss(withDelay: 1)
|
||||||
self.sshLabel?.isEnabled = true
|
self.sshLabel?.isEnabled = true
|
||||||
|
|
@ -268,10 +268,10 @@ class GitServerSettingTableViewController: UITableViewController {
|
||||||
}()
|
}()
|
||||||
optionMenu.addAction(fileAction)
|
optionMenu.addAction(fileAction)
|
||||||
|
|
||||||
if SharedDefaults[.gitSSHKeySource] != nil {
|
if Defaults.gitSSHKeySource != nil {
|
||||||
let deleteAction = UIAlertAction(title: "RemoveSShKeys".localize(), style: .destructive) { _ in
|
let deleteAction = UIAlertAction(title: "RemoveSShKeys".localize(), style: .destructive) { _ in
|
||||||
self.passwordStore.removeGitSSHKeys()
|
self.passwordStore.removeGitSSHKeys()
|
||||||
SharedDefaults[.gitSSHKeySource] = nil
|
Defaults.gitSSHKeySource = nil
|
||||||
self.sshLabel?.isEnabled = false
|
self.sshLabel?.isEnabled = false
|
||||||
self.updateAuthenticationMethodCheckView(for: .password)
|
self.updateAuthenticationMethodCheckView(for: .password)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@ class PGPKeyArmorSettingTableViewController: AutoCellHeightUITableViewController
|
||||||
// no
|
// no
|
||||||
savePassphraseAlert.addAction(UIAlertAction(title: "No".localize(), style: UIAlertAction.Style.default) { _ in
|
savePassphraseAlert.addAction(UIAlertAction(title: "No".localize(), style: UIAlertAction.Style.default) { _ in
|
||||||
self.keychain.removeContent(for: Globals.pgpKeyPassphrase)
|
self.keychain.removeContent(for: Globals.pgpKeyPassphrase)
|
||||||
SharedDefaults[.isRememberPGPPassphraseOn] = false
|
Defaults.isRememberPGPPassphraseOn = false
|
||||||
self.performSegue(withIdentifier: "savePGPKeySegue", sender: self)
|
self.performSegue(withIdentifier: "savePGPKeySegue", sender: self)
|
||||||
})
|
})
|
||||||
// yes
|
// yes
|
||||||
|
|
@ -99,7 +99,7 @@ class PGPKeyArmorSettingTableViewController: AutoCellHeightUITableViewController
|
||||||
let alert = UIAlertController(title: "Passphrase".localize(), message: "FillInPgpPassphrase.".localize(), preferredStyle: UIAlertController.Style.alert)
|
let alert = UIAlertController(title: "Passphrase".localize(), message: "FillInPgpPassphrase.".localize(), preferredStyle: UIAlertController.Style.alert)
|
||||||
alert.addAction(UIAlertAction(title: "Ok".localize(), style: UIAlertAction.Style.default, handler: {_ in
|
alert.addAction(UIAlertAction(title: "Ok".localize(), style: UIAlertAction.Style.default, handler: {_ in
|
||||||
self.keychain.add(string: alert.textFields?.first?.text, for: Globals.pgpKeyPassphrase)
|
self.keychain.add(string: alert.textFields?.first?.text, for: Globals.pgpKeyPassphrase)
|
||||||
SharedDefaults[.isRememberPGPPassphraseOn] = true
|
Defaults.isRememberPGPPassphraseOn = true
|
||||||
self.performSegue(withIdentifier: "savePGPKeySegue", sender: self)
|
self.performSegue(withIdentifier: "savePGPKeySegue", sender: self)
|
||||||
}))
|
}))
|
||||||
alert.addTextField(configurationHandler: {(textField: UITextField!) in
|
alert.addTextField(configurationHandler: {(textField: UITextField!) in
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ class PGPKeySettingTableViewController: AutoCellHeightUITableViewController {
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
pgpPublicKeyURLTextField.text = SharedDefaults[.pgpPublicKeyURL]?.absoluteString
|
pgpPublicKeyURLTextField.text = Defaults.pgpPublicKeyURL?.absoluteString
|
||||||
pgpPrivateKeyURLTextField.text = SharedDefaults[.pgpPrivateKeyURL]?.absoluteString
|
pgpPrivateKeyURLTextField.text = Defaults.pgpPrivateKeyURL?.absoluteString
|
||||||
}
|
}
|
||||||
|
|
||||||
private func validatePGPKeyURL(input: String?) -> Bool {
|
private func validatePGPKeyURL(input: String?) -> Bool {
|
||||||
|
|
@ -44,7 +44,7 @@ class PGPKeySettingTableViewController: AutoCellHeightUITableViewController {
|
||||||
// no
|
// no
|
||||||
savePassphraseAlert.addAction(UIAlertAction(title: "No".localize(), style: UIAlertAction.Style.default) { _ in
|
savePassphraseAlert.addAction(UIAlertAction(title: "No".localize(), style: UIAlertAction.Style.default) { _ in
|
||||||
self.keychain.removeContent(for: Globals.pgpKeyPassphrase)
|
self.keychain.removeContent(for: Globals.pgpKeyPassphrase)
|
||||||
SharedDefaults[.isRememberPGPPassphraseOn] = false
|
Defaults.isRememberPGPPassphraseOn = false
|
||||||
self.performSegue(withIdentifier: "savePGPKeySegue", sender: self)
|
self.performSegue(withIdentifier: "savePGPKeySegue", sender: self)
|
||||||
})
|
})
|
||||||
// yes
|
// yes
|
||||||
|
|
@ -53,7 +53,7 @@ class PGPKeySettingTableViewController: AutoCellHeightUITableViewController {
|
||||||
let alert = UIAlertController(title: "Passphrase".localize(), message: "FillInPgpPassphrase.".localize(), preferredStyle: UIAlertController.Style.alert)
|
let alert = UIAlertController(title: "Passphrase".localize(), message: "FillInPgpPassphrase.".localize(), preferredStyle: UIAlertController.Style.alert)
|
||||||
alert.addAction(UIAlertAction(title: "Ok".localize(), style: UIAlertAction.Style.default, handler: {_ in
|
alert.addAction(UIAlertAction(title: "Ok".localize(), style: UIAlertAction.Style.default, handler: {_ in
|
||||||
self.keychain.add(string: alert.textFields?.first?.text, for: Globals.pgpKeyPassphrase)
|
self.keychain.add(string: alert.textFields?.first?.text, for: Globals.pgpKeyPassphrase)
|
||||||
SharedDefaults[.isRememberPGPPassphraseOn] = true
|
Defaults.isRememberPGPPassphraseOn = true
|
||||||
self.performSegue(withIdentifier: "savePGPKeySegue", sender: self)
|
self.performSegue(withIdentifier: "savePGPKeySegue", sender: self)
|
||||||
}))
|
}))
|
||||||
alert.addTextField(configurationHandler: {(textField: UITextField!) in
|
alert.addTextField(configurationHandler: {(textField: UITextField!) in
|
||||||
|
|
|
||||||
|
|
@ -103,7 +103,7 @@ class PasswordDetailTableViewController: UITableViewController, UIGestureRecogni
|
||||||
self.present(alert, animated: true, completion: nil)
|
self.present(alert, animated: true, completion: nil)
|
||||||
}
|
}
|
||||||
let _ = sem.wait(timeout: DispatchTime.distantFuture)
|
let _ = sem.wait(timeout: DispatchTime.distantFuture)
|
||||||
if SharedDefaults[.isRememberPGPPassphraseOn] {
|
if Defaults.isRememberPGPPassphraseOn {
|
||||||
self.keychain.add(string: passphrase, for: Globals.pgpKeyPassphrase)
|
self.keychain.add(string: passphrase, for: Globals.pgpKeyPassphrase)
|
||||||
}
|
}
|
||||||
return passphrase
|
return passphrase
|
||||||
|
|
@ -144,7 +144,7 @@ class PasswordDetailTableViewController: UITableViewController, UIGestureRecogni
|
||||||
self?.setTableData()
|
self?.setTableData()
|
||||||
self?.tableView.reloadData()
|
self?.tableView.reloadData()
|
||||||
self?.editUIBarButtonItem.isEnabled = true
|
self?.editUIBarButtonItem.isEnabled = true
|
||||||
if !SharedDefaults[.isHidePasswordImagesOn] {
|
if !Defaults.isHidePasswordImagesOn {
|
||||||
if let urlString = self?.password?.urlString {
|
if let urlString = self?.password?.urlString {
|
||||||
if self?.passwordEntity?.getImage() == nil {
|
if self?.passwordEntity?.getImage() == nil {
|
||||||
self?.updatePasswordImage(urlString: urlString)
|
self?.updatePasswordImage(urlString: urlString)
|
||||||
|
|
@ -395,7 +395,7 @@ class PasswordDetailTableViewController: UITableViewController, UIGestureRecogni
|
||||||
switch(tableData[sectionIndex].type) {
|
switch(tableData[sectionIndex].type) {
|
||||||
case .name:
|
case .name:
|
||||||
let cell = tableView.dequeueReusableCell(withIdentifier: "passwordDetailTitleTableViewCell", for: indexPath) as! PasswordDetailTitleTableViewCell
|
let cell = tableView.dequeueReusableCell(withIdentifier: "passwordDetailTitleTableViewCell", for: indexPath) as! PasswordDetailTitleTableViewCell
|
||||||
if !SharedDefaults[.isHidePasswordImagesOn] {
|
if !Defaults.isHidePasswordImagesOn {
|
||||||
cell.labelCellConstraint.isActive = false
|
cell.labelCellConstraint.isActive = false
|
||||||
cell.labelImageConstraint.isActive = true
|
cell.labelImageConstraint.isActive = true
|
||||||
cell.passwordImageImageView.image = passwordImage ?? #imageLiteral(resourceName: "PasswordImagePlaceHolder")
|
cell.passwordImageImageView.image = passwordImage ?? #imageLiteral(resourceName: "PasswordImagePlaceHolder")
|
||||||
|
|
@ -438,8 +438,8 @@ class PasswordDetailTableViewController: UITableViewController, UIGestureRecogni
|
||||||
}
|
}
|
||||||
|
|
||||||
var numberOfHiddenFields = 0
|
var numberOfHiddenFields = 0
|
||||||
numberOfHiddenFields += SharedDefaults[.isHideUnknownOn] ? password!.numberOfUnknowns : 0
|
numberOfHiddenFields += Defaults.isHideUnknownOn ? password!.numberOfUnknowns : 0
|
||||||
numberOfHiddenFields += SharedDefaults[.isHideOTPOn] ? password!.numberOfOtpRelated : 0
|
numberOfHiddenFields += Defaults.isHideOTPOn ? password!.numberOfOtpRelated : 0
|
||||||
guard numberOfHiddenFields > 0 else {
|
guard numberOfHiddenFields > 0 else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -116,7 +116,7 @@ class PasswordEditorTableViewController: UITableViewController, FillPasswordTabl
|
||||||
return fillPasswordCell!
|
return fillPasswordCell!
|
||||||
case .passwordLengthCell:
|
case .passwordLengthCell:
|
||||||
passwordLengthCell = tableView.dequeueReusableCell(withIdentifier: "passwordLengthCell", for: indexPath) as? SliderTableViewCell
|
passwordLengthCell = tableView.dequeueReusableCell(withIdentifier: "passwordLengthCell", for: indexPath) as? SliderTableViewCell
|
||||||
let lengthSetting = PasswordGeneratorFlavour.from(SharedDefaults[.passwordGeneratorFlavor]).defaultLength
|
let lengthSetting = PasswordGeneratorFlavour.from(Defaults.passwordGeneratorFlavor).defaultLength
|
||||||
let minimumLength = lengthSetting.min
|
let minimumLength = lengthSetting.min
|
||||||
let maximumLength = lengthSetting.max
|
let maximumLength = lengthSetting.max
|
||||||
var defaultLength = lengthSetting.def
|
var defaultLength = lengthSetting.def
|
||||||
|
|
@ -215,7 +215,7 @@ class PasswordEditorTableViewController: UITableViewController, FillPasswordTabl
|
||||||
showPasswordSettings()
|
showPasswordSettings()
|
||||||
|
|
||||||
let length = passwordLengthCell?.roundedValue ?? 0
|
let length = passwordLengthCell?.roundedValue ?? 0
|
||||||
let plainPassword = PasswordGeneratorFlavour.from(SharedDefaults[.passwordGeneratorFlavor]).generatePassword(length: length)
|
let plainPassword = PasswordGeneratorFlavour.from(Defaults.passwordGeneratorFlavor).generatePassword(length: length)
|
||||||
|
|
||||||
// update tableData so to make sure reloadData() works correctly
|
// update tableData so to make sure reloadData() works correctly
|
||||||
tableData[passwordSection][0][PasswordEditorCellKey.content] = plainPassword
|
tableData[passwordSection][0][PasswordEditorCellKey.content] = plainPassword
|
||||||
|
|
|
||||||
|
|
@ -44,12 +44,12 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV
|
||||||
|
|
||||||
private var gitCredential: GitCredential {
|
private var gitCredential: GitCredential {
|
||||||
get {
|
get {
|
||||||
switch SharedDefaults[.gitAuthenticationMethod] {
|
switch Defaults.gitAuthenticationMethod {
|
||||||
case .password:
|
case .password:
|
||||||
return GitCredential(credential: .http(userName: SharedDefaults[.gitUsername]))
|
return GitCredential(credential: .http(userName: Defaults.gitUsername))
|
||||||
case .key:
|
case .key:
|
||||||
let privateKey: String = AppKeychain.shared.get(for: SshKey.PRIVATE.getKeychainKey()) ?? ""
|
let privateKey: String = AppKeychain.shared.get(for: SshKey.PRIVATE.getKeychainKey()) ?? ""
|
||||||
return GitCredential(credential: .ssh(userName: SharedDefaults[.gitUsername], privateKey: privateKey))
|
return GitCredential(credential: .ssh(userName: Defaults.gitUsername, privateKey: privateKey))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -135,7 +135,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV
|
||||||
filteredPasswordsTableEntries.removeAll()
|
filteredPasswordsTableEntries.removeAll()
|
||||||
var passwordEntities = [PasswordEntity]()
|
var passwordEntities = [PasswordEntity]()
|
||||||
var passwordAllEntities = [PasswordEntity]()
|
var passwordAllEntities = [PasswordEntity]()
|
||||||
if SharedDefaults[.isShowFolderOn] {
|
if Defaults.isShowFolderOn {
|
||||||
passwordEntities = self.passwordStore.fetchPasswordEntityCoreData(parent: parent)
|
passwordEntities = self.passwordStore.fetchPasswordEntityCoreData(parent: parent)
|
||||||
} else {
|
} else {
|
||||||
passwordEntities = self.passwordStore.fetchPasswordEntityCoreData(withDir: false)
|
passwordEntities = self.passwordStore.fetchPasswordEntityCoreData(withDir: false)
|
||||||
|
|
@ -230,7 +230,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV
|
||||||
override func viewDidAppear(_ animated: Bool) {
|
override func viewDidAppear(_ animated: Bool) {
|
||||||
super.viewDidAppear(animated)
|
super.viewDidAppear(animated)
|
||||||
|
|
||||||
if SharedDefaults[.isShowFolderOn] {
|
if Defaults.isShowFolderOn {
|
||||||
searchController.searchBar.scopeButtonTitles = SearchBarScope.allCases.map { $0.localizedName }
|
searchController.searchBar.scopeButtonTitles = SearchBarScope.allCases.map { $0.localizedName }
|
||||||
} else {
|
} else {
|
||||||
searchController.searchBar.scopeButtonTitles = nil
|
searchController.searchBar.scopeButtonTitles = nil
|
||||||
|
|
@ -396,7 +396,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func backAction(_ sender: Any?) {
|
@objc func backAction(_ sender: Any?) {
|
||||||
guard SharedDefaults[.isShowFolderOn] else { return }
|
guard Defaults.isShowFolderOn else { return }
|
||||||
var anim: CATransition? = transitionFromLeft
|
var anim: CATransition? = transitionFromLeft
|
||||||
if parentPasswordEntity == nil {
|
if parentPasswordEntity == nil {
|
||||||
anim = nil
|
anim = nil
|
||||||
|
|
@ -464,7 +464,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV
|
||||||
self.present(alert, animated: true, completion: nil)
|
self.present(alert, animated: true, completion: nil)
|
||||||
}
|
}
|
||||||
let _ = sem.wait(timeout: DispatchTime.distantFuture)
|
let _ = sem.wait(timeout: DispatchTime.distantFuture)
|
||||||
if SharedDefaults[.isRememberPGPPassphraseOn] {
|
if Defaults.isRememberPGPPassphraseOn {
|
||||||
self.keychain.add(string: passphrase, for: Globals.pgpKeyPassphrase)
|
self.keychain.add(string: passphrase, for: Globals.pgpKeyPassphrase)
|
||||||
}
|
}
|
||||||
return passphrase
|
return passphrase
|
||||||
|
|
@ -682,13 +682,13 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV
|
||||||
|
|
||||||
func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
|
func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
|
||||||
// update the default search scope
|
// update the default search scope
|
||||||
SharedDefaults[.searchDefault] = SearchBarScope(rawValue: selectedScope)
|
Defaults.searchDefault = SearchBarScope(rawValue: selectedScope)
|
||||||
updateSearchResults(for: searchController)
|
updateSearchResults(for: searchController)
|
||||||
}
|
}
|
||||||
|
|
||||||
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
|
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
|
||||||
// set the default search scope to "all"
|
// set the default search scope to "all"
|
||||||
if SharedDefaults[.isShowFolderOn] && SharedDefaults[.searchDefault] == .all {
|
if Defaults.isShowFolderOn && Defaults.searchDefault == .all {
|
||||||
searchController.searchBar.selectedScopeButtonIndex = SearchBarScope.all.rawValue
|
searchController.searchBar.selectedScopeButtonIndex = SearchBarScope.all.rawValue
|
||||||
} else {
|
} else {
|
||||||
searchController.searchBar.selectedScopeButtonIndex = SearchBarScope.current.rawValue
|
searchController.searchBar.selectedScopeButtonIndex = SearchBarScope.current.rawValue
|
||||||
|
|
|
||||||
|
|
@ -28,14 +28,14 @@ class SSHKeySettingTableViewController: AutoCellHeightUITableViewController {
|
||||||
do {
|
do {
|
||||||
try Data(contentsOf: privateKeyURL).write(to: URL(fileURLWithPath: SshKey.PRIVATE.getFileSharingPath()), options: .atomic)
|
try Data(contentsOf: privateKeyURL).write(to: URL(fileURLWithPath: SshKey.PRIVATE.getFileSharingPath()), options: .atomic)
|
||||||
try self.passwordStore.gitSSHKeyImportFromFileSharing()
|
try self.passwordStore.gitSSHKeyImportFromFileSharing()
|
||||||
SharedDefaults[.gitSSHKeySource] = .file
|
Defaults.gitSSHKeySource = .file
|
||||||
SharedDefaults[.gitAuthenticationMethod] = .key
|
Defaults.gitAuthenticationMethod = .key
|
||||||
SVProgressHUD.showSuccess(withStatus: "Imported".localize())
|
SVProgressHUD.showSuccess(withStatus: "Imported".localize())
|
||||||
SVProgressHUD.dismiss(withDelay: 1)
|
SVProgressHUD.dismiss(withDelay: 1)
|
||||||
} catch {
|
} catch {
|
||||||
Utils.alert(title: "Error".localize(), message: error.localizedDescription, controller: self, completion: nil)
|
Utils.alert(title: "Error".localize(), message: error.localizedDescription, controller: self, completion: nil)
|
||||||
}
|
}
|
||||||
SharedDefaults[.gitSSHKeySource] = .url
|
Defaults.gitSSHKeySource = .url
|
||||||
self.navigationController!.popViewController(animated: true)
|
self.navigationController!.popViewController(animated: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,17 +27,17 @@ class SettingsTableViewController: UITableViewController, UITabBarControllerDele
|
||||||
|
|
||||||
@IBAction func savePGPKey(segue: UIStoryboardSegue) {
|
@IBAction func savePGPKey(segue: UIStoryboardSegue) {
|
||||||
if let controller = segue.source as? PGPKeySettingTableViewController {
|
if let controller = segue.source as? PGPKeySettingTableViewController {
|
||||||
SharedDefaults[.pgpPrivateKeyURL] = URL(string: controller.pgpPrivateKeyURLTextField.text!.trimmed)
|
Defaults.pgpPrivateKeyURL = URL(string: controller.pgpPrivateKeyURLTextField.text!.trimmed)
|
||||||
SharedDefaults[.pgpPublicKeyURL] = URL(string: controller.pgpPublicKeyURLTextField.text!.trimmed)
|
Defaults.pgpPublicKeyURL = URL(string: controller.pgpPublicKeyURLTextField.text!.trimmed)
|
||||||
SharedDefaults[.pgpKeySource] = "url"
|
Defaults.pgpKeySource = "url"
|
||||||
|
|
||||||
SVProgressHUD.setDefaultMaskType(.black)
|
SVProgressHUD.setDefaultMaskType(.black)
|
||||||
SVProgressHUD.setDefaultStyle(.light)
|
SVProgressHUD.setDefaultStyle(.light)
|
||||||
SVProgressHUD.show(withStatus: "FetchingPgpKey".localize())
|
SVProgressHUD.show(withStatus: "FetchingPgpKey".localize())
|
||||||
DispatchQueue.global(qos: .userInitiated).async { [unowned self] in
|
DispatchQueue.global(qos: .userInitiated).async { [unowned self] in
|
||||||
do {
|
do {
|
||||||
try KeyFileManager.PublicPgp.importKey(from: SharedDefaults[.pgpPublicKeyURL]!)
|
try KeyFileManager.PublicPgp.importKey(from: Defaults.pgpPublicKeyURL!)
|
||||||
try KeyFileManager.PrivatePgp.importKey(from: SharedDefaults[.pgpPrivateKeyURL]!)
|
try KeyFileManager.PrivatePgp.importKey(from: Defaults.pgpPrivateKeyURL!)
|
||||||
try PGPAgent.shared.initKeys()
|
try PGPAgent.shared.initKeys()
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.setPGPKeyTableViewCellDetailText()
|
self.setPGPKeyTableViewCellDetailText()
|
||||||
|
|
@ -54,7 +54,7 @@ class SettingsTableViewController: UITableViewController, UITabBarControllerDele
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if let controller = segue.source as? PGPKeyArmorSettingTableViewController {
|
} else if let controller = segue.source as? PGPKeyArmorSettingTableViewController {
|
||||||
SharedDefaults[.pgpKeySource] = "armor"
|
Defaults.pgpKeySource = "armor"
|
||||||
|
|
||||||
SVProgressHUD.setDefaultMaskType(.black)
|
SVProgressHUD.setDefaultMaskType(.black)
|
||||||
SVProgressHUD.setDefaultStyle(.light)
|
SVProgressHUD.setDefaultStyle(.light)
|
||||||
|
|
@ -81,7 +81,7 @@ class SettingsTableViewController: UITableViewController, UITabBarControllerDele
|
||||||
|
|
||||||
private func saveImportedPGPKey() {
|
private func saveImportedPGPKey() {
|
||||||
// load keys
|
// load keys
|
||||||
SharedDefaults[.pgpKeySource] = "file"
|
Defaults.pgpKeySource = "file"
|
||||||
SVProgressHUD.setDefaultMaskType(.black)
|
SVProgressHUD.setDefaultMaskType(.black)
|
||||||
SVProgressHUD.setDefaultStyle(.light)
|
SVProgressHUD.setDefaultStyle(.light)
|
||||||
SVProgressHUD.show(withStatus: "FetchingPgpKey".localize())
|
SVProgressHUD.show(withStatus: "FetchingPgpKey".localize())
|
||||||
|
|
@ -105,7 +105,7 @@ class SettingsTableViewController: UITableViewController, UITabBarControllerDele
|
||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func saveGitServerSetting(segue: UIStoryboardSegue) {
|
@IBAction func saveGitServerSetting(segue: UIStoryboardSegue) {
|
||||||
self.passwordRepositoryTableViewCell.detailTextLabel?.text = SharedDefaults[.gitURL].host
|
self.passwordRepositoryTableViewCell.detailTextLabel?.text = Defaults.gitURL.host
|
||||||
}
|
}
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||||||
|
|
@ -115,7 +115,7 @@ class SettingsTableViewController: UITableViewController, UITabBarControllerDele
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
NotificationCenter.default.addObserver(self, selector: #selector(SettingsTableViewController.actOnPasswordStoreErasedNotification), name: .passwordStoreErased, object: nil)
|
NotificationCenter.default.addObserver(self, selector: #selector(SettingsTableViewController.actOnPasswordStoreErasedNotification), name: .passwordStoreErased, object: nil)
|
||||||
self.passwordRepositoryTableViewCell.detailTextLabel?.text = SharedDefaults[.gitURL].host
|
self.passwordRepositoryTableViewCell.detailTextLabel?.text = Defaults.gitURL.host
|
||||||
setPGPKeyTableViewCellDetailText()
|
setPGPKeyTableViewCellDetailText()
|
||||||
setPasscodeLockCell()
|
setPasscodeLockCell()
|
||||||
}
|
}
|
||||||
|
|
@ -140,7 +140,7 @@ class SettingsTableViewController: UITableViewController, UITabBarControllerDele
|
||||||
|
|
||||||
private func setPasswordRepositoryTableViewCellDetailText() {
|
private func setPasswordRepositoryTableViewCellDetailText() {
|
||||||
let host: String? = {
|
let host: String? = {
|
||||||
let gitURL = SharedDefaults[.gitURL]
|
let gitURL = Defaults.gitURL
|
||||||
if gitURL.scheme == nil {
|
if gitURL.scheme == nil {
|
||||||
return URL(string: "scheme://" + gitURL.absoluteString)?.host
|
return URL(string: "scheme://" + gitURL.absoluteString)?.host
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -186,11 +186,11 @@ class SettingsTableViewController: UITableViewController, UITabBarControllerDele
|
||||||
var armorActionTitle = "AsciiArmorEncryptedKey".localize()
|
var armorActionTitle = "AsciiArmorEncryptedKey".localize()
|
||||||
var fileActionTitle = "ITunesFileSharing".localize()
|
var fileActionTitle = "ITunesFileSharing".localize()
|
||||||
|
|
||||||
if SharedDefaults[.pgpKeySource] == "url" {
|
if Defaults.pgpKeySource == "url" {
|
||||||
urlActionTitle = "✓ \(urlActionTitle)"
|
urlActionTitle = "✓ \(urlActionTitle)"
|
||||||
} else if SharedDefaults[.pgpKeySource] == "armor" {
|
} else if Defaults.pgpKeySource == "armor" {
|
||||||
armorActionTitle = "✓ \(armorActionTitle)"
|
armorActionTitle = "✓ \(armorActionTitle)"
|
||||||
} else if SharedDefaults[.pgpKeySource] == "file" {
|
} else if Defaults.pgpKeySource == "file" {
|
||||||
fileActionTitle = "✓ \(fileActionTitle)"
|
fileActionTitle = "✓ \(fileActionTitle)"
|
||||||
}
|
}
|
||||||
let urlAction = UIAlertAction(title: urlActionTitle, style: .default) { _ in
|
let urlAction = UIAlertAction(title: urlActionTitle, style: .default) { _ in
|
||||||
|
|
@ -211,7 +211,7 @@ class SettingsTableViewController: UITableViewController, UITabBarControllerDele
|
||||||
// no
|
// no
|
||||||
savePassphraseAlert.addAction(UIAlertAction(title: "No".localize(), style: UIAlertAction.Style.default) { _ in
|
savePassphraseAlert.addAction(UIAlertAction(title: "No".localize(), style: UIAlertAction.Style.default) { _ in
|
||||||
self.keychain.removeContent(for: Globals.pgpKeyPassphrase)
|
self.keychain.removeContent(for: Globals.pgpKeyPassphrase)
|
||||||
SharedDefaults[.isRememberPGPPassphraseOn] = false
|
Defaults.isRememberPGPPassphraseOn = false
|
||||||
self.saveImportedPGPKey()
|
self.saveImportedPGPKey()
|
||||||
})
|
})
|
||||||
// yes
|
// yes
|
||||||
|
|
@ -220,7 +220,7 @@ class SettingsTableViewController: UITableViewController, UITabBarControllerDele
|
||||||
let alert = UIAlertController(title: "Passphrase".localize(), message: "FillInPgpPassphrase.".localize(), preferredStyle: UIAlertController.Style.alert)
|
let alert = UIAlertController(title: "Passphrase".localize(), message: "FillInPgpPassphrase.".localize(), preferredStyle: UIAlertController.Style.alert)
|
||||||
alert.addAction(UIAlertAction(title: "Ok".localize(), style: UIAlertAction.Style.default, handler: {_ in
|
alert.addAction(UIAlertAction(title: "Ok".localize(), style: UIAlertAction.Style.default, handler: {_ in
|
||||||
self.keychain.add(string: alert.textFields?.first?.text, for: Globals.pgpKeyPassphrase)
|
self.keychain.add(string: alert.textFields?.first?.text, for: Globals.pgpKeyPassphrase)
|
||||||
SharedDefaults[.isRememberPGPPassphraseOn] = true
|
Defaults.isRememberPGPPassphraseOn = true
|
||||||
self.saveImportedPGPKey()
|
self.saveImportedPGPKey()
|
||||||
}))
|
}))
|
||||||
alert.addTextField(configurationHandler: {(textField: UITextField!) in
|
alert.addTextField(configurationHandler: {(textField: UITextField!) in
|
||||||
|
|
@ -243,7 +243,7 @@ class SettingsTableViewController: UITableViewController, UITabBarControllerDele
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if SharedDefaults[.pgpKeySource] != nil {
|
if Defaults.pgpKeySource != nil {
|
||||||
let deleteAction = UIAlertAction(title: "RemovePgpKeys".localize(), style: .destructive) { _ in
|
let deleteAction = UIAlertAction(title: "RemovePgpKeys".localize(), style: .destructive) { _ in
|
||||||
self.keychain.removeContent(for: PgpKey.PUBLIC.getKeychainKey())
|
self.keychain.removeContent(for: PgpKey.PUBLIC.getKeychainKey())
|
||||||
self.keychain.removeContent(for: PgpKey.PRIVATE.getKeychainKey())
|
self.keychain.removeContent(for: PgpKey.PRIVATE.getKeychainKey())
|
||||||
|
|
|
||||||
|
|
@ -198,7 +198,7 @@ class CredentialProviderViewController: ASCredentialProviderViewController, UITa
|
||||||
self.present(alert, animated: true, completion: nil)
|
self.present(alert, animated: true, completion: nil)
|
||||||
}
|
}
|
||||||
let _ = sem.wait(timeout: DispatchTime.distantFuture)
|
let _ = sem.wait(timeout: DispatchTime.distantFuture)
|
||||||
if SharedDefaults[.isRememberPGPPassphraseOn] {
|
if Defaults.isRememberPGPPassphraseOn {
|
||||||
self.keychain.add(string: passphrase, for: Globals.pgpKeyPassphrase)
|
self.keychain.add(string: passphrase, for: Globals.pgpKeyPassphrase)
|
||||||
}
|
}
|
||||||
return passphrase
|
return passphrase
|
||||||
|
|
|
||||||
|
|
@ -225,7 +225,7 @@ class ExtensionViewController: UIViewController, UITableViewDataSource, UITableV
|
||||||
self.present(alert, animated: true, completion: nil)
|
self.present(alert, animated: true, completion: nil)
|
||||||
}
|
}
|
||||||
let _ = sem.wait(timeout: DispatchTime.distantFuture)
|
let _ = sem.wait(timeout: DispatchTime.distantFuture)
|
||||||
if SharedDefaults[.isRememberPGPPassphraseOn] {
|
if Defaults.isRememberPGPPassphraseOn {
|
||||||
self.keychain.add(string: passphrase, for: Globals.pgpKeyPassphrase)
|
self.keychain.add(string: passphrase, for: Globals.pgpKeyPassphrase)
|
||||||
}
|
}
|
||||||
return passphrase
|
return passphrase
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ struct GopenPgp: PgpInterface {
|
||||||
|
|
||||||
func encrypt(plainData: Data) throws -> Data {
|
func encrypt(plainData: Data) throws -> Data {
|
||||||
let encryptedData = try publicKey.encrypt(CryptoNewPlainMessage(plainData.mutable as Data), privateKey: nil)
|
let encryptedData = try publicKey.encrypt(CryptoNewPlainMessage(plainData.mutable as Data), privateKey: nil)
|
||||||
if SharedDefaults[.encryptInArmored] {
|
if Defaults.encryptInArmored {
|
||||||
var error: NSError?
|
var error: NSError?
|
||||||
let armor = encryptedData.getArmored(&error)
|
let armor = encryptedData.getArmored(&error)
|
||||||
guard error == nil else {
|
guard error == nil else {
|
||||||
|
|
@ -66,7 +66,7 @@ struct GopenPgp: PgpInterface {
|
||||||
|
|
||||||
private func createPgpMessage(from encryptedData: Data) -> CryptoPGPMessage? {
|
private func createPgpMessage(from encryptedData: Data) -> CryptoPGPMessage? {
|
||||||
// Important note:
|
// Important note:
|
||||||
// Even if SharedDefaults[.encryptInArmored] is true now, it could be different during the encryption.
|
// Even if Defaults.encryptInArmored is true now, it could be different during the encryption.
|
||||||
var error: NSError?
|
var error: NSError?
|
||||||
let message = CryptoNewPGPMessageFromArmored(String(data: encryptedData, encoding: .ascii), &error)
|
let message = CryptoNewPGPMessageFromArmored(String(data: encryptedData, encoding: .ascii), &error)
|
||||||
if error == nil {
|
if error == nil {
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ struct ObjectivePgp: PgpInterface {
|
||||||
|
|
||||||
func encrypt(plainData: Data) throws -> Data {
|
func encrypt(plainData: Data) throws -> Data {
|
||||||
let encryptedData = try ObjectivePGP.encrypt(plainData, addSignature: false, using: keyring.keys, passphraseForKey: nil)
|
let encryptedData = try ObjectivePGP.encrypt(plainData, addSignature: false, using: keyring.keys, passphraseForKey: nil)
|
||||||
if SharedDefaults[.encryptInArmored] {
|
if Defaults.encryptInArmored {
|
||||||
return Armor.armored(encryptedData, as: .message).data(using: .ascii)!
|
return Armor.armored(encryptedData, as: .message).data(using: .ascii)!
|
||||||
}
|
}
|
||||||
return encryptedData
|
return encryptedData
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
import Foundation
|
import Foundation
|
||||||
import SwiftyUserDefaults
|
import SwiftyUserDefaults
|
||||||
|
|
||||||
public var SharedDefaults = UserDefaults(suiteName: Globals.groupIdentifier)!
|
public var Defaults = DefaultsAdapter(defaults: UserDefaults(suiteName: Globals.groupIdentifier)!, keyStore: DefaultsKeys())
|
||||||
|
|
||||||
public enum GitAuthenticationMethod: String, DefaultsSerializable {
|
public enum GitAuthenticationMethod: String, DefaultsSerializable {
|
||||||
case password, key
|
case password, key
|
||||||
|
|
@ -20,37 +20,37 @@ public enum GitSSHKeySource: String, DefaultsSerializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension DefaultsKeys {
|
public extension DefaultsKeys {
|
||||||
static let pgpKeySource = DefaultsKey<String?>("pgpKeySource")
|
var pgpKeySource: DefaultsKey<String?> { .init("pgpKeySource") }
|
||||||
static let pgpPublicKeyURL = DefaultsKey<URL?>("pgpPublicKeyURL")
|
var pgpPublicKeyURL: DefaultsKey<URL?> { .init("pgpPublicKeyURL") }
|
||||||
static let pgpPrivateKeyURL = DefaultsKey<URL?>("pgpPrivateKeyURL")
|
var pgpPrivateKeyURL: DefaultsKey<URL?> { .init("pgpPrivateKeyURL") }
|
||||||
|
|
||||||
// Keep them for legacy reasons.
|
// Keep them for legacy reasons.
|
||||||
static let pgpPublicKeyArmor = DefaultsKey<String?>("pgpPublicKeyArmor")
|
var pgpPublicKeyArmor: DefaultsKey<String?> { .init("pgpPublicKeyArmor") }
|
||||||
static let pgpPrivateKeyArmor = DefaultsKey<String?>("pgpPrivateKeyArmor")
|
var pgpPrivateKeyArmor: DefaultsKey<String?> { .init("pgpPrivateKeyArmor") }
|
||||||
static let gitSSHPrivateKeyArmor = DefaultsKey<String?>("gitSSHPrivateKeyArmor")
|
var gitSSHPrivateKeyArmor: DefaultsKey<String?> { .init("gitSSHPrivateKeyArmor") }
|
||||||
static let passcodeKey = DefaultsKey<String?>("passcodeKey")
|
var passcodeKey: DefaultsKey<String?> { .init("passcodeKey") }
|
||||||
|
|
||||||
static let gitURL = DefaultsKey<URL>("gitURL", defaultValue: URL(string: "https://")!)
|
var gitURL: DefaultsKey<URL> { .init("gitURL", defaultValue: URL(string: "https://")!) }
|
||||||
static let gitAuthenticationMethod = DefaultsKey<GitAuthenticationMethod>("gitAuthenticationMethod", defaultValue: GitAuthenticationMethod.password)
|
var gitAuthenticationMethod: DefaultsKey<GitAuthenticationMethod> { .init("gitAuthenticationMethod", defaultValue: GitAuthenticationMethod.password) }
|
||||||
static let gitUsername = DefaultsKey<String>("gitUsername", defaultValue: "git")
|
var gitUsername: DefaultsKey<String> { .init("gitUsername", defaultValue: "git") }
|
||||||
static let gitBranchName = DefaultsKey<String>("gitBranchName", defaultValue: "master")
|
var gitBranchName: DefaultsKey<String> { .init("gitBranchName", defaultValue: "master") }
|
||||||
static let gitSSHPrivateKeyURL = DefaultsKey<URL?>("gitSSHPrivateKeyURL")
|
var gitSSHPrivateKeyURL: DefaultsKey<URL?> { .init("gitSSHPrivateKeyURL") }
|
||||||
static let gitSSHKeySource = DefaultsKey<GitSSHKeySource?>("gitSSHKeySource")
|
var gitSSHKeySource: DefaultsKey<GitSSHKeySource?> { .init("gitSSHKeySource") }
|
||||||
static let gitSignatureName = DefaultsKey<String?>("gitSignatureName")
|
var gitSignatureName: DefaultsKey<String?> { .init("gitSignatureName") }
|
||||||
static let gitSignatureEmail = DefaultsKey<String?>("gitSignatureEmail")
|
var gitSignatureEmail: DefaultsKey<String?> { .init("gitSignatureEmail") }
|
||||||
|
|
||||||
static let lastSyncedTime = DefaultsKey<Date?>("lastSyncedTime")
|
var lastSyncedTime: DefaultsKey<Date?> { .init("lastSyncedTime") }
|
||||||
|
|
||||||
static let isTouchIDOn = DefaultsKey<Bool>("isTouchIDOn", defaultValue: false)
|
var isTouchIDOn: DefaultsKey<Bool> { .init("isTouchIDOn", defaultValue: false) }
|
||||||
|
|
||||||
static let isHideUnknownOn = DefaultsKey<Bool>("isHideUnknownOn", defaultValue: false)
|
var isHideUnknownOn: DefaultsKey<Bool> { .init("isHideUnknownOn", defaultValue: false) }
|
||||||
static let isHideOTPOn = DefaultsKey<Bool>("isHideOTPOn", defaultValue: false)
|
var isHideOTPOn: DefaultsKey<Bool> { .init("isHideOTPOn", defaultValue: false) }
|
||||||
static let isRememberPGPPassphraseOn = DefaultsKey<Bool>("isRememberPGPPassphraseOn", defaultValue: false)
|
var isRememberPGPPassphraseOn: DefaultsKey<Bool> { .init("isRememberPGPPassphraseOn", defaultValue: false) }
|
||||||
static let isRememberGitCredentialPassphraseOn = DefaultsKey<Bool>("isRememberGitCredentialPassphraseOn", defaultValue: false)
|
var isRememberGitCredentialPassphraseOn: DefaultsKey<Bool> { .init("isRememberGitCredentialPassphraseOn", defaultValue: false) }
|
||||||
static let isShowFolderOn = DefaultsKey<Bool>("isShowFolderOn", defaultValue: true)
|
var isShowFolderOn: DefaultsKey<Bool> { .init("isShowFolderOn", defaultValue: true) }
|
||||||
static let isHidePasswordImagesOn = DefaultsKey<Bool>("isHidePasswordImagesOn", defaultValue: false)
|
var isHidePasswordImagesOn: DefaultsKey<Bool> { .init("isHidePasswordImagesOn", defaultValue: false) }
|
||||||
static let searchDefault = DefaultsKey<SearchBarScope?>("searchDefault", defaultValue: .all)
|
var searchDefault: DefaultsKey<SearchBarScope?> { .init("searchDefault", defaultValue: .all) }
|
||||||
static let passwordGeneratorFlavor = DefaultsKey<String>("passwordGeneratorFlavor", defaultValue: "Apple")
|
var passwordGeneratorFlavor: DefaultsKey<String> { .init("passwordGeneratorFlavor", defaultValue: "Apple") }
|
||||||
|
|
||||||
static let encryptInArmored = DefaultsKey<Bool>("encryptInArmored", defaultValue: false)
|
var encryptInArmored: DefaultsKey<Bool> { .init("encryptInArmored", defaultValue: false) }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ public struct GitCredential {
|
||||||
var lastPassword = self.passwordStore.gitPassword
|
var lastPassword = self.passwordStore.gitPassword
|
||||||
if lastPassword == nil || attempts != 0 {
|
if lastPassword == nil || attempts != 0 {
|
||||||
if let requestedPassword = requestCredentialPassword(self.credential, lastPassword) {
|
if let requestedPassword = requestCredentialPassword(self.credential, lastPassword) {
|
||||||
if SharedDefaults[.isRememberGitCredentialPassphraseOn] {
|
if Defaults.isRememberGitCredentialPassphraseOn {
|
||||||
self.passwordStore.gitPassword = requestedPassword
|
self.passwordStore.gitPassword = requestedPassword
|
||||||
}
|
}
|
||||||
lastPassword = requestedPassword
|
lastPassword = requestedPassword
|
||||||
|
|
@ -54,7 +54,7 @@ public struct GitCredential {
|
||||||
var lastPassword = self.passwordStore.gitSSHPrivateKeyPassphrase
|
var lastPassword = self.passwordStore.gitSSHPrivateKeyPassphrase
|
||||||
if lastPassword == nil || attempts != 0 {
|
if lastPassword == nil || attempts != 0 {
|
||||||
if let requestedPassword = requestCredentialPassword(self.credential, lastPassword) {
|
if let requestedPassword = requestCredentialPassword(self.credential, lastPassword) {
|
||||||
if SharedDefaults[.isRememberGitCredentialPassphraseOn] {
|
if Defaults.isRememberGitCredentialPassphraseOn {
|
||||||
self.passwordStore.gitSSHPrivateKeyPassphrase = requestedPassword
|
self.passwordStore.gitSSHPrivateKeyPassphrase = requestedPassword
|
||||||
}
|
}
|
||||||
lastPassword = requestedPassword
|
lastPassword = requestedPassword
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,9 @@ public class PasscodeLock {
|
||||||
|
|
||||||
/// Constructor used to migrate passcode from SharedDefaults to Keychain
|
/// Constructor used to migrate passcode from SharedDefaults to Keychain
|
||||||
private init() {
|
private init() {
|
||||||
if let passcode = SharedDefaults[.passcodeKey] {
|
if let passcode = Defaults.passcodeKey {
|
||||||
save(passcode: passcode)
|
save(passcode: passcode)
|
||||||
SharedDefaults[.passcodeKey] = nil
|
Defaults.passcodeKey = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -124,8 +124,8 @@ public class Password {
|
||||||
return title != Constants.USERNAME_KEYWORD
|
return title != Constants.USERNAME_KEYWORD
|
||||||
&& title != Constants.LOGIN_KEYWORD
|
&& title != Constants.LOGIN_KEYWORD
|
||||||
&& title != Constants.PASSWORD_KEYWORD
|
&& title != Constants.PASSWORD_KEYWORD
|
||||||
&& (!Constants.isUnknown(title) || !SharedDefaults[.isHideUnknownOn])
|
&& (!Constants.isUnknown(title) || !Defaults.isHideUnknownOn)
|
||||||
&& (!Constants.isOtpKeyword(title) || !SharedDefaults[.isHideOTPOn])
|
&& (!Constants.isOtpKeyword(title) || !Defaults.isHideOTPOn)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,8 +29,8 @@ public class PasswordStore {
|
||||||
|
|
||||||
public var gitSignatureForNow: GTSignature? {
|
public var gitSignatureForNow: GTSignature? {
|
||||||
get {
|
get {
|
||||||
let gitSignatureName = SharedDefaults[.gitSignatureName] ?? Globals.gitSignatureDefaultName
|
let gitSignatureName = Defaults.gitSignatureName ?? Globals.gitSignatureDefaultName
|
||||||
let gitSignatureEmail = SharedDefaults[.gitSignatureEmail] ?? Globals.gitSignatureDefaultEmail
|
let gitSignatureEmail = Defaults.gitSignatureEmail ?? Globals.gitSignatureDefaultEmail
|
||||||
return GTSignature(name: gitSignatureName, email: gitSignatureEmail, time: Date())
|
return GTSignature(name: gitSignatureName, email: gitSignatureEmail, time: Date())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -94,7 +94,7 @@ public class PasswordStore {
|
||||||
}
|
}
|
||||||
|
|
||||||
public var lastSyncedTime: Date? {
|
public var lastSyncedTime: Date? {
|
||||||
return SharedDefaults[.lastSyncedTime]
|
return Defaults.lastSyncedTime
|
||||||
}
|
}
|
||||||
|
|
||||||
public var numberOfCommits: UInt? {
|
public var numberOfCommits: UInt? {
|
||||||
|
|
@ -119,9 +119,9 @@ public class PasswordStore {
|
||||||
try? KeyFileManager(keyType: PgpKey.PUBLIC, keyPath: Globals.pgpPublicKeyPath).importKeyFromFileSharing()
|
try? KeyFileManager(keyType: PgpKey.PUBLIC, keyPath: Globals.pgpPublicKeyPath).importKeyFromFileSharing()
|
||||||
try? KeyFileManager(keyType: PgpKey.PRIVATE, keyPath: Globals.pgpPrivateKeyPath).importKeyFromFileSharing()
|
try? KeyFileManager(keyType: PgpKey.PRIVATE, keyPath: Globals.pgpPrivateKeyPath).importKeyFromFileSharing()
|
||||||
try? KeyFileManager(keyType: SshKey.PRIVATE, keyPath: Globals.gitSSHPrivateKeyPath).importKeyFromFileSharing()
|
try? KeyFileManager(keyType: SshKey.PRIVATE, keyPath: Globals.gitSSHPrivateKeyPath).importKeyFromFileSharing()
|
||||||
SharedDefaults.remove(.pgpPublicKeyArmor)
|
Defaults.remove(\.pgpPublicKeyArmor)
|
||||||
SharedDefaults.remove(.pgpPrivateKeyArmor)
|
Defaults.remove(\.pgpPrivateKeyArmor)
|
||||||
SharedDefaults.remove(.gitSSHPrivateKeyArmor)
|
Defaults.remove(\.gitSSHPrivateKeyArmor)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func initGitSSHKey(with armorKey: String) throws {
|
public func initGitSSHKey(with armorKey: String) throws {
|
||||||
|
|
@ -197,14 +197,14 @@ public class PasswordStore {
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
credential.delete()
|
credential.delete()
|
||||||
SharedDefaults[.lastSyncedTime] = nil
|
Defaults.lastSyncedTime = nil
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.deleteCoreData(entityName: "PasswordEntity")
|
self.deleteCoreData(entityName: "PasswordEntity")
|
||||||
NotificationCenter.default.post(name: .passwordStoreUpdated, object: nil)
|
NotificationCenter.default.post(name: .passwordStoreUpdated, object: nil)
|
||||||
}
|
}
|
||||||
throw(error)
|
throw(error)
|
||||||
}
|
}
|
||||||
SharedDefaults[.lastSyncedTime] = Date()
|
Defaults.lastSyncedTime = Date()
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.updatePasswordEntityCoreData()
|
self.updatePasswordEntityCoreData()
|
||||||
NotificationCenter.default.post(name: .passwordStoreUpdated, object: nil)
|
NotificationCenter.default.post(name: .passwordStoreUpdated, object: nil)
|
||||||
|
|
@ -237,7 +237,7 @@ public class PasswordStore {
|
||||||
let options = [GTRepositoryRemoteOptionsCredentialProvider: credentialProvider]
|
let options = [GTRepositoryRemoteOptionsCredentialProvider: credentialProvider]
|
||||||
let remote = try GTRemote(name: "origin", in: storeRepository)
|
let remote = try GTRemote(name: "origin", in: storeRepository)
|
||||||
try storeRepository.pull(storeRepository.currentBranch(), from: remote, withOptions: options, progress: progressBlock)
|
try storeRepository.pull(storeRepository.currentBranch(), from: remote, withOptions: options, progress: progressBlock)
|
||||||
SharedDefaults[.lastSyncedTime] = Date()
|
Defaults.lastSyncedTime = Date()
|
||||||
self.setAllSynced()
|
self.setAllSynced()
|
||||||
self.updatePasswordEntityCoreData()
|
self.updatePasswordEntityCoreData()
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
|
|
@ -453,7 +453,7 @@ public class PasswordStore {
|
||||||
do {
|
do {
|
||||||
let credentialProvider = try credential.credentialProvider(requestCredentialPassword: requestCredentialPassword)
|
let credentialProvider = try credential.credentialProvider(requestCredentialPassword: requestCredentialPassword)
|
||||||
let options = [GTRepositoryRemoteOptionsCredentialProvider: credentialProvider]
|
let options = [GTRepositoryRemoteOptionsCredentialProvider: credentialProvider]
|
||||||
if let branch = try getLocalBranch(withName: SharedDefaults[.gitBranchName]) {
|
if let branch = try getLocalBranch(withName: Defaults.gitBranchName) {
|
||||||
let remote = try GTRemote(name: "origin", in: storeRepository)
|
let remote = try GTRemote(name: "origin", in: storeRepository)
|
||||||
try storeRepository.push(branch, to: remote, withOptions: options, progress: transferProgressBlock)
|
try storeRepository.push(branch, to: remote, withOptions: options, progress: transferProgressBlock)
|
||||||
}
|
}
|
||||||
|
|
@ -620,7 +620,7 @@ public class PasswordStore {
|
||||||
deleteCoreData(entityName: "PasswordEntity")
|
deleteCoreData(entityName: "PasswordEntity")
|
||||||
|
|
||||||
// Delete default settings.
|
// Delete default settings.
|
||||||
SharedDefaults.removeAll()
|
Defaults.removeAll()
|
||||||
|
|
||||||
// Clean up variables inside PasswordStore.
|
// Clean up variables inside PasswordStore.
|
||||||
storeRepository = nil
|
storeRepository = nil
|
||||||
|
|
@ -666,7 +666,7 @@ public class PasswordStore {
|
||||||
throw AppError.RepositoryNotSet
|
throw AppError.RepositoryNotSet
|
||||||
}
|
}
|
||||||
// get the remote branch
|
// get the remote branch
|
||||||
let remoteBranchName = SharedDefaults[.gitBranchName]
|
let remoteBranchName = Defaults.gitBranchName
|
||||||
guard let remoteBranch = try storeRepository.remoteBranches().first(where: { $0.shortName == remoteBranchName }) else {
|
guard let remoteBranch = try storeRepository.remoteBranches().first(where: { $0.shortName == remoteBranchName }) else {
|
||||||
throw AppError.RepositoryRemoteBranchNotFound(remoteBranchName)
|
throw AppError.RepositoryRemoteBranchNotFound(remoteBranchName)
|
||||||
}
|
}
|
||||||
|
|
@ -696,9 +696,9 @@ public class PasswordStore {
|
||||||
|
|
||||||
public func removeGitSSHKeys() {
|
public func removeGitSSHKeys() {
|
||||||
try? fm.removeItem(atPath: Globals.gitSSHPrivateKeyPath)
|
try? fm.removeItem(atPath: Globals.gitSSHPrivateKeyPath)
|
||||||
Defaults.remove(.gitSSHKeySource)
|
Defaults.remove(\.gitSSHKeySource)
|
||||||
Defaults.remove(.gitSSHPrivateKeyArmor)
|
Defaults.remove(\.gitSSHPrivateKeyArmor)
|
||||||
Defaults.remove(.gitSSHPrivateKeyURL)
|
Defaults.remove(\.gitSSHPrivateKeyURL)
|
||||||
AppKeychain.shared.removeContent(for: SshKey.PRIVATE.getKeychainKey())
|
AppKeychain.shared.removeContent(for: SshKey.PRIVATE.getKeychainKey())
|
||||||
gitSSHPrivateKeyPassphrase = nil
|
gitSSHPrivateKeyPassphrase = nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,6 @@ import SwiftyUserDefaults
|
||||||
@testable import passKit
|
@testable import passKit
|
||||||
|
|
||||||
class PGPAgentTest: XCTestCase {
|
class PGPAgentTest: XCTestCase {
|
||||||
enum ValidationError: Error {
|
|
||||||
case emptyName
|
|
||||||
}
|
|
||||||
private var keychain: KeyStore!
|
private var keychain: KeyStore!
|
||||||
private var pgpAgent: PGPAgent!
|
private var pgpAgent: PGPAgent!
|
||||||
|
|
||||||
|
|
@ -25,7 +22,7 @@ class PGPAgentTest: XCTestCase {
|
||||||
keychain = DictBasedKeychain()
|
keychain = DictBasedKeychain()
|
||||||
pgpAgent = PGPAgent(keyStore: keychain)
|
pgpAgent = PGPAgent(keyStore: keychain)
|
||||||
UserDefaults().removePersistentDomain(forName: "SharedDefaultsForPGPAgentTest")
|
UserDefaults().removePersistentDomain(forName: "SharedDefaultsForPGPAgentTest")
|
||||||
SharedDefaults = UserDefaults(suiteName: "SharedDefaultsForPGPAgentTest")!
|
passKit.Defaults = DefaultsAdapter(defaults: UserDefaults(suiteName: "SharedDefaultsForPGPAgentTest")!, keyStore: DefaultsKeys())
|
||||||
}
|
}
|
||||||
|
|
||||||
override func tearDown() {
|
override func tearDown() {
|
||||||
|
|
@ -35,9 +32,9 @@ class PGPAgentTest: XCTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
func basicEncryptDecrypt(using pgpAgent: PGPAgent, requestPassphrase: () -> String = requestPGPKeyPassphrase, encryptInArmored: Bool = true, encryptInArmoredNow: Bool = true) throws -> Data? {
|
func basicEncryptDecrypt(using pgpAgent: PGPAgent, requestPassphrase: () -> String = requestPGPKeyPassphrase, encryptInArmored: Bool = true, encryptInArmoredNow: Bool = true) throws -> Data? {
|
||||||
SharedDefaults[.encryptInArmored] = encryptInArmored
|
passKit.Defaults.encryptInArmored = encryptInArmored
|
||||||
let encryptedData = try pgpAgent.encrypt(plainData: testData)
|
let encryptedData = try pgpAgent.encrypt(plainData: testData)
|
||||||
SharedDefaults[.encryptInArmored] = encryptInArmoredNow
|
passKit.Defaults.encryptInArmored = encryptInArmoredNow
|
||||||
return try pgpAgent.decrypt(encryptedData: encryptedData, requestPGPKeyPassphrase: requestPassphrase)
|
return try pgpAgent.decrypt(encryptedData: encryptedData, requestPGPKeyPassphrase: requestPassphrase)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue