Store ssh key passphrase in Keychain

This commit is contained in:
Evgeny Morozov 2017-02-23 17:34:55 +03:00
parent 04ceeb87dc
commit de6183764b
4 changed files with 8 additions and 7 deletions

View file

@ -18,7 +18,7 @@ class SSHKeySettingTableViewController: UITableViewController {
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
passphraseTextField.text = Defaults[.gitRepositorySSHPrivateKeyPassphrase] passphraseTextField.text = Utils.getPasswordFromKeychain(name: "gitRepositorySSHPrivateKeyPassphrase")!
privateKeyURLTextField.text = Defaults[.gitRepositorySSHPrivateKeyURL]?.absoluteString privateKeyURLTextField.text = Defaults[.gitRepositorySSHPrivateKeyURL]?.absoluteString
publicKeyURLTextField.text = Defaults[.gitRepositorySSHPublicKeyURL]?.absoluteString publicKeyURLTextField.text = Defaults[.gitRepositorySSHPublicKeyURL]?.absoluteString
var doneBarButtonItem: UIBarButtonItem? var doneBarButtonItem: UIBarButtonItem?
@ -43,7 +43,7 @@ class SSHKeySettingTableViewController: UITableViewController {
Defaults[.gitRepositorySSHPublicKeyURL] = URL(string: publicKeyURLTextField.text!) Defaults[.gitRepositorySSHPublicKeyURL] = URL(string: publicKeyURLTextField.text!)
Defaults[.gitRepositorySSHPrivateKeyURL] = URL(string: privateKeyURLTextField.text!) Defaults[.gitRepositorySSHPrivateKeyURL] = URL(string: privateKeyURLTextField.text!)
Defaults[.gitRepositorySSHPrivateKeyPassphrase] = passphraseTextField.text! Utils.addPasswrodToKeychain(name: "gitRepositorySSHPrivateKeyPassphrase", password: passphraseTextField.text!)
do { do {
try Data(contentsOf: Defaults[.gitRepositorySSHPublicKeyURL]!).write(to: Globals.sshPublicKeyURL, options: .atomic) try Data(contentsOf: Defaults[.gitRepositorySSHPublicKeyURL]!).write(to: Globals.sshPublicKeyURL, options: .atomic)

View file

@ -116,7 +116,7 @@ class SettingsTableViewController: UITableViewController {
gitCredential = GitCredential( gitCredential = GitCredential(
credential: GitCredential.Credential.ssh( credential: GitCredential.Credential.ssh(
userName: username, userName: username,
password: Defaults[.gitRepositorySSHPrivateKeyPassphrase]!, password: Utils.getPasswordFromKeychain(name: "gitRepositorySSHPrivateKeyPassphrase")!,
publicKeyFile: Globals.sshPublicKeyURL, publicKeyFile: Globals.sshPublicKeyURL,
privateKeyFile: Globals.sshPrivateKeyURL, privateKeyFile: Globals.sshPrivateKeyURL,
passwordNotSetCallback: self.requestSshKeyPassword passwordNotSetCallback: self.requestSshKeyPassword

View file

@ -26,7 +26,7 @@ extension DefaultsKeys {
static let gitRepositoryPasswordAttempts = DefaultsKey<Int>("gitRepositoryPasswordAttempts") static let gitRepositoryPasswordAttempts = DefaultsKey<Int>("gitRepositoryPasswordAttempts")
static let gitRepositorySSHPublicKeyURL = DefaultsKey<URL?>("gitRepositorySSHPublicKeyURL") static let gitRepositorySSHPublicKeyURL = DefaultsKey<URL?>("gitRepositorySSHPublicKeyURL")
static let gitRepositorySSHPrivateKeyURL = DefaultsKey<URL?>("gitRepositorySSHPrivateKeyURL") static let gitRepositorySSHPrivateKeyURL = DefaultsKey<URL?>("gitRepositorySSHPrivateKeyURL")
static let gitRepositorySSHPrivateKeyPassphrase = DefaultsKey<String?>("gitRepositorySSHPrivateKeyPassphrase")
static let lastUpdatedTime = DefaultsKey<Date?>("lasteUpdatedTime") static let lastUpdatedTime = DefaultsKey<Date?>("lasteUpdatedTime")
static let isTouchIDOn = DefaultsKey<Bool>("isTouchIDOn") static let isTouchIDOn = DefaultsKey<Bool>("isTouchIDOn")

View file

@ -77,13 +77,14 @@ struct GitCredential {
newPassword = passwordNotSetCallback!() newPassword = passwordNotSetCallback!()
} }
// Save password for the future
Utils.addPasswrodToKeychain(name: "gitRepositorySSHPrivateKeyPassphrase", password: newPassword!)
// nil is expected in case of empty password // nil is expected in case of empty password
if newPassword == "" { if newPassword == "" {
newPassword = nil newPassword = nil
} }
// Save password for the future
Defaults[.gitRepositorySSHPrivateKeyPassphrase] = newPassword
credential = try? GTCredential(userName: userName, publicKeyURL: publicKeyFile, privateKeyURL: privateKeyFile, passphrase: newPassword) credential = try? GTCredential(userName: userName, publicKeyURL: publicKeyFile, privateKeyURL: privateKeyFile, passphrase: newPassword)
} }
@ -141,7 +142,7 @@ class PasswordStore {
gitCredential = GitCredential( gitCredential = GitCredential(
credential: GitCredential.Credential.ssh( credential: GitCredential.Credential.ssh(
userName: Defaults[.gitRepositoryUsername]!, userName: Defaults[.gitRepositoryUsername]!,
password: Defaults[.gitRepositorySSHPrivateKeyPassphrase]!, password: Utils.getPasswordFromKeychain(name: "gitRepositorySSHPrivateKeyPassphrase")!,
publicKeyFile: Globals.sshPublicKeyURL, publicKeyFile: Globals.sshPublicKeyURL,
privateKeyFile: Globals.sshPrivateKeyURL, privateKeyFile: Globals.sshPrivateKeyURL,
passwordNotSetCallback: nil passwordNotSetCallback: nil