authentik.policies.password.tests.test_zxcvbn

Password Policy zxcvbn tests

 1"""Password Policy zxcvbn tests"""
 2
 3from django.test import TestCase
 4from guardian.shortcuts import get_anonymous_user
 5
 6from authentik.lib.generators import generate_key
 7from authentik.policies.password.models import PasswordPolicy
 8from authentik.policies.types import PolicyRequest, PolicyResult
 9from authentik.stages.prompt.stage import PLAN_CONTEXT_PROMPT
10
11
12class TestPasswordPolicyZxcvbn(TestCase):
13    """Test Password Policy (zxcvbn)"""
14
15    def test_invalid(self):
16        """Test without password"""
17        policy = PasswordPolicy.objects.create(
18            check_zxcvbn=True,
19            check_static_rules=False,
20            name="test_invalid",
21        )
22        request = PolicyRequest(get_anonymous_user())
23        result: PolicyResult = policy.passes(request)
24        self.assertFalse(result.passing)
25        self.assertEqual(result.messages[0], "Password not set in context")
26
27    def test_false(self):
28        """Failing password case"""
29        policy = PasswordPolicy.objects.create(
30            check_zxcvbn=True,
31            check_static_rules=False,
32            zxcvbn_score_threshold=3,
33            name="test_false",
34        )
35        request = PolicyRequest(get_anonymous_user())
36        request.context[PLAN_CONTEXT_PROMPT] = {"password": "password"}  # nosec
37        result: PolicyResult = policy.passes(request)
38        self.assertFalse(result.passing, result.messages)
39        self.assertEqual(result.messages[0], "Password is too weak.")
40        self.assertEqual(result.messages[1], "Add another word or two. Uncommon words are better.")
41
42        request.context[PLAN_CONTEXT_PROMPT] = {"password": "Awdccdw1234"}  # nosec
43        result: PolicyResult = policy.passes(request)
44        self.assertFalse(result.passing, result.messages)
45        self.assertEqual(result.messages[0], "Password is too weak.")
46        self.assertEqual(len(result.messages), 1)
47
48    def test_true(self):
49        """Positive password case"""
50        policy = PasswordPolicy.objects.create(
51            check_zxcvbn=True,
52            check_static_rules=False,
53            name="test_true",
54        )
55        request = PolicyRequest(get_anonymous_user())
56        request.context[PLAN_CONTEXT_PROMPT] = {"password": generate_key()}
57        result: PolicyResult = policy.passes(request)
58        self.assertTrue(result.passing)
59        self.assertEqual(result.messages, tuple())
class TestPasswordPolicyZxcvbn(django.test.testcases.TestCase):
13class TestPasswordPolicyZxcvbn(TestCase):
14    """Test Password Policy (zxcvbn)"""
15
16    def test_invalid(self):
17        """Test without password"""
18        policy = PasswordPolicy.objects.create(
19            check_zxcvbn=True,
20            check_static_rules=False,
21            name="test_invalid",
22        )
23        request = PolicyRequest(get_anonymous_user())
24        result: PolicyResult = policy.passes(request)
25        self.assertFalse(result.passing)
26        self.assertEqual(result.messages[0], "Password not set in context")
27
28    def test_false(self):
29        """Failing password case"""
30        policy = PasswordPolicy.objects.create(
31            check_zxcvbn=True,
32            check_static_rules=False,
33            zxcvbn_score_threshold=3,
34            name="test_false",
35        )
36        request = PolicyRequest(get_anonymous_user())
37        request.context[PLAN_CONTEXT_PROMPT] = {"password": "password"}  # nosec
38        result: PolicyResult = policy.passes(request)
39        self.assertFalse(result.passing, result.messages)
40        self.assertEqual(result.messages[0], "Password is too weak.")
41        self.assertEqual(result.messages[1], "Add another word or two. Uncommon words are better.")
42
43        request.context[PLAN_CONTEXT_PROMPT] = {"password": "Awdccdw1234"}  # nosec
44        result: PolicyResult = policy.passes(request)
45        self.assertFalse(result.passing, result.messages)
46        self.assertEqual(result.messages[0], "Password is too weak.")
47        self.assertEqual(len(result.messages), 1)
48
49    def test_true(self):
50        """Positive password case"""
51        policy = PasswordPolicy.objects.create(
52            check_zxcvbn=True,
53            check_static_rules=False,
54            name="test_true",
55        )
56        request = PolicyRequest(get_anonymous_user())
57        request.context[PLAN_CONTEXT_PROMPT] = {"password": generate_key()}
58        result: PolicyResult = policy.passes(request)
59        self.assertTrue(result.passing)
60        self.assertEqual(result.messages, tuple())

Test Password Policy (zxcvbn)

def test_invalid(self):
16    def test_invalid(self):
17        """Test without password"""
18        policy = PasswordPolicy.objects.create(
19            check_zxcvbn=True,
20            check_static_rules=False,
21            name="test_invalid",
22        )
23        request = PolicyRequest(get_anonymous_user())
24        result: PolicyResult = policy.passes(request)
25        self.assertFalse(result.passing)
26        self.assertEqual(result.messages[0], "Password not set in context")

Test without password

def test_false(self):
28    def test_false(self):
29        """Failing password case"""
30        policy = PasswordPolicy.objects.create(
31            check_zxcvbn=True,
32            check_static_rules=False,
33            zxcvbn_score_threshold=3,
34            name="test_false",
35        )
36        request = PolicyRequest(get_anonymous_user())
37        request.context[PLAN_CONTEXT_PROMPT] = {"password": "password"}  # nosec
38        result: PolicyResult = policy.passes(request)
39        self.assertFalse(result.passing, result.messages)
40        self.assertEqual(result.messages[0], "Password is too weak.")
41        self.assertEqual(result.messages[1], "Add another word or two. Uncommon words are better.")
42
43        request.context[PLAN_CONTEXT_PROMPT] = {"password": "Awdccdw1234"}  # nosec
44        result: PolicyResult = policy.passes(request)
45        self.assertFalse(result.passing, result.messages)
46        self.assertEqual(result.messages[0], "Password is too weak.")
47        self.assertEqual(len(result.messages), 1)

Failing password case

def test_true(self):
49    def test_true(self):
50        """Positive password case"""
51        policy = PasswordPolicy.objects.create(
52            check_zxcvbn=True,
53            check_static_rules=False,
54            name="test_true",
55        )
56        request = PolicyRequest(get_anonymous_user())
57        request.context[PLAN_CONTEXT_PROMPT] = {"password": generate_key()}
58        result: PolicyResult = policy.passes(request)
59        self.assertTrue(result.passing)
60        self.assertEqual(result.messages, tuple())

Positive password case