authentik.policies.password.tests.test_hibp

Password Policy HIBP tests

 1"""Password Policy HIBP 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 TestPasswordPolicyHIBP(TestCase):
13    """Test Password Policy (haveibeenpwned)"""
14
15    def test_invalid(self):
16        """Test without password"""
17        policy = PasswordPolicy.objects.create(
18            check_have_i_been_pwned=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_have_i_been_pwned=True,
31            check_static_rules=False,
32            name="test_false",
33        )
34        request = PolicyRequest(get_anonymous_user())
35        request.context[PLAN_CONTEXT_PROMPT] = {"password": "password"}  # nosec
36        result: PolicyResult = policy.passes(request)
37        self.assertFalse(result.passing)
38        self.assertTrue(result.messages[0].startswith("Password exists on "))
39
40    def test_true(self):
41        """Positive password case"""
42        policy = PasswordPolicy.objects.create(
43            check_have_i_been_pwned=True,
44            check_static_rules=False,
45            name="test_true",
46        )
47        request = PolicyRequest(get_anonymous_user())
48        request.context[PLAN_CONTEXT_PROMPT] = {"password": generate_key()}
49        result: PolicyResult = policy.passes(request)
50        self.assertTrue(result.passing)
51        self.assertEqual(result.messages, tuple())
class TestPasswordPolicyHIBP(django.test.testcases.TestCase):
13class TestPasswordPolicyHIBP(TestCase):
14    """Test Password Policy (haveibeenpwned)"""
15
16    def test_invalid(self):
17        """Test without password"""
18        policy = PasswordPolicy.objects.create(
19            check_have_i_been_pwned=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_have_i_been_pwned=True,
32            check_static_rules=False,
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)
39        self.assertTrue(result.messages[0].startswith("Password exists on "))
40
41    def test_true(self):
42        """Positive password case"""
43        policy = PasswordPolicy.objects.create(
44            check_have_i_been_pwned=True,
45            check_static_rules=False,
46            name="test_true",
47        )
48        request = PolicyRequest(get_anonymous_user())
49        request.context[PLAN_CONTEXT_PROMPT] = {"password": generate_key()}
50        result: PolicyResult = policy.passes(request)
51        self.assertTrue(result.passing)
52        self.assertEqual(result.messages, tuple())

Test Password Policy (haveibeenpwned)

def test_invalid(self):
16    def test_invalid(self):
17        """Test without password"""
18        policy = PasswordPolicy.objects.create(
19            check_have_i_been_pwned=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_have_i_been_pwned=True,
32            check_static_rules=False,
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)
39        self.assertTrue(result.messages[0].startswith("Password exists on "))

Failing password case

def test_true(self):
41    def test_true(self):
42        """Positive password case"""
43        policy = PasswordPolicy.objects.create(
44            check_have_i_been_pwned=True,
45            check_static_rules=False,
46            name="test_true",
47        )
48        request = PolicyRequest(get_anonymous_user())
49        request.context[PLAN_CONTEXT_PROMPT] = {"password": generate_key()}
50        result: PolicyResult = policy.passes(request)
51        self.assertTrue(result.passing)
52        self.assertEqual(result.messages, tuple())

Positive password case