Bug #1445068: getpass.getpass() can now be given an explicit stream

argument to specify where to write the prompt.
This commit is contained in:
Georg Brandl 2006-03-31 18:42:16 +00:00
parent 22ec80bc4f
commit 338ef7d2bd
3 changed files with 24 additions and 12 deletions

View File

@ -11,11 +11,15 @@
The \module{getpass} module provides two functions: The \module{getpass} module provides two functions:
\begin{funcdesc}{getpass}{\optional{prompt}} \begin{funcdesc}{getpass}{\optional{prompt\optional{, stream}}}
Prompt the user for a password without echoing. The user is Prompt the user for a password without echoing. The user is
prompted using the string \var{prompt}, which defaults to prompted using the string \var{prompt}, which defaults to
\code{'Password: '}. \code{'Password: '}. On \UNIX, the prompt is written to the
file-like object \var{stream}, which defaults to
\code{sys.stdout} (this argument is ignored on Windows).
Availability: Macintosh, \UNIX, Windows. Availability: Macintosh, \UNIX, Windows.
\versionadded[The \var{stream} parameter]{2.5}
\end{funcdesc} \end{funcdesc}

View File

@ -15,11 +15,14 @@ import sys
__all__ = ["getpass","getuser"] __all__ = ["getpass","getuser"]
def unix_getpass(prompt='Password: '): def unix_getpass(prompt='Password: ', stream=None):
"""Prompt for a password, with echo turned off. """Prompt for a password, with echo turned off.
The prompt is written on stream, by default stdout.
Restore terminal settings at end. Restore terminal settings at end.
""" """
if stream is None:
stream = sys.stdout
try: try:
fd = sys.stdin.fileno() fd = sys.stdin.fileno()
@ -32,18 +35,18 @@ def unix_getpass(prompt='Password: '):
new[3] = new[3] & ~termios.ECHO # 3 == 'lflags' new[3] = new[3] & ~termios.ECHO # 3 == 'lflags'
try: try:
termios.tcsetattr(fd, termios.TCSADRAIN, new) termios.tcsetattr(fd, termios.TCSADRAIN, new)
passwd = _raw_input(prompt) passwd = _raw_input(prompt, stream)
finally: finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old) termios.tcsetattr(fd, termios.TCSADRAIN, old)
sys.stdout.write('\n') stream.write('\n')
return passwd return passwd
def win_getpass(prompt='Password: '): def win_getpass(prompt='Password: ', stream=None):
"""Prompt for password with echo off, using Windows getch().""" """Prompt for password with echo off, using Windows getch()."""
if sys.stdin is not sys.__stdin__: if sys.stdin is not sys.__stdin__:
return default_getpass(prompt) return default_getpass(prompt, stream)
import msvcrt import msvcrt
for c in prompt: for c in prompt:
msvcrt.putch(c) msvcrt.putch(c)
@ -63,17 +66,19 @@ def win_getpass(prompt='Password: '):
return pw return pw
def default_getpass(prompt='Password: '): def default_getpass(prompt='Password: ', stream=None):
print "Warning: Problem with getpass. Passwords may be echoed." print >>sys.stderr, "Warning: Problem with getpass. Passwords may be echoed."
return _raw_input(prompt) return _raw_input(prompt, stream)
def _raw_input(prompt=""): def _raw_input(prompt="", stream=None):
# A raw_input() replacement that doesn't save the string in the # A raw_input() replacement that doesn't save the string in the
# GNU readline history. # GNU readline history.
if stream is None:
stream = sys.stdout
prompt = str(prompt) prompt = str(prompt)
if prompt: if prompt:
sys.stdout.write(prompt) stream.write(prompt)
line = sys.stdin.readline() line = sys.stdin.readline()
if not line: if not line:
raise EOFError raise EOFError

View File

@ -487,6 +487,9 @@ Extension Modules
Library Library
------- -------
- Bug #1445068: getpass.getpass() can now be given an explicit stream
argument to specify where to write the prompt.
- Patch #1462313, bug #1443328: the pickle modules now can handle classes - Patch #1462313, bug #1443328: the pickle modules now can handle classes
that have __private names in their __slots__. that have __private names in their __slots__.