| """Utilities to get a password and/or the current user name. | 
 |  | 
 | getpass(prompt) - prompt for a password, with echo turned off | 
 | getuser() - get the user name from the environment or password database | 
 |  | 
 | On Windows, the msvcrt module will be used. | 
 | On the Mac EasyDialogs.AskPassword is used, if available. | 
 |  | 
 | """ | 
 |  | 
 | # Authors: Piers Lauder (original) | 
 | #          Guido van Rossum (Windows support and cleanup) | 
 |  | 
 | import sys | 
 |  | 
 | def unix_getpass(prompt='Password: '): | 
 | 	"""Prompt for a password, with echo turned off. | 
 |  | 
 | 	Restore terminal settings at end. | 
 | 	""" | 
 |  | 
 | 	try: | 
 | 		fd = sys.stdin.fileno() | 
 | 	except: | 
 | 		return default_getpass(prompt) | 
 |  | 
 | 	getpass = default_getpass | 
 | 	old = termios.tcgetattr(fd)	# a copy to save | 
 | 	new = old[:] | 
 |  | 
 | 	new[3] = new[3] & ~TERMIOS.ECHO	# 3 == 'lflags' | 
 | 	try: | 
 | 		termios.tcsetattr(fd, TERMIOS.TCSADRAIN, new) | 
 | 		passwd = _raw_input(prompt) | 
 | 	finally: | 
 | 		termios.tcsetattr(fd, TERMIOS.TCSADRAIN, old) | 
 |  | 
 | 	sys.stdout.write('\n') | 
 | 	return passwd | 
 |  | 
 |  | 
 | def win_getpass(prompt='Password: '): | 
 | 	"""Prompt for password with echo off, using Windows getch().""" | 
 | 	import msvcrt | 
 | 	for c in prompt: | 
 | 		msvcrt.putch(c) | 
 | 	pw = "" | 
 | 	while 1: | 
 | 		c = msvcrt.getch() | 
 | 		if c == '\r' or c == '\n': | 
 | 			break | 
 | 		if c == '\003': | 
 | 			raise KeyboardInterrupt | 
 | 		if c == '\b': | 
 | 			pw = pw[:-1] | 
 | 		else: | 
 | 			pw = pw + c | 
 | 	msvcrt.putch('\r') | 
 | 	msvcrt.putch('\n') | 
 | 	return pw | 
 |  | 
 |  | 
 | def default_getpass(prompt='Password: '): | 
 | 	print "Warning: Problem with getpass. Passwords may be echoed." | 
 | 	return _raw_input(prompt) | 
 |  | 
 |  | 
 | def _raw_input(prompt=""): | 
 | 	# A raw_input() replacement that doesn't save the string in the | 
 | 	# GNU readline history. | 
 | 	import sys | 
 | 	prompt = str(prompt) | 
 | 	if prompt: | 
 | 		sys.stdout.write(prompt) | 
 | 	line = sys.stdin.readline() | 
 | 	if not line: | 
 | 		raise EOFError | 
 | 	if line[-1] == '\n': | 
 | 		line = line[:-1] | 
 | 	return line | 
 |  | 
 |  | 
 | def getuser(): | 
 | 	"""Get the username from the environment or password database. | 
 |  | 
 | 	First try various environment variables, then the password | 
 | 	database.  This works on Windows as long as USERNAME is set. | 
 |  | 
 | 	""" | 
 |  | 
 | 	import os | 
 |  | 
 | 	for name in ('LOGNAME', 'USER', 'LNAME', 'USERNAME'): | 
 | 		user = os.environ.get(name) | 
 | 		if user: | 
 | 			return user | 
 |  | 
 | 	# If this fails, the exception will "explain" why | 
 | 	import pwd | 
 | 	return pwd.getpwuid(os.getuid())[0] | 
 |  | 
 | # Bind the name getpass to the appropriate function | 
 | try: | 
 | 	import termios, TERMIOS | 
 | except ImportError: | 
 | 	try: | 
 | 		import msvcrt | 
 | 	except ImportError: | 
 | 		try: | 
 | 			from EasyDialogs import AskPassword | 
 | 		except ImportError: | 
 | 			getpass = default_getpass | 
 | 		else: | 
 | 			getpass = AskPassword | 
 | 	else: | 
 | 		getpass = win_getpass | 
 | else: | 
 | 	getpass = unix_getpass | 
 |  |