mirror of
https://github.com/python/cpython.git
synced 2024-11-26 19:34:19 +08:00
f3d7dbe72e
svn+ssh://pythondev@svn.python.org/python/branches/py3k ................ r75231 | benjamin.peterson | 2009-10-04 09:49:41 -0500 (Sun, 04 Oct 2009) | 166 lines Merged revisions 74779-74786,74793,74795,74811,74860-74861,74863,74876,74886,74896,74901,74903,74908,74912,74930,74933,74943,74946,74952-74955,75015,75019,75032,75068,75076,75095,75098,75102,75129,75139,75230 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r74779 | michael.foord | 2009-09-13 11:13:36 -0500 (Sun, 13 Sep 2009) | 1 line Change to tutorial wording for reading text / binary files on Windows. Issue #6301. ........ r74780 | michael.foord | 2009-09-13 11:40:02 -0500 (Sun, 13 Sep 2009) | 1 line Objects that compare equal automatically pass or fail assertAlmostEqual and assertNotAlmostEqual tests on unittest.TestCase. Issue 6567. ........ r74781 | michael.foord | 2009-09-13 11:46:19 -0500 (Sun, 13 Sep 2009) | 1 line Note that sys._getframe is not guaranteed to exist in all implementations of Python, and a corresponding note in inspect.currentframe. Issue 6712. ........ r74782 | michael.foord | 2009-09-13 12:07:46 -0500 (Sun, 13 Sep 2009) | 1 line Tutorial tweaks. Issue 6849. ........ r74783 | michael.foord | 2009-09-13 12:28:35 -0500 (Sun, 13 Sep 2009) | 1 line unittest.TestLoader.loadTestsFromName honors the loader suiteClass attribute. Issue 6866. ........ r74784 | georg.brandl | 2009-09-13 13:15:07 -0500 (Sun, 13 Sep 2009) | 1 line Typo fix. ........ r74785 | michael.foord | 2009-09-13 14:07:03 -0500 (Sun, 13 Sep 2009) | 1 line Test discovery in unittest will only attempt to import modules that are importable; i.e. their names are valid Python identifiers. If an import fails during discovery this will be recorded as an error and test discovery will continue. Issue 6568. ........ r74786 | michael.foord | 2009-09-13 14:08:18 -0500 (Sun, 13 Sep 2009) | 1 line Remove an extraneous space in unittest documentation. ........ r74793 | georg.brandl | 2009-09-14 09:50:47 -0500 (Mon, 14 Sep 2009) | 1 line #6908: fix association of hashlib hash attributes. ........ r74795 | benjamin.peterson | 2009-09-14 22:36:26 -0500 (Mon, 14 Sep 2009) | 1 line Py_SetPythonHome uses static storage #6913 ........ r74811 | georg.brandl | 2009-09-15 15:26:59 -0500 (Tue, 15 Sep 2009) | 1 line Add Armin Ronacher. ........ r74860 | benjamin.peterson | 2009-09-16 21:46:54 -0500 (Wed, 16 Sep 2009) | 1 line kill bare except ........ r74861 | benjamin.peterson | 2009-09-16 22:18:28 -0500 (Wed, 16 Sep 2009) | 1 line pep 8 defaults ........ r74863 | benjamin.peterson | 2009-09-16 22:27:33 -0500 (Wed, 16 Sep 2009) | 1 line rationalize a bit ........ r74876 | georg.brandl | 2009-09-17 11:15:53 -0500 (Thu, 17 Sep 2009) | 1 line #6932: remove paragraph that advises relying on __del__ being called. ........ r74886 | benjamin.peterson | 2009-09-17 16:33:46 -0500 (Thu, 17 Sep 2009) | 1 line use macros ........ r74896 | georg.brandl | 2009-09-18 02:22:41 -0500 (Fri, 18 Sep 2009) | 1 line #6936: for interactive use, quit() is just fine. ........ r74901 | georg.brandl | 2009-09-18 04:14:52 -0500 (Fri, 18 Sep 2009) | 1 line #6905: use better exception messages in inspect when the argument is of the wrong type. ........ r74903 | georg.brandl | 2009-09-18 04:18:27 -0500 (Fri, 18 Sep 2009) | 1 line #6938: "ident" is always a string, so use a format code which works. ........ r74908 | georg.brandl | 2009-09-18 08:57:11 -0500 (Fri, 18 Sep 2009) | 1 line Use str.format() to fix beginner's mistake with %-style string formatting. ........ r74912 | georg.brandl | 2009-09-18 11:19:56 -0500 (Fri, 18 Sep 2009) | 1 line Optimize optimization and fix method name in docstring. ........ r74930 | georg.brandl | 2009-09-18 16:21:41 -0500 (Fri, 18 Sep 2009) | 1 line #6925: rewrite docs for locals() and vars() a bit. ........ r74933 | georg.brandl | 2009-09-18 16:35:59 -0500 (Fri, 18 Sep 2009) | 1 line #6930: clarify description about byteorder handling in UTF decoder routines. ........ r74943 | georg.brandl | 2009-09-19 02:35:07 -0500 (Sat, 19 Sep 2009) | 1 line #6944: the argument to PyArg_ParseTuple should be a tuple, otherwise a SystemError is set. Also clean up another usage of PyArg_ParseTuple. ........ r74946 | georg.brandl | 2009-09-19 03:43:16 -0500 (Sat, 19 Sep 2009) | 1 line Update bug tracker reference. ........ r74952 | georg.brandl | 2009-09-19 05:42:34 -0500 (Sat, 19 Sep 2009) | 1 line #6946: fix duplicate index entries for datetime classes. ........ r74953 | georg.brandl | 2009-09-19 07:04:16 -0500 (Sat, 19 Sep 2009) | 1 line Fix references to threading.enumerate(). ........ r74954 | georg.brandl | 2009-09-19 08:13:56 -0500 (Sat, 19 Sep 2009) | 1 line Add Doug. ........ r74955 | georg.brandl | 2009-09-19 08:20:49 -0500 (Sat, 19 Sep 2009) | 1 line Add Mark Summerfield. ........ r75015 | georg.brandl | 2009-09-22 05:55:08 -0500 (Tue, 22 Sep 2009) | 1 line Fix encoding name. ........ r75019 | vinay.sajip | 2009-09-22 12:23:41 -0500 (Tue, 22 Sep 2009) | 1 line Fixed a typo, and added sections on optimization and using arbitrary objects as messages. ........ r75032 | benjamin.peterson | 2009-09-22 17:15:28 -0500 (Tue, 22 Sep 2009) | 1 line fix typos/rephrase ........ r75068 | benjamin.peterson | 2009-09-25 21:57:59 -0500 (Fri, 25 Sep 2009) | 1 line comment out ugly xxx ........ r75076 | vinay.sajip | 2009-09-26 09:53:32 -0500 (Sat, 26 Sep 2009) | 1 line Tidied up name of parameter in StreamHandler ........ r75095 | michael.foord | 2009-09-27 14:15:41 -0500 (Sun, 27 Sep 2009) | 1 line Test creation moved from TestProgram.parseArgs to TestProgram.createTests exclusively. Issue 6956. ........ r75098 | michael.foord | 2009-09-27 15:08:23 -0500 (Sun, 27 Sep 2009) | 1 line Documentation improvement for load_tests protocol in unittest. Issue 6515. ........ r75102 | skip.montanaro | 2009-09-27 21:12:27 -0500 (Sun, 27 Sep 2009) | 3 lines Patch from Thomas Barr so that csv.Sniffer will set doublequote property. Closes issue 6606. ........ r75129 | vinay.sajip | 2009-09-29 02:08:54 -0500 (Tue, 29 Sep 2009) | 1 line Issue #7014: logging: Improved IronPython 2.6 compatibility. ........ r75139 | raymond.hettinger | 2009-09-29 13:53:24 -0500 (Tue, 29 Sep 2009) | 3 lines Issue 7008: Better document str.title and show how to work around the apostrophe problem. ........ r75230 | benjamin.peterson | 2009-10-04 08:38:38 -0500 (Sun, 04 Oct 2009) | 1 line test logging ........ ................
174 lines
5.2 KiB
Python
174 lines
5.2 KiB
Python
"""Utilities to get a password and/or the current user name.
|
|
|
|
getpass(prompt[, stream]) - Prompt for a password, with echo turned off.
|
|
getuser() - Get the user name from the environment or password database.
|
|
|
|
GetPassWarning - This UserWarning is issued when getpass() cannot prevent
|
|
echoing of the password contents while reading.
|
|
|
|
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)
|
|
# Gregory P. Smith (tty support & GetPassWarning)
|
|
|
|
import os, sys, warnings
|
|
|
|
__all__ = ["getpass","getuser","GetPassWarning"]
|
|
|
|
|
|
class GetPassWarning(UserWarning): pass
|
|
|
|
|
|
def unix_getpass(prompt='Password: ', stream=None):
|
|
"""Prompt for a password, with echo turned off.
|
|
|
|
Args:
|
|
prompt: Written on stream to ask for the input. Default: 'Password: '
|
|
stream: A writable file object to display the prompt. Defaults to
|
|
the tty. If no tty is available defaults to sys.stderr.
|
|
Returns:
|
|
The seKr3t input.
|
|
Raises:
|
|
EOFError: If our input tty or stdin was closed.
|
|
GetPassWarning: When we were unable to turn echo off on the input.
|
|
|
|
Always restores terminal settings before returning.
|
|
"""
|
|
fd = None
|
|
tty = None
|
|
try:
|
|
# Always try reading and writing directly on the tty first.
|
|
fd = os.open('/dev/tty', os.O_RDWR|os.O_NOCTTY)
|
|
tty = os.fdopen(fd, 'w+', 1)
|
|
input = tty
|
|
if not stream:
|
|
stream = tty
|
|
except EnvironmentError as e:
|
|
# If that fails, see if stdin can be controlled.
|
|
try:
|
|
fd = sys.stdin.fileno()
|
|
except (AttributeError, ValueError):
|
|
passwd = fallback_getpass(prompt, stream)
|
|
input = sys.stdin
|
|
if not stream:
|
|
stream = sys.stderr
|
|
|
|
if fd is not None:
|
|
passwd = None
|
|
try:
|
|
old = termios.tcgetattr(fd) # a copy to save
|
|
new = old[:]
|
|
new[3] &= ~termios.ECHO # 3 == 'lflags'
|
|
try:
|
|
termios.tcsetattr(fd, termios.TCSADRAIN, new)
|
|
passwd = _raw_input(prompt, stream, input=input)
|
|
finally:
|
|
termios.tcsetattr(fd, termios.TCSADRAIN, old)
|
|
except termios.error as e:
|
|
if passwd is not None:
|
|
# _raw_input succeeded. The final tcsetattr failed. Reraise
|
|
# instead of leaving the terminal in an unknown state.
|
|
raise
|
|
# We can't control the tty or stdin. Give up and use normal IO.
|
|
# fallback_getpass() raises an appropriate warning.
|
|
del input, tty # clean up unused file objects before blocking
|
|
passwd = fallback_getpass(prompt, stream)
|
|
|
|
stream.write('\n')
|
|
return passwd
|
|
|
|
|
|
def win_getpass(prompt='Password: ', stream=None):
|
|
"""Prompt for password with echo off, using Windows getch()."""
|
|
if sys.stdin is not sys.__stdin__:
|
|
return fallback_getpass(prompt, stream)
|
|
import msvcrt
|
|
for c in prompt:
|
|
msvcrt.putwch(c)
|
|
pw = ""
|
|
while 1:
|
|
c = msvcrt.getwch()
|
|
if c == '\r' or c == '\n':
|
|
break
|
|
if c == '\003':
|
|
raise KeyboardInterrupt
|
|
if c == '\b':
|
|
pw = pw[:-1]
|
|
else:
|
|
pw = pw + c
|
|
msvcrt.putwch('\r')
|
|
msvcrt.putwch('\n')
|
|
return pw
|
|
|
|
|
|
def fallback_getpass(prompt='Password: ', stream=None):
|
|
warnings.warn("Can not control echo on the terminal.", GetPassWarning,
|
|
stacklevel=2)
|
|
if not stream:
|
|
stream = sys.stderr
|
|
print("Warning: Password input may be echoed.", file=stream)
|
|
return _raw_input(prompt, stream)
|
|
|
|
|
|
def _raw_input(prompt="", stream=None, input=None):
|
|
# This doesn't save the string in the GNU readline history.
|
|
if not stream:
|
|
stream = sys.stderr
|
|
if not input:
|
|
input = sys.stdin
|
|
prompt = str(prompt)
|
|
if prompt:
|
|
stream.write(prompt)
|
|
stream.flush()
|
|
line = input.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
|
|
# it's possible there is an incompatible termios from the
|
|
# McMillan Installer, make sure we have a UNIX-compatible termios
|
|
termios.tcgetattr, termios.tcsetattr
|
|
except (ImportError, AttributeError):
|
|
try:
|
|
import msvcrt
|
|
except ImportError:
|
|
try:
|
|
from EasyDialogs import AskPassword
|
|
except ImportError:
|
|
getpass = fallback_getpass
|
|
else:
|
|
getpass = AskPassword
|
|
else:
|
|
getpass = win_getpass
|
|
else:
|
|
getpass = unix_getpass
|