Compare commits
	
		
			5 Commits
		
	
	
		
			dependabot
			...
			version-20
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8543e140ef | |||
| e2cf578afd | |||
| 0ce9fd9b2e | |||
| d17ad65435 | |||
| 01529d3894 | 
| @ -1,5 +1,6 @@ | |||||||
| """authentik consent stage""" | """authentik consent stage""" | ||||||
| from typing import Optional | from typing import Optional | ||||||
|  | from uuid import uuid4 | ||||||
|  |  | ||||||
| from django.http import HttpRequest, HttpResponse | from django.http import HttpRequest, HttpResponse | ||||||
| from django.utils.timezone import now | from django.utils.timezone import now | ||||||
| @ -20,7 +21,8 @@ from authentik.stages.consent.models import ConsentMode, ConsentStage, UserConse | |||||||
| PLAN_CONTEXT_CONSENT_TITLE = "consent_title" | PLAN_CONTEXT_CONSENT_TITLE = "consent_title" | ||||||
| PLAN_CONTEXT_CONSENT_HEADER = "consent_header" | PLAN_CONTEXT_CONSENT_HEADER = "consent_header" | ||||||
| PLAN_CONTEXT_CONSENT_PERMISSIONS = "consent_permissions" | PLAN_CONTEXT_CONSENT_PERMISSIONS = "consent_permissions" | ||||||
| PLAN_CONTEXT_CONSNET_EXTRA_PERMISSIONS = "consent_additional_permissions" | PLAN_CONTEXT_CONSENT_EXTRA_PERMISSIONS = "consent_additional_permissions" | ||||||
|  | SESSION_KEY_CONSENT_TOKEN = "authentik/stages/consent/token"  # nosec | ||||||
|  |  | ||||||
|  |  | ||||||
| class ConsentChallenge(WithUserInfoChallenge): | class ConsentChallenge(WithUserInfoChallenge): | ||||||
| @ -30,12 +32,14 @@ class ConsentChallenge(WithUserInfoChallenge): | |||||||
|     permissions = PermissionSerializer(many=True) |     permissions = PermissionSerializer(many=True) | ||||||
|     additional_permissions = PermissionSerializer(many=True) |     additional_permissions = PermissionSerializer(many=True) | ||||||
|     component = CharField(default="ak-stage-consent") |     component = CharField(default="ak-stage-consent") | ||||||
|  |     token = CharField(required=True) | ||||||
|  |  | ||||||
|  |  | ||||||
| class ConsentChallengeResponse(ChallengeResponse): | class ConsentChallengeResponse(ChallengeResponse): | ||||||
|     """Consent challenge response, any valid response request is valid""" |     """Consent challenge response, any valid response request is valid""" | ||||||
|  |  | ||||||
|     component = CharField(default="ak-stage-consent") |     component = CharField(default="ak-stage-consent") | ||||||
|  |     token = CharField(required=True) | ||||||
|  |  | ||||||
|  |  | ||||||
| class ConsentStageView(ChallengeStageView): | class ConsentStageView(ChallengeStageView): | ||||||
| @ -44,12 +48,15 @@ class ConsentStageView(ChallengeStageView): | |||||||
|     response_class = ConsentChallengeResponse |     response_class = ConsentChallengeResponse | ||||||
|  |  | ||||||
|     def get_challenge(self) -> Challenge: |     def get_challenge(self) -> Challenge: | ||||||
|  |         token = str(uuid4()) | ||||||
|  |         self.request.session[SESSION_KEY_CONSENT_TOKEN] = token | ||||||
|         data = { |         data = { | ||||||
|             "type": ChallengeTypes.NATIVE.value, |             "type": ChallengeTypes.NATIVE.value, | ||||||
|             "permissions": self.executor.plan.context.get(PLAN_CONTEXT_CONSENT_PERMISSIONS, []), |             "permissions": self.executor.plan.context.get(PLAN_CONTEXT_CONSENT_PERMISSIONS, []), | ||||||
|             "additional_permissions": self.executor.plan.context.get( |             "additional_permissions": self.executor.plan.context.get( | ||||||
|                 PLAN_CONTEXT_CONSNET_EXTRA_PERMISSIONS, [] |                 PLAN_CONTEXT_CONSENT_EXTRA_PERMISSIONS, [] | ||||||
|             ), |             ), | ||||||
|  |             "token": token, | ||||||
|         } |         } | ||||||
|         if PLAN_CONTEXT_CONSENT_TITLE in self.executor.plan.context: |         if PLAN_CONTEXT_CONSENT_TITLE in self.executor.plan.context: | ||||||
|             data["title"] = self.executor.plan.context[PLAN_CONTEXT_CONSENT_TITLE] |             data["title"] = self.executor.plan.context[PLAN_CONTEXT_CONSENT_TITLE] | ||||||
| @ -85,14 +92,14 @@ class ConsentStageView(ChallengeStageView): | |||||||
|  |  | ||||||
|         if consent: |         if consent: | ||||||
|             perms = self.executor.plan.context.get(PLAN_CONTEXT_CONSENT_PERMISSIONS, []) |             perms = self.executor.plan.context.get(PLAN_CONTEXT_CONSENT_PERMISSIONS, []) | ||||||
|             allowed_perms = set(consent.permissions.split(" ")) |             allowed_perms = set(consent.permissions.split(" ") if consent.permissions != "" else []) | ||||||
|             requested_perms = set(x["id"] for x in perms) |             requested_perms = set(x["id"] for x in perms) | ||||||
|  |  | ||||||
|             if allowed_perms != requested_perms: |             if allowed_perms != requested_perms: | ||||||
|                 self.executor.plan.context[PLAN_CONTEXT_CONSENT_PERMISSIONS] = [ |                 self.executor.plan.context[PLAN_CONTEXT_CONSENT_PERMISSIONS] = [ | ||||||
|                     x for x in perms if x["id"] in allowed_perms |                     x for x in perms if x["id"] in allowed_perms | ||||||
|                 ] |                 ] | ||||||
|                 self.executor.plan.context[PLAN_CONTEXT_CONSNET_EXTRA_PERMISSIONS] = [ |                 self.executor.plan.context[PLAN_CONTEXT_CONSENT_EXTRA_PERMISSIONS] = [ | ||||||
|                     x for x in perms if x["id"] in requested_perms.difference(allowed_perms) |                     x for x in perms if x["id"] in requested_perms.difference(allowed_perms) | ||||||
|                 ] |                 ] | ||||||
|                 return super().get(request, *args, **kwargs) |                 return super().get(request, *args, **kwargs) | ||||||
| @ -102,13 +109,15 @@ class ConsentStageView(ChallengeStageView): | |||||||
|         return super().get(request, *args, **kwargs) |         return super().get(request, *args, **kwargs) | ||||||
|  |  | ||||||
|     def challenge_valid(self, response: ChallengeResponse) -> HttpResponse: |     def challenge_valid(self, response: ChallengeResponse) -> HttpResponse: | ||||||
|  |         if response.data["token"] != self.request.session[SESSION_KEY_CONSENT_TOKEN]: | ||||||
|  |             return self.get(self.request) | ||||||
|         current_stage: ConsentStage = self.executor.current_stage |         current_stage: ConsentStage = self.executor.current_stage | ||||||
|         if PLAN_CONTEXT_APPLICATION not in self.executor.plan.context: |         if PLAN_CONTEXT_APPLICATION not in self.executor.plan.context: | ||||||
|             return self.executor.stage_ok() |             return self.executor.stage_ok() | ||||||
|         application = self.executor.plan.context[PLAN_CONTEXT_APPLICATION] |         application = self.executor.plan.context[PLAN_CONTEXT_APPLICATION] | ||||||
|         permissions = self.executor.plan.context.get( |         permissions = self.executor.plan.context.get( | ||||||
|             PLAN_CONTEXT_CONSENT_PERMISSIONS, [] |             PLAN_CONTEXT_CONSENT_PERMISSIONS, [] | ||||||
|         ) + self.executor.plan.context.get(PLAN_CONTEXT_CONSNET_EXTRA_PERMISSIONS, []) |         ) + self.executor.plan.context.get(PLAN_CONTEXT_CONSENT_EXTRA_PERMISSIONS, []) | ||||||
|         permissions_string = " ".join(x["id"] for x in permissions) |         permissions_string = " ".join(x["id"] for x in permissions) | ||||||
|         # Make this StageView work when injected, in which case `current_stage` is an instance |         # Make this StageView work when injected, in which case `current_stage` is an instance | ||||||
|         # of the base class, and we don't save any consent, as it is assumed to be a one-time |         # of the base class, and we don't save any consent, as it is assumed to be a one-time | ||||||
| @ -116,18 +125,14 @@ class ConsentStageView(ChallengeStageView): | |||||||
|         if not isinstance(current_stage, ConsentStage): |         if not isinstance(current_stage, ConsentStage): | ||||||
|             return self.executor.stage_ok() |             return self.executor.stage_ok() | ||||||
|         # Since we only get here when no consent exists, we can create it without update |         # Since we only get here when no consent exists, we can create it without update | ||||||
|  |         consent = UserConsent( | ||||||
|  |             user=self.request.user, | ||||||
|  |             application=application, | ||||||
|  |             permissions=permissions_string, | ||||||
|  |         ) | ||||||
|         if current_stage.mode == ConsentMode.PERMANENT: |         if current_stage.mode == ConsentMode.PERMANENT: | ||||||
|             UserConsent.objects.create( |             consent.expiring = False | ||||||
|                 user=self.request.user, |  | ||||||
|                 application=application, |  | ||||||
|                 expiring=False, |  | ||||||
|                 permissions=permissions_string, |  | ||||||
|             ) |  | ||||||
|         if current_stage.mode == ConsentMode.EXPIRING: |         if current_stage.mode == ConsentMode.EXPIRING: | ||||||
|             UserConsent.objects.create( |             consent.expires = now() + timedelta_from_string(current_stage.consent_expire_in) | ||||||
|                 user=self.request.user, |         consent.save() | ||||||
|                 application=application, |  | ||||||
|                 expires=now() + timedelta_from_string(current_stage.consent_expire_in), |  | ||||||
|                 permissions=permissions_string, |  | ||||||
|             ) |  | ||||||
|         return self.executor.stage_ok() |         return self.executor.stage_ok() | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| """consent tests""" | """consent tests""" | ||||||
| from time import sleep | from time import sleep | ||||||
|  | from uuid import uuid4 | ||||||
|  |  | ||||||
| from django.urls import reverse | from django.urls import reverse | ||||||
|  |  | ||||||
| @ -14,7 +15,10 @@ from authentik.flows.tests import FlowTestCase | |||||||
| from authentik.flows.views.executor import SESSION_KEY_PLAN | from authentik.flows.views.executor import SESSION_KEY_PLAN | ||||||
| from authentik.lib.generators import generate_id | from authentik.lib.generators import generate_id | ||||||
| from authentik.stages.consent.models import ConsentMode, ConsentStage, UserConsent | from authentik.stages.consent.models import ConsentMode, ConsentStage, UserConsent | ||||||
| from authentik.stages.consent.stage import PLAN_CONTEXT_CONSENT_PERMISSIONS | from authentik.stages.consent.stage import ( | ||||||
|  |     PLAN_CONTEXT_CONSENT_PERMISSIONS, | ||||||
|  |     SESSION_KEY_CONSENT_TOKEN, | ||||||
|  | ) | ||||||
|  |  | ||||||
|  |  | ||||||
| class TestConsentStage(FlowTestCase): | class TestConsentStage(FlowTestCase): | ||||||
| @ -37,10 +41,13 @@ class TestConsentStage(FlowTestCase): | |||||||
|         plan = FlowPlan(flow_pk=flow.pk.hex, bindings=[binding], markers=[StageMarker()]) |         plan = FlowPlan(flow_pk=flow.pk.hex, bindings=[binding], markers=[StageMarker()]) | ||||||
|         session = self.client.session |         session = self.client.session | ||||||
|         session[SESSION_KEY_PLAN] = plan |         session[SESSION_KEY_PLAN] = plan | ||||||
|  |         session[SESSION_KEY_CONSENT_TOKEN] = str(uuid4()) | ||||||
|         session.save() |         session.save() | ||||||
|         response = self.client.post( |         response = self.client.post( | ||||||
|             reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), |             reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), | ||||||
|             {}, |             { | ||||||
|  |                 "token": session[SESSION_KEY_CONSENT_TOKEN], | ||||||
|  |             }, | ||||||
|         ) |         ) | ||||||
|         # pylint: disable=no-member |         # pylint: disable=no-member | ||||||
|         self.assertEqual(response.status_code, 200) |         self.assertEqual(response.status_code, 200) | ||||||
| @ -62,10 +69,13 @@ class TestConsentStage(FlowTestCase): | |||||||
|         ) |         ) | ||||||
|         session = self.client.session |         session = self.client.session | ||||||
|         session[SESSION_KEY_PLAN] = plan |         session[SESSION_KEY_PLAN] = plan | ||||||
|  |         session[SESSION_KEY_CONSENT_TOKEN] = str(uuid4()) | ||||||
|         session.save() |         session.save() | ||||||
|         response = self.client.post( |         response = self.client.post( | ||||||
|             reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), |             reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), | ||||||
|             {}, |             { | ||||||
|  |                 "token": session[SESSION_KEY_CONSENT_TOKEN], | ||||||
|  |             }, | ||||||
|         ) |         ) | ||||||
|         self.assertEqual(response.status_code, 200) |         self.assertEqual(response.status_code, 200) | ||||||
|         self.assertStageRedirects(response, reverse("authentik_core:root-redirect")) |         self.assertStageRedirects(response, reverse("authentik_core:root-redirect")) | ||||||
| @ -96,7 +106,7 @@ class TestConsentStage(FlowTestCase): | |||||||
|             {}, |             {}, | ||||||
|         ) |         ) | ||||||
|         self.assertEqual(response.status_code, 200) |         self.assertEqual(response.status_code, 200) | ||||||
|         self.assertStageResponse( |         raw_res = self.assertStageResponse( | ||||||
|             response, |             response, | ||||||
|             flow, |             flow, | ||||||
|             self.user, |             self.user, | ||||||
| @ -105,7 +115,9 @@ class TestConsentStage(FlowTestCase): | |||||||
|         ) |         ) | ||||||
|         response = self.client.post( |         response = self.client.post( | ||||||
|             reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), |             reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), | ||||||
|             {}, |             { | ||||||
|  |                 "token": raw_res["token"], | ||||||
|  |             }, | ||||||
|         ) |         ) | ||||||
|         self.assertEqual(response.status_code, 200) |         self.assertEqual(response.status_code, 200) | ||||||
|         self.assertStageRedirects(response, reverse("authentik_core:root-redirect")) |         self.assertStageRedirects(response, reverse("authentik_core:root-redirect")) | ||||||
| @ -144,7 +156,7 @@ class TestConsentStage(FlowTestCase): | |||||||
|             {}, |             {}, | ||||||
|         ) |         ) | ||||||
|         self.assertEqual(response.status_code, 200) |         self.assertEqual(response.status_code, 200) | ||||||
|         self.assertStageResponse( |         raw_res = self.assertStageResponse( | ||||||
|             response, |             response, | ||||||
|             flow, |             flow, | ||||||
|             self.user, |             self.user, | ||||||
| @ -155,7 +167,9 @@ class TestConsentStage(FlowTestCase): | |||||||
|         ) |         ) | ||||||
|         response = self.client.post( |         response = self.client.post( | ||||||
|             reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), |             reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), | ||||||
|             {}, |             { | ||||||
|  |                 "token": raw_res["token"], | ||||||
|  |             }, | ||||||
|         ) |         ) | ||||||
|         self.assertEqual(response.status_code, 200) |         self.assertEqual(response.status_code, 200) | ||||||
|         self.assertStageRedirects(response, reverse("authentik_core:root-redirect")) |         self.assertStageRedirects(response, reverse("authentik_core:root-redirect")) | ||||||
| @ -187,7 +201,7 @@ class TestConsentStage(FlowTestCase): | |||||||
|             {}, |             {}, | ||||||
|         ) |         ) | ||||||
|         self.assertEqual(response.status_code, 200) |         self.assertEqual(response.status_code, 200) | ||||||
|         self.assertStageResponse( |         raw_res = self.assertStageResponse( | ||||||
|             response, |             response, | ||||||
|             flow, |             flow, | ||||||
|             self.user, |             self.user, | ||||||
| @ -200,7 +214,9 @@ class TestConsentStage(FlowTestCase): | |||||||
|         ) |         ) | ||||||
|         response = self.client.post( |         response = self.client.post( | ||||||
|             reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), |             reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), | ||||||
|             {}, |             { | ||||||
|  |                 "token": raw_res["token"], | ||||||
|  |             }, | ||||||
|         ) |         ) | ||||||
|         self.assertEqual(response.status_code, 200) |         self.assertEqual(response.status_code, 200) | ||||||
|         self.assertStageRedirects(response, reverse("authentik_core:root-redirect")) |         self.assertStageRedirects(response, reverse("authentik_core:root-redirect")) | ||||||
| @ -209,3 +225,70 @@ class TestConsentStage(FlowTestCase): | |||||||
|                 user=self.user, application=self.application, permissions="foo bar" |                 user=self.user, application=self.application, permissions="foo bar" | ||||||
|             ).exists() |             ).exists() | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|  |     def test_permanent_same(self): | ||||||
|  |         """Test permanent consent from user""" | ||||||
|  |         self.client.force_login(self.user) | ||||||
|  |         flow = create_test_flow(FlowDesignation.AUTHENTICATION) | ||||||
|  |         stage = ConsentStage.objects.create(name=generate_id(), mode=ConsentMode.PERMANENT) | ||||||
|  |         binding = FlowStageBinding.objects.create(target=flow, stage=stage, order=2) | ||||||
|  |  | ||||||
|  |         plan = FlowPlan( | ||||||
|  |             flow_pk=flow.pk.hex, | ||||||
|  |             bindings=[binding], | ||||||
|  |             markers=[StageMarker()], | ||||||
|  |             context={ | ||||||
|  |                 PLAN_CONTEXT_APPLICATION: self.application, | ||||||
|  |             }, | ||||||
|  |         ) | ||||||
|  |         session = self.client.session | ||||||
|  |         session[SESSION_KEY_PLAN] = plan | ||||||
|  |         session.save() | ||||||
|  |  | ||||||
|  |         # First, consent with a single permission | ||||||
|  |         response = self.client.get( | ||||||
|  |             reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), | ||||||
|  |             {}, | ||||||
|  |         ) | ||||||
|  |         self.assertEqual(response.status_code, 200) | ||||||
|  |         raw_res = self.assertStageResponse( | ||||||
|  |             response, | ||||||
|  |             flow, | ||||||
|  |             self.user, | ||||||
|  |             permissions=[], | ||||||
|  |             additional_permissions=[], | ||||||
|  |         ) | ||||||
|  |         response = self.client.post( | ||||||
|  |             reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), | ||||||
|  |             { | ||||||
|  |                 "token": raw_res["token"], | ||||||
|  |             }, | ||||||
|  |         ) | ||||||
|  |         self.assertEqual(response.status_code, 200) | ||||||
|  |         self.assertStageRedirects(response, reverse("authentik_core:root-redirect")) | ||||||
|  |         self.assertTrue( | ||||||
|  |             UserConsent.objects.filter( | ||||||
|  |                 user=self.user, application=self.application, permissions="" | ||||||
|  |             ).exists() | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |         # Request again with the same perms | ||||||
|  |         plan = FlowPlan( | ||||||
|  |             flow_pk=flow.pk.hex, | ||||||
|  |             bindings=[binding], | ||||||
|  |             markers=[StageMarker()], | ||||||
|  |             context={ | ||||||
|  |                 PLAN_CONTEXT_APPLICATION: self.application, | ||||||
|  |                 PLAN_CONTEXT_CONSENT_PERMISSIONS: [], | ||||||
|  |             }, | ||||||
|  |         ) | ||||||
|  |         session = self.client.session | ||||||
|  |         session[SESSION_KEY_PLAN] = plan | ||||||
|  |         session.save() | ||||||
|  |  | ||||||
|  |         response = self.client.get( | ||||||
|  |             reverse("authentik_api:flow-executor", kwargs={"flow_slug": flow.slug}), | ||||||
|  |             {}, | ||||||
|  |         ) | ||||||
|  |         self.assertEqual(response.status_code, 200) | ||||||
|  |         self.assertStageResponse(response, component="xak-flow-redirect") | ||||||
|  | |||||||
							
								
								
									
										816
									
								
								schema.yml
									
									
									
									
									
								
							
							
						
						
									
										816
									
								
								schema.yml
									
									
									
									
									
								
							| @ -179,6 +179,32 @@ paths: | |||||||
|           $ref: '#/components/schemas/ValidationError' |           $ref: '#/components/schemas/ValidationError' | ||||||
|         '403': |         '403': | ||||||
|           $ref: '#/components/schemas/GenericError' |           $ref: '#/components/schemas/GenericError' | ||||||
|  |   /authenticators/admin/all/: | ||||||
|  |     get: | ||||||
|  |       operationId: authenticators_admin_all_list | ||||||
|  |       description: Get all devices for current user | ||||||
|  |       parameters: | ||||||
|  |       - in: query | ||||||
|  |         name: user | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 type: array | ||||||
|  |                 items: | ||||||
|  |                   $ref: '#/components/schemas/Device' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|   /authenticators/admin/duo/: |   /authenticators/admin/duo/: | ||||||
|     get: |     get: | ||||||
|       operationId: authenticators_admin_duo_list |       operationId: authenticators_admin_duo_list | ||||||
| @ -407,6 +433,30 @@ paths: | |||||||
|           $ref: '#/components/schemas/ValidationError' |           $ref: '#/components/schemas/ValidationError' | ||||||
|         '403': |         '403': | ||||||
|           $ref: '#/components/schemas/GenericError' |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     post: | ||||||
|  |       operationId: authenticators_admin_sms_create | ||||||
|  |       description: Viewset for sms authenticator devices (for admins) | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       requestBody: | ||||||
|  |         content: | ||||||
|  |           application/json: | ||||||
|  |             schema: | ||||||
|  |               $ref: '#/components/schemas/SMSDeviceRequest' | ||||||
|  |         required: true | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/SMSDevice' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|   /authenticators/admin/sms/{id}/: |   /authenticators/admin/sms/{id}/: | ||||||
|     get: |     get: | ||||||
|       operationId: authenticators_admin_sms_retrieve |       operationId: authenticators_admin_sms_retrieve | ||||||
| @ -433,6 +483,88 @@ paths: | |||||||
|           $ref: '#/components/schemas/ValidationError' |           $ref: '#/components/schemas/ValidationError' | ||||||
|         '403': |         '403': | ||||||
|           $ref: '#/components/schemas/GenericError' |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     put: | ||||||
|  |       operationId: authenticators_admin_sms_update | ||||||
|  |       description: Viewset for sms authenticator devices (for admins) | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: id | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |         description: A unique integer value identifying this SMS Device. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       requestBody: | ||||||
|  |         content: | ||||||
|  |           application/json: | ||||||
|  |             schema: | ||||||
|  |               $ref: '#/components/schemas/SMSDeviceRequest' | ||||||
|  |         required: true | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/SMSDevice' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     patch: | ||||||
|  |       operationId: authenticators_admin_sms_partial_update | ||||||
|  |       description: Viewset for sms authenticator devices (for admins) | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: id | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |         description: A unique integer value identifying this SMS Device. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       requestBody: | ||||||
|  |         content: | ||||||
|  |           application/json: | ||||||
|  |             schema: | ||||||
|  |               $ref: '#/components/schemas/PatchedSMSDeviceRequest' | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/SMSDevice' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     delete: | ||||||
|  |       operationId: authenticators_admin_sms_destroy | ||||||
|  |       description: Viewset for sms authenticator devices (for admins) | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: id | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |         description: A unique integer value identifying this SMS Device. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '204': | ||||||
|  |           description: No response body | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|   /authenticators/admin/static/: |   /authenticators/admin/static/: | ||||||
|     get: |     get: | ||||||
|       operationId: authenticators_admin_static_list |       operationId: authenticators_admin_static_list | ||||||
| @ -481,6 +613,30 @@ paths: | |||||||
|           $ref: '#/components/schemas/ValidationError' |           $ref: '#/components/schemas/ValidationError' | ||||||
|         '403': |         '403': | ||||||
|           $ref: '#/components/schemas/GenericError' |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     post: | ||||||
|  |       operationId: authenticators_admin_static_create | ||||||
|  |       description: Viewset for static authenticator devices (for admins) | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       requestBody: | ||||||
|  |         content: | ||||||
|  |           application/json: | ||||||
|  |             schema: | ||||||
|  |               $ref: '#/components/schemas/StaticDeviceRequest' | ||||||
|  |         required: true | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/StaticDevice' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|   /authenticators/admin/static/{id}/: |   /authenticators/admin/static/{id}/: | ||||||
|     get: |     get: | ||||||
|       operationId: authenticators_admin_static_retrieve |       operationId: authenticators_admin_static_retrieve | ||||||
| @ -507,6 +663,88 @@ paths: | |||||||
|           $ref: '#/components/schemas/ValidationError' |           $ref: '#/components/schemas/ValidationError' | ||||||
|         '403': |         '403': | ||||||
|           $ref: '#/components/schemas/GenericError' |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     put: | ||||||
|  |       operationId: authenticators_admin_static_update | ||||||
|  |       description: Viewset for static authenticator devices (for admins) | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: id | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |         description: A unique integer value identifying this static device. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       requestBody: | ||||||
|  |         content: | ||||||
|  |           application/json: | ||||||
|  |             schema: | ||||||
|  |               $ref: '#/components/schemas/StaticDeviceRequest' | ||||||
|  |         required: true | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/StaticDevice' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     patch: | ||||||
|  |       operationId: authenticators_admin_static_partial_update | ||||||
|  |       description: Viewset for static authenticator devices (for admins) | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: id | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |         description: A unique integer value identifying this static device. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       requestBody: | ||||||
|  |         content: | ||||||
|  |           application/json: | ||||||
|  |             schema: | ||||||
|  |               $ref: '#/components/schemas/PatchedStaticDeviceRequest' | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/StaticDevice' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     delete: | ||||||
|  |       operationId: authenticators_admin_static_destroy | ||||||
|  |       description: Viewset for static authenticator devices (for admins) | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: id | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |         description: A unique integer value identifying this static device. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '204': | ||||||
|  |           description: No response body | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|   /authenticators/admin/totp/: |   /authenticators/admin/totp/: | ||||||
|     get: |     get: | ||||||
|       operationId: authenticators_admin_totp_list |       operationId: authenticators_admin_totp_list | ||||||
| @ -555,6 +793,30 @@ paths: | |||||||
|           $ref: '#/components/schemas/ValidationError' |           $ref: '#/components/schemas/ValidationError' | ||||||
|         '403': |         '403': | ||||||
|           $ref: '#/components/schemas/GenericError' |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     post: | ||||||
|  |       operationId: authenticators_admin_totp_create | ||||||
|  |       description: Viewset for totp authenticator devices (for admins) | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       requestBody: | ||||||
|  |         content: | ||||||
|  |           application/json: | ||||||
|  |             schema: | ||||||
|  |               $ref: '#/components/schemas/TOTPDeviceRequest' | ||||||
|  |         required: true | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/TOTPDevice' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|   /authenticators/admin/totp/{id}/: |   /authenticators/admin/totp/{id}/: | ||||||
|     get: |     get: | ||||||
|       operationId: authenticators_admin_totp_retrieve |       operationId: authenticators_admin_totp_retrieve | ||||||
| @ -581,6 +843,88 @@ paths: | |||||||
|           $ref: '#/components/schemas/ValidationError' |           $ref: '#/components/schemas/ValidationError' | ||||||
|         '403': |         '403': | ||||||
|           $ref: '#/components/schemas/GenericError' |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     put: | ||||||
|  |       operationId: authenticators_admin_totp_update | ||||||
|  |       description: Viewset for totp authenticator devices (for admins) | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: id | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |         description: A unique integer value identifying this TOTP device. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       requestBody: | ||||||
|  |         content: | ||||||
|  |           application/json: | ||||||
|  |             schema: | ||||||
|  |               $ref: '#/components/schemas/TOTPDeviceRequest' | ||||||
|  |         required: true | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/TOTPDevice' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     patch: | ||||||
|  |       operationId: authenticators_admin_totp_partial_update | ||||||
|  |       description: Viewset for totp authenticator devices (for admins) | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: id | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |         description: A unique integer value identifying this TOTP device. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       requestBody: | ||||||
|  |         content: | ||||||
|  |           application/json: | ||||||
|  |             schema: | ||||||
|  |               $ref: '#/components/schemas/PatchedTOTPDeviceRequest' | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/TOTPDevice' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     delete: | ||||||
|  |       operationId: authenticators_admin_totp_destroy | ||||||
|  |       description: Viewset for totp authenticator devices (for admins) | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: id | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |         description: A unique integer value identifying this TOTP device. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '204': | ||||||
|  |           description: No response body | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|   /authenticators/admin/webauthn/: |   /authenticators/admin/webauthn/: | ||||||
|     get: |     get: | ||||||
|       operationId: authenticators_admin_webauthn_list |       operationId: authenticators_admin_webauthn_list | ||||||
| @ -629,6 +973,30 @@ paths: | |||||||
|           $ref: '#/components/schemas/ValidationError' |           $ref: '#/components/schemas/ValidationError' | ||||||
|         '403': |         '403': | ||||||
|           $ref: '#/components/schemas/GenericError' |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     post: | ||||||
|  |       operationId: authenticators_admin_webauthn_create | ||||||
|  |       description: Viewset for WebAuthn authenticator devices (for admins) | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       requestBody: | ||||||
|  |         content: | ||||||
|  |           application/json: | ||||||
|  |             schema: | ||||||
|  |               $ref: '#/components/schemas/WebAuthnDeviceRequest' | ||||||
|  |         required: true | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/WebAuthnDevice' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|   /authenticators/admin/webauthn/{id}/: |   /authenticators/admin/webauthn/{id}/: | ||||||
|     get: |     get: | ||||||
|       operationId: authenticators_admin_webauthn_retrieve |       operationId: authenticators_admin_webauthn_retrieve | ||||||
| @ -655,6 +1023,88 @@ paths: | |||||||
|           $ref: '#/components/schemas/ValidationError' |           $ref: '#/components/schemas/ValidationError' | ||||||
|         '403': |         '403': | ||||||
|           $ref: '#/components/schemas/GenericError' |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     put: | ||||||
|  |       operationId: authenticators_admin_webauthn_update | ||||||
|  |       description: Viewset for WebAuthn authenticator devices (for admins) | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: id | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |         description: A unique integer value identifying this WebAuthn Device. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       requestBody: | ||||||
|  |         content: | ||||||
|  |           application/json: | ||||||
|  |             schema: | ||||||
|  |               $ref: '#/components/schemas/WebAuthnDeviceRequest' | ||||||
|  |         required: true | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/WebAuthnDevice' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     patch: | ||||||
|  |       operationId: authenticators_admin_webauthn_partial_update | ||||||
|  |       description: Viewset for WebAuthn authenticator devices (for admins) | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: id | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |         description: A unique integer value identifying this WebAuthn Device. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       requestBody: | ||||||
|  |         content: | ||||||
|  |           application/json: | ||||||
|  |             schema: | ||||||
|  |               $ref: '#/components/schemas/PatchedWebAuthnDeviceRequest' | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/WebAuthnDevice' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     delete: | ||||||
|  |       operationId: authenticators_admin_webauthn_destroy | ||||||
|  |       description: Viewset for WebAuthn authenticator devices (for admins) | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: id | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |         description: A unique integer value identifying this WebAuthn Device. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '204': | ||||||
|  |           description: No response body | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|   /authenticators/all/: |   /authenticators/all/: | ||||||
|     get: |     get: | ||||||
|       operationId: authenticators_all_list |       operationId: authenticators_all_list | ||||||
| @ -1601,6 +2051,22 @@ paths: | |||||||
|       operationId: core_applications_list |       operationId: core_applications_list | ||||||
|       description: Custom list method that checks Policy based access instead of guardian |       description: Custom list method that checks Policy based access instead of guardian | ||||||
|       parameters: |       parameters: | ||||||
|  |       - in: query | ||||||
|  |         name: group | ||||||
|  |         schema: | ||||||
|  |           type: string | ||||||
|  |       - in: query | ||||||
|  |         name: meta_description | ||||||
|  |         schema: | ||||||
|  |           type: string | ||||||
|  |       - in: query | ||||||
|  |         name: meta_launch_url | ||||||
|  |         schema: | ||||||
|  |           type: string | ||||||
|  |       - in: query | ||||||
|  |         name: meta_publisher | ||||||
|  |         schema: | ||||||
|  |           type: string | ||||||
|       - in: query |       - in: query | ||||||
|         name: name |         name: name | ||||||
|         schema: |         schema: | ||||||
| @ -5403,7 +5869,7 @@ paths: | |||||||
|   /flows/instances/{slug}/export/: |   /flows/instances/{slug}/export/: | ||||||
|     get: |     get: | ||||||
|       operationId: flows_instances_export_retrieve |       operationId: flows_instances_export_retrieve | ||||||
|       description: Export flow to .akflow file |       description: Export flow to .yaml file | ||||||
|       parameters: |       parameters: | ||||||
|       - in: path |       - in: path | ||||||
|         name: slug |         name: slug | ||||||
| @ -5547,7 +6013,7 @@ paths: | |||||||
|   /flows/instances/import_flow/: |   /flows/instances/import_flow/: | ||||||
|     post: |     post: | ||||||
|       operationId: flows_instances_import_flow_create |       operationId: flows_instances_import_flow_create | ||||||
|       description: Import flow from .akflow file |       description: Import flow from .yaml file | ||||||
|       tags: |       tags: | ||||||
|       - flows |       - flows | ||||||
|       requestBody: |       requestBody: | ||||||
| @ -5564,6 +6030,215 @@ paths: | |||||||
|           description: Bad request |           description: Bad request | ||||||
|         '403': |         '403': | ||||||
|           $ref: '#/components/schemas/GenericError' |           $ref: '#/components/schemas/GenericError' | ||||||
|  |   /managed/blueprints/: | ||||||
|  |     get: | ||||||
|  |       operationId: managed_blueprints_list | ||||||
|  |       description: Blueprint instances | ||||||
|  |       parameters: | ||||||
|  |       - in: query | ||||||
|  |         name: name | ||||||
|  |         schema: | ||||||
|  |           type: string | ||||||
|  |       - name: ordering | ||||||
|  |         required: false | ||||||
|  |         in: query | ||||||
|  |         description: Which field to use when ordering the results. | ||||||
|  |         schema: | ||||||
|  |           type: string | ||||||
|  |       - name: page | ||||||
|  |         required: false | ||||||
|  |         in: query | ||||||
|  |         description: A page number within the paginated result set. | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |       - name: page_size | ||||||
|  |         required: false | ||||||
|  |         in: query | ||||||
|  |         description: Number of results to return per page. | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |       - in: query | ||||||
|  |         name: path | ||||||
|  |         schema: | ||||||
|  |           type: string | ||||||
|  |       - name: search | ||||||
|  |         required: false | ||||||
|  |         in: query | ||||||
|  |         description: A search term. | ||||||
|  |         schema: | ||||||
|  |           type: string | ||||||
|  |       tags: | ||||||
|  |       - managed | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/PaginatedBlueprintInstanceList' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     post: | ||||||
|  |       operationId: managed_blueprints_create | ||||||
|  |       description: Blueprint instances | ||||||
|  |       tags: | ||||||
|  |       - managed | ||||||
|  |       requestBody: | ||||||
|  |         content: | ||||||
|  |           application/json: | ||||||
|  |             schema: | ||||||
|  |               $ref: '#/components/schemas/BlueprintInstanceRequest' | ||||||
|  |         required: true | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/BlueprintInstance' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|  |   /managed/blueprints/{instance_uuid}/: | ||||||
|  |     get: | ||||||
|  |       operationId: managed_blueprints_retrieve | ||||||
|  |       description: Blueprint instances | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: instance_uuid | ||||||
|  |         schema: | ||||||
|  |           type: string | ||||||
|  |           format: uuid | ||||||
|  |         description: A UUID string identifying this Blueprint Instance. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - managed | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/BlueprintInstance' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     put: | ||||||
|  |       operationId: managed_blueprints_update | ||||||
|  |       description: Blueprint instances | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: instance_uuid | ||||||
|  |         schema: | ||||||
|  |           type: string | ||||||
|  |           format: uuid | ||||||
|  |         description: A UUID string identifying this Blueprint Instance. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - managed | ||||||
|  |       requestBody: | ||||||
|  |         content: | ||||||
|  |           application/json: | ||||||
|  |             schema: | ||||||
|  |               $ref: '#/components/schemas/BlueprintInstanceRequest' | ||||||
|  |         required: true | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/BlueprintInstance' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     patch: | ||||||
|  |       operationId: managed_blueprints_partial_update | ||||||
|  |       description: Blueprint instances | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: instance_uuid | ||||||
|  |         schema: | ||||||
|  |           type: string | ||||||
|  |           format: uuid | ||||||
|  |         description: A UUID string identifying this Blueprint Instance. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - managed | ||||||
|  |       requestBody: | ||||||
|  |         content: | ||||||
|  |           application/json: | ||||||
|  |             schema: | ||||||
|  |               $ref: '#/components/schemas/PatchedBlueprintInstanceRequest' | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 $ref: '#/components/schemas/BlueprintInstance' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|  |     delete: | ||||||
|  |       operationId: managed_blueprints_destroy | ||||||
|  |       description: Blueprint instances | ||||||
|  |       parameters: | ||||||
|  |       - in: path | ||||||
|  |         name: instance_uuid | ||||||
|  |         schema: | ||||||
|  |           type: string | ||||||
|  |           format: uuid | ||||||
|  |         description: A UUID string identifying this Blueprint Instance. | ||||||
|  |         required: true | ||||||
|  |       tags: | ||||||
|  |       - managed | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '204': | ||||||
|  |           description: No response body | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|  |   /managed/blueprints/available/: | ||||||
|  |     get: | ||||||
|  |       operationId: managed_blueprints_available_list | ||||||
|  |       description: Get blueprints | ||||||
|  |       tags: | ||||||
|  |       - managed | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 type: array | ||||||
|  |                 items: | ||||||
|  |                   type: string | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|   /oauth2/authorization_codes/: |   /oauth2/authorization_codes/: | ||||||
|     get: |     get: | ||||||
|       operationId: oauth2_authorization_codes_list |       operationId: oauth2_authorization_codes_list | ||||||
| @ -7679,12 +8354,12 @@ paths: | |||||||
|           enum: |           enum: | ||||||
|           - authentik.admin |           - authentik.admin | ||||||
|           - authentik.api |           - authentik.api | ||||||
|  |           - authentik.blueprints | ||||||
|           - authentik.core |           - authentik.core | ||||||
|           - authentik.crypto |           - authentik.crypto | ||||||
|           - authentik.events |           - authentik.events | ||||||
|           - authentik.flows |           - authentik.flows | ||||||
|           - authentik.lib |           - authentik.lib | ||||||
|           - authentik.managed |  | ||||||
|           - authentik.outposts |           - authentik.outposts | ||||||
|           - authentik.policies |           - authentik.policies | ||||||
|           - authentik.policies.dummy |           - authentik.policies.dummy | ||||||
| @ -19141,7 +19816,7 @@ components: | |||||||
|       - authentik.stages.user_logout |       - authentik.stages.user_logout | ||||||
|       - authentik.stages.user_write |       - authentik.stages.user_write | ||||||
|       - authentik.tenants |       - authentik.tenants | ||||||
|       - authentik.managed |       - authentik.blueprints | ||||||
|       - authentik.core |       - authentik.core | ||||||
|       type: string |       type: string | ||||||
|     AppleChallengeResponseRequest: |     AppleChallengeResponseRequest: | ||||||
| @ -20187,6 +20862,60 @@ components: | |||||||
|       - POST |       - POST | ||||||
|       - POST_AUTO |       - POST_AUTO | ||||||
|       type: string |       type: string | ||||||
|  |     BlueprintInstance: | ||||||
|  |       type: object | ||||||
|  |       description: Info about a single blueprint instance file | ||||||
|  |       properties: | ||||||
|  |         name: | ||||||
|  |           type: string | ||||||
|  |         path: | ||||||
|  |           type: string | ||||||
|  |         context: | ||||||
|  |           type: object | ||||||
|  |           additionalProperties: {} | ||||||
|  |         last_applied: | ||||||
|  |           type: string | ||||||
|  |           format: date-time | ||||||
|  |           readOnly: true | ||||||
|  |         status: | ||||||
|  |           $ref: '#/components/schemas/BlueprintInstanceStatusEnum' | ||||||
|  |         enabled: | ||||||
|  |           type: boolean | ||||||
|  |       required: | ||||||
|  |       - context | ||||||
|  |       - last_applied | ||||||
|  |       - name | ||||||
|  |       - path | ||||||
|  |       - status | ||||||
|  |     BlueprintInstanceRequest: | ||||||
|  |       type: object | ||||||
|  |       description: Info about a single blueprint instance file | ||||||
|  |       properties: | ||||||
|  |         name: | ||||||
|  |           type: string | ||||||
|  |           minLength: 1 | ||||||
|  |         path: | ||||||
|  |           type: string | ||||||
|  |           minLength: 1 | ||||||
|  |         context: | ||||||
|  |           type: object | ||||||
|  |           additionalProperties: {} | ||||||
|  |         status: | ||||||
|  |           $ref: '#/components/schemas/BlueprintInstanceStatusEnum' | ||||||
|  |         enabled: | ||||||
|  |           type: boolean | ||||||
|  |       required: | ||||||
|  |       - context | ||||||
|  |       - name | ||||||
|  |       - path | ||||||
|  |       - status | ||||||
|  |     BlueprintInstanceStatusEnum: | ||||||
|  |       enum: | ||||||
|  |       - successful | ||||||
|  |       - warning | ||||||
|  |       - error | ||||||
|  |       - unknown | ||||||
|  |       type: string | ||||||
|     Cache: |     Cache: | ||||||
|       type: object |       type: object | ||||||
|       description: Generic cache stats for an object |       description: Generic cache stats for an object | ||||||
| @ -20523,11 +21252,14 @@ components: | |||||||
|           type: array |           type: array | ||||||
|           items: |           items: | ||||||
|             $ref: '#/components/schemas/Permission' |             $ref: '#/components/schemas/Permission' | ||||||
|  |         token: | ||||||
|  |           type: string | ||||||
|       required: |       required: | ||||||
|       - additional_permissions |       - additional_permissions | ||||||
|       - pending_user |       - pending_user | ||||||
|       - pending_user_avatar |       - pending_user_avatar | ||||||
|       - permissions |       - permissions | ||||||
|  |       - token | ||||||
|       - type |       - type | ||||||
|     ConsentChallengeResponseRequest: |     ConsentChallengeResponseRequest: | ||||||
|       type: object |       type: object | ||||||
| @ -20537,6 +21269,11 @@ components: | |||||||
|           type: string |           type: string | ||||||
|           minLength: 1 |           minLength: 1 | ||||||
|           default: ak-stage-consent |           default: ak-stage-consent | ||||||
|  |         token: | ||||||
|  |           type: string | ||||||
|  |           minLength: 1 | ||||||
|  |       required: | ||||||
|  |       - token | ||||||
|     ConsentStage: |     ConsentStage: | ||||||
|       type: object |       type: object | ||||||
|       description: ConsentStage Serializer |       description: ConsentStage Serializer | ||||||
| @ -20742,7 +21479,10 @@ components: | |||||||
|         type: |         type: | ||||||
|           type: string |           type: string | ||||||
|           readOnly: true |           readOnly: true | ||||||
|  |         confirmed: | ||||||
|  |           type: boolean | ||||||
|       required: |       required: | ||||||
|  |       - confirmed | ||||||
|       - meta_model_name |       - meta_model_name | ||||||
|       - name |       - name | ||||||
|       - pk |       - pk | ||||||
| @ -24096,6 +24836,41 @@ components: | |||||||
|       required: |       required: | ||||||
|       - pagination |       - pagination | ||||||
|       - results |       - results | ||||||
|  |     PaginatedBlueprintInstanceList: | ||||||
|  |       type: object | ||||||
|  |       properties: | ||||||
|  |         pagination: | ||||||
|  |           type: object | ||||||
|  |           properties: | ||||||
|  |             next: | ||||||
|  |               type: number | ||||||
|  |             previous: | ||||||
|  |               type: number | ||||||
|  |             count: | ||||||
|  |               type: number | ||||||
|  |             current: | ||||||
|  |               type: number | ||||||
|  |             total_pages: | ||||||
|  |               type: number | ||||||
|  |             start_index: | ||||||
|  |               type: number | ||||||
|  |             end_index: | ||||||
|  |               type: number | ||||||
|  |           required: | ||||||
|  |           - next | ||||||
|  |           - previous | ||||||
|  |           - count | ||||||
|  |           - current | ||||||
|  |           - total_pages | ||||||
|  |           - start_index | ||||||
|  |           - end_index | ||||||
|  |         results: | ||||||
|  |           type: array | ||||||
|  |           items: | ||||||
|  |             $ref: '#/components/schemas/BlueprintInstance' | ||||||
|  |       required: | ||||||
|  |       - pagination | ||||||
|  |       - results | ||||||
|     PaginatedCaptchaStageList: |     PaginatedCaptchaStageList: | ||||||
|       type: object |       type: object | ||||||
|       properties: |       properties: | ||||||
| @ -27003,6 +27778,23 @@ components: | |||||||
|           minLength: 1 |           minLength: 1 | ||||||
|           description: If any of the user's device has been used within this threshold, |           description: If any of the user's device has been used within this threshold, | ||||||
|             this stage will be skipped |             this stage will be skipped | ||||||
|  |     PatchedBlueprintInstanceRequest: | ||||||
|  |       type: object | ||||||
|  |       description: Info about a single blueprint instance file | ||||||
|  |       properties: | ||||||
|  |         name: | ||||||
|  |           type: string | ||||||
|  |           minLength: 1 | ||||||
|  |         path: | ||||||
|  |           type: string | ||||||
|  |           minLength: 1 | ||||||
|  |         context: | ||||||
|  |           type: object | ||||||
|  |           additionalProperties: {} | ||||||
|  |         status: | ||||||
|  |           $ref: '#/components/schemas/BlueprintInstanceStatusEnum' | ||||||
|  |         enabled: | ||||||
|  |           type: boolean | ||||||
|     PatchedCaptchaStageRequest: |     PatchedCaptchaStageRequest: | ||||||
|       type: object |       type: object | ||||||
|       description: CaptchaStage Serializer |       description: CaptchaStage Serializer | ||||||
| @ -30822,13 +31614,6 @@ components: | |||||||
|           maxLength: 16 |           maxLength: 16 | ||||||
|       required: |       required: | ||||||
|       - token |       - token | ||||||
|     StatusEnum: |  | ||||||
|       enum: |  | ||||||
|       - SUCCESSFUL |  | ||||||
|       - WARNING |  | ||||||
|       - ERROR |  | ||||||
|       - UNKNOWN |  | ||||||
|       type: string |  | ||||||
|     SubModeEnum: |     SubModeEnum: | ||||||
|       enum: |       enum: | ||||||
|       - hashed_user_id |       - hashed_user_id | ||||||
| @ -30937,7 +31722,7 @@ components: | |||||||
|           type: string |           type: string | ||||||
|           format: date-time |           format: date-time | ||||||
|         status: |         status: | ||||||
|           $ref: '#/components/schemas/StatusEnum' |           $ref: '#/components/schemas/TaskStatusEnum' | ||||||
|         messages: |         messages: | ||||||
|           type: array |           type: array | ||||||
|           items: {} |           items: {} | ||||||
| @ -30947,6 +31732,13 @@ components: | |||||||
|       - task_description |       - task_description | ||||||
|       - task_finish_timestamp |       - task_finish_timestamp | ||||||
|       - task_name |       - task_name | ||||||
|  |     TaskStatusEnum: | ||||||
|  |       enum: | ||||||
|  |       - SUCCESSFUL | ||||||
|  |       - WARNING | ||||||
|  |       - ERROR | ||||||
|  |       - UNKNOWN | ||||||
|  |       type: string | ||||||
|     Tenant: |     Tenant: | ||||||
|       type: object |       type: object | ||||||
|       description: Tenant Serializer |       description: Tenant Serializer | ||||||
|  | |||||||
							
								
								
									
										14
									
								
								web/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										14
									
								
								web/package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -21,7 +21,7 @@ | |||||||
|                 "@codemirror/legacy-modes": "^6.1.0", |                 "@codemirror/legacy-modes": "^6.1.0", | ||||||
|                 "@formatjs/intl-listformat": "^7.0.3", |                 "@formatjs/intl-listformat": "^7.0.3", | ||||||
|                 "@fortawesome/fontawesome-free": "^6.1.1", |                 "@fortawesome/fontawesome-free": "^6.1.1", | ||||||
|                 "@goauthentik/api": "^2022.7.2-1657137907", |                 "@goauthentik/api": "^2022.7.3-1659304078", | ||||||
|                 "@jackfranklin/rollup-plugin-markdown": "^0.4.0", |                 "@jackfranklin/rollup-plugin-markdown": "^0.4.0", | ||||||
|                 "@lingui/cli": "^3.14.0", |                 "@lingui/cli": "^3.14.0", | ||||||
|                 "@lingui/core": "^3.14.0", |                 "@lingui/core": "^3.14.0", | ||||||
| @ -1922,9 +1922,9 @@ | |||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "node_modules/@goauthentik/api": { |         "node_modules/@goauthentik/api": { | ||||||
|             "version": "2022.7.2-1657137907", |             "version": "2022.7.3-1659304078", | ||||||
|             "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2022.7.2-1657137907.tgz", |             "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2022.7.3-1659304078.tgz", | ||||||
|             "integrity": "sha512-dNyoxWOhLpBMFY3u5v0DiWnqzbEApru87Dkl09i9tgAq5TEjENZbE5xsZO8IpjoZJ8rb8uYqFXyBgVLK9mBvgw==" |             "integrity": "sha512-dWvWB7mlhEZtbFJPVsUCK8Pyxb2lTJhOFmG6oAPVFI0k+TN9HGjY+0FSD+wto+Y9fWq6rPo4lZLaPVJluaA0WA==" | ||||||
|         }, |         }, | ||||||
|         "node_modules/@humanwhocodes/config-array": { |         "node_modules/@humanwhocodes/config-array": { | ||||||
|             "version": "0.9.2", |             "version": "0.9.2", | ||||||
| @ -10384,9 +10384,9 @@ | |||||||
|             "integrity": "sha512-J/3yg2AIXc9wznaVqpHVX3Wa5jwKovVF0AMYSnbmcXTiL3PpRPfF58pzWucCwEiCJBp+hCNRLWClTomD8SseKg==" |             "integrity": "sha512-J/3yg2AIXc9wznaVqpHVX3Wa5jwKovVF0AMYSnbmcXTiL3PpRPfF58pzWucCwEiCJBp+hCNRLWClTomD8SseKg==" | ||||||
|         }, |         }, | ||||||
|         "@goauthentik/api": { |         "@goauthentik/api": { | ||||||
|             "version": "2022.7.2-1657137907", |             "version": "2022.7.3-1659304078", | ||||||
|             "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2022.7.2-1657137907.tgz", |             "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2022.7.3-1659304078.tgz", | ||||||
|             "integrity": "sha512-dNyoxWOhLpBMFY3u5v0DiWnqzbEApru87Dkl09i9tgAq5TEjENZbE5xsZO8IpjoZJ8rb8uYqFXyBgVLK9mBvgw==" |             "integrity": "sha512-dWvWB7mlhEZtbFJPVsUCK8Pyxb2lTJhOFmG6oAPVFI0k+TN9HGjY+0FSD+wto+Y9fWq6rPo4lZLaPVJluaA0WA==" | ||||||
|         }, |         }, | ||||||
|         "@humanwhocodes/config-array": { |         "@humanwhocodes/config-array": { | ||||||
|             "version": "0.9.2", |             "version": "0.9.2", | ||||||
|  | |||||||
| @ -64,7 +64,7 @@ | |||||||
|         "@codemirror/legacy-modes": "^6.1.0", |         "@codemirror/legacy-modes": "^6.1.0", | ||||||
|         "@formatjs/intl-listformat": "^7.0.3", |         "@formatjs/intl-listformat": "^7.0.3", | ||||||
|         "@fortawesome/fontawesome-free": "^6.1.1", |         "@fortawesome/fontawesome-free": "^6.1.1", | ||||||
|         "@goauthentik/api": "^2022.7.2-1657137907", |         "@goauthentik/api": "^2022.7.3-1659304078", | ||||||
|         "@jackfranklin/rollup-plugin-markdown": "^0.4.0", |         "@jackfranklin/rollup-plugin-markdown": "^0.4.0", | ||||||
|         "@lingui/cli": "^3.14.0", |         "@lingui/cli": "^3.14.0", | ||||||
|         "@lingui/core": "^3.14.0", |         "@lingui/core": "^3.14.0", | ||||||
|  | |||||||
| @ -32,6 +32,7 @@ export class UserConsentList extends Table<UserConsent> { | |||||||
|         return [ |         return [ | ||||||
|             new TableColumn(t`Application`, "application"), |             new TableColumn(t`Application`, "application"), | ||||||
|             new TableColumn(t`Expires`, "expires"), |             new TableColumn(t`Expires`, "expires"), | ||||||
|  |             new TableColumn(t`Permissions`, "permissions"), | ||||||
|         ]; |         ]; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -58,6 +59,10 @@ export class UserConsentList extends Table<UserConsent> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     row(item: UserConsent): TemplateResult[] { |     row(item: UserConsent): TemplateResult[] { | ||||||
|         return [html`${item.application.name}`, html`${item.expires?.toLocaleString()}`]; |         return [ | ||||||
|  |             html`${item.application.name}`, | ||||||
|  |             html`${item.expires?.toLocaleString()}`, | ||||||
|  |             html`${item.permissions || "-"}`, | ||||||
|  |         ]; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -23,17 +23,19 @@ export function readFileAsync(file: Blob) { | |||||||
|     }); |     }); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | export type KeyUnknown = { | ||||||
|  |     [key: string]: unknown; | ||||||
|  | }; | ||||||
|  |  | ||||||
| export class BaseStage<Tin, Tout> extends LitElement { | export class BaseStage<Tin, Tout> extends LitElement { | ||||||
|     host!: StageHost; |     host!: StageHost; | ||||||
|  |  | ||||||
|     @property({ attribute: false }) |     @property({ attribute: false }) | ||||||
|     challenge!: Tin; |     challenge!: Tin; | ||||||
|  |  | ||||||
|     async submitForm(e: Event): Promise<boolean> { |     async submitForm(e: Event, defaults?: KeyUnknown): Promise<boolean> { | ||||||
|         e.preventDefault(); |         e.preventDefault(); | ||||||
|         const object: { |         const object: KeyUnknown = defaults || {}; | ||||||
|             [key: string]: unknown; |  | ||||||
|         } = {}; |  | ||||||
|         const form = new FormData(this.shadowRoot?.querySelector("form") || undefined); |         const form = new FormData(this.shadowRoot?.querySelector("form") || undefined); | ||||||
|  |  | ||||||
|         for await (const [key, value] of form.entries()) { |         for await (const [key, value] of form.entries()) { | ||||||
|  | |||||||
| @ -107,7 +107,9 @@ export class ConsentStage extends BaseStage<ConsentChallenge, ConsentChallengeRe | |||||||
|                 <form |                 <form | ||||||
|                     class="pf-c-form" |                     class="pf-c-form" | ||||||
|                     @submit=${(e: Event) => { |                     @submit=${(e: Event) => { | ||||||
|                         this.submitForm(e); |                         this.submitForm(e, { | ||||||
|  |                             token: this.challenge.token, | ||||||
|  |                         }); | ||||||
|                     }} |                     }} | ||||||
|                 > |                 > | ||||||
|                     <ak-form-static |                     <ak-form-static | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ import { t } from "@lingui/macro"; | |||||||
|  |  | ||||||
| import { customElement } from "lit/decorators.js"; | import { customElement } from "lit/decorators.js"; | ||||||
|  |  | ||||||
| import { SourcesApi, StatusEnum } from "@goauthentik/api"; | import { SourcesApi, TaskStatusEnum } from "@goauthentik/api"; | ||||||
|  |  | ||||||
| interface LDAPSyncStats { | interface LDAPSyncStats { | ||||||
|     healthy: number; |     healthy: number; | ||||||
| @ -50,7 +50,7 @@ export class LDAPSyncStatusChart extends AKChart<LDAPSyncStats> { | |||||||
|                     }); |                     }); | ||||||
|  |  | ||||||
|                     health.forEach((task) => { |                     health.forEach((task) => { | ||||||
|                         if (task.status !== StatusEnum.Successful) { |                         if (task.status !== TaskStatusEnum.Successful) { | ||||||
|                             sourceKey = "failed"; |                             sourceKey = "failed"; | ||||||
|                         } |                         } | ||||||
|                         const now = new Date().getTime(); |                         const now = new Date().getTime(); | ||||||
|  | |||||||
| @ -24,7 +24,7 @@ import PFPage from "@patternfly/patternfly/components/Page/page.css"; | |||||||
| import PFGrid from "@patternfly/patternfly/layouts/Grid/grid.css"; | import PFGrid from "@patternfly/patternfly/layouts/Grid/grid.css"; | ||||||
| import PFBase from "@patternfly/patternfly/patternfly-base.css"; | import PFBase from "@patternfly/patternfly/patternfly-base.css"; | ||||||
|  |  | ||||||
| import { LDAPSource, SourcesApi, StatusEnum } from "@goauthentik/api"; | import { LDAPSource, SourcesApi, TaskStatusEnum } from "@goauthentik/api"; | ||||||
|  |  | ||||||
| @customElement("ak-source-ldap-view") | @customElement("ak-source-ldap-view") | ||||||
| export class LDAPSourceViewPage extends LitElement { | export class LDAPSourceViewPage extends LitElement { | ||||||
| @ -145,9 +145,9 @@ export class LDAPSourceViewPage extends LitElement { | |||||||
|                                         return html`<ul class="pf-c-list"> |                                         return html`<ul class="pf-c-list"> | ||||||
|                                             ${tasks.map((task) => { |                                             ${tasks.map((task) => { | ||||||
|                                                 let header = ""; |                                                 let header = ""; | ||||||
|                                                 if (task.status === StatusEnum.Warning) { |                                                 if (task.status === TaskStatusEnum.Warning) { | ||||||
|                                                     header = t`Task finished with warnings`; |                                                     header = t`Task finished with warnings`; | ||||||
|                                                 } else if (task.status === StatusEnum.Error) { |                                                 } else if (task.status === TaskStatusEnum.Error) { | ||||||
|                                                     header = t`Task finished with errors`; |                                                     header = t`Task finished with errors`; | ||||||
|                                                 } else { |                                                 } else { | ||||||
|                                                     header = t`Last sync: ${task.taskFinishTimestamp.toLocaleString()}`; |                                                     header = t`Last sync: ${task.taskFinishTimestamp.toLocaleString()}`; | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ import { customElement, property } from "lit/decorators.js"; | |||||||
|  |  | ||||||
| import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList/description-list.css"; | import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList/description-list.css"; | ||||||
|  |  | ||||||
| import { AdminApi, StatusEnum, Task } from "@goauthentik/api"; | import { AdminApi, Task, TaskStatusEnum } from "@goauthentik/api"; | ||||||
|  |  | ||||||
| @customElement("ak-system-task-list") | @customElement("ak-system-task-list") | ||||||
| export class SystemTaskListPage extends TablePage<Task> { | export class SystemTaskListPage extends TablePage<Task> { | ||||||
| @ -67,11 +67,11 @@ export class SystemTaskListPage extends TablePage<Task> { | |||||||
|  |  | ||||||
|     taskStatus(task: Task): TemplateResult { |     taskStatus(task: Task): TemplateResult { | ||||||
|         switch (task.status) { |         switch (task.status) { | ||||||
|             case StatusEnum.Successful: |             case TaskStatusEnum.Successful: | ||||||
|                 return html`<ak-label color=${PFColor.Green}>${t`Successful`}</ak-label>`; |                 return html`<ak-label color=${PFColor.Green}>${t`Successful`}</ak-label>`; | ||||||
|             case StatusEnum.Warning: |             case TaskStatusEnum.Warning: | ||||||
|                 return html`<ak-label color=${PFColor.Orange}>${t`Warning`}</ak-label>`; |                 return html`<ak-label color=${PFColor.Orange}>${t`Warning`}</ak-label>`; | ||||||
|             case StatusEnum.Error: |             case TaskStatusEnum.Error: | ||||||
|                 return html`<ak-label color=${PFColor.Red}>${t`Error`}</ak-label>`; |                 return html`<ak-label color=${PFColor.Red}>${t`Error`}</ak-label>`; | ||||||
|             default: |             default: | ||||||
|                 return html`<ak-label color=${PFColor.Grey}>${t`Unknown`}</ak-label>`; |                 return html`<ak-label color=${PFColor.Grey}>${t`Unknown`}</ak-label>`; | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	