Compare commits
1 Commits
eap-but-ac
...
endpoints
Author | SHA1 | Date | |
---|---|---|---|
19c5b28cb2 |
0
authentik/endpoints/__init__.py
Normal file
0
authentik/endpoints/__init__.py
Normal file
12
authentik/endpoints/apps.py
Normal file
12
authentik/endpoints/apps.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
"""authentik endpoints app config"""
|
||||||
|
|
||||||
|
from authentik.blueprints.apps import ManagedAppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class AuthentikEndpointsConfig(ManagedAppConfig):
|
||||||
|
"""authentik endpoints app config"""
|
||||||
|
|
||||||
|
name = "authentik.endpoints"
|
||||||
|
label = "authentik_endpoints"
|
||||||
|
verbose_name = "authentik Endpoints"
|
||||||
|
default = True
|
47
authentik/endpoints/common_data.py
Normal file
47
authentik/endpoints/common_data.py
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
|
||||||
|
class UNSUPPORTED(BaseModel):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class OSFamily(Enum):
|
||||||
|
|
||||||
|
linux = "linux"
|
||||||
|
unix = "unix"
|
||||||
|
bsd = "bsd"
|
||||||
|
windows = "windows"
|
||||||
|
macOS = "mac_os"
|
||||||
|
android = "android"
|
||||||
|
iOS = "i_os"
|
||||||
|
other = "other"
|
||||||
|
|
||||||
|
class CommonDeviceData(BaseModel):
|
||||||
|
class Disk(BaseModel):
|
||||||
|
encryption: bool
|
||||||
|
|
||||||
|
class OS(BaseModel):
|
||||||
|
firewall_enabled: bool
|
||||||
|
family: OSFamily
|
||||||
|
name: str
|
||||||
|
version: str
|
||||||
|
|
||||||
|
class Network(BaseModel):
|
||||||
|
hostname: str
|
||||||
|
dns_servers: list[str]
|
||||||
|
|
||||||
|
class Hardware(BaseModel):
|
||||||
|
model: str
|
||||||
|
manufacturer: str
|
||||||
|
|
||||||
|
class Software(BaseModel):
|
||||||
|
name: str
|
||||||
|
version: str
|
||||||
|
|
||||||
|
os: OS | UNSUPPORTED
|
||||||
|
disks: list[Disk] | UNSUPPORTED
|
||||||
|
network: Network | UNSUPPORTED
|
||||||
|
hardware: Hardware | UNSUPPORTED
|
||||||
|
software: list[Software] | UNSUPPORTED
|
16
authentik/endpoints/connector.py
Normal file
16
authentik/endpoints/connector.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
from authentik.blueprints import models
|
||||||
|
|
||||||
|
|
||||||
|
class EnrollmentMethods(models.TextChoices):
|
||||||
|
AUTOMATIC_USER = "automatic_user" # Automatically enrolled through user action
|
||||||
|
AUTOMATIC_API = "automatic_api" # Automatically enrolled through connector integration
|
||||||
|
MANUAL_USER = "manual_user" # Manually enrolled
|
||||||
|
|
||||||
|
|
||||||
|
class BaseConnector:
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def supported_enrollment_methods(self) -> list[EnrollmentMethods]:
|
||||||
|
return []
|
0
authentik/endpoints/connectors/__init__.py
Normal file
0
authentik/endpoints/connectors/__init__.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from authentik.endpoints.connector import BaseConnector, EnrollmentMethods
|
||||||
|
|
||||||
|
|
||||||
|
class GoogleChromeConnector(BaseConnector):
|
||||||
|
|
||||||
|
def supported_enrollment_methods(self) -> list[EnrollmentMethods]:
|
||||||
|
return [EnrollmentMethods.AUTOMATIC_USER]
|
7
authentik/endpoints/connectors/google_chrome/models.py
Normal file
7
authentik/endpoints/connectors/google_chrome/models.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from django.db import models
|
||||||
|
|
||||||
|
from authentik.endpoints.models import Connector
|
||||||
|
|
||||||
|
|
||||||
|
class GoogleChromeConnector(Connector):
|
||||||
|
credentials = models.JSONField()
|
125
authentik/endpoints/migrations/0001_initial.py
Normal file
125
authentik/endpoints/migrations/0001_initial.py
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
# Generated by Django 5.0.9 on 2024-09-24 19:16
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
import uuid
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name="Connector",
|
||||||
|
fields=[
|
||||||
|
(
|
||||||
|
"id",
|
||||||
|
models.AutoField(
|
||||||
|
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
("connector_uuid", models.UUIDField(default=uuid.uuid4)),
|
||||||
|
("name", models.TextField()),
|
||||||
|
(
|
||||||
|
"enrollment_method",
|
||||||
|
models.TextField(
|
||||||
|
choices=[
|
||||||
|
("automatic_user", "Automatic User"),
|
||||||
|
("automatic_api", "Automatic Api"),
|
||||||
|
("manual_user", "Manual User"),
|
||||||
|
]
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
"abstract": False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name="Device",
|
||||||
|
fields=[
|
||||||
|
(
|
||||||
|
"id",
|
||||||
|
models.AutoField(
|
||||||
|
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
("device_uuid", models.UUIDField(default=uuid.uuid4)),
|
||||||
|
("identifier", models.TextField(unique=True)),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
"abstract": False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name="DeviceConnection",
|
||||||
|
fields=[
|
||||||
|
(
|
||||||
|
"id",
|
||||||
|
models.AutoField(
|
||||||
|
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
("device_connection_uuid", models.UUIDField(default=uuid.uuid4)),
|
||||||
|
("data", models.JSONField(default=dict)),
|
||||||
|
(
|
||||||
|
"connection",
|
||||||
|
models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
to="authentik_endpoints.connector",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"device",
|
||||||
|
models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE, to="authentik_endpoints.device"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="device",
|
||||||
|
name="connections",
|
||||||
|
field=models.ManyToManyField(
|
||||||
|
through="authentik_endpoints.DeviceConnection", to="authentik_endpoints.connector"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name="DeviceUser",
|
||||||
|
fields=[
|
||||||
|
(
|
||||||
|
"id",
|
||||||
|
models.AutoField(
|
||||||
|
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
("device_user_uuid", models.UUIDField(default=uuid.uuid4)),
|
||||||
|
("is_primary", models.BooleanField()),
|
||||||
|
(
|
||||||
|
"device",
|
||||||
|
models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE, to="authentik_endpoints.device"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"user",
|
||||||
|
models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="device",
|
||||||
|
name="users",
|
||||||
|
field=models.ManyToManyField(
|
||||||
|
through="authentik_endpoints.DeviceUser", to=settings.AUTH_USER_MODEL
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
0
authentik/endpoints/migrations/__init__.py
Normal file
0
authentik/endpoints/migrations/__init__.py
Normal file
40
authentik/endpoints/models.py
Normal file
40
authentik/endpoints/models.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
from uuid import uuid4
|
||||||
|
|
||||||
|
from django.db import models
|
||||||
|
from django.utils.functional import cached_property
|
||||||
|
|
||||||
|
from authentik.core.models import User
|
||||||
|
from authentik.endpoints.common_data import CommonDeviceData
|
||||||
|
from authentik.lib.models import SerializerModel
|
||||||
|
|
||||||
|
|
||||||
|
class Device(SerializerModel):
|
||||||
|
device_uuid = models.UUIDField(default=uuid4)
|
||||||
|
|
||||||
|
identifier = models.TextField(unique=True)
|
||||||
|
users = models.ManyToManyField(User, through="DeviceUser")
|
||||||
|
connections = models.ManyToManyField("Connector", through="DeviceConnection")
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def data(self) -> CommonDeviceData:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class DeviceUser(models.Model):
|
||||||
|
device_user_uuid = models.UUIDField(default=uuid4)
|
||||||
|
device = models.ForeignKey("Device", on_delete=models.CASCADE)
|
||||||
|
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
|
is_primary = models.BooleanField()
|
||||||
|
|
||||||
|
|
||||||
|
class DeviceConnection(models.Model):
|
||||||
|
device_connection_uuid = models.UUIDField(default=uuid4)
|
||||||
|
device = models.ForeignKey("Device", on_delete=models.CASCADE)
|
||||||
|
connection = models.ForeignKey("Connector", on_delete=models.CASCADE)
|
||||||
|
data = models.JSONField(default=dict)
|
||||||
|
|
||||||
|
|
||||||
|
class Connector(SerializerModel):
|
||||||
|
connector_uuid = models.UUIDField(default=uuid4)
|
||||||
|
|
||||||
|
name = models.TextField()
|
@ -73,6 +73,7 @@ TENANT_APPS = [
|
|||||||
"authentik.admin",
|
"authentik.admin",
|
||||||
"authentik.api",
|
"authentik.api",
|
||||||
"authentik.crypto",
|
"authentik.crypto",
|
||||||
|
"authentik.endpoints",
|
||||||
"authentik.flows",
|
"authentik.flows",
|
||||||
"authentik.outposts",
|
"authentik.outposts",
|
||||||
"authentik.policies.dummy",
|
"authentik.policies.dummy",
|
||||||
|
Reference in New Issue
Block a user