X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/6f34e365eed04c1b4ebcf6d90511dd9e4400880a..8c42f28c3cdeae6d882e5b8eff465ef6e6cc3d1a:/ssh.c diff --git a/ssh.c b/ssh.c index 3cfab606..4068aa72 100644 --- a/ssh.c +++ b/ssh.c @@ -2,7 +2,13 @@ #include #include #include +#ifndef AUTO_WINSOCK +#ifdef WINSOCK_TWO +#include +#else #include +#endif +#endif #include "putty.h" #include "tree234.h" @@ -1267,6 +1273,7 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt) while (pktin.type == SSH1_SMSG_FAILURE) { static char password[100]; + static char prompt[200]; static int pos; static char c; static int pwpkt_type; @@ -1379,10 +1386,71 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt) if (*cfg.keyfile && !tried_publickey) pwpkt_type = SSH1_CMSG_AUTH_RSA; - if (pwpkt_type == SSH1_CMSG_AUTH_PASSWORD && - !(flags & FLAG_INTERACTIVE)) { - char prompt[200]; - sprintf(prompt, "%s@%s's password: ", cfg.username, savedhost); + if (pktin.type == SSH1_SMSG_FAILURE && + cfg.try_tis_auth && + (supported_auths_mask & (1< sizeof(prompt)-1) + challengelen = sizeof(prompt)-1; /* prevent overrun */ + memcpy(prompt, pktin.body+4, challengelen); + prompt[challengelen] = '\0'; + } + } + if (pktin.type == SSH1_SMSG_FAILURE && + cfg.try_tis_auth && + (supported_auths_mask & (1< sizeof(prompt)-1) + challengelen = sizeof(prompt)-1; /* prevent overrun */ + memcpy(prompt, pktin.body+4, challengelen); + strncpy(prompt + challengelen, "\r\nResponse : ", + sizeof(prompt)-challengelen); + prompt[sizeof(prompt)-1] = '\0'; + } + } + if (pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) { + sprintf(prompt, "%.90s@%.90s's password: ", + cfg.username, savedhost); + } + if (pwpkt_type == SSH1_CMSG_AUTH_RSA) { + char *comment = NULL; + if (flags & FLAG_VERBOSE) + c_write("Trying public key authentication.\r\n", 35); + if (!rsakey_encrypted(cfg.keyfile, &comment)) { + if (flags & FLAG_VERBOSE) + c_write("No passphrase required.\r\n", 25); + goto tryauth; + } + sprintf(prompt, "Passphrase for key \"%.100s\": ", comment); + free(comment); + } + + if (!(flags & FLAG_INTERACTIVE)) { if (!ssh_get_password(prompt, password, sizeof(password))) { /* * get_password failed to get a password (for @@ -1395,59 +1463,7 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt) crReturn(1); } } else { - - if (pktin.type == SSH1_SMSG_FAILURE && - cfg.try_tis_auth && - (supported_auths_mask & (1<= 0) { @@ -1476,8 +1492,7 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt) } } c_write("\r\n", 2); - - } + } tryauth: if (pwpkt_type == SSH1_CMSG_AUTH_RSA) { @@ -1512,8 +1527,7 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt) crWaitUntil(ispkt); if (pktin.type == SSH1_SMSG_FAILURE) { - if (flags & FLAG_VERBOSE) - c_write("Server refused our public key.\r\n", 32); + c_write("Server refused our public key.\r\n", 32); continue; /* go and try password */ } if (pktin.type != SSH1_SMSG_AUTH_RSA_CHALLENGE) {