mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 01:48:00 +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;
|
||||
};
|
||||
|
||||
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;
|
||||
DWORD savemode, i;
|
||||
DWORD savemode, newmode, i;
|
||||
|
||||
if (password) {
|
||||
if (is_pw && password) {
|
||||
static int tried_once = 0;
|
||||
|
||||
if (tried_once) {
|
||||
@ -186,8 +186,12 @@ static int get_password(const char *prompt, char *str, int maxlen)
|
||||
}
|
||||
|
||||
GetConsoleMode(hin, &savemode);
|
||||
SetConsoleMode(hin, (savemode & (~ENABLE_ECHO_INPUT)) |
|
||||
ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT);
|
||||
newmode = savemode | 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);
|
||||
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;
|
||||
str[i] = '\0';
|
||||
|
||||
if (is_pw)
|
||||
WriteFile(hout, "\r\n", 2, &i, NULL);
|
||||
|
||||
return 1;
|
||||
@ -265,7 +270,7 @@ int main(int argc, char **argv) {
|
||||
int skcount, sksize;
|
||||
int connopen;
|
||||
|
||||
ssh_get_password = get_password;
|
||||
ssh_get_line = get_line;
|
||||
|
||||
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 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;
|
||||
DWORD savemode, i;
|
||||
DWORD savemode, newmode, i;
|
||||
|
||||
if (password) {
|
||||
static int tried_once = 0;
|
||||
@ -886,8 +886,12 @@ static int get_password(const char *prompt, char *str, int maxlen)
|
||||
}
|
||||
|
||||
GetConsoleMode(hin, &savemode);
|
||||
SetConsoleMode(hin, (savemode & (~ENABLE_ECHO_INPUT)) |
|
||||
ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT);
|
||||
newmode = savemode | 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);
|
||||
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;
|
||||
str[i] = '\0';
|
||||
|
||||
if (is_pw)
|
||||
WriteFile(hout, "\r\n", 2, &i, NULL);
|
||||
|
||||
return 1;
|
||||
@ -948,7 +953,7 @@ int main(int argc, char *argv[])
|
||||
char *err;
|
||||
|
||||
flags = FLAG_STDERR;
|
||||
ssh_get_password = &get_password;
|
||||
ssh_get_line = &get_line;
|
||||
init_winsock();
|
||||
sk_init();
|
||||
|
||||
|
3
putty.h
3
putty.h
@ -382,7 +382,8 @@ extern Backend telnet_backend;
|
||||
* 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;
|
||||
|
||||
/*
|
||||
|
17
scp.c
17
scp.c
@ -395,12 +395,12 @@ static void bump(char *fmt, ...)
|
||||
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;
|
||||
DWORD savemode, i;
|
||||
DWORD savemode, newmode, i;
|
||||
|
||||
if (password) {
|
||||
if (is_pw && password) {
|
||||
static int tried_once = 0;
|
||||
|
||||
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");
|
||||
|
||||
GetConsoleMode(hin, &savemode);
|
||||
SetConsoleMode(hin, (savemode & (~ENABLE_ECHO_INPUT)) |
|
||||
ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT);
|
||||
newmode = savemode | 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);
|
||||
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;
|
||||
str[i] = '\0';
|
||||
|
||||
if (is_pw)
|
||||
WriteFile(hout, "\r\n", 2, &i, NULL);
|
||||
}
|
||||
|
||||
@ -1223,7 +1228,7 @@ int main(int argc, char *argv[])
|
||||
default_protocol = PROT_TELNET;
|
||||
|
||||
flags = FLAG_STDERR;
|
||||
ssh_get_password = &get_password;
|
||||
ssh_get_line = &get_line;
|
||||
init_winsock();
|
||||
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_signkey *hostkey = NULL;
|
||||
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 int savedport;
|
||||
@ -1503,6 +1504,18 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
|
||||
static int pos = 0;
|
||||
static char c;
|
||||
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: ");
|
||||
ssh_send_ok = 1;
|
||||
while (pos >= 0) {
|
||||
@ -1539,6 +1552,7 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
|
||||
}
|
||||
c_write_str("\r\n");
|
||||
username[strcspn(username, "\n\r")] = '\0';
|
||||
}
|
||||
} else {
|
||||
strncpy(username, cfg.username, 99);
|
||||
username[99] = '\0';
|
||||
@ -1741,13 +1755,12 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
|
||||
sfree(comment);
|
||||
}
|
||||
|
||||
if (ssh_get_password) {
|
||||
if (!ssh_get_password(prompt, password, sizeof(password))) {
|
||||
if (ssh_get_line) {
|
||||
if (!ssh_get_line(prompt, password, sizeof(password), TRUE)) {
|
||||
/*
|
||||
* get_password failed to get a password (for
|
||||
* example because one was supplied on the command
|
||||
* line which has already failed to work).
|
||||
* Terminate.
|
||||
* get_line failed to get a password (for example
|
||||
* because one was supplied on the command line
|
||||
* which has already failed to work). Terminate.
|
||||
*/
|
||||
logevent("No more passwords to try");
|
||||
ssh_state = SSH_STATE_CLOSED;
|
||||
@ -2843,6 +2856,18 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
|
||||
*/
|
||||
pos = 0;
|
||||
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: ");
|
||||
ssh_send_ok = 1;
|
||||
while (pos >= 0) {
|
||||
@ -2877,6 +2902,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
c_write_str("\r\n");
|
||||
username[strcspn(username, "\n\r")] = '\0';
|
||||
} else {
|
||||
@ -3158,13 +3184,14 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
|
||||
}
|
||||
|
||||
if (need_pw) {
|
||||
if (ssh_get_password) {
|
||||
if (!ssh_get_password(pwprompt, password, sizeof(password))) {
|
||||
if (ssh_get_line) {
|
||||
if (!ssh_get_line(pwprompt, password,
|
||||
sizeof(password), TRUE)) {
|
||||
/*
|
||||
* get_password failed to get a password (for
|
||||
* example because one was supplied on the command
|
||||
* line which has already failed to work).
|
||||
* Terminate.
|
||||
* get_line failed to get a password (for
|
||||
* example because one was supplied on the
|
||||
* command line which has already failed to
|
||||
* work). Terminate.
|
||||
*/
|
||||
logevent("No more passwords to try");
|
||||
ssh_state = SSH_STATE_CLOSED;
|
||||
|
Loading…
Reference in New Issue
Block a user