Skip to content

Commit

Permalink
Fixed #32235 -- Made ReadOnlyPasswordHashField disabled by default.
Browse files Browse the repository at this point in the history
  • Loading branch information
timobrembeck authored and felixxm committed Dec 3, 2020
1 parent d746f28 commit d8dfff2
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 21 deletions.
15 changes: 1 addition & 14 deletions django/contrib/auth/forms.py
Expand Up @@ -56,16 +56,9 @@ class ReadOnlyPasswordHashField(forms.Field):

def __init__(self, *args, **kwargs):
kwargs.setdefault("required", False)
kwargs.setdefault('disabled', True)
super().__init__(*args, **kwargs)

def bound_data(self, data, initial):
# Always return initial because the widget doesn't
# render an input field.
return initial

def has_changed(self, initial, data):
return False


class UsernameField(forms.CharField):
def to_python(self, value):
Expand Down Expand Up @@ -163,12 +156,6 @@ def __init__(self, *args, **kwargs):
if user_permissions:
user_permissions.queryset = user_permissions.queryset.select_related('content_type')

def clean_password(self):
# Regardless of what the user provides, return the initial value.
# This is done here, rather than on the field, because the
# field does not have access to the initial value
return self.initial.get('password')


class AuthenticationForm(forms.Form):
"""
Expand Down
5 changes: 5 additions & 0 deletions docs/releases/3.2.txt
Expand Up @@ -625,6 +625,11 @@ Miscellaneous
using :option:`makemessages --locale` option, when they contain hyphens
(``'-'``).

* The ``django.contrib.auth.forms.ReadOnlyPasswordHashField`` form field is now
:attr:`~django.forms.Field.disabled` by default. Therefore
``UserChangeForm.clean_password()`` is no longer required to return the
initial value.

.. _deprecated-features-3.2:

Features deprecated in 3.2
Expand Down
15 changes: 8 additions & 7 deletions docs/topics/auth/customizing.txt
Expand Up @@ -1129,20 +1129,14 @@ code would be required in the app's ``admin.py`` file::
class UserChangeForm(forms.ModelForm):
"""A form for updating users. Includes all the fields on
the user, but replaces the password field with admin's
password hash display field.
disabled password hash display field.
"""
password = ReadOnlyPasswordHashField()

class Meta:
model = MyUser
fields = ('email', 'password', 'date_of_birth', 'is_active', 'is_admin')

def clean_password(self):
# Regardless of what the user provides, return the initial value.
# This is done here, rather than on the field, because the
# field does not have access to the initial value
return self.initial["password"]


class UserAdmin(BaseUserAdmin):
# The forms to add and change user instances
Expand Down Expand Up @@ -1182,3 +1176,10 @@ Finally, specify the custom model as the default user model for your project
using the :setting:`AUTH_USER_MODEL` setting in your ``settings.py``::

AUTH_USER_MODEL = 'customauth.MyUser'

.. versionchanged:: 3.2

In older versions, ``ReadOnlyPasswordHashField`` is not
:attr:`~django.forms.Field.disabled` by default and
``UserChangeForm.clean_password()`` is required to return the initial
value, whatever the user provides.
1 change: 1 addition & 0 deletions tests/auth_tests/test_forms.py
Expand Up @@ -1022,6 +1022,7 @@ def test_render(self):

def test_readonly_field_has_changed(self):
field = ReadOnlyPasswordHashField()
self.assertIs(field.disabled, True)
self.assertFalse(field.has_changed('aaa', 'bbb'))


Expand Down

0 comments on commit d8dfff2

Please sign in to comment.