Blame libfreerdp/utils/passphrase.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 * Passphrase Handling Utils
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2011 Shea Levy <shea@shealevy.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <errno.h>
Packit 1fb8d4
#include <freerdp/utils/passphrase.h>
Packit 1fb8d4
Packit 1fb8d4
#ifdef _WIN32
Packit 1fb8d4
Packit 1fb8d4
char* freerdp_passphrase_read(const char* prompt, char* buf, size_t bufsiz, int from_stdin)
Packit 1fb8d4
{
Packit 1fb8d4
	errno = ENOSYS;
Packit 1fb8d4
	return NULL;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#elif !defined(ANDROID)
Packit 1fb8d4
Packit 1fb8d4
#include <fcntl.h>
Packit 1fb8d4
#include <stdio.h>
Packit 1fb8d4
#include <string.h>
Packit 1fb8d4
#include <sys/stat.h>
Packit 1fb8d4
#include <termios.h>
Packit 1fb8d4
#include <unistd.h>
Packit 1fb8d4
#include <freerdp/utils/signal.h>
Packit 1fb8d4
Packit 1fb8d4
char* freerdp_passphrase_read(const char* prompt, char* buf, size_t bufsiz, int from_stdin)
Packit 1fb8d4
{
Packit 1fb8d4
	char read_char;
Packit 1fb8d4
	char* buf_iter;
Packit 1fb8d4
	char term_name[L_ctermid];
Packit 1fb8d4
	int term_file, write_file;
Packit 1fb8d4
	ssize_t nbytes;
Packit 1fb8d4
	size_t read_bytes = 0;
Packit 1fb8d4
Packit 1fb8d4
	if (bufsiz == 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		errno = EINVAL;
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	ctermid(term_name);
Packit 1fb8d4
	if(from_stdin || strcmp(term_name, "") == 0
Packit 1fb8d4
		|| (term_file = open(term_name, O_RDWR)) == -1)
Packit 1fb8d4
	{
Packit 1fb8d4
		write_file = STDERR_FILENO;
Packit 1fb8d4
		terminal_fildes = STDIN_FILENO;
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit 1fb8d4
		write_file = term_file;
Packit 1fb8d4
		terminal_fildes = term_file;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (tcgetattr(terminal_fildes, &orig_flags) != -1)
Packit 1fb8d4
	{
Packit 1fb8d4
		new_flags = orig_flags;
Packit 1fb8d4
		new_flags.c_lflag &= ~ECHO;
Packit 1fb8d4
		new_flags.c_lflag |= ECHONL;
Packit 1fb8d4
		terminal_needs_reset = 1;
Packit 1fb8d4
		if (tcsetattr(terminal_fildes, TCSAFLUSH, &new_flags) == -1)
Packit 1fb8d4
			terminal_needs_reset = 0;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (write(write_file, prompt, strlen(prompt)) == (ssize_t) -1)
Packit 1fb8d4
		goto error;
Packit 1fb8d4
Packit 1fb8d4
	buf_iter = buf;
Packit 1fb8d4
	while ((nbytes = read(terminal_fildes, &read_char, sizeof read_char)) == (sizeof read_char))
Packit 1fb8d4
	{
Packit 1fb8d4
		if (read_char == '\n')
Packit 1fb8d4
			break;
Packit 1fb8d4
		if (read_bytes < (bufsiz - (size_t) 1))
Packit 1fb8d4
		{
Packit 1fb8d4
			read_bytes++;
Packit 1fb8d4
			*buf_iter = read_char;
Packit 1fb8d4
			buf_iter++;
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit 1fb8d4
	*buf_iter = '\0';
Packit 1fb8d4
	buf_iter = NULL;
Packit 1fb8d4
	read_char = '\0';
Packit 1fb8d4
	if (nbytes == (ssize_t) -1)
Packit 1fb8d4
		goto error;
Packit 1fb8d4
Packit 1fb8d4
	if (terminal_needs_reset)
Packit 1fb8d4
	{
Packit 1fb8d4
		if (tcsetattr(terminal_fildes, TCSAFLUSH, &orig_flags) == -1)	
Packit 1fb8d4
			goto error;
Packit 1fb8d4
		terminal_needs_reset = 0;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (terminal_fildes != STDIN_FILENO)
Packit 1fb8d4
	{
Packit 1fb8d4
		if (close(terminal_fildes) == -1)
Packit 1fb8d4
			goto error;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return buf;
Packit 1fb8d4
Packit 1fb8d4
	error:
Packit 1fb8d4
	{
Packit 1fb8d4
		int saved_errno = errno;
Packit 1fb8d4
		buf_iter = NULL;
Packit 1fb8d4
		read_char = '\0';
Packit 1fb8d4
		if (terminal_needs_reset)
Packit 1fb8d4
			tcsetattr(terminal_fildes, TCSAFLUSH, &orig_flags);
Packit 1fb8d4
		if (terminal_fildes != STDIN_FILENO)
Packit 1fb8d4
			close(terminal_fildes);
Packit 1fb8d4
		errno = saved_errno;
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#else
Packit 1fb8d4
Packit 1fb8d4
char* freerdp_passphrase_read(const char* prompt, char* buf, size_t bufsiz, int from_stdin)
Packit 1fb8d4
{
Packit 1fb8d4
	return NULL;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#endif
Packit 1fb8d4