comparison mercurial/windows.py @ 47038:5b3513177f2b stable

util: avoid echoing the password to the console on Windows py3 (issue6446) The `getpass.getpass()` implementation on Windows first checks if `sys.stdin` and `sys.__stdin__` are the same object. It's not on py3 because the former is replaced in dispatch.py with something that doesn't normalize '\n' to '\r\n'. When they aren't the same object, it simply calls `sys.stdin.readline()` instead of the mscvrt functions that read the input characters before they are echoed. This simply copies the `getpass.win_getpass()` implementation without the stdin check, and byteifies around the edges. I'm not sure if there's a reasonable replacement for the check that we could implement. When echoing input into the hg command, the `ui.interactive()` check causes `ui.getpass()` to bail before getting here. If the proper config switches are used to bypass that and call this, the process stalls until '\n' is input into the console. So there could be a deadlock here when run by another command if the wrong config settings are applied. Differential Revision: https://phab.mercurial-scm.org/D10708
author Matt Harbison <matt_harbison@yahoo.com>
date Wed, 12 May 2021 12:41:52 -0400
parents d4ba4d51f85f
children f77404040776
comparison
equal deleted inserted replaced
47037:3af293735d0f 47038:5b3513177f2b
190 def _isatty(fp): 190 def _isatty(fp):
191 try: 191 try:
192 return fp.isatty() 192 return fp.isatty()
193 except AttributeError: 193 except AttributeError:
194 return False 194 return False
195
196
197 def get_password():
198 """Prompt for password with echo off, using Windows getch().
199
200 This shouldn't be called directly- use ``ui.getpass()`` instead, which
201 checks if the session is interactive first.
202 """
203 pw = ""
204 while True:
205 c = msvcrt.getwch()
206 if c == '\r' or c == '\n':
207 break
208 if c == '\003':
209 raise KeyboardInterrupt
210 if c == '\b':
211 pw = pw[:-1]
212 else:
213 pw = pw + c
214 msvcrt.putwch('\r')
215 msvcrt.putwch('\n')
216 return encoding.strtolocal(pw)
195 217
196 218
197 class winstdout(object): 219 class winstdout(object):
198 """Some files on Windows misbehave. 220 """Some files on Windows misbehave.
199 221