diff options
author | Chris Engel <cjengel@us.ibm.com> | 2017-11-20 13:17:50 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-20 13:17:50 -0600 |
commit | 19fe5f4d6886d9ccc58c8c123cdcfd9a2f9beb68 (patch) | |
tree | a1fde451406babc707f5febe6536724bd2673321 | |
parent | 0f9cc90f16ec44a53dc9b390867357c1b73d49c6 (diff) | |
parent | 28a0e0cd238a2ef9383f6cbb37aced034aa92881 (diff) | |
download | sb-signing-framework-19fe5f4d6886d9ccc58c8c123cdcfd9a2f9beb68.tar.gz sb-signing-framework-19fe5f4d6886d9ccc58c8c123cdcfd9a2f9beb68.zip |
Support PW entry retries for encrypted sshkey for sf_client
-rw-r--r-- | src/client/pscp_sftp.c | 50 |
1 files changed, 44 insertions, 6 deletions
diff --git a/src/client/pscp_sftp.c b/src/client/pscp_sftp.c index 7a41945..de7a434 100644 --- a/src/client/pscp_sftp.c +++ b/src/client/pscp_sftp.c @@ -29,6 +29,7 @@ #define PSCP_PKEY_PASSPHRASE_MAX 256 #define PSCP_SFTP_MAX_POLLING_ATTEMPTS 10 #define PSCP_SFTP_POLLING_DURATION 5 +#define PSCP_SSHKEY_GETPW_MAX_RETRIES 2 struct pscp_sftp_session { @@ -106,14 +107,51 @@ struct pscp_sftp_session* startSftpSession(const char * sftp_url, const char * } if(status == CURLE_OK) { - char passphrase[PSCP_PKEY_PASSPHRASE_MAX]; - bzero(passphrase, PSCP_PKEY_PASSPHRASE_MAX); - status = GetPassword(passphrase, PSCP_PKEY_PASSPHRASE_MAX, verbose); - if(status == 0) - { + status = curl_easy_setopt(sftp->curl, CURLOPT_URL, sftp_url); + } + if(status == CURLE_OK) + { + status = curl_easy_setopt(sftp->curl, CURLOPT_CONNECT_ONLY, 1L); + } + if(status == CURLE_OK) + { + int retry = 0; + while(retry <= PSCP_SSHKEY_GETPW_MAX_RETRIES) { + + char passphrase[PSCP_PKEY_PASSPHRASE_MAX]; + bzero(passphrase, PSCP_PKEY_PASSPHRASE_MAX); + + status = GetPassword(passphrase, PSCP_PKEY_PASSPHRASE_MAX, verbose); + if(status != 0) + { + fprintf(stderr, "ERROR: unable to get password, error: %d\n", status); + bzero(passphrase, PSCP_PKEY_PASSPHRASE_MAX); + break; + } status = curl_easy_setopt(sftp->curl, CURLOPT_KEYPASSWD, passphrase); + bzero(passphrase, PSCP_PKEY_PASSPHRASE_MAX); + if(status != CURLE_OK) + { + fprintf(stderr, "ERROR: unable to set CURLOPT_KEYPASSWD, curl error: %d\n", status); + break; + } + status = curl_easy_perform(sftp->curl); + if(status == 0) + { + status = curl_easy_setopt(sftp->curl, CURLOPT_CONNECT_ONLY, 0L); + break; + } + if(status != CURLE_LOGIN_DENIED) + { + fprintf(stderr, "ERROR: unable to establish session with %s\n", sftp->url); + break; + } + retry++; + } + if(status == CURLE_LOGIN_DENIED) + { + fprintf(stderr, "ERROR: unable to connect to %s with provided credentials\n", sftp->url); } - bzero(passphrase, PSCP_PKEY_PASSPHRASE_MAX); } if(status != 0 && sftp) |