Skip to content

Commit 5a2c914

Browse files
flows: better test stage's challenge responses (cherry-pick #12316) (#12317)
flows: better test stage's challenge responses (#12316) Signed-off-by: Jens Langhammer <[email protected]> Co-authored-by: Jens L. <[email protected]>
1 parent f210625 commit 5a2c914

File tree

4 files changed

+21
-3
lines changed

4 files changed

+21
-3
lines changed

authentik/flows/stage.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from typing import TYPE_CHECKING
44

5+
from django.conf import settings
56
from django.contrib.auth.models import AnonymousUser
67
from django.http import HttpRequest
78
from django.http.request import QueryDict
@@ -224,6 +225,14 @@ def challenge_invalid(self, response: ChallengeResponse) -> HttpResponse:
224225
full_errors[field].append(field_error)
225226
challenge_response.initial_data["response_errors"] = full_errors
226227
if not challenge_response.is_valid():
228+
if settings.TEST:
229+
raise StageInvalidException(
230+
(
231+
f"Invalid challenge response: \n\t{challenge_response.errors}"
232+
f"\n\nValidated data:\n\t {challenge_response.data}"
233+
f"\n\nInitial data:\n\t {challenge_response.initial_data}"
234+
),
235+
)
227236
self.logger.error(
228237
"f(ch): invalid challenge response",
229238
errors=challenge_response.errors,

authentik/stages/authenticator_validate/stage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ def get_challenge(self) -> AuthenticatorValidationChallenge:
332332
serializer = SelectableStageSerializer(
333333
data={
334334
"pk": stage.pk,
335-
"name": getattr(stage, "friendly_name", stage.name),
335+
"name": getattr(stage, "friendly_name", stage.name) or stage.name,
336336
"verbose_name": str(stage._meta.verbose_name)
337337
.replace("Setup Stage", "")
338338
.strip(),

authentik/stages/authenticator_validate/tests/test_stage.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from django.test.client import RequestFactory
66
from django.urls.base import reverse
7+
from django.utils.timezone import now
78

89
from authentik.core.tests.utils import create_test_admin_user, create_test_flow
910
from authentik.flows.models import FlowDesignation, FlowStageBinding, NotConfiguredAction
@@ -13,6 +14,7 @@
1314
from authentik.lib.generators import generate_id, generate_key
1415
from authentik.stages.authenticator_duo.models import AuthenticatorDuoStage, DuoDevice
1516
from authentik.stages.authenticator_static.models import AuthenticatorStaticStage
17+
from authentik.stages.authenticator_totp.models import AuthenticatorTOTPStage, TOTPDigits
1618
from authentik.stages.authenticator_validate.api import AuthenticatorValidateStageSerializer
1719
from authentik.stages.authenticator_validate.models import AuthenticatorValidateStage, DeviceClasses
1820
from authentik.stages.authenticator_validate.stage import PLAN_CONTEXT_DEVICE_CHALLENGES
@@ -76,8 +78,8 @@ def test_not_configured_action_multiple(self):
7678
conf_stage = AuthenticatorStaticStage.objects.create(
7779
name=generate_id(),
7880
)
79-
conf_stage2 = AuthenticatorStaticStage.objects.create(
80-
name=generate_id(),
81+
conf_stage2 = AuthenticatorTOTPStage.objects.create(
82+
name=generate_id(), digits=TOTPDigits.SIX
8183
)
8284
stage = AuthenticatorValidateStage.objects.create(
8385
name=generate_id(),
@@ -153,10 +155,14 @@ def test_validate_selected_challenge(self):
153155
{
154156
"device_class": "static",
155157
"device_uid": "1",
158+
"challenge": {},
159+
"last_used": now(),
156160
},
157161
{
158162
"device_class": "totp",
159163
"device_uid": "2",
164+
"challenge": {},
165+
"last_used": now(),
160166
},
161167
]
162168
session[SESSION_KEY_PLAN] = plan

authentik/stages/identification/stage.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from authentik.flows.planner import PLAN_CONTEXT_PENDING_USER
2727
from authentik.flows.stage import PLAN_CONTEXT_PENDING_USER_IDENTIFIER, ChallengeStageView
2828
from authentik.flows.views.executor import SESSION_KEY_APPLICATION_PRE, SESSION_KEY_GET
29+
from authentik.lib.avatars import DEFAULT_AVATAR
2930
from authentik.lib.utils.reflection import all_subclasses
3031
from authentik.lib.utils.urls import reverse_with_qs
3132
from authentik.root.middleware import ClientIPMiddleware
@@ -224,6 +225,8 @@ def get_challenge(self) -> Challenge:
224225
"js_url": current_stage.captcha_stage.js_url,
225226
"site_key": current_stage.captcha_stage.public_key,
226227
"interactive": current_stage.captcha_stage.interactive,
228+
"pending_user": "",
229+
"pending_user_avatar": DEFAULT_AVATAR,
227230
}
228231
if current_stage.captcha_stage
229232
else None

0 commit comments

Comments
 (0)