Mercurial > public > mercurial-scm > hg-stable
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) |