mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
Fixed #34565 -- Added support for async checking of user passwords.
This commit is contained in:
committed by
Mariusz Felisiak
parent
4e73d8c04d
commit
674c23999c
@@ -11,6 +11,7 @@ from django.contrib.auth.hashers import (
|
||||
PBKDF2PasswordHasher,
|
||||
PBKDF2SHA1PasswordHasher,
|
||||
ScryptPasswordHasher,
|
||||
acheck_password,
|
||||
check_password,
|
||||
get_hasher,
|
||||
identify_hasher,
|
||||
@@ -59,6 +60,15 @@ class TestUtilsHashPass(SimpleTestCase):
|
||||
self.assertTrue(check_password("", blank_encoded))
|
||||
self.assertFalse(check_password(" ", blank_encoded))
|
||||
|
||||
async def test_acheck_password(self):
|
||||
encoded = make_password("lètmein")
|
||||
self.assertIs(await acheck_password("lètmein", encoded), True)
|
||||
self.assertIs(await acheck_password("lètmeinz", encoded), False)
|
||||
# Blank passwords.
|
||||
blank_encoded = make_password("")
|
||||
self.assertIs(await acheck_password("", blank_encoded), True)
|
||||
self.assertIs(await acheck_password(" ", blank_encoded), False)
|
||||
|
||||
def test_bytes(self):
|
||||
encoded = make_password(b"bytes_password")
|
||||
self.assertTrue(encoded.startswith("pbkdf2_sha256$"))
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
from unittest import mock
|
||||
|
||||
from asgiref.sync import sync_to_async
|
||||
|
||||
from django.conf.global_settings import PASSWORD_HASHERS
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.backends import ModelBackend
|
||||
@@ -312,6 +314,29 @@ class AbstractUserTestCase(TestCase):
|
||||
finally:
|
||||
hasher.iterations = old_iterations
|
||||
|
||||
@override_settings(PASSWORD_HASHERS=PASSWORD_HASHERS)
|
||||
async def test_acheck_password_upgrade(self):
|
||||
user = await sync_to_async(User.objects.create_user)(
|
||||
username="user", password="foo"
|
||||
)
|
||||
initial_password = user.password
|
||||
self.assertIs(await user.acheck_password("foo"), True)
|
||||
hasher = get_hasher("default")
|
||||
self.assertEqual("pbkdf2_sha256", hasher.algorithm)
|
||||
|
||||
old_iterations = hasher.iterations
|
||||
try:
|
||||
# Upgrade the password iterations.
|
||||
hasher.iterations = old_iterations + 1
|
||||
with mock.patch(
|
||||
"django.contrib.auth.password_validation.password_changed"
|
||||
) as pw_changed:
|
||||
self.assertIs(await user.acheck_password("foo"), True)
|
||||
self.assertEqual(pw_changed.call_count, 0)
|
||||
self.assertNotEqual(initial_password, user.password)
|
||||
finally:
|
||||
hasher.iterations = old_iterations
|
||||
|
||||
|
||||
class CustomModelBackend(ModelBackend):
|
||||
def with_perm(
|
||||
|
||||
Reference in New Issue
Block a user