def items(self): mapping = {} classes = all_subclasses(Challenge) classes.remove(WithUserInfoChallenge) for cls in classes: mapping[cls().fields["component"].default] = cls return mapping.items()
def ready(self): import_module("authentik.flows.signals") try: from authentik.flows.models import Stage for stage in all_subclasses(Stage): _ = stage().type except ProgrammingError: pass
def types(self, request: Request) -> Response: """Get all creatable policy types""" data = [] for subclass in all_subclasses(self.queryset.model): subclass: Policy data.append({ "name": subclass._meta.verbose_name, "description": subclass.__doc__, "component": subclass().component, "model_name": subclass._meta.model_name, }) return Response(TypeCreateSerializer(data, many=True).data)
def types(self, request: Request) -> Response: """Get all creatable property-mapping types""" data = [] for subclass in all_subclasses(self.queryset.model): subclass: PropertyMapping data.append({ "name": subclass._meta.verbose_name, "description": subclass.__doc__, # pyright: reportGeneralTypeIssues=false "component": subclass().component, "model_name": subclass._meta.model_name, }) return Response(TypeCreateSerializer(data, many=True).data)
def types(self, request: Request) -> Response: """Get all creatable service connection types""" data = [] for subclass in all_subclasses(self.queryset.model): subclass: OutpostServiceConnection # pyright: reportGeneralTypeIssues=false data.append({ "name": subclass._meta.verbose_name, "description": subclass.__doc__, "component": subclass().component, "model_name": subclass._meta.model_name, }) return Response(TypeCreateSerializer(data, many=True).data)
def types(self, request: Request) -> Response: """Get all creatable stage types""" data = [] for subclass in all_subclasses(self.queryset.model, False): subclass: Stage data.append({ "name": subclass._meta.verbose_name, "description": subclass.__doc__, "component": subclass().component, "model_name": subclass._meta.model_name, }) data = sorted(data, key=lambda x: x["name"]) return Response(TypeCreateSerializer(data, many=True).data)
def types(self, request: Request) -> Response: """Get all creatable source types""" data = [] for subclass in all_subclasses(self.queryset.model): subclass: Source component = "" if subclass._meta.abstract: component = subclass.__bases__[0]().component else: component = subclass().component # pyright: reportGeneralTypeIssues=false data.append({ "name": subclass._meta.verbose_name, "description": subclass.__doc__, "component": component, "model_name": subclass._meta.model_name, }) return Response(TypeCreateSerializer(data, many=True).data)
def types(self, request: Request) -> Response: """Get all creatable provider types""" data = [] for subclass in all_subclasses(self.queryset.model): subclass: Provider data.append({ "name": subclass._meta.verbose_name, "description": subclass.__doc__, "component": subclass().component, }) data.append({ "name": _("SAML Provider from Metadata"), "description": _("Create a SAML Provider by importing its Metadata."), "component": "ak-provider-saml-import-form", }) return Response(TypeCreateSerializer(data, many=True).data)
def user_settings(self, request: Request) -> Response: """Get all stages the user can configure""" stages = [] for configurable_stage in all_subclasses(ConfigurableStage): stages += list(configurable_stage.objects.all().order_by("name")) matching_stages: list[dict] = [] for stage in stages: user_settings = stage.ui_user_settings() if not user_settings: continue user_settings.initial_data["object_uid"] = str(stage.pk) if hasattr(stage, "configure_flow") and stage.configure_flow: user_settings.initial_data["configure_url"] = reverse( "authentik_flows:configure", kwargs={"stage_uuid": stage.pk}, ) if not user_settings.is_valid(): LOGGER.warning(user_settings.errors) matching_stages.append(user_settings.initial_data) return Response(matching_stages)
def items(self): mapping = {} classes = all_subclasses(ChallengeResponse) for cls in classes: mapping[cls(stage=None).fields["component"].default] = cls return mapping.items()
model_class = test_model.__bases__[0]() else: model_class = test_model() model_class.slug = "test" self.assertIsNotNone(model_class.component) _ = model_class.ui_login_button _ = model_class.ui_user_settings return tester def provider_tester_factory(test_model: Type[Stage]) -> Callable: """Test provider""" def tester(self: TestModels): model_class = None if test_model._meta.abstract: model_class = test_model.__bases__[0]() else: model_class = test_model() self.assertIsNotNone(model_class.component) return tester for model in all_subclasses(Source): setattr(TestModels, f"test_model_{model.__name__}", source_tester_factory(model)) for model in all_subclasses(Provider): setattr(TestModels, f"test_model_{model.__name__}", provider_tester_factory(model))
from django.test import TestCase from authentik.flows.models import Stage from authentik.flows.stage import StageView from authentik.lib.utils.reflection import all_subclasses class TestModels(TestCase): """Generic model properties tests""" def model_tester_factory(test_model: type[Stage]) -> Callable: """Test a form""" def tester(self: TestModels): model_class = None if test_model._meta.abstract: # pragma: no cover model_class = test_model.__bases__[0]() else: model_class = test_model() self.assertTrue(issubclass(model_class.type, StageView)) self.assertIsNotNone(test_model.component) _ = model_class.ui_user_settings() return tester for model in all_subclasses(Stage): setattr(TestModels, f"test_model_{model.__name__}", model_tester_factory(model))
from rest_framework.serializers import BaseSerializer from authentik.flows.models import Stage from authentik.lib.models import SerializerModel from authentik.lib.utils.reflection import all_subclasses class TestModels(TestCase): """Generic model properties tests""" def model_tester_factory(test_model: Type[Stage]) -> Callable: """Test a form""" def tester(self: TestModels): try: model_class = None if test_model._meta.abstract: model_class = test_model.__bases__[0]() else: model_class = test_model() self.assertTrue(issubclass(model_class.serializer, BaseSerializer)) except NotImplementedError: pass return tester for model in all_subclasses(SerializerModel): setattr(TestModels, f"test_model_{model.__name__}", model_tester_factory(model))
"""stage view tests""" from typing import Callable from django.test import RequestFactory, TestCase from authentik.flows.stage import StageView from authentik.flows.views.executor import FlowExecutorView from authentik.lib.utils.reflection import all_subclasses class TestViews(TestCase): """Generic model properties tests""" def setUp(self) -> None: self.factory = RequestFactory() self.exec = FlowExecutorView(request=self.factory.get("/")) def view_tester_factory(view_class: type[StageView]) -> Callable: """Test a form""" def tester(self: TestViews): model_class = view_class(self.exec) self.assertIsNotNone(model_class.post) self.assertIsNotNone(model_class.get) return tester for view in all_subclasses(StageView): setattr(TestViews, f"test_view_{view.__name__}", view_tester_factory(view))