示例#1
0
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 */
}
示例#2
0
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 */

}
示例#3
0
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 */

}