aboutsummaryrefslogtreecommitdiff
path: root/lib/ssh.c
diff options
context:
space:
mode:
authorArmel Asselin <armelasselin@hotmail.com>2012-04-01 20:22:37 +0200
committerDaniel Stenberg <daniel@haxx.se>2012-04-01 20:22:37 +0200
commit05a443adf2d607a53a943d6f1df33cd765061c4e (patch)
tree3553c2f71251fa01214514f50f95a066d958bfd1 /lib/ssh.c
parentebf315e6f399ec534dbce4741d0463c28ae858e3 (diff)
SSH: public key can now be an empty string
If an empty string is passed to CURLOPT_SSH_PUBLIC_KEYFILE, libcurl will pass no public key to libssh2 which then tries to compute it from the private key. This is known to work when libssh2 1.4.0+ is linked against OpenSSL.
Diffstat (limited to 'lib/ssh.c')
-rw-r--r--lib/ssh.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/lib/ssh.c b/lib/ssh.c
index ad251f2e0..90c8013c2 100644
--- a/lib/ssh.c
+++ b/lib/ssh.c
@@ -770,6 +770,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
if((data->set.ssh_auth_types & CURLSSH_AUTH_PUBLICKEY) &&
(strstr(sshc->authlist, "publickey") != NULL)) {
char *home = NULL;
+ bool rsa_pub_empty_but_ok = FALSE;
sshc->rsa_pub = sshc->rsa = NULL;
@@ -777,7 +778,10 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
HOME environment variable etc? */
home = curl_getenv("HOME");
- if(data->set.str[STRING_SSH_PUBLIC_KEY])
+ if(data->set.str[STRING_SSH_PUBLIC_KEY] &&
+ !*data->set.str[STRING_SSH_PUBLIC_KEY])
+ rsa_pub_empty_but_ok = true;
+ else if(data->set.str[STRING_SSH_PUBLIC_KEY])
sshc->rsa_pub = aprintf("%s", data->set.str[STRING_SSH_PUBLIC_KEY]);
else if(home)
sshc->rsa_pub = aprintf("%s/.ssh/id_dsa.pub", home);
@@ -785,7 +789,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
/* as a final resort, try current dir! */
sshc->rsa_pub = strdup("id_dsa.pub");
- if(sshc->rsa_pub == NULL) {
+ if(!rsa_pub_empty_but_ok && (sshc->rsa_pub == NULL)) {
Curl_safefree(home);
state(conn, SSH_SESSION_FREE);
sshc->actualcode = CURLE_OUT_OF_MEMORY;