mirror of
https://github.com/gilbertchen/duplicacy
synced 2025-12-15 07:43:21 +00:00
Support ssh private key files encrypted by passphrases
This commit is contained in:
@@ -291,6 +291,7 @@ func CreateStorage(preference Preference, resetPassword bool, threads int) (stor
|
|||||||
|
|
||||||
// If ssh_key_file is set, skip password-based login
|
// If ssh_key_file is set, skip password-based login
|
||||||
keyFile := GetPasswordFromPreference(preference, "ssh_key_file")
|
keyFile := GetPasswordFromPreference(preference, "ssh_key_file")
|
||||||
|
passphrase := ""
|
||||||
|
|
||||||
password := ""
|
password := ""
|
||||||
passwordCallback := func() (string, error) {
|
passwordCallback := func() (string, error) {
|
||||||
@@ -348,10 +349,23 @@ func CreateStorage(preference Preference, resetPassword bool, threads int) (stor
|
|||||||
} else {
|
} else {
|
||||||
key, err = ssh.ParsePrivateKey(content)
|
key, err = ssh.ParsePrivateKey(content)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if strings.Contains(err.Error(), "cannot decode encrypted private keys") {
|
||||||
|
LOG_TRACE("SSH_PUBLICKEY", "The private key file is encrypted")
|
||||||
|
passphrase = GetPassword(preference, "ssh_passphrase", "Enter the passphrase to decrypt the private key file:", false, resetPassword)
|
||||||
|
if len(passphrase) == 0 {
|
||||||
|
LOG_INFO("SSH_PUBLICKEY", "No passphrase to descrypt the private key file %s", keyFile)
|
||||||
|
} else {
|
||||||
|
key, err = ssh.ParsePrivateKeyWithPassphrase(content, []byte(passphrase))
|
||||||
|
if err != nil {
|
||||||
|
LOG_INFO("SSH_PUBLICKEY", "Failed to parse the encrypted private key file %s: %v", keyFile, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
LOG_INFO("SSH_PUBLICKEY", "Failed to parse the private key file %s: %v", keyFile, err)
|
LOG_INFO("SSH_PUBLICKEY", "Failed to parse the private key file %s: %v", keyFile, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if key != nil {
|
if key != nil {
|
||||||
signers = append(signers, key)
|
signers = append(signers, key)
|
||||||
@@ -410,6 +424,9 @@ func CreateStorage(preference Preference, resetPassword bool, threads int) (stor
|
|||||||
|
|
||||||
if keyFile != "" {
|
if keyFile != "" {
|
||||||
SavePassword(preference, "ssh_key_file", keyFile)
|
SavePassword(preference, "ssh_key_file", keyFile)
|
||||||
|
if passphrase != "" {
|
||||||
|
SavePassword(preference, "ssh_passphrase", passphrase)
|
||||||
|
}
|
||||||
} else if password != "" {
|
} else if password != "" {
|
||||||
SavePassword(preference, "ssh_password", password)
|
SavePassword(preference, "ssh_password", password)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user