1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 17:38:00 +00:00

Windows: better -legacy-stdio-prompts fidelity.

In 0.81, some prompts (such as host-key prompts) went to stderr, while
others (such as username and password prompts) went to stdout.
With -legacy-stdio-prompts (or if we otherwise couldn't get console
handles), we were sending all such prompts to stdout, which might have
messed up someone's workflow if they were interacting with the
non-username/password prompts programmatically.
This commit is contained in:
Jacob Nevins 2024-11-24 04:22:23 +00:00
parent 628a9486af
commit 725870d97e

View File

@ -72,7 +72,7 @@ typedef struct ConsoleIO {
static void console_write(BinarySink *bs, const void *data, size_t len); static void console_write(BinarySink *bs, const void *data, size_t len);
static ConsoleIO *conio_setup(bool utf8) static ConsoleIO *conio_setup(bool utf8, DWORD fallback_output)
{ {
ConsoleIO *conio = snew(ConsoleIO); ConsoleIO *conio = snew(ConsoleIO);
@ -118,14 +118,15 @@ static ConsoleIO *conio_setup(bool utf8)
} }
/* /*
* Fall back from that to using the standard handles. We use * Fall back from that to using the standard handles.
* standard error rather than standard output for our prompts, * (For prompt output, some callers use STD_ERROR_HANDLE rather
* because that has a better chance of separating them from * than STD_OUTPUT_HANDLE, because that has a better chance of
* separating them from session output.)
*/ */
if (conio->hin == INVALID_HANDLE_VALUE) if (conio->hin == INVALID_HANDLE_VALUE)
conio->hin = GetStdHandle(STD_INPUT_HANDLE); conio->hin = GetStdHandle(STD_INPUT_HANDLE);
if (conio->hout == INVALID_HANDLE_VALUE) if (conio->hout == INVALID_HANDLE_VALUE)
conio->hout = GetStdHandle(STD_OUTPUT_HANDLE); conio->hout = GetStdHandle(fallback_output);
DWORD dummy; DWORD dummy;
conio->hin_is_console = GetConsoleMode(conio->hin, &dummy); conio->hin_is_console = GetConsoleMode(conio->hin, &dummy);
@ -389,7 +390,7 @@ SeatPromptResult console_confirm_ssh_host_key(
char *keystr, SeatDialogText *text, HelpCtx helpctx, char *keystr, SeatDialogText *text, HelpCtx helpctx,
void (*callback)(void *ctx, SeatPromptResult result), void *ctx) void (*callback)(void *ctx, SeatPromptResult result), void *ctx)
{ {
ConsoleIO *conio = conio_setup(false); ConsoleIO *conio = conio_setup(false, STD_ERROR_HANDLE);
SeatPromptResult result; SeatPromptResult result;
const char *prompt = console_print_seatdialogtext(conio, text); const char *prompt = console_print_seatdialogtext(conio, text);
@ -445,7 +446,7 @@ SeatPromptResult console_confirm_weak_crypto_primitive(
Seat *seat, SeatDialogText *text, Seat *seat, SeatDialogText *text,
void (*callback)(void *ctx, SeatPromptResult result), void *ctx) void (*callback)(void *ctx, SeatPromptResult result), void *ctx)
{ {
ConsoleIO *conio = conio_setup(false); ConsoleIO *conio = conio_setup(false, STD_ERROR_HANDLE);
SeatPromptResult result; SeatPromptResult result;
const char *prompt = console_print_seatdialogtext(conio, text); const char *prompt = console_print_seatdialogtext(conio, text);
@ -475,7 +476,7 @@ SeatPromptResult console_confirm_weak_cached_hostkey(
Seat *seat, SeatDialogText *text, Seat *seat, SeatDialogText *text,
void (*callback)(void *ctx, SeatPromptResult result), void *ctx) void (*callback)(void *ctx, SeatPromptResult result), void *ctx)
{ {
ConsoleIO *conio = conio_setup(false); ConsoleIO *conio = conio_setup(false, STD_ERROR_HANDLE);
SeatPromptResult result; SeatPromptResult result;
const char *prompt = console_print_seatdialogtext(conio, text); const char *prompt = console_print_seatdialogtext(conio, text);
@ -501,7 +502,7 @@ SeatPromptResult console_confirm_weak_cached_hostkey(
bool is_interactive(void) bool is_interactive(void)
{ {
ConsoleIO *conio = conio_setup(false); ConsoleIO *conio = conio_setup(false, STD_ERROR_HANDLE /* irrelevant */);
bool toret = conio->hin_is_console; bool toret = conio->hin_is_console;
conio_free(conio); conio_free(conio);
return toret; return toret;
@ -568,7 +569,7 @@ int console_askappend(LogPolicy *lp, Filename *filename,
"The session log file \"%.*s\" already exists.\n" "The session log file \"%.*s\" already exists.\n"
"Logging will not be enabled.\n"; "Logging will not be enabled.\n";
ConsoleIO *conio = conio_setup(true); ConsoleIO *conio = conio_setup(true, STD_ERROR_HANDLE);
int result; int result;
if (console_batch_mode) { if (console_batch_mode) {
@ -660,7 +661,7 @@ StripCtrlChars *console_stripctrl_new(
SeatPromptResult console_get_userpass_input(prompts_t *p) SeatPromptResult console_get_userpass_input(prompts_t *p)
{ {
ConsoleIO *conio = conio_setup(p->utf8); ConsoleIO *conio = conio_setup(p->utf8, STD_OUTPUT_HANDLE);
SeatPromptResult result; SeatPromptResult result;
size_t curr_prompt; size_t curr_prompt;