From edcfab905a072af918ff69f4dfc03e8e43d3001b Mon Sep 17 00:00:00 2001 From: Guenter Knauf <eflash@gmx.net> Date: Thu, 19 Jul 2007 15:25:46 +0000 Subject: [PATCH] added selection of authentication method based on what libssh2_userauth_list() returns; added vars for the key files. --- example/simple/ssh2.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/example/simple/ssh2.c b/example/simple/ssh2.c index 054c83a..de8f386 100644 --- a/example/simple/ssh2.c +++ b/example/simple/ssh2.c @@ -1,5 +1,5 @@ /* - * $Id: ssh2.c,v 1.8 2007/07/18 19:31:15 gknauf Exp $ + * $Id: ssh2.c,v 1.9 2007/07/19 15:25:46 gknauf Exp $ * * Sample showing how to do SSH2 connect. * @@ -38,7 +38,7 @@ int main(int argc, char *argv[]) { unsigned long hostaddr; - int sock, i, auth_pw = 1; + int sock, i, auth_pw = 0; struct sockaddr_in sin; const char *fingerprint; char *userauthlist; @@ -46,6 +46,8 @@ int main(int argc, char *argv[]) LIBSSH2_CHANNEL *channel; char *username=(char *)"username"; char *password=(char *)"password"; + char *keyfile1=(char *)"~/.ssh/id_rsa.pub"; + char *keyfile2=(char *)"~/.ssh/id_rsa"; #ifdef WIN32 WSADATA wsadata; @@ -101,13 +103,21 @@ int main(int argc, char *argv[]) } printf("\n"); -#ifdef TEST_AUTH_LIST + auth_pw = 0; /* check what authentication methods are available */ userauthlist = libssh2_userauth_list(session, username, sizeof(username)); printf("Authentication methods: %s\n", userauthlist); -#endif + if (strstr(userauthlist, "password") != NULL) { + auth_pw |= 1; + } + if (strstr(userauthlist, "publickey") != NULL) { + auth_pw |= 2; + } + if (strstr(userauthlist, "keyboard-interactive") != NULL) { + auth_pw |= 4; + } - if (auth_pw) { + if (auth_pw & 1) { /* We could authenticate via password */ if (libssh2_userauth_password(session, username, password)) { printf("Authentication by password failed.\n"); @@ -115,14 +125,17 @@ int main(int argc, char *argv[]) } else { printf("Authentication by password succeeded.\n"); } - } else { + } else if (auth_pw & 2) { /* Or by public key */ - if (libssh2_userauth_publickey_fromfile(session, username, "/home/username/.ssh/id_rsa.pub", "/home/username/.ssh/id_rsa", password)) { + if (libssh2_userauth_publickey_fromfile(session, username, keyfile1, keyfile2, password)) { printf("\tAuthentication by public key failed\n"); goto shutdown; } else { printf("Authentication by public key succeeded.\n"); } + } else { + printf("No supported authentication methods found!\n"); + goto shutdown; } /* Request a shell */