Skip to content

website/docs: add info about make install and recovery key (cherry-pick #20447 to version-2026.2)#20486

Merged
gergosimonyi merged 1 commit intoversion-2026.2from
cherry-pick/20447-to-version-2026.2
Feb 24, 2026
Merged

website/docs: add info about make install and recovery key (cherry-pick #20447 to version-2026.2)#20486
gergosimonyi merged 1 commit intoversion-2026.2from
cherry-pick/20447-to-version-2026.2

Conversation

@authentik-automation
Copy link
Contributor

Cherry-pick of #20447 to version-2026.2 branch.

Original PR: #20447
Original Author: @tanberry
Cherry-picked commit: 991f5fc

* add info about make install and recovery key

* fix formatting on troubleshooting tip

* Apply suggestion from @dominic-r

Signed-off-by: Dominic R <dominic@sdko.org>

* tweak to bump

* tweak

* tweaked words abouot make install per jens

* build

---------

Signed-off-by: Dominic R <dominic@sdko.org>
Co-authored-by: Dominic R <dominic@sdko.org>
Co-authored-by: Marcelo Elizeche Landó <marcelo@goauthentik.io>
@netlify
Copy link

netlify bot commented Feb 23, 2026

Deploy Preview for authentik-integrations ready!

Name Link
🔨 Latest commit 390a740
🔍 Latest deploy log https://app.netlify.com/projects/authentik-integrations/deploys/699ca8547d8c180008729527
😎 Deploy Preview https://deploy-preview-20486--authentik-integrations.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@netlify
Copy link

netlify bot commented Feb 23, 2026

Deploy Preview for authentik-docs ready!

Name Link
🔨 Latest commit 390a740
🔍 Latest deploy log https://app.netlify.com/projects/authentik-docs/deploys/699ca8540611a200087ada5b
😎 Deploy Preview https://deploy-preview-20486--authentik-docs.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@codecov
Copy link

codecov bot commented Feb 23, 2026

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
3020 1 3019 4
View the top 1 failed test(s) by shortest run time
authentik.policies.password.tests.test_hibp.TestPasswordPolicyHIBP::test_invalid
Stack Traces | 0.009s run time
self = <unittest.case._Outcome object at 0x7f1b1811aac0>
test_case = <authentik.policies.password.tests.test_hibp.TestPasswordPolicyHIBP testMethod=test_invalid>
subTest = False

    @contextlib.contextmanager
    def testPartExecutor(self, test_case, subTest=False):
        old_success = self.success
        self.success = True
        try:
>           yield

.../hostedtoolcache/Python/3.14.2................../x64/lib/python3.14/unittest/case.py:58: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <authentik.policies.password.tests.test_hibp.TestPasswordPolicyHIBP testMethod=test_invalid>
result = <TestCaseFunction test_invalid>

    def run(self, result=None):
        if result is None:
            result = self.defaultTestResult()
            startTestRun = getattr(result, 'startTestRun', None)
            stopTestRun = getattr(result, 'stopTestRun', None)
            if startTestRun is not None:
                startTestRun()
        else:
            stopTestRun = None
    
        result.startTest(self)
        try:
            testMethod = getattr(self, self._testMethodName)
            if (getattr(self.__class__, "__unittest_skip__", False) or
                getattr(testMethod, "__unittest_skip__", False)):
                # If the class or method was skipped.
                skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')
                            or getattr(testMethod, '__unittest_skip_why__', ''))
                _addSkip(result, self, skip_why)
                return result
    
            expecting_failure = (
                getattr(self, "__unittest_expecting_failure__", False) or
                getattr(testMethod, "__unittest_expecting_failure__", False)
            )
            outcome = _Outcome(result)
            start_time = time.perf_counter()
            try:
                self._outcome = outcome
    
                with outcome.testPartExecutor(self):
                    self._callSetUp()
                if outcome.success:
                    outcome.expecting_failure = expecting_failure
                    with outcome.testPartExecutor(self):
>                       self._callTestMethod(testMethod)

.../hostedtoolcache/Python/3.14.2................../x64/lib/python3.14/unittest/case.py:669: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <authentik.policies.password.tests.test_hibp.TestPasswordPolicyHIBP testMethod=test_invalid>
method = <bound method TestPasswordPolicyHIBP.test_invalid of <authentik.policies.password.tests.test_hibp.TestPasswordPolicyHIBP testMethod=test_invalid>>

    def _callTestMethod(self, method):
>       result = method()
                 ^^^^^^^^

.../hostedtoolcache/Python/3.14.2................../x64/lib/python3.14/unittest/case.py:615: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <authentik.policies.password.tests.test_hibp.TestPasswordPolicyHIBP testMethod=test_invalid>

    def test_invalid(self):
        """Test without password"""
        policy = PasswordPolicy.objects.create(
            check_have_i_been_pwned=True,
            check_static_rules=False,
            name="test_invalid",
        )
        request = PolicyRequest(get_anonymous_user())
        result: PolicyResult = policy.passes(request)
        self.assertFalse(result.passing)
>       self.assertEqual(result.messages[0], "Password not set in context")

.../password/tests/test_hibp.py:25: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <authentik.policies.password.tests.test_hibp.TestPasswordPolicyHIBP testMethod=test_invalid>
first = 'Mot de passe non défini dans le contexte'
second = 'Password not set in context', msg = None

    def assertEqual(self, first, second, msg=None):
        """Fail if the two objects are unequal as determined by the '=='
           operator.
        """
        assertion_func = self._getAssertEqualityFunc(first, second)
>       assertion_func(first, second, msg=msg)

.../hostedtoolcache/Python/3.14.2................../x64/lib/python3.14/unittest/case.py:925: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <authentik.policies.password.tests.test_hibp.TestPasswordPolicyHIBP testMethod=test_invalid>
first = 'Mot de passe non défini dans le contexte'
second = 'Password not set in context', msg = None

    def assertMultiLineEqual(self, first, second, msg=None):
        """Assert that two multi-line strings are equal."""
        self.assertIsInstance(first, str, "First argument is not a string")
        self.assertIsInstance(second, str, "Second argument is not a string")
    
        if first != second:
            # Don't use difflib if the strings are too long
            if (len(first) > self._diffThreshold or
                len(second) > self._diffThreshold):
                self._baseAssertEqual(first, second, msg)
    
            # Append \n to both strings if either is missing the \n.
            # This allows the final ndiff to show the \n difference. The
            # exception here is if the string is empty, in which case no
            # \n should be added
            first_presplit = first
            second_presplit = second
            if first and second:
                if first[-1] != '\n' or second[-1] != '\n':
                    first_presplit += '\n'
                    second_presplit += '\n'
            elif second and second[-1] != '\n':
                second_presplit += '\n'
            elif first and first[-1] != '\n':
                first_presplit += '\n'
    
            firstlines = first_presplit.splitlines(keepends=True)
            secondlines = second_presplit.splitlines(keepends=True)
    
            # Generate the message and diff, then raise the exception
            standardMsg = '%s != %s' % _common_shorten_repr(first, second)
            diff = '\n' + ''.join(difflib.ndiff(firstlines, secondlines))
            standardMsg = self._truncateMessage(standardMsg, diff)
>           self.fail(self._formatMessage(msg, standardMsg))

.../hostedtoolcache/Python/3.14.2................../x64/lib/python3.14/unittest/case.py:1291: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <authentik.policies.password.tests.test_hibp.TestPasswordPolicyHIBP testMethod=test_invalid>
msg = "'Mot de passe non défini dans le contexte' != 'Password not set in context'\n- Mot de passe non défini dans le contexte\n+ Password not set in context\n"

    def fail(self, msg=None):
        """Fail immediately, with the given message."""
>       raise self.failureException(msg)
E       AssertionError: 'Mot de passe non défini dans le contexte' != 'Password not set in context'
E       - Mot de passe non défini dans le contexte
E       + Password not set in context

.../hostedtoolcache/Python/3.14.2................../x64/lib/python3.14/unittest/case.py:750: AssertionError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@gergosimonyi gergosimonyi merged commit 84a605a into version-2026.2 Feb 24, 2026
161 of 176 checks passed
@gergosimonyi gergosimonyi deleted the cherry-pick/20447-to-version-2026.2 branch February 24, 2026 08:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants