comparison mercurial/mail.py @ 45777:07b0a687c01a stable

ui: ensure `getpass()` returns bytes Previously, this could return either bytes or str. I'm not sure which direction we should go in, but since the input is bytes, I guess bytes makes sense as output. `debuguigetpass` crashed because it assumed bytes would be returned, `sslcontext.load_cert_chain()` is happy with bytes or str if the type info in PyCharm is correct, and `smtplib.SMTP.login()` wants str. I couldn't figure out how to test this, because the test stalls for input with `echo test | hg debuguigetpass --config ui.interactive=1`, likely because it drains stdin before prompting. The custom input reading with `ui.nontty=1` does not. I'm also a bit concerned with all of this encoding/decoding. The existing code in the mail module uses `encoding.strfromlocal()`, but the username and password are ascii encoded/decoded in `mercurial.url.passwordmgr.find_user_password()` with `pycompat.{str,bytes}url()`. I'm not sure if this inconsistency could cause subtle compatability issues. Differential Revision: https://phab.mercurial-scm.org/D9375
author Matt Harbison <matt_harbison@yahoo.com>
date Mon, 23 Nov 2020 11:47:06 -0500
parents 8f26dd09aa78
children 89a2afe31e82
comparison
equal deleted inserted replaced
45776:139b334c9392 45777:07b0a687c01a
155 if username: 155 if username:
156 if password: 156 if password:
157 password = encoding.strfromlocal(password) 157 password = encoding.strfromlocal(password)
158 else: 158 else:
159 password = ui.getpass() 159 password = ui.getpass()
160 if password is not None:
161 password = encoding.strfromlocal(password)
160 if username and password: 162 if username and password:
161 ui.note(_(b'(authenticating to mail server as %s)\n') % username) 163 ui.note(_(b'(authenticating to mail server as %s)\n') % username)
162 username = encoding.strfromlocal(username) 164 username = encoding.strfromlocal(username)
163 try: 165 try:
164 s.login(username, password) 166 s.login(username, password)