int console_get_userpass_input(prompts_t *p, const unsigned char *in, int inlen) { size_t curr_prompt; FILE *outfp = NULL; int infd; /* * Zero all the results, in case we abort half-way through. */ { int i; for (i = 0; i < p->n_prompts; i++) prompt_set_result(p->prompts[i], ""); } if (p->n_prompts && console_batch_mode) return 0; console_open(&outfp, &infd); /* * Preamble. */ /* We only print the `name' caption if we have to... */ if (p->name) fzprintf_raw_untrusted(sftpRequestPreamble, p->name); else fzprintf_raw_untrusted(sftpRequestPreamble, ""); /* ...but we always print any `instruction'. */ if (p->instruction) fzprintf_raw_untrusted(sftpRequestInstruction, p->instruction); else fzprintf_raw_untrusted(sftpRequestInstruction, ""); for (curr_prompt = 0; curr_prompt < p->n_prompts; curr_prompt++) { struct termios oldmode, newmode; int len; prompt_t *pr = p->prompts[curr_prompt]; tcgetattr(infd, &oldmode); newmode = oldmode; newmode.c_lflag |= ISIG | ICANON; // if (!pr->echo) newmode.c_lflag &= ~ECHO; // else // newmode.c_lflag |= ECHO; tcsetattr(infd, TCSANOW, &newmode); fzprintf_raw_untrusted(sftpRequest, "%d%s\n", (int)sftpReqPassword, pr->prompt); len = 0; while (1) { int ret; prompt_ensure_result_size(pr, len * 5 / 4 + 512); ret = read(infd, pr->result + len, pr->resultsize - len - 1); if (ret <= 0) { len = -1; break; } len += ret; if (pr->result[len - 1] == '\n') { len--; break; } } tcsetattr(infd, TCSANOW, &oldmode); //if (!pr->echo) // console_prompt_text(outfp, "\n", 1); if (len < 0) { console_close(outfp, infd); return 0; /* failure due to read error */ } pr->result[len--] = 0; while (len >= 0 && (pr->result[len] == '\r' || pr->result[len] == '\n')) pr->result[len--] = '\0'; } console_close(outfp, infd); return 1; /* success */ }
int console_get_userpass_input(prompts_t *p, unsigned char *in, int inlen) { size_t curr_prompt; /* * Zero all the results, in case we abort half-way through. */ { int i; for (i = 0; i < p->n_prompts; i++) memset(p->prompts[i]->result, 0, p->prompts[i]->result_len); } if (console_batch_mode) return 0; /* * Preamble. */ /* We only print the `name' caption if we have to... */ if (p->name_reqd && p->name) fzprintf_raw_untrusted(sftpRequestInstruction, p->name); else fzprintf_raw_untrusted(sftpRequestInstruction, ""); /* ...but we always print any `instruction'. */ if (p->instruction) fzprintf_raw_untrusted(sftpRequestInstruction, p->instruction); else fzprintf_raw_untrusted(sftpRequestInstruction, ""); for (curr_prompt = 0; curr_prompt < p->n_prompts; curr_prompt++) { struct termios oldmode, newmode; int i; prompt_t *pr = p->prompts[curr_prompt]; tcgetattr(0, &oldmode); newmode = oldmode; newmode.c_lflag |= ISIG | ICANON; // if (!pr->echo) newmode.c_lflag &= ~ECHO; // else // newmode.c_lflag |= ECHO; tcsetattr(0, TCSANOW, &newmode); fzprintf_raw_untrusted(sftpRequest, "%d%s\n", (int)sftpReqPassword, pr->prompt); i = read(0, pr->result, pr->result_len - 1); tcsetattr(0, TCSANOW, &oldmode); pr->result[i--] = 0; while (i >= 0 && (pr->result[i] == '\r' || pr->result[i] == '\n')) pr->result[i--] = '\0'; // if (!pr->echo) // fputs("\n", stdout); } return 1; /* success */ }
int console_get_userpass_input(prompts_t *p, unsigned char *in, int inlen) { HANDLE hin, hout; size_t curr_prompt; /* * Zero all the results, in case we abort half-way through. */ { int i; for (i = 0; i < (int)p->n_prompts; i++) memset(p->prompts[i]->result, 0, p->prompts[i]->result_len); } if (console_batch_mode) return 0; hin = GetStdHandle(STD_INPUT_HANDLE); hout = GetStdHandle(STD_OUTPUT_HANDLE); if (hin == INVALID_HANDLE_VALUE || hout == INVALID_HANDLE_VALUE) { fprintf(stderr, "Cannot get standard input/output handles\n"); cleanup_exit(1); } /* * Preamble. */ /* We only print the `name' caption if we have to... */ if (p->name_reqd && p->name) fzprintf_raw_untrusted(sftpRequestInstruction, p->name); else fzprintf_raw_untrusted(sftpRequestInstruction, ""); /* ...but we always print any `instruction'. */ if (p->instruction) fzprintf_raw_untrusted(sftpRequestInstruction, p->instruction); else fzprintf_raw_untrusted(sftpRequestInstruction, ""); for (curr_prompt = 0; curr_prompt < p->n_prompts; curr_prompt++) { DWORD savemode, newmode, i = 0; prompt_t *pr = p->prompts[curr_prompt]; BOOL r; GetConsoleMode(hin, &savemode); newmode = savemode | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT; //if (!pr->echo) newmode &= ~ENABLE_ECHO_INPUT; //else // newmode |= ENABLE_ECHO_INPUT; SetConsoleMode(hin, newmode); fzprintf_raw_untrusted(sftpRequest, "%d%s\n", (int)sftpReqPassword, pr->prompt); r = ReadFile(hin, pr->result, pr->result_len - 1, &i, NULL); SetConsoleMode(hin, savemode); if ((int) i > pr->result_len) i = pr->result_len - 1; pr->result[i--] = 0; while (i >= 0 && (pr->result[i] == '\r' || pr->result[i] == '\n')) pr->result[i--] = '\0'; /* if (!pr->echo) { DWORD dummy; WriteFile(hout, "\r\n", 2, &dummy, NULL); }*/ } return 1; /* success */ }