mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-25 09:12:24 +00:00
ssh_get_password has become ssh_get_line, so it can handle usernames
as well. This should fix the multiple-reads-on-stdin bug in plink. [originally from svn r994]
This commit is contained in:
parent
9ee21069b5
commit
55659a959f
17
plink.c
17
plink.c
@ -160,12 +160,12 @@ struct input_data {
|
|||||||
HANDLE event, eventback;
|
HANDLE event, eventback;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int get_password(const char *prompt, char *str, int maxlen)
|
static int get_line(const char *prompt, char *str, int maxlen, int is_pw)
|
||||||
{
|
{
|
||||||
HANDLE hin, hout;
|
HANDLE hin, hout;
|
||||||
DWORD savemode, i;
|
DWORD savemode, newmode, i;
|
||||||
|
|
||||||
if (password) {
|
if (is_pw && password) {
|
||||||
static int tried_once = 0;
|
static int tried_once = 0;
|
||||||
|
|
||||||
if (tried_once) {
|
if (tried_once) {
|
||||||
@ -186,8 +186,12 @@ static int get_password(const char *prompt, char *str, int maxlen)
|
|||||||
}
|
}
|
||||||
|
|
||||||
GetConsoleMode(hin, &savemode);
|
GetConsoleMode(hin, &savemode);
|
||||||
SetConsoleMode(hin, (savemode & (~ENABLE_ECHO_INPUT)) |
|
newmode = savemode | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT;
|
||||||
ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT);
|
if (is_pw)
|
||||||
|
newmode &= ~ENABLE_ECHO_INPUT;
|
||||||
|
else
|
||||||
|
newmode |= ENABLE_ECHO_INPUT;
|
||||||
|
SetConsoleMode(hin, newmode);
|
||||||
|
|
||||||
WriteFile(hout, prompt, strlen(prompt), &i, NULL);
|
WriteFile(hout, prompt, strlen(prompt), &i, NULL);
|
||||||
ReadFile(hin, str, maxlen-1, &i, NULL);
|
ReadFile(hin, str, maxlen-1, &i, NULL);
|
||||||
@ -197,6 +201,7 @@ static int get_password(const char *prompt, char *str, int maxlen)
|
|||||||
if ((int)i > maxlen) i = maxlen-1; else i = i - 2;
|
if ((int)i > maxlen) i = maxlen-1; else i = i - 2;
|
||||||
str[i] = '\0';
|
str[i] = '\0';
|
||||||
|
|
||||||
|
if (is_pw)
|
||||||
WriteFile(hout, "\r\n", 2, &i, NULL);
|
WriteFile(hout, "\r\n", 2, &i, NULL);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -265,7 +270,7 @@ int main(int argc, char **argv) {
|
|||||||
int skcount, sksize;
|
int skcount, sksize;
|
||||||
int connopen;
|
int connopen;
|
||||||
|
|
||||||
ssh_get_password = get_password;
|
ssh_get_line = get_line;
|
||||||
|
|
||||||
sklist = NULL; skcount = sksize = 0;
|
sklist = NULL; skcount = sksize = 0;
|
||||||
|
|
||||||
|
15
psftp.c
15
psftp.c
@ -860,10 +860,10 @@ static void ssh_sftp_init(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static char *password = NULL;
|
static char *password = NULL;
|
||||||
static int get_password(const char *prompt, char *str, int maxlen)
|
static int get_line(const char *prompt, char *str, int maxlen, int is_pw)
|
||||||
{
|
{
|
||||||
HANDLE hin, hout;
|
HANDLE hin, hout;
|
||||||
DWORD savemode, i;
|
DWORD savemode, newmode, i;
|
||||||
|
|
||||||
if (password) {
|
if (password) {
|
||||||
static int tried_once = 0;
|
static int tried_once = 0;
|
||||||
@ -886,8 +886,12 @@ static int get_password(const char *prompt, char *str, int maxlen)
|
|||||||
}
|
}
|
||||||
|
|
||||||
GetConsoleMode(hin, &savemode);
|
GetConsoleMode(hin, &savemode);
|
||||||
SetConsoleMode(hin, (savemode & (~ENABLE_ECHO_INPUT)) |
|
newmode = savemode | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT;
|
||||||
ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT);
|
if (is_pw)
|
||||||
|
newmode &= ~ENABLE_ECHO_INPUT;
|
||||||
|
else
|
||||||
|
newmode |= ENABLE_ECHO_INPUT;
|
||||||
|
SetConsoleMode(hin, newmode);
|
||||||
|
|
||||||
WriteFile(hout, prompt, strlen(prompt), &i, NULL);
|
WriteFile(hout, prompt, strlen(prompt), &i, NULL);
|
||||||
ReadFile(hin, str, maxlen-1, &i, NULL);
|
ReadFile(hin, str, maxlen-1, &i, NULL);
|
||||||
@ -897,6 +901,7 @@ static int get_password(const char *prompt, char *str, int maxlen)
|
|||||||
if ((int)i > maxlen) i = maxlen-1; else i = i - 2;
|
if ((int)i > maxlen) i = maxlen-1; else i = i - 2;
|
||||||
str[i] = '\0';
|
str[i] = '\0';
|
||||||
|
|
||||||
|
if (is_pw)
|
||||||
WriteFile(hout, "\r\n", 2, &i, NULL);
|
WriteFile(hout, "\r\n", 2, &i, NULL);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -948,7 +953,7 @@ int main(int argc, char *argv[])
|
|||||||
char *err;
|
char *err;
|
||||||
|
|
||||||
flags = FLAG_STDERR;
|
flags = FLAG_STDERR;
|
||||||
ssh_get_password = &get_password;
|
ssh_get_line = &get_line;
|
||||||
init_winsock();
|
init_winsock();
|
||||||
sk_init();
|
sk_init();
|
||||||
|
|
||||||
|
3
putty.h
3
putty.h
@ -382,7 +382,8 @@ extern Backend telnet_backend;
|
|||||||
* Exports from ssh.c.
|
* Exports from ssh.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int (*ssh_get_password)(const char *prompt, char *str, int maxlen);
|
extern int (*ssh_get_line)(const char *prompt, char *str, int maxlen,
|
||||||
|
int is_pw);
|
||||||
extern Backend ssh_backend;
|
extern Backend ssh_backend;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
17
scp.c
17
scp.c
@ -395,12 +395,12 @@ static void bump(char *fmt, ...)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_password(const char *prompt, char *str, int maxlen)
|
static int get_line(const char *prompt, char *str, int maxlen, int is_pw)
|
||||||
{
|
{
|
||||||
HANDLE hin, hout;
|
HANDLE hin, hout;
|
||||||
DWORD savemode, i;
|
DWORD savemode, newmode, i;
|
||||||
|
|
||||||
if (password) {
|
if (is_pw && password) {
|
||||||
static int tried_once = 0;
|
static int tried_once = 0;
|
||||||
|
|
||||||
if (tried_once) {
|
if (tried_once) {
|
||||||
@ -423,8 +423,12 @@ static int get_password(const char *prompt, char *str, int maxlen)
|
|||||||
bump("Cannot get standard input/output handles");
|
bump("Cannot get standard input/output handles");
|
||||||
|
|
||||||
GetConsoleMode(hin, &savemode);
|
GetConsoleMode(hin, &savemode);
|
||||||
SetConsoleMode(hin, (savemode & (~ENABLE_ECHO_INPUT)) |
|
newmode = savemode | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT;
|
||||||
ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT);
|
if (is_pw)
|
||||||
|
newmode &= ~ENABLE_ECHO_INPUT;
|
||||||
|
else
|
||||||
|
newmode |= ENABLE_ECHO_INPUT;
|
||||||
|
SetConsoleMode(hin, newmode);
|
||||||
|
|
||||||
WriteFile(hout, prompt, strlen(prompt), &i, NULL);
|
WriteFile(hout, prompt, strlen(prompt), &i, NULL);
|
||||||
ReadFile(hin, str, maxlen-1, &i, NULL);
|
ReadFile(hin, str, maxlen-1, &i, NULL);
|
||||||
@ -434,6 +438,7 @@ static int get_password(const char *prompt, char *str, int maxlen)
|
|||||||
if ((int)i > maxlen) i = maxlen-1; else i = i - 2;
|
if ((int)i > maxlen) i = maxlen-1; else i = i - 2;
|
||||||
str[i] = '\0';
|
str[i] = '\0';
|
||||||
|
|
||||||
|
if (is_pw)
|
||||||
WriteFile(hout, "\r\n", 2, &i, NULL);
|
WriteFile(hout, "\r\n", 2, &i, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1223,7 +1228,7 @@ int main(int argc, char *argv[])
|
|||||||
default_protocol = PROT_TELNET;
|
default_protocol = PROT_TELNET;
|
||||||
|
|
||||||
flags = FLAG_STDERR;
|
flags = FLAG_STDERR;
|
||||||
ssh_get_password = &get_password;
|
ssh_get_line = &get_line;
|
||||||
init_winsock();
|
init_winsock();
|
||||||
sk_init();
|
sk_init();
|
||||||
|
|
||||||
|
53
ssh.c
53
ssh.c
@ -269,7 +269,8 @@ static const struct ssh_compress *sccomp = NULL;
|
|||||||
static const struct ssh_kex *kex = NULL;
|
static const struct ssh_kex *kex = NULL;
|
||||||
static const struct ssh_signkey *hostkey = NULL;
|
static const struct ssh_signkey *hostkey = NULL;
|
||||||
static unsigned char ssh2_session_id[20];
|
static unsigned char ssh2_session_id[20];
|
||||||
int (*ssh_get_password)(const char *prompt, char *str, int maxlen) = NULL;
|
int (*ssh_get_line)(const char *prompt, char *str, int maxlen,
|
||||||
|
int is_pw) = NULL;
|
||||||
|
|
||||||
static char *savedhost;
|
static char *savedhost;
|
||||||
static int savedport;
|
static int savedport;
|
||||||
@ -1503,6 +1504,18 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
|
|||||||
static int pos = 0;
|
static int pos = 0;
|
||||||
static char c;
|
static char c;
|
||||||
if ((flags & FLAG_INTERACTIVE) && !*cfg.username) {
|
if ((flags & FLAG_INTERACTIVE) && !*cfg.username) {
|
||||||
|
if (ssh_get_line) {
|
||||||
|
if (!ssh_get_line("login as: ",
|
||||||
|
username, sizeof(username), FALSE)) {
|
||||||
|
/*
|
||||||
|
* get_line failed to get a username.
|
||||||
|
* Terminate.
|
||||||
|
*/
|
||||||
|
logevent("No username provided. Abandoning session.");
|
||||||
|
ssh_state = SSH_STATE_CLOSED;
|
||||||
|
crReturn(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
c_write_str("login as: ");
|
c_write_str("login as: ");
|
||||||
ssh_send_ok = 1;
|
ssh_send_ok = 1;
|
||||||
while (pos >= 0) {
|
while (pos >= 0) {
|
||||||
@ -1539,6 +1552,7 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
|
|||||||
}
|
}
|
||||||
c_write_str("\r\n");
|
c_write_str("\r\n");
|
||||||
username[strcspn(username, "\n\r")] = '\0';
|
username[strcspn(username, "\n\r")] = '\0';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
strncpy(username, cfg.username, 99);
|
strncpy(username, cfg.username, 99);
|
||||||
username[99] = '\0';
|
username[99] = '\0';
|
||||||
@ -1741,13 +1755,12 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
|
|||||||
sfree(comment);
|
sfree(comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ssh_get_password) {
|
if (ssh_get_line) {
|
||||||
if (!ssh_get_password(prompt, password, sizeof(password))) {
|
if (!ssh_get_line(prompt, password, sizeof(password), TRUE)) {
|
||||||
/*
|
/*
|
||||||
* get_password failed to get a password (for
|
* get_line failed to get a password (for example
|
||||||
* example because one was supplied on the command
|
* because one was supplied on the command line
|
||||||
* line which has already failed to work).
|
* which has already failed to work). Terminate.
|
||||||
* Terminate.
|
|
||||||
*/
|
*/
|
||||||
logevent("No more passwords to try");
|
logevent("No more passwords to try");
|
||||||
ssh_state = SSH_STATE_CLOSED;
|
ssh_state = SSH_STATE_CLOSED;
|
||||||
@ -2843,6 +2856,18 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
|
|||||||
*/
|
*/
|
||||||
pos = 0;
|
pos = 0;
|
||||||
if ((flags & FLAG_INTERACTIVE) && !*cfg.username) {
|
if ((flags & FLAG_INTERACTIVE) && !*cfg.username) {
|
||||||
|
if (ssh_get_line) {
|
||||||
|
if (!ssh_get_line("login as: ",
|
||||||
|
username, sizeof(username), FALSE)) {
|
||||||
|
/*
|
||||||
|
* get_line failed to get a username.
|
||||||
|
* Terminate.
|
||||||
|
*/
|
||||||
|
logevent("No username provided. Abandoning session.");
|
||||||
|
ssh_state = SSH_STATE_CLOSED;
|
||||||
|
crReturn(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
c_write_str("login as: ");
|
c_write_str("login as: ");
|
||||||
ssh_send_ok = 1;
|
ssh_send_ok = 1;
|
||||||
while (pos >= 0) {
|
while (pos >= 0) {
|
||||||
@ -2877,6 +2902,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
c_write_str("\r\n");
|
c_write_str("\r\n");
|
||||||
username[strcspn(username, "\n\r")] = '\0';
|
username[strcspn(username, "\n\r")] = '\0';
|
||||||
} else {
|
} else {
|
||||||
@ -3158,13 +3184,14 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (need_pw) {
|
if (need_pw) {
|
||||||
if (ssh_get_password) {
|
if (ssh_get_line) {
|
||||||
if (!ssh_get_password(pwprompt, password, sizeof(password))) {
|
if (!ssh_get_line(pwprompt, password,
|
||||||
|
sizeof(password), TRUE)) {
|
||||||
/*
|
/*
|
||||||
* get_password failed to get a password (for
|
* get_line failed to get a password (for
|
||||||
* example because one was supplied on the command
|
* example because one was supplied on the
|
||||||
* line which has already failed to work).
|
* command line which has already failed to
|
||||||
* Terminate.
|
* work). Terminate.
|
||||||
*/
|
*/
|
||||||
logevent("No more passwords to try");
|
logevent("No more passwords to try");
|
||||||
ssh_state = SSH_STATE_CLOSED;
|
ssh_state = SSH_STATE_CLOSED;
|
||||||
|
Loading…
Reference in New Issue
Block a user