Skip to content

Commit 6c71075

Browse files
committed
accept suggestions
1 parent da00d07 commit 6c71075

File tree

2 files changed

+32
-20
lines changed

2 files changed

+32
-20
lines changed

Doc/library/getpass.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ The :mod:`getpass` module provides two functions:
3939
If you call getpass from within IDLE, the input may be done in the
4040
terminal you launched IDLE from rather than the idle window itself.
4141

42+
.. versionchanged:: next
43+
Added the *echochar* parameter for keyboard feedback.
44+
4245
.. exception:: GetPassWarning
4346

4447
A :exc:`UserWarning` subclass issued when password input may be echoed.

Lib/getpass.py

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def unix_getpass(prompt='Password: ', stream=None, *, echochar=None):
3434
stream: A writable file object to display the prompt. Defaults to
3535
the tty. If no tty is available defaults to sys.stderr.
3636
echochar: A string used to mask input (e.g., '*'). If None, input is
37-
hidden.
37+
hidden.
3838
Returns:
3939
The seKr3t input.
4040
Raises:
@@ -83,25 +83,7 @@ def unix_getpass(prompt='Password: ', stream=None, *, echochar=None):
8383
stream.write('\n')
8484
return passwd
8585

86-
passwd = ""
87-
stream.write(prompt)
88-
stream.flush()
89-
while True:
90-
char = input.read(1)
91-
if char == '\n' or char == '\r':
92-
break
93-
if char == '\x03':
94-
raise KeyboardInterrupt
95-
if char == '\x7f' or char == '\b':
96-
if echochar and passwd:
97-
stream.write("\b \b" * len(echochar))
98-
stream.flush()
99-
passwd = passwd[:-1]
100-
else:
101-
passwd += char
102-
if echochar:
103-
stream.write(echochar)
104-
stream.flush()
86+
passwd = _echochar_input(prompt, stream, input, echochar)
10587
finally:
10688
termios.tcsetattr(fd, tcsetattr_flags, old)
10789
stream.flush() # issue7208
@@ -186,6 +168,33 @@ def _raw_input(prompt="", stream=None, input=None):
186168
return line
187169

188170

171+
def _echochar_input(prompt="", stream=None, input=None, echochar=""):
172+
if not stream:
173+
stream = sys.stderr
174+
if not input:
175+
input = sys.stdin
176+
prompt = str(prompt)
177+
stream.write(prompt)
178+
stream.flush()
179+
passwd = ""
180+
while True:
181+
char = input.read(1)
182+
if char == '\n' or char == '\r':
183+
break
184+
if char == '\x03':
185+
raise KeyboardInterrupt
186+
if char == '\x7f' or char == '\b':
187+
if passwd:
188+
stream.write("\b \b" * len(echochar))
189+
stream.flush()
190+
passwd = passwd[:-1]
191+
else:
192+
passwd += char
193+
stream.write(echochar)
194+
stream.flush()
195+
return passwd
196+
197+
189198
def getuser():
190199
"""Get the username from the environment or password database.
191200

0 commit comments

Comments
 (0)