228 lines
8.5 KiB
Python
228 lines
8.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
from django.core.exceptions import ValidationError
|
|
from django.test import SimpleTestCase
|
|
|
|
from ..validators import PasswordScoreValidator, CustomWordlistPasswordValidator, CharacterClassPasswordValidator
|
|
|
|
|
|
class PasswordScoreValidatorTestCase(SimpleTestCase):
|
|
def test_too_little_score(self):
|
|
passwords = [
|
|
'', # score = 0
|
|
'abcdefghijklmnopq', # score = 17
|
|
'Abcdefghijklmnop', # score = 16 + 1
|
|
'ABcdefghijklmno', # score = 15 + 2
|
|
'AB1defghijklmn', # score = 14 + 2 + 1
|
|
'AB12efghijklm', # score = 13 + 2 + 2
|
|
'AB12+fghijkl', # score = 12 + 2 + 2 + 1
|
|
'AB12+-ghijk', # score = 11 + 2 + 2 + 2
|
|
'AB12+-*hij', # score = 10 + 2 + 2 + 3
|
|
'AB12+-*hi/', # score = 10 + 2 + 2 + 3
|
|
'AB12+-*hi3', # score = 10 + 2 + 2 + 3
|
|
'AB12+-*hiC', # score = 10 + 2 + 2 + 3
|
|
'abcbbbgbbjklmnopqr', # score = 17
|
|
]
|
|
|
|
validator = PasswordScoreValidator(min_classes=0)
|
|
|
|
for password in passwords:
|
|
try:
|
|
validator.validate(password)
|
|
except ValidationError as e:
|
|
self.assertEqual('too_little_score', e.code)
|
|
else:
|
|
self.fail('%s: no validation error was raised' % password)
|
|
|
|
def test_too_few_classes(self):
|
|
passwords = [
|
|
'', # classes = 0
|
|
'abcdefgh', # classes = 1
|
|
'abcdef+-', # classes = 2
|
|
'abcd12gh', # classes = 2
|
|
'abcd12-+', # classes = 3
|
|
'abCDefgh', # classes = 2
|
|
'abCDef+-', # classes = 3
|
|
'abCD12gh', # classes = 3
|
|
'ABCD12-+', # classes = 3
|
|
]
|
|
|
|
validator = PasswordScoreValidator(min_score=0, min_classes=4)
|
|
|
|
for password in passwords:
|
|
try:
|
|
validator.validate(password)
|
|
except ValidationError as e:
|
|
self.assertEqual('too_few_classes', e.code)
|
|
else:
|
|
self.fail('%s: no validation error was raised' % password)
|
|
|
|
def test_valid(self):
|
|
passwords = [
|
|
'Abcdefghijklmnopq',
|
|
'ABcdefghijklmnop',
|
|
'AB1defghijklmno',
|
|
'AB12efghijklmn',
|
|
'AB12+fghijklm',
|
|
'AB12+-ghijkl',
|
|
'AB12+-*hijk',
|
|
'ab1defghijklmnopq',
|
|
'abcd+fghijklmnopq',
|
|
'AB1CDEFGHIJKLMNOPQ',
|
|
]
|
|
|
|
validator = PasswordScoreValidator()
|
|
|
|
for password in passwords:
|
|
try:
|
|
validator.validate(password)
|
|
except ValidationError as e:
|
|
self.fail(e)
|
|
|
|
|
|
class CustomWordlistPasswordValidatorTestCase(SimpleTestCase):
|
|
def test_invalid(self):
|
|
invalid_passwords = [
|
|
('passwort', [
|
|
'Das Passwort darf nicht die Zeichenfolge \'passwort\' enthalten.',
|
|
]),
|
|
('abcdDaVefgh', [
|
|
'Das Passwort darf nicht die Zeichenfolge \'dav\' enthalten.',
|
|
]),
|
|
('abcdsektIonefgh', [
|
|
'Das Passwort darf nicht die Zeichenfolge \'sektion\' enthalten.',
|
|
]),
|
|
('alpen12verein34KArlsruhE berge', [
|
|
'Das Passwort darf nicht die Zeichenfolge \'karlsruhe\' enthalten.',
|
|
'Das Passwort darf nicht die Zeichenfolge \'berge\' enthalten.',
|
|
]),
|
|
('heinzel@alpenverein-karlsruhe.de', [
|
|
'Das Passwort darf nicht die Zeichenfolge \'heinzel\' enthalten.',
|
|
'Das Passwort darf nicht die Zeichenfolge \'alpenverein\' enthalten.',
|
|
'Das Passwort darf nicht die Zeichenfolge \'karlsruhe\' enthalten.',
|
|
]),
|
|
]
|
|
|
|
validator = CustomWordlistPasswordValidator()
|
|
|
|
for password, expected_errors in invalid_passwords:
|
|
try:
|
|
validator.validate(password)
|
|
except ValidationError as e:
|
|
errors = e.messages
|
|
for expected_error in expected_errors:
|
|
self.assertIn(expected_error, errors)
|
|
for error in errors:
|
|
self.assertIn(error, expected_errors)
|
|
else:
|
|
self.fail('%s: no validation error was raised' % password)
|
|
|
|
def test_valid(self):
|
|
passwords = [
|
|
'',
|
|
'password',
|
|
'münchen',
|
|
]
|
|
|
|
validator = CustomWordlistPasswordValidator()
|
|
|
|
for password in passwords:
|
|
try:
|
|
validator.validate(password)
|
|
except ValidationError as e:
|
|
self.fail(e)
|
|
|
|
|
|
class CharacterClassPasswordValidatorTestCase(SimpleTestCase):
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.validator = CharacterClassPasswordValidator()
|
|
|
|
def test_invalid(self):
|
|
invalid_passwords = [
|
|
('', [
|
|
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
|
|
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
|
|
'Das Passwort muss mindestens 2 Ziffern enthalten.',
|
|
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
|
|
]),
|
|
('A+-', [
|
|
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
|
|
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
|
|
'Das Passwort muss mindestens 2 Ziffern enthalten.',
|
|
]),
|
|
('1234567890*', [
|
|
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
|
|
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
|
|
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
|
|
]),
|
|
('34*/()', [
|
|
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
|
|
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
|
|
]),
|
|
('AA', [
|
|
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
|
|
'Das Passwort muss mindestens 2 Ziffern enthalten.',
|
|
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
|
|
]),
|
|
('CD0.,', [
|
|
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
|
|
'Das Passwort muss mindestens 2 Ziffern enthalten.',
|
|
]),
|
|
('EF56', [
|
|
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
|
|
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
|
|
]),
|
|
('8GH?!8', [
|
|
'Das Passwort muss mindestens 2 Kleinbuchstaben enthalten.',
|
|
]),
|
|
('bbX', [
|
|
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
|
|
'Das Passwort muss mindestens 2 Ziffern enthalten.',
|
|
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
|
|
]),
|
|
('$cd%', [
|
|
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
|
|
'Das Passwort muss mindestens 2 Ziffern enthalten.',
|
|
]),
|
|
('ef90', [
|
|
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
|
|
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
|
|
]),
|
|
('1g=h3~', [
|
|
'Das Passwort muss mindestens 2 Großbuchstaben enthalten.',
|
|
]),
|
|
('Gi&jH', [
|
|
'Das Passwort muss mindestens 2 Ziffern enthalten.',
|
|
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
|
|
]),
|
|
('IkK:i;', [
|
|
'Das Passwort muss mindestens 2 Ziffern enthalten.',
|
|
]),
|
|
('mKn4L8', [
|
|
'Das Passwort muss mindestens 2 Sonderzeichen enthalten.',
|
|
]),
|
|
]
|
|
|
|
validator = self.validator
|
|
|
|
for password, expected_errors in invalid_passwords:
|
|
try:
|
|
validator.validate(password)
|
|
except ValidationError as e:
|
|
errors = e.messages
|
|
for expected_error in expected_errors:
|
|
self.assertIn(expected_error, errors)
|
|
for error in errors:
|
|
self.assertIn(error, expected_errors)
|
|
else:
|
|
self.fail('%s: no validation error was raised' % password)
|
|
|
|
def test_valid(self):
|
|
valid_passwords = ['abCD12+-']
|
|
validator = self.validator
|
|
for password in valid_passwords:
|
|
try:
|
|
validator.validate(password)
|
|
except ValidationError as e:
|
|
self.fail(e)
|