Bug #1445068: getpass.getpass() can now be given an explicit stream
argument to specify where to write the prompt.
This commit is contained in:
parent
22ec80bc4f
commit
338ef7d2bd
|
@ -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}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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__.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue