Check cloned repository for .gpg-id file (#523)

* Extract method
* Separate deletion of store data from general data erasure
* Check cloned repository for .gpg-id file
This commit is contained in:
Danny Moesch 2021-12-28 02:38:33 +01:00 committed by GitHub
parent 08ce198334
commit b62c5fa2e5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 55 additions and 32 deletions

View file

@ -193,31 +193,23 @@ class GitRepositorySettingsTableViewController: UITableViewController, PasswordA
checkoutProgressBlock: checkoutProgressBlock
)
SVProgressHUD.dismiss {
let savePassphraseAlert: UIAlertController = {
let alert = UIAlertController(title: "Done".localize(), message: "WantToSaveGitCredential?".localize(), preferredStyle: .alert)
alert.addAction(
UIAlertAction(title: "No".localize(), style: .default) { _ in
Defaults.isRememberGitCredentialPassphraseOn = false
self.passwordStore.gitPassword = nil
self.passwordStore.gitSSHPrivateKeyPassphrase = nil
self.performSegue(withIdentifier: "saveGitServerSettingSegue", sender: self)
}
)
alert.addAction(
UIAlertAction(title: "Yes".localize(), style: .destructive) { _ in
Defaults.isRememberGitCredentialPassphraseOn = true
self.performSegue(withIdentifier: "saveGitServerSettingSegue", sender: self)
}
)
return alert
}()
DispatchQueue.main.async {
self.present(savePassphraseAlert, animated: true)
let gpgIdFile = self.passwordStore.storeURL.appendingPathComponent(".gpg-id").path
guard FileManager.default.fileExists(atPath: gpgIdFile) else {
self.passwordStore.eraseStoreData()
SVProgressHUD.dismiss {
DispatchQueue.main.async {
Utils.alert(title: "Error".localize(), message: "NoProperPassRepo.".localize(), controller: self)
}
}
return
}
SVProgressHUD.dismiss {
self.savePassphraseAndSegue()
}
} catch {
SVProgressHUD.dismiss {
self.passwordStore.eraseStoreData()
let error = error as NSError
var message = error.localizedDescription
if let underlyingError = error.userInfo[NSUnderlyingErrorKey] as? NSError {
@ -231,6 +223,31 @@ class GitRepositorySettingsTableViewController: UITableViewController, PasswordA
}
}
private func savePassphraseAndSegue() {
let savePassphraseAlert = UIAlertController(
title: "Done".localize(),
message: "WantToSaveGitCredential?".localize(),
preferredStyle: .alert
)
savePassphraseAlert.addAction(
UIAlertAction(title: "No".localize(), style: .default) { _ in
Defaults.isRememberGitCredentialPassphraseOn = false
self.passwordStore.gitPassword = nil
self.passwordStore.gitSSHPrivateKeyPassphrase = nil
self.performSegue(withIdentifier: "saveGitServerSettingSegue", sender: self)
}
)
savePassphraseAlert.addAction(
UIAlertAction(title: "Yes".localize(), style: .destructive) { _ in
Defaults.isRememberGitCredentialPassphraseOn = true
self.performSegue(withIdentifier: "saveGitServerSettingSegue", sender: self)
}
)
DispatchQueue.main.async {
self.present(savePassphraseAlert, animated: true)
}
}
@IBAction
private func importSSHKey(segue: UIStoryboardSegue) {
guard let sourceController = segue.source as? KeyImporter, sourceController.isReadyToUse() else {

View file

@ -41,6 +41,7 @@
"MakeSurePgpAndGitProperlySet." = "Stelle bitte sicher, dass die Einstellungen für GPG-Schlüssel und Git-Server richtig sind.";
"RecoverySuggestion." = "Das falsche Passwort wurde entfernt. Bitte probiere es erneut.";
"NSURLFileAllocatedSizeKeyShouldAlwaysReturnValue." = "Huh? NSURLFileAllocatedSizeKey sollte immer einen Wert liefern.";
"NoProperPassRepo." = "Das Repository enthält keine .gpg-id Datei. Es muss erst noch mit 'pass init' korrekt initialisiert werden, bevor es in die App geladen werden kann.";
// Settings
"PasswordGeneratorFlavor" = "Art";

View file

@ -41,6 +41,7 @@
"MakeSurePgpAndGitProperlySet." = "Please make sure PGP key and Git server are properly set.";
"RecoverySuggestion." = "Recovery suggestion: Wrong credential password/passphrase has been removed, please try again.";
"NSURLFileAllocatedSizeKeyShouldAlwaysReturnValue." = "Huh? NSURLFileAllocatedSizeKey should always return a value.";
"NoProperPassRepo." = "The repository does not contain a .gpg-id file. Please set it up properly by performing 'pass init'. Then try again to load it into the app.";
// Settings
"PasswordGeneratorFlavor" = "Style";

View file

@ -618,32 +618,36 @@ public class PasswordStore {
}
}
public func erase() {
public func eraseStoreData() {
// Delete files.
try? fileManager.removeItem(at: storeURL)
try? fileManager.removeItem(at: tempStoreURL)
// Delete PGP key, SSH key and other secrets from the keychain.
AppKeychain.shared.removeAllContent()
// Delete core data.
deleteCoreData(entityName: "PasswordEntity")
// Delete default settings.
Defaults.removeAll()
// Clean up variables inside PasswordStore.
storeRepository = nil
// Delete cache explicitly.
PasscodeLock.shared.delete()
PGPAgent.shared.uninitKeys()
// Broadcast.
NotificationCenter.default.post(name: .passwordStoreUpdated, object: nil)
NotificationCenter.default.post(name: .passwordStoreErased, object: nil)
}
public func erase() {
eraseStoreData()
// Delete PGP key, SSH key and other secrets from the keychain.
AppKeychain.shared.removeAllContent()
// Delete default settings.
Defaults.removeAll()
// Delete cache explicitly.
PasscodeLock.shared.delete()
PGPAgent.shared.uninitKeys()
}
// return the number of discarded commits
public func reset() throws -> Int {
guard let storeRepository = storeRepository else {