]> granicus.if.org Git - python/commitdiff
Another new utility: getpass() prompts for a password, with echo off.
authorGuido van Rossum <guido@python.org>
Thu, 9 Apr 1998 20:37:16 +0000 (20:37 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 9 Apr 1998 20:37:16 +0000 (20:37 +0000)
Also contains getuser(), which returns the username (not prompting though).
These work on Unix and Windows!

Lib/getpass.py [new file with mode: 0644]

diff --git a/Lib/getpass.py b/Lib/getpass.py
new file mode 100644 (file)
index 0000000..44e78c2
--- /dev/null
@@ -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]