summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Nester <andrew.nester.dev@gmail.com>2016-07-22 11:51:38 +0300
committerTim Graham <timograham@gmail.com>2016-08-10 15:08:06 -0400
commit4591cf3fd88fb13325ffce91279eae38e38c61cb (patch)
treea9e77bc9ed71afac84b0237a4689e908aef96322
parentf5c6295797b8332134fd89e0209a18a1d1d45e0c (diff)
Fixed #26909 -- Allowed UserAttributeSimilarityValidator to validate against model properties.
-rw-r--r--django/contrib/auth/password_validation.py9
-rw-r--r--tests/auth_tests/test_validators.py15
2 files changed, 22 insertions, 2 deletions
diff --git a/django/contrib/auth/password_validation.py b/django/contrib/auth/password_validation.py
index e5ab22b614..5fdae05a84 100644
--- a/django/contrib/auth/password_validation.py
+++ b/django/contrib/auth/password_validation.py
@@ -6,7 +6,9 @@ import re
from difflib import SequenceMatcher
from django.conf import settings
-from django.core.exceptions import ImproperlyConfigured, ValidationError
+from django.core.exceptions import (
+ FieldDoesNotExist, ImproperlyConfigured, ValidationError,
+)
from django.utils import lru_cache
from django.utils._os import upath
from django.utils.encoding import force_text
@@ -144,7 +146,10 @@ class UserAttributeSimilarityValidator(object):
value_parts = re.split('\W+', value) + [value]
for value_part in value_parts:
if SequenceMatcher(a=password.lower(), b=value_part.lower()).quick_ratio() > self.max_similarity:
- verbose_name = force_text(user._meta.get_field(attribute_name).verbose_name)
+ try:
+ verbose_name = force_text(user._meta.get_field(attribute_name).verbose_name)
+ except FieldDoesNotExist:
+ verbose_name = attribute_name
raise ValidationError(
_("The password is too similar to the %(verbose_name)s."),
code='password_too_similar',
diff --git a/tests/auth_tests/test_validators.py b/tests/auth_tests/test_validators.py
index 49a3c5395b..97cf396b1a 100644
--- a/tests/auth_tests/test_validators.py
+++ b/tests/auth_tests/test_validators.py
@@ -13,7 +13,9 @@ from django.contrib.auth.password_validation import (
validate_password,
)
from django.core.exceptions import ValidationError
+from django.db import models
from django.test import TestCase, override_settings
+from django.test.utils import isolate_apps
from django.utils._os import upath
@@ -127,6 +129,19 @@ class UserAttributeSimilarityValidatorTest(TestCase):
UserAttributeSimilarityValidator(user_attributes=['first_name']).validate('testclient', user=user)
)
+ @isolate_apps('auth_tests')
+ def test_validate_property(self):
+ class TestUser(models.Model):
+ pass
+
+ @property
+ def username(self):
+ return 'foobar'
+
+ with self.assertRaises(ValidationError) as cm:
+ UserAttributeSimilarityValidator().validate('foobar', user=TestUser()),
+ self.assertEqual(cm.exception.messages, ['The password is too similar to the username.'])
+
def test_help_text(self):
self.assertEqual(
UserAttributeSimilarityValidator().get_help_text(),