diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-04-30 14:51:53 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-04-30 14:51:53 +0000 |
commit | 2ed97906e3942ae4271a950a7a3c17839ebf7438 (patch) | |
tree | 1f3f4bbb592bd086c97776dbb373db76d4b10ee8 /libssh/auth.c | |
parent | deb9d30f4d124f82491225508a8699b0aad1375b (diff) | |
download | libssh-2ed97906e3942ae4271a950a7a3c17839ebf7438.tar.gz libssh-2ed97906e3942ae4271a950a7a3c17839ebf7438.tar.xz libssh-2ed97906e3942ae4271a950a7a3c17839ebf7438.zip |
Improve ssh_userauth_agent_pubkey().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@668 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/auth.c')
-rw-r--r-- | libssh/auth.c | 86 |
1 files changed, 44 insertions, 42 deletions
diff --git a/libssh/auth.c b/libssh/auth.c index 988bd305..29f66484 100644 --- a/libssh/auth.c +++ b/libssh/auth.c @@ -511,21 +511,28 @@ error: } #ifndef _WIN32 -/** \brief Try to authenticate through public key with ssh agent - * \param session ssh session - * \param username username to authenticate. You can specify NULL if - * ssh_option_set_username() has been used. You cannot try two different logins in a row. - * \param publickey the public key provided by the agent - * \returns SSH_AUTH_ERROR : a serious error happened\n - * SSH_AUTH_DENIED : Authentication failed : use another method\n - * SSH_AUTH_PARTIAL : You've been partially authenticated, you still have to use another method\n - * SSH_AUTH_SUCCESS : Authentication success - * \see publickey_from_file() - * \see privatekey_from_file() - * \see privatekey_free() - * \see ssh_userauth_offer_pubkey() +/** + * @brief Try to authenticate through public key with an ssh agent. + * + * @param session The ssh session to use. + * + * @param username The username to authenticate. You can specify NULL if + * ssh_option_set_username() has been used. You cannot try + * two different logins in a row. + * + * @param publickey The public key provided by the agent. + * + * @returns SSH_AUTH_ERROR: A serious error happened.\n + * SSH_AUTH_DENIED: Authentication failed: use another method.\n + * SSH_AUTH_PARTIAL: You've been partially authenticated, you still + * have to use another method.\n + * SSH_AUTH_SUCCESS: Authentication successful. + * + * @see publickey_from_file() + * @see privatekey_from_file() + * @see privatekey_free() + * @see ssh_userauth_offer_pubkey() */ - int ssh_userauth_agent_pubkey(SSH_SESSION *session, const char *username, PUBLIC_KEY *publickey) { STRING *user = NULL; @@ -537,29 +544,34 @@ int ssh_userauth_agent_pubkey(SSH_SESSION *session, const char *username, int rc = SSH_AUTH_ERROR; enter_function(); + if (! agent_is_running(session)) { return rc; } - if(username == NULL) { - if((username = session->options->username) == NULL) { - if (ssh_options_default_username(session->options)) { + if (username == NULL) { + if (session->options->username == NULL) { + if (ssh_options_default_username(session->options) < 0) { leave_function(); return rc; - } else { - username=session->options->username; } } + user = string_from_char(session->options->username); + } else { + user = string_from_char(username); } - if (ask_userauth(session)) { + + if (user == NULL) { leave_function(); return rc; } - user = string_from_char(username); - if (user == NULL) { - goto error; + if (ask_userauth(session) < 0) { + string_free(user); + leave_function(); + return rc; } + service = string_from_char("ssh-connection"); if (service == NULL) { goto error; @@ -578,25 +590,13 @@ int ssh_userauth_agent_pubkey(SSH_SESSION *session, const char *username, } /* we said previously the public key was accepted */ - if (buffer_add_u8(session->out_buffer, SSH2_MSG_USERAUTH_REQUEST) < 0) { - goto error; - } - if (buffer_add_ssh_string(session->out_buffer, user) < 0) { - goto error; - } - if (buffer_add_ssh_string(session->out_buffer, service) < 0) { - goto error; - } - if (buffer_add_ssh_string(session->out_buffer, method) < 0) { - goto error; - } - if (buffer_add_u8(session->out_buffer, 1) < 0) { - goto error; - } - if (buffer_add_ssh_string(session->out_buffer, algo) < 0) { - goto error; - } - if (buffer_add_ssh_string(session->out_buffer, key) < 0) { + if (buffer_add_u8(session->out_buffer, SSH2_MSG_USERAUTH_REQUEST) < 0 || + buffer_add_ssh_string(session->out_buffer, user) < 0 || + buffer_add_ssh_string(session->out_buffer, service) < 0 || + buffer_add_ssh_string(session->out_buffer, method) < 0 || + buffer_add_u8(session->out_buffer, 1) < 0 || + buffer_add_ssh_string(session->out_buffer, algo) < 0 || + buffer_add_ssh_string(session->out_buffer, key) < 0) { goto error; } @@ -613,11 +613,13 @@ int ssh_userauth_agent_pubkey(SSH_SESSION *session, const char *username, } rc = wait_auth_status(session,0); } + string_free(user); string_free(service); string_free(method); string_free(algo); string_free(key); + leave_function(); return rc; |