HomePhabricator

ui: ensure `getpass()` returns bytes

Authored by mharbison72.

Description

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

Details

Committed
mharbison72Nov 23 2020, 11:47 AM
Differential Revision
D9375: ui: ensure `getpass()` returns bytes
Parents
rHG62329b759635: packaging: regenerate the Windows requirements manifest on Windows
Branches
Unknown
Tags
Unknown