From 030cd274c2e09f7727016c5a75109159e20622a4 Mon Sep 17 00:00:00 2001 From: niknah Date: Mon, 4 Sep 2017 19:28:26 +1000 Subject: [PATCH] If we have a sftp key file in the environment/preferences, then don't attempt a password login to avoid bad login errors. --- src/duplicacy_storage.go | 11 ++++++++++- src/duplicacy_utils.go | 19 ++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/duplicacy_storage.go b/src/duplicacy_storage.go index 819462b..d0e3638 100644 --- a/src/duplicacy_storage.go +++ b/src/duplicacy_storage.go @@ -199,6 +199,7 @@ func CreateStorage(preference Preference, resetPassword bool, threads int) (stor if username != "" { username = username[:len(username) - 1] } + keyFile := GetPasswordFromPreference(preference, "ssh_key_file") password := "" passwordCallback := func() (string, error) { @@ -219,7 +220,6 @@ func CreateStorage(preference Preference, resetPassword bool, threads int) (stor } } - keyFile := "" publicKeysCallback := func() ([]ssh.Signer, error) { LOG_DEBUG("SSH_PUBLICKEY", "Attempting public key authentication") @@ -273,10 +273,19 @@ func CreateStorage(preference Preference, resetPassword bool, threads int) (stor } authMethods := [] ssh.AuthMethod { + } + passwordAuthMethods := [] ssh.AuthMethod { ssh.PasswordCallback(passwordCallback), ssh.KeyboardInteractive(keyboardInteractive), + } + keyFileAuthMethods := [] ssh.AuthMethod { ssh.PublicKeysCallback(publicKeysCallback), } + if keyFile!="" { + authMethods = append(keyFileAuthMethods,passwordAuthMethods...) + } else { + authMethods = append(passwordAuthMethods,keyFileAuthMethods...) + } if RunInBackground { diff --git a/src/duplicacy_utils.go b/src/duplicacy_utils.go index feda7ac..757a756 100644 --- a/src/duplicacy_utils.go +++ b/src/duplicacy_utils.go @@ -118,10 +118,8 @@ func GenerateKeyFromPassword(password string) []byte { return pbkdf2.Key([]byte(password), DEFAULT_KEY, 16384, 32, sha256.New) } -// GetPassword attempts to get the password from KeyChain/KeyRing, environment variables, or keyboard input. -func GetPassword(preference Preference, passwordType string, prompt string, - showPassword bool, resetPassword bool) (string) { - +// Get password from preference, env, but don't start any keyring request +func GetPasswordFromPreference(preference Preference, passwordType string) (string) { passwordID := passwordType if preference.Name != "default" { passwordID = preference.Name + "_" + passwordID @@ -139,6 +137,17 @@ func GetPassword(preference Preference, passwordType string, prompt string, LOG_DEBUG("PASSWORD_KEYCHAIN", "Reading %s from preferences", passwordID) return preference.Keys[passwordID] } + return "" +} + +// GetPassword attempts to get the password from KeyChain/KeyRing, environment variables, or keyboard input. +func GetPassword(preference Preference, passwordType string, prompt string, + showPassword bool, resetPassword bool) (string) { + passwordID := passwordType + password := GetPasswordFromPreference(preference,passwordType) + if password != "" { + return password + } if resetPassword && !RunInBackground { keyringSet(passwordID, "") @@ -155,7 +164,7 @@ func GetPassword(preference Preference, passwordType string, prompt string, } - password := "" + password = "" fmt.Printf("%s", prompt) if showPassword { scanner := bufio.NewScanner(os.Stdin)