From b5903ac9fb67fd7f32aa223c5ed158ad6bb5293a Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Thu, 9 Apr 1998 20:37:16 +0000 Subject: [PATCH] Another new utility: getpass() prompts for a password, with echo off. Also contains getuser(), which returns the username (not prompting though). These work on Unix and Windows! --- Lib/getpass.py | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 Lib/getpass.py diff --git a/Lib/getpass.py b/Lib/getpass.py new file mode 100644 index 00000000000..44e78c264be --- /dev/null +++ b/Lib/getpass.py @@ -0,0 +1,79 @@ +"""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 + +Authors: Piers Lauder (original) + Guido van Rossum (Windows support and cleanup) +""" + + +def getpass(prompt='Password: '): + """Prompt for a password, with echo turned off. + + Restore terminal settings at end. + + On Windows, this calls win_getpass(prompt) which uses the + msvcrt module to get the same effect. + + """ + + import sys + try: + import termios, TERMIOS + except ImportError: + return win_getpass(prompt) + + fd = sys.stdin.fileno() + 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) + try: passwd = raw_input(prompt) + except KeyboardInterrupt: passwd = None + 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 == '\b': + pw = pw[:-1] + else: + pw = pw + c + msvcrt.putch('\r') + msvcrt.putch('\n') + return pw + + +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]