Fixed #19807 -- Sanitized getpass input in createsuperuser

Python 2 getpass on Windows doesn't accept unicode, even when
containing only ascii chars.
Thanks Semmel for the report and tests.
This commit is contained in:
Claude Paroz 2013-02-15 15:44:27 +01:00
parent dcf8cd30ae
commit 02e5909f7a
2 changed files with 7 additions and 4 deletions

View File

@ -122,7 +122,7 @@ class Command(BaseCommand):
while password is None: while password is None:
if not password: if not password:
password = getpass.getpass() password = getpass.getpass()
password2 = getpass.getpass('Password (again): ') password2 = getpass.getpass(force_str('Password (again): '))
if password != password2: if password != password2:
self.stderr.write("Error: Your passwords didn't match.") self.stderr.write("Error: Your passwords didn't match.")
password = None password = None

View File

@ -13,7 +13,7 @@ from django.core.management import call_command
from django.test import TestCase from django.test import TestCase
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils.encoding import force_str from django.utils.encoding import force_str
from django.utils.six import StringIO from django.utils.six import binary_type, StringIO
def mock_inputs(inputs): def mock_inputs(inputs):
@ -24,8 +24,11 @@ def mock_inputs(inputs):
def inner(test_func): def inner(test_func):
def wrapped(*args): def wrapped(*args):
class mock_getpass: class mock_getpass:
pass @staticmethod
mock_getpass.getpass = staticmethod(lambda p=None: inputs['password']) def getpass(prompt=b'Password: ', stream=None):
# getpass on Windows only supports prompt as bytestring (#19807)
assert isinstance(prompt, binary_type)
return inputs['password']
def mock_input(prompt): def mock_input(prompt):
# prompt should be encoded in Python 2. This line will raise an # prompt should be encoded in Python 2. This line will raise an