Skip to content

Commit

Permalink
start endpoint and property mapping stuff
Browse files Browse the repository at this point in the history
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
  • Loading branch information
BeryJu committed Dec 2, 2023
1 parent 180a8a7 commit 37d08ad
Show file tree
Hide file tree
Showing 11 changed files with 1,171 additions and 91 deletions.
24 changes: 24 additions & 0 deletions authentik/enterprise/providers/rac/api/endpoints.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
"""RAC Provider API Views"""
from rest_framework.viewsets import ModelViewSet

from authentik.core.api.providers import ProviderSerializer
from authentik.core.api.used_by import UsedByMixin
from authentik.enterprise.providers.rac.models import Endpoint


class EndpointSerializer(ProviderSerializer):
"""Endpoint Serializer"""

class Meta:
model = Endpoint
fields = ["name", "protocol", "host", "settings", "property_mappings"]
extra_kwargs = ProviderSerializer.Meta.extra_kwargs


class EndpointViewSet(UsedByMixin, ModelViewSet):
"""Endpoint Viewset"""

queryset = Endpoint.objects.all()
serializer_class = EndpointSerializer
search_fields = ["name", "protocol"]
ordering = ["name", "protocol"]
23 changes: 23 additions & 0 deletions authentik/enterprise/providers/rac/api/property_mappings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""RAC Provider API Views"""
from rest_framework.viewsets import ModelViewSet

from authentik.core.api.propertymappings import PropertyMappingSerializer
from authentik.core.api.used_by import UsedByMixin
from authentik.enterprise.providers.rac.models import RACPropertyMapping


class RACPropertyMappingSerializer(PropertyMappingSerializer):
"""RACPropertyMapping Serializer"""

class Meta:
model = RACPropertyMapping
fields = PropertyMappingSerializer.Meta.fields + []


class RACPropertyMappingViewSet(UsedByMixin, ModelViewSet):
"""RACPropertyMapping Viewset"""

queryset = RACPropertyMapping.objects.all()
serializer_class = RACPropertyMappingSerializer
search_fields = ["name"]
ordering = ["name"]
1 change: 0 additions & 1 deletion authentik/enterprise/providers/rac/api/providers.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ class Meta:
model = RACProvider
fields = ProviderSerializer.Meta.fields + [
"protocol",
"host",
"settings",
]
extra_kwargs = ProviderSerializer.Meta.extra_kwargs
Expand Down
63 changes: 61 additions & 2 deletions authentik/enterprise/providers/rac/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Generated by Django 4.2.6 on 2023-10-25 15:01
# Generated by Django 4.2.7 on 2023-11-29 14:01

import django.db.models.deletion
from django.db import migrations, models
Expand All @@ -8,10 +8,66 @@ class Migration(migrations.Migration):
initial = True

dependencies = [
("authentik_policies", "0011_policybinding_failure_result_and_more"),
("authentik_core", "0032_group_roles"),
]

operations = [
migrations.CreateModel(
name="Endpoint",
fields=[
(
"policybindingmodel_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="authentik_policies.policybindingmodel",
),
),
("name", models.TextField()),
("host", models.TextField()),
(
"protocol",
models.TextField(choices=[("rdp", "Rdp"), ("vnc", "Vnc"), ("ssh", "Ssh")]),
),
("settings", models.JSONField(default=dict)),
(
"property_mappings",
models.ManyToManyField(
blank=True, default=None, to="authentik_core.propertymapping"
),
),
],
options={
"verbose_name": "RAC Endpoint",
"verbose_name_plural": "RAC Endpoints",
},
bases=("authentik_policies.policybindingmodel", models.Model),
),
migrations.CreateModel(
name="RACPropertyMapping",
fields=[
(
"propertymapping_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="authentik_core.propertymapping",
),
),
],
options={
"verbose_name": "RAC Property Mapping",
"verbose_name_plural": "RAC Property Mappings",
},
bases=("authentik_core.propertymapping",),
),
migrations.CreateModel(
name="RACProvider",
fields=[
Expand All @@ -30,12 +86,15 @@ class Migration(migrations.Migration):
"protocol",
models.TextField(choices=[("rdp", "Rdp"), ("vnc", "Vnc"), ("ssh", "Ssh")]),
),
("host", models.TextField()),
("settings", models.JSONField(default=dict)),
(
"auth_mode",
models.TextField(choices=[("static", "Static"), ("prompt", "Prompt")]),
),
(
"endpoints",
models.ManyToManyField(blank=True, to="authentik_providers_rac.endpoint"),
),
],
options={
"verbose_name": "RAC Provider",
Expand Down
70 changes: 59 additions & 11 deletions authentik/enterprise/providers/rac/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
from django.utils.translation import gettext as _
from rest_framework.serializers import Serializer

from authentik.core.models import Provider
from authentik.core.models import PropertyMapping, Provider
from authentik.lib.models import SerializerModel
from authentik.policies.models import PolicyBindingModel


class Protocols(models.TextChoices):
Expand All @@ -29,14 +31,16 @@ class RACProvider(Provider):
"""Remote access provider"""

protocol = models.TextField(choices=Protocols.choices)
host = models.TextField()
settings = models.JSONField(default=dict)
auth_mode = models.TextField(choices=AuthenticationMode.choices)
endpoints = models.ManyToManyField("Endpoint", blank=True)

@property
def launch_url(self) -> Optional[str]:
"""URL to this provider and initiate authorization for the user.
Can return None for providers that are not URL-based"""
if len(self.endpoints.all()) < 1:
return None
try:
# pylint: disable=no-member
return reverse(
Expand All @@ -46,13 +50,40 @@ def launch_url(self) -> Optional[str]:
except Provider.application.RelatedObjectDoesNotExist:
return None

def get_settings(self) -> dict:
@property
def component(self) -> str:
return "ak-provider-rac-form"

@property
def serializer(self) -> type[Serializer]:
from authentik.enterprise.providers.rac.api.providers import RACProviderSerializer

return RACProviderSerializer

class Meta:
verbose_name = _("RAC Provider")
verbose_name_plural = _("RAC Providers")


class Endpoint(SerializerModel, PolicyBindingModel):
"""Remote-accessible endpoint"""

name = models.TextField()
host = models.TextField()
protocol = models.TextField(choices=Protocols.choices)
settings = models.JSONField(default=dict)

property_mappings = models.ManyToManyField(
"authentik_core.PropertyMapping", default=None, blank=True
)

def get_settings(self, provider: RACProvider) -> dict:
"""Get settings"""
default_settings = {}
default_settings["hostname"] = self.host
default_settings["enable-drive"] = "true"
default_settings["drive-name"] = "authentik"
default_settings["client-name"] = "foo"
# default_settings["enable-drive"] = "true"
# default_settings["drive-name"] = "authentik"
# default_settings["client-name"] = "foo"
if self.protocol == Protocols.RDP:
default_settings["resize-method"] = "display-update"
default_settings["enable-wallpaper"] = "true"
Expand All @@ -66,19 +97,36 @@ def get_settings(self) -> dict:
default_settings["terminal-type"] = "xterm-256color"
settings = {}
always_merger.merge(settings, default_settings)
always_merger.merge(settings, provider.settings)
always_merger.merge(settings, self.settings)
return settings

@property
def serializer(self) -> type[Serializer]:
from authentik.enterprise.providers.rac.api.endpoints import EndpointSerializer

return EndpointSerializer

class Meta:
verbose_name = _("RAC Endpoint")
verbose_name_plural = _("RAC Endpoints")


class RACPropertyMapping(PropertyMapping):
"""RAC Property mapping"""

@property
def component(self) -> str:
return "ak-provider-rac-form"
return "ak-property-mapping-rac-form"

@property
def serializer(self) -> type[Serializer]:
from authentik.enterprise.providers.rac.api.providers import RACProviderSerializer
from authentik.enterprise.providers.rac.api.property_mappings import (
PropertyMappingSerializer,
)

return RACProviderSerializer
return PropertyMappingSerializer

class Meta:
verbose_name = _("RAC Provider")
verbose_name_plural = _("RAC Providers")
verbose_name = _("RAC Property Mapping")
verbose_name_plural = _("RAC Property Mappings")
4 changes: 4 additions & 0 deletions authentik/enterprise/providers/rac/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
from django.views.decorators.csrf import ensure_csrf_cookie

from authentik.core.channels import TokenOutpostMiddleware
from authentik.enterprise.providers.rac.api.endpoints import EndpointViewSet
from authentik.enterprise.providers.rac.api.property_mappings import RACPropertyMappingViewSet
from authentik.enterprise.providers.rac.api.providers import RACProviderViewSet
from authentik.enterprise.providers.rac.consumer_client import RACClientConsumer
from authentik.enterprise.providers.rac.consumer_outpost import RACOutpostConsumer
Expand Down Expand Up @@ -35,4 +37,6 @@

api_urlpatterns = [
("providers/rac", RACProviderViewSet),
("propertymappings/rac", RACPropertyMappingViewSet),
("rac/endpoints", EndpointViewSet),
]
Loading

0 comments on commit 37d08ad

Please sign in to comment.