示例#1
0
 def items(self):
     mapping = {}
     classes = all_subclasses(Challenge)
     classes.remove(WithUserInfoChallenge)
     for cls in classes:
         mapping[cls().fields["component"].default] = cls
     return mapping.items()
示例#2
0
    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
示例#3
0
 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)
示例#4
0
 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)
示例#6
0
 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)
示例#7
0
 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)
示例#8
0
 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)
示例#9
0
 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)
示例#10
0
 def items(self):
     mapping = {}
     classes = all_subclasses(ChallengeResponse)
     for cls in classes:
         mapping[cls(stage=None).fields["component"].default] = cls
     return mapping.items()
示例#11
0
            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))
示例#12
0
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))
示例#13
0
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))
示例#14
0
"""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))