Merge branch 'main' into celery-2-dramatiq

Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
This commit is contained in:
Marc 'risson' Schmitt
2025-06-26 13:46:51 +02:00
25 changed files with 479 additions and 258 deletions

View File

@ -6,13 +6,15 @@
"!Context scalar", "!Context scalar",
"!Enumerate sequence", "!Enumerate sequence",
"!Env scalar", "!Env scalar",
"!Env sequence",
"!Find sequence", "!Find sequence",
"!Format sequence", "!Format sequence",
"!If sequence", "!If sequence",
"!Index scalar", "!Index scalar",
"!KeyOf scalar", "!KeyOf scalar",
"!Value scalar", "!Value scalar",
"!AtIndex scalar" "!AtIndex scalar",
"!ParseJSON scalar"
], ],
"typescript.preferences.importModuleSpecifier": "non-relative", "typescript.preferences.importModuleSpecifier": "non-relative",
"typescript.preferences.importModuleSpecifierEnding": "index", "typescript.preferences.importModuleSpecifierEnding": "index",

View File

@ -37,6 +37,7 @@ entries:
- attrs: - attrs:
attributes: attributes:
env_null: !Env [bar-baz, null] env_null: !Env [bar-baz, null]
json_parse: !ParseJSON '{"foo": "bar"}'
policy_pk1: policy_pk1:
!Format [ !Format [
"%s-%s", "%s-%s",

View File

@ -215,6 +215,7 @@ class TestBlueprintsV1(TransactionTestCase):
}, },
"nested_context": "context-nested-value", "nested_context": "context-nested-value",
"env_null": None, "env_null": None,
"json_parse": {"foo": "bar"},
"at_index_sequence": "foo", "at_index_sequence": "foo",
"at_index_sequence_default": "non existent", "at_index_sequence_default": "non existent",
"at_index_mapping": 2, "at_index_mapping": 2,

View File

@ -6,6 +6,7 @@ from copy import copy
from dataclasses import asdict, dataclass, field, is_dataclass from dataclasses import asdict, dataclass, field, is_dataclass
from enum import Enum from enum import Enum
from functools import reduce from functools import reduce
from json import JSONDecodeError, loads
from operator import ixor from operator import ixor
from os import getenv from os import getenv
from typing import Any, Literal, Union from typing import Any, Literal, Union
@ -291,6 +292,22 @@ class Context(YAMLTag):
return value return value
class ParseJSON(YAMLTag):
"""Parse JSON from context/env/etc value"""
raw: str
def __init__(self, loader: "BlueprintLoader", node: ScalarNode) -> None:
super().__init__()
self.raw = node.value
def resolve(self, entry: BlueprintEntry, blueprint: Blueprint) -> Any:
try:
return loads(self.raw)
except JSONDecodeError as exc:
raise EntryInvalidError.from_entry(exc, entry) from exc
class Format(YAMLTag): class Format(YAMLTag):
"""Format a string""" """Format a string"""
@ -666,6 +683,7 @@ class BlueprintLoader(SafeLoader):
self.add_constructor("!Value", Value) self.add_constructor("!Value", Value)
self.add_constructor("!Index", Index) self.add_constructor("!Index", Index)
self.add_constructor("!AtIndex", AtIndex) self.add_constructor("!AtIndex", AtIndex)
self.add_constructor("!ParseJSON", ParseJSON)
class EntryInvalidError(SentryIgnoredException): class EntryInvalidError(SentryIgnoredException):

View File

@ -407,7 +407,7 @@ class UserViewSet(UsedByMixin, ModelViewSet):
StrField(User, "path"), StrField(User, "path"),
BoolField(User, "is_active", nullable=True), BoolField(User, "is_active", nullable=True),
ChoiceSearchField(User, "type"), ChoiceSearchField(User, "type"),
JSONSearchField(User, "attributes"), JSONSearchField(User, "attributes", suggest_nested=False),
] ]
def get_queryset(self): def get_queryset(self):

View File

@ -2,6 +2,7 @@
from typing import Any from typing import Any
from django.db import models
from django.db.models import Model from django.db.models import Model
from drf_spectacular.extensions import OpenApiSerializerFieldExtension from drf_spectacular.extensions import OpenApiSerializerFieldExtension
from drf_spectacular.plumbing import build_basic_type from drf_spectacular.plumbing import build_basic_type
@ -30,7 +31,27 @@ def is_dict(value: Any):
raise ValidationError("Value must be a dictionary, and not have any duplicate keys.") raise ValidationError("Value must be a dictionary, and not have any duplicate keys.")
class JSONDictField(JSONField):
"""JSON Field which only allows dictionaries"""
default_validators = [is_dict]
class JSONExtension(OpenApiSerializerFieldExtension):
"""Generate API Schema for JSON fields as"""
target_class = "authentik.core.api.utils.JSONDictField"
def map_serializer_field(self, auto_schema, direction):
return build_basic_type(OpenApiTypes.OBJECT)
class ModelSerializer(BaseModelSerializer): class ModelSerializer(BaseModelSerializer):
# By default, JSON fields we have are used to store dictionaries
serializer_field_mapping = BaseModelSerializer.serializer_field_mapping.copy()
serializer_field_mapping[models.JSONField] = JSONDictField
def create(self, validated_data): def create(self, validated_data):
instance = super().create(validated_data) instance = super().create(validated_data)
@ -71,21 +92,6 @@ class ModelSerializer(BaseModelSerializer):
return instance return instance
class JSONDictField(JSONField):
"""JSON Field which only allows dictionaries"""
default_validators = [is_dict]
class JSONExtension(OpenApiSerializerFieldExtension):
"""Generate API Schema for JSON fields as"""
target_class = "authentik.core.api.utils.JSONDictField"
def map_serializer_field(self, auto_schema, direction):
return build_basic_type(OpenApiTypes.OBJECT)
class PassiveSerializer(Serializer): class PassiveSerializer(Serializer):
"""Base serializer class which doesn't implement create/update methods""" """Base serializer class which doesn't implement create/update methods"""

View File

@ -193,17 +193,32 @@ class Event(SerializerModel, ExpiringModel):
brand: Brand = request.brand brand: Brand = request.brand
self.brand = sanitize_dict(model_to_dict(brand)) self.brand = sanitize_dict(model_to_dict(brand))
if hasattr(request, "user"): if hasattr(request, "user"):
original_user = None self.user = get_user(request.user)
if hasattr(request, "session"):
original_user = request.session.get(SESSION_KEY_IMPERSONATE_ORIGINAL_USER, None)
self.user = get_user(request.user, original_user)
if user: if user:
self.user = get_user(user) self.user = get_user(user)
# Check if we're currently impersonating, and add that user
if hasattr(request, "session"): if hasattr(request, "session"):
from authentik.flows.views.executor import SESSION_KEY_PLAN
# Check if we're currently impersonating, and add that user
if SESSION_KEY_IMPERSONATE_ORIGINAL_USER in request.session: if SESSION_KEY_IMPERSONATE_ORIGINAL_USER in request.session:
self.user = get_user(request.session[SESSION_KEY_IMPERSONATE_ORIGINAL_USER]) self.user = get_user(request.session[SESSION_KEY_IMPERSONATE_ORIGINAL_USER])
self.user["on_behalf_of"] = get_user(request.session[SESSION_KEY_IMPERSONATE_USER]) self.user["on_behalf_of"] = get_user(request.session[SESSION_KEY_IMPERSONATE_USER])
# Special case for events that happen during a flow, the user might not be authenticated
# yet but is a pending user instead
if SESSION_KEY_PLAN in request.session:
from authentik.flows.planner import PLAN_CONTEXT_PENDING_USER, FlowPlan
plan: FlowPlan = request.session[SESSION_KEY_PLAN]
pending_user = plan.context.get(PLAN_CONTEXT_PENDING_USER, None)
# Only save `authenticated_as` if there's a different pending user in the flow
# than the user that is authenticated
if pending_user and (
(pending_user.pk and pending_user.pk != self.user.get("pk"))
or (not pending_user.pk)
):
orig_user = self.user.copy()
self.user = {"authenticated_as": orig_user, **get_user(pending_user)}
# User 255.255.255.255 as fallback if IP cannot be determined # User 255.255.255.255 as fallback if IP cannot be determined
self.client_ip = ClientIPMiddleware.get_client_ip(request) self.client_ip = ClientIPMiddleware.get_client_ip(request)
# Enrich event data # Enrich event data

View File

@ -8,9 +8,11 @@ from django.views.debug import SafeExceptionReporterFilter
from guardian.shortcuts import get_anonymous_user from guardian.shortcuts import get_anonymous_user
from authentik.brands.models import Brand from authentik.brands.models import Brand
from authentik.core.models import Group from authentik.core.models import Group, User
from authentik.core.tests.utils import create_test_user
from authentik.events.models import Event from authentik.events.models import Event
from authentik.flows.views.executor import QS_QUERY from authentik.flows.planner import PLAN_CONTEXT_PENDING_USER, FlowPlan
from authentik.flows.views.executor import QS_QUERY, SESSION_KEY_PLAN
from authentik.lib.generators import generate_id from authentik.lib.generators import generate_id
from authentik.policies.dummy.models import DummyPolicy from authentik.policies.dummy.models import DummyPolicy
@ -116,3 +118,92 @@ class TestEvents(TestCase):
"pk": brand.pk.hex, "pk": brand.pk.hex,
}, },
) )
def test_from_http_flow_pending_user(self):
"""Test request from flow request with a pending user"""
user = create_test_user()
session = self.client.session
plan = FlowPlan(generate_id())
plan.context[PLAN_CONTEXT_PENDING_USER] = user
session[SESSION_KEY_PLAN] = plan
session.save()
request = self.factory.get("/")
request.session = session
request.user = user
event = Event.new("unittest").from_http(request)
self.assertEqual(
event.user,
{
"email": user.email,
"pk": user.pk,
"username": user.username,
},
)
def test_from_http_flow_pending_user_anon(self):
"""Test request from flow request with a pending user"""
user = create_test_user()
anon = get_anonymous_user()
session = self.client.session
plan = FlowPlan(generate_id())
plan.context[PLAN_CONTEXT_PENDING_USER] = user
session[SESSION_KEY_PLAN] = plan
session.save()
request = self.factory.get("/")
request.session = session
request.user = anon
event = Event.new("unittest").from_http(request)
self.assertEqual(
event.user,
{
"authenticated_as": {
"pk": anon.pk,
"is_anonymous": True,
"username": "AnonymousUser",
"email": "",
},
"email": user.email,
"pk": user.pk,
"username": user.username,
},
)
def test_from_http_flow_pending_user_fake(self):
"""Test request from flow request with a pending user"""
user = User(
username=generate_id(),
email=generate_id(),
)
anon = get_anonymous_user()
session = self.client.session
plan = FlowPlan(generate_id())
plan.context[PLAN_CONTEXT_PENDING_USER] = user
session[SESSION_KEY_PLAN] = plan
session.save()
request = self.factory.get("/")
request.session = session
request.user = anon
event = Event.new("unittest").from_http(request)
self.assertEqual(
event.user,
{
"authenticated_as": {
"pk": anon.pk,
"is_anonymous": True,
"username": "AnonymousUser",
"email": "",
},
"email": user.email,
"pk": user.pk,
"username": user.username,
},
)

View File

@ -74,8 +74,8 @@ def model_to_dict(model: Model) -> dict[str, Any]:
} }
def get_user(user: User | AnonymousUser, original_user: User | None = None) -> dict[str, Any]: def get_user(user: User | AnonymousUser) -> dict[str, Any]:
"""Convert user object to dictionary, optionally including the original user""" """Convert user object to dictionary"""
if isinstance(user, AnonymousUser): if isinstance(user, AnonymousUser):
try: try:
user = get_anonymous_user() user = get_anonymous_user()
@ -88,10 +88,6 @@ def get_user(user: User | AnonymousUser, original_user: User | None = None) -> d
} }
if user.username == settings.ANONYMOUS_USER_NAME: if user.username == settings.ANONYMOUS_USER_NAME:
user_data["is_anonymous"] = True user_data["is_anonymous"] = True
if original_user:
original_data = get_user(original_user)
original_data["on_behalf_of"] = user_data
return original_data
return user_data return user_data

View File

@ -1,6 +1,7 @@
"""Serializer for tenants models""" """Serializer for tenants models"""
from django_tenants.utils import get_public_schema_name from django_tenants.utils import get_public_schema_name
from rest_framework.fields import JSONField
from rest_framework.generics import RetrieveUpdateAPIView from rest_framework.generics import RetrieveUpdateAPIView
from rest_framework.permissions import SAFE_METHODS from rest_framework.permissions import SAFE_METHODS
@ -12,6 +13,8 @@ from authentik.tenants.models import Tenant
class SettingsSerializer(ModelSerializer): class SettingsSerializer(ModelSerializer):
"""Settings Serializer""" """Settings Serializer"""
footer_links = JSONField(required=False)
class Meta: class Meta:
model = Tenant model = Tenant
fields = [ fields = [

View File

@ -41424,7 +41424,9 @@ components:
app: app:
type: string type: string
format: uuid format: uuid
attributes: {} attributes:
type: object
additionalProperties: {}
required: required:
- app - app
- name - name
@ -41439,7 +41441,9 @@ components:
app: app:
type: string type: string
format: uuid format: uuid
attributes: {} attributes:
type: object
additionalProperties: {}
required: required:
- app - app
- name - name
@ -42028,7 +42032,9 @@ components:
friendly_name: friendly_name:
type: string type: string
nullable: true nullable: true
credentials: {} credentials:
type: object
additionalProperties: {}
required: required:
- component - component
- credentials - credentials
@ -42058,7 +42064,9 @@ components:
type: string type: string
nullable: true nullable: true
minLength: 1 minLength: 1
credentials: {} credentials:
type: object
additionalProperties: {}
required: required:
- credentials - credentials
- name - name
@ -42863,7 +42871,9 @@ components:
path: path:
type: string type: string
default: '' default: ''
context: {} context:
type: object
additionalProperties: {}
last_applied: last_applied:
type: string type: string
format: date-time format: date-time
@ -42883,6 +42893,8 @@ components:
type: string type: string
readOnly: true readOnly: true
metadata: metadata:
type: object
additionalProperties: {}
readOnly: true readOnly: true
content: content:
type: string type: string
@ -42904,7 +42916,9 @@ components:
path: path:
type: string type: string
default: '' default: ''
context: {} context:
type: object
additionalProperties: {}
enabled: enabled:
type: boolean type: boolean
content: content:
@ -42984,7 +42998,9 @@ components:
type: string type: string
format: uuid format: uuid
description: Certificates used for client authentication. description: Certificates used for client authentication.
attributes: {} attributes:
type: object
additionalProperties: {}
required: required:
- brand_uuid - brand_uuid
- domain - domain
@ -43054,7 +43070,9 @@ components:
type: string type: string
format: uuid format: uuid
description: Certificates used for client authentication. description: Certificates used for client authentication.
attributes: {} attributes:
type: object
additionalProperties: {}
required: required:
- domain - domain
Cache: Cache:
@ -44695,7 +44713,9 @@ components:
$ref: '#/components/schemas/ProtocolEnum' $ref: '#/components/schemas/ProtocolEnum'
host: host:
type: string type: string
settings: {} settings:
type: object
additionalProperties: {}
property_mappings: property_mappings:
type: array type: array
items: items:
@ -44766,7 +44786,9 @@ components:
host: host:
type: string type: string
minLength: 1 minLength: 1
settings: {} settings:
type: object
additionalProperties: {}
property_mappings: property_mappings:
type: array type: array
items: items:
@ -44830,12 +44852,16 @@ components:
format: uuid format: uuid
readOnly: true readOnly: true
title: Event uuid title: Event uuid
user: {} user:
type: object
additionalProperties: {}
action: action:
$ref: '#/components/schemas/EventActions' $ref: '#/components/schemas/EventActions'
app: app:
type: string type: string
context: {} context:
type: object
additionalProperties: {}
client_ip: client_ip:
type: string type: string
nullable: true nullable: true
@ -44846,7 +44872,9 @@ components:
expires: expires:
type: string type: string
format: date-time format: date-time
brand: {} brand:
type: object
additionalProperties: {}
required: required:
- action - action
- app - app
@ -44991,13 +45019,17 @@ components:
type: object type: object
description: Event Serializer description: Event Serializer
properties: properties:
user: {} user:
type: object
additionalProperties: {}
action: action:
$ref: '#/components/schemas/EventActions' $ref: '#/components/schemas/EventActions'
app: app:
type: string type: string
minLength: 1 minLength: 1
context: {} context:
type: object
additionalProperties: {}
client_ip: client_ip:
type: string type: string
nullable: true nullable: true
@ -45005,7 +45037,9 @@ components:
expires: expires:
type: string type: string
format: date-time format: date-time
brand: {} brand:
type: object
additionalProperties: {}
required: required:
- action - action
- app - app
@ -45980,7 +46014,9 @@ components:
type: string type: string
format: email format: email
maxLength: 254 maxLength: 254
credentials: {} credentials:
type: object
additionalProperties: {}
scopes: scopes:
type: string type: string
exclude_users_service_account: exclude_users_service_account:
@ -46031,6 +46067,8 @@ components:
provider: provider:
type: integer type: integer
attributes: attributes:
type: object
additionalProperties: {}
readOnly: true readOnly: true
required: required:
- attributes - attributes
@ -46145,7 +46183,9 @@ components:
format: email format: email
minLength: 1 minLength: 1
maxLength: 254 maxLength: 254
credentials: {} credentials:
type: object
additionalProperties: {}
scopes: scopes:
type: string type: string
minLength: 1 minLength: 1
@ -46190,6 +46230,8 @@ components:
provider: provider:
type: integer type: integer
attributes: attributes:
type: object
additionalProperties: {}
readOnly: true readOnly: true
required: required:
- attributes - attributes
@ -47503,6 +47545,8 @@ components:
description: Return internal model name description: Return internal model name
readOnly: true readOnly: true
kubeconfig: kubeconfig:
type: object
additionalProperties: {}
description: Paste your kubeconfig here. authentik will automatically use description: Paste your kubeconfig here. authentik will automatically use
the currently selected context. the currently selected context.
verify_ssl: verify_ssl:
@ -47527,6 +47571,8 @@ components:
description: If enabled, use the local connection. Required Docker socket/Kubernetes description: If enabled, use the local connection. Required Docker socket/Kubernetes
Integration Integration
kubeconfig: kubeconfig:
type: object
additionalProperties: {}
description: Paste your kubeconfig here. authentik will automatically use description: Paste your kubeconfig here. authentik will automatically use
the currently selected context. the currently selected context.
verify_ssl: verify_ssl:
@ -48463,6 +48509,8 @@ components:
provider: provider:
type: integer type: integer
attributes: attributes:
type: object
additionalProperties: {}
readOnly: true readOnly: true
required: required:
- attributes - attributes
@ -48619,6 +48667,8 @@ components:
provider: provider:
type: integer type: integer
attributes: attributes:
type: object
additionalProperties: {}
readOnly: true readOnly: true
required: required:
- attributes - attributes
@ -49532,7 +49582,9 @@ components:
type: string type: string
oidc_jwks_url: oidc_jwks_url:
type: string type: string
oidc_jwks: {} oidc_jwks:
type: object
additionalProperties: {}
authorization_code_auth_method: authorization_code_auth_method:
allOf: allOf:
- $ref: '#/components/schemas/AuthorizationCodeAuthMethodEnum' - $ref: '#/components/schemas/AuthorizationCodeAuthMethodEnum'
@ -49706,7 +49758,9 @@ components:
type: string type: string
oidc_jwks_url: oidc_jwks_url:
type: string type: string
oidc_jwks: {} oidc_jwks:
type: object
additionalProperties: {}
authorization_code_auth_method: authorization_code_auth_method:
allOf: allOf:
- $ref: '#/components/schemas/AuthorizationCodeAuthMethodEnum' - $ref: '#/components/schemas/AuthorizationCodeAuthMethodEnum'
@ -52406,7 +52460,9 @@ components:
app: app:
type: string type: string
format: uuid format: uuid
attributes: {} attributes:
type: object
additionalProperties: {}
PatchedApplicationRequest: PatchedApplicationRequest:
type: object type: object
description: Application Serializer description: Application Serializer
@ -52558,7 +52614,9 @@ components:
type: string type: string
nullable: true nullable: true
minLength: 1 minLength: 1
credentials: {} credentials:
type: object
additionalProperties: {}
PatchedAuthenticatorSMSStageRequest: PatchedAuthenticatorSMSStageRequest:
type: object type: object
description: AuthenticatorSMSStage Serializer description: AuthenticatorSMSStage Serializer
@ -52745,7 +52803,9 @@ components:
path: path:
type: string type: string
default: '' default: ''
context: {} context:
type: object
additionalProperties: {}
enabled: enabled:
type: boolean type: boolean
content: content:
@ -52816,7 +52876,9 @@ components:
type: string type: string
format: uuid format: uuid
description: Certificates used for client authentication. description: Certificates used for client authentication.
attributes: {} attributes:
type: object
additionalProperties: {}
PatchedCaptchaStageRequest: PatchedCaptchaStageRequest:
type: object type: object
description: CaptchaStage Serializer description: CaptchaStage Serializer
@ -53092,7 +53154,9 @@ components:
host: host:
type: string type: string
minLength: 1 minLength: 1
settings: {} settings:
type: object
additionalProperties: {}
property_mappings: property_mappings:
type: array type: array
items: items:
@ -53144,13 +53208,17 @@ components:
type: object type: object
description: Event Serializer description: Event Serializer
properties: properties:
user: {} user:
type: object
additionalProperties: {}
action: action:
$ref: '#/components/schemas/EventActions' $ref: '#/components/schemas/EventActions'
app: app:
type: string type: string
minLength: 1 minLength: 1
context: {} context:
type: object
additionalProperties: {}
client_ip: client_ip:
type: string type: string
nullable: true nullable: true
@ -53158,7 +53226,9 @@ components:
expires: expires:
type: string type: string
format: date-time format: date-time
brand: {} brand:
type: object
additionalProperties: {}
PatchedExpressionPolicyRequest: PatchedExpressionPolicyRequest:
type: object type: object
description: Group Membership Policy Serializer description: Group Membership Policy Serializer
@ -53341,7 +53411,9 @@ components:
format: email format: email
minLength: 1 minLength: 1
maxLength: 254 maxLength: 254
credentials: {} credentials:
type: object
additionalProperties: {}
scopes: scopes:
type: string type: string
minLength: 1 minLength: 1
@ -53725,6 +53797,8 @@ components:
description: If enabled, use the local connection. Required Docker socket/Kubernetes description: If enabled, use the local connection. Required Docker socket/Kubernetes
Integration Integration
kubeconfig: kubeconfig:
type: object
additionalProperties: {}
description: Paste your kubeconfig here. authentik will automatically use description: Paste your kubeconfig here. authentik will automatically use
the currently selected context. the currently selected context.
verify_ssl: verify_ssl:
@ -54308,7 +54382,9 @@ components:
type: string type: string
oidc_jwks_url: oidc_jwks_url:
type: string type: string
oidc_jwks: {} oidc_jwks:
type: object
additionalProperties: {}
authorization_code_auth_method: authorization_code_auth_method:
allOf: allOf:
- $ref: '#/components/schemas/AuthorizationCodeAuthMethodEnum' - $ref: '#/components/schemas/AuthorizationCodeAuthMethodEnum'
@ -54787,7 +54863,9 @@ components:
items: items:
type: string type: string
format: uuid format: uuid
settings: {} settings:
type: object
additionalProperties: {}
connection_expiry: connection_expiry:
type: string type: string
minLength: 1 minLength: 1
@ -55244,7 +55322,9 @@ components:
source: source:
type: string type: string
format: uuid format: uuid
attributes: {} attributes:
type: object
additionalProperties: {}
PatchedSCIMSourcePropertyMappingRequest: PatchedSCIMSourcePropertyMappingRequest:
type: object type: object
description: SCIMSourcePropertyMapping Serializer description: SCIMSourcePropertyMapping Serializer
@ -55305,7 +55385,9 @@ components:
source: source:
type: string type: string
format: uuid format: uuid
attributes: {} attributes:
type: object
additionalProperties: {}
PatchedSMSDeviceRequest: PatchedSMSDeviceRequest:
type: object type: object
description: Serializer for sms authenticator devices description: Serializer for sms authenticator devices
@ -55406,9 +55488,7 @@ components:
minimum: 0 minimum: 0
description: Reputation cannot increase higher than this value. Zero or description: Reputation cannot increase higher than this value. Zero or
positive. positive.
footer_links: footer_links: {}
description: The option configures the footer links on the flow executor
pages.
gdpr_compliance: gdpr_compliance:
type: boolean type: boolean
description: When enabled, all the events caused by a user will be deleted description: When enabled, all the events caused by a user will be deleted
@ -57220,7 +57300,9 @@ components:
type: string type: string
description: Return internal model name description: Return internal model name
readOnly: true readOnly: true
settings: {} settings:
type: object
additionalProperties: {}
outpost_set: outpost_set:
type: array type: array
items: items:
@ -57268,7 +57350,9 @@ components:
items: items:
type: string type: string
format: uuid format: uuid
settings: {} settings:
type: object
additionalProperties: {}
connection_expiry: connection_expiry:
type: string type: string
minLength: 1 minLength: 1
@ -57678,8 +57762,12 @@ components:
type: string type: string
ip: ip:
type: string type: string
ip_geo_data: {} ip_geo_data:
ip_asn_data: {} type: object
additionalProperties: {}
ip_asn_data:
type: object
additionalProperties: {}
score: score:
type: integer type: integer
maximum: 9223372036854775807 maximum: 9223372036854775807
@ -58752,6 +58840,8 @@ components:
provider: provider:
type: integer type: integer
attributes: attributes:
type: object
additionalProperties: {}
readOnly: true readOnly: true
required: required:
- attributes - attributes
@ -58842,6 +58932,8 @@ components:
provider: provider:
type: integer type: integer
attributes: attributes:
type: object
additionalProperties: {}
readOnly: true readOnly: true
required: required:
- attributes - attributes
@ -58956,7 +59048,9 @@ components:
source: source:
type: string type: string
format: uuid format: uuid
attributes: {} attributes:
type: object
additionalProperties: {}
required: required:
- group - group
- group_obj - group_obj
@ -58975,7 +59069,9 @@ components:
source: source:
type: string type: string
format: uuid format: uuid
attributes: {} attributes:
type: object
additionalProperties: {}
required: required:
- group - group
- id - id
@ -59094,7 +59190,9 @@ components:
source: source:
type: string type: string
format: uuid format: uuid
attributes: {} attributes:
type: object
additionalProperties: {}
required: required:
- id - id
- source - source
@ -59112,7 +59210,9 @@ components:
source: source:
type: string type: string
format: uuid format: uuid
attributes: {} attributes:
type: object
additionalProperties: {}
required: required:
- id - id
- source - source
@ -59569,9 +59669,7 @@ components:
minimum: 0 minimum: 0
description: Reputation cannot increase higher than this value. Zero or description: Reputation cannot increase higher than this value. Zero or
positive. positive.
footer_links: footer_links: {}
description: The option configures the footer links on the flow executor
pages.
gdpr_compliance: gdpr_compliance:
type: boolean type: boolean
description: When enabled, all the events caused by a user will be deleted description: When enabled, all the events caused by a user will be deleted
@ -59623,9 +59721,7 @@ components:
minimum: 0 minimum: 0
description: Reputation cannot increase higher than this value. Zero or description: Reputation cannot increase higher than this value. Zero or
positive. positive.
footer_links: footer_links: {}
description: The option configures the footer links on the flow executor
pages.
gdpr_compliance: gdpr_compliance:
type: boolean type: boolean
description: When enabled, all the events caused by a user will be deleted description: When enabled, all the events caused by a user will be deleted

104
uv.lock generated
View File

@ -563,30 +563,30 @@ wheels = [
[[package]] [[package]]
name = "boto3" name = "boto3"
version = "1.38.38" version = "1.38.43"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "botocore" }, { name = "botocore" },
{ name = "jmespath" }, { name = "jmespath" },
{ name = "s3transfer" }, { name = "s3transfer" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/98/a1/f2b68cba5d1907e004f4d88a028eda35a4f619c1e81d764e5cf58491eb46/boto3-1.38.38.tar.gz", hash = "sha256:0fe6b7d1974851588ec1edd39c66d9525d539133e02c7f985f9ebec5e222c0db", size = 111847, upload-time = "2025-06-17T19:33:03.097Z" } sdist = { url = "https://files.pythonhosted.org/packages/90/96/c99c9dac902faae3896558809d130b1bf02df8abb6e4553ad87d018910f9/boto3-1.38.43.tar.gz", hash = "sha256:9b0ff0b34c9cf7328546c532c20b081f09055ff485f4d57c19146c36877048c5", size = 111845, upload-time = "2025-06-24T19:29:02.978Z" }
wheels = [ wheels = [
{ url = "https://files.pythonhosted.org/packages/e4/dc/43d4ab839b84876bdf7baeba0a3ffcef4c3d52d81f3ce1979b4195c0e213/boto3-1.38.38-py3-none-any.whl", hash = "sha256:6f4163cd9e030afd1059e8a6daa178835165b79eb0b5325a8cd447020b895921", size = 139934, upload-time = "2025-06-17T19:33:00.621Z" }, { url = "https://files.pythonhosted.org/packages/de/67/42355b452a5aa622205c321217cba61a85746f0d93984788116a43120821/boto3-1.38.43-py3-none-any.whl", hash = "sha256:2e3411bb43285caad1c8e1a3186d025ba65a6342e26bad493f6b8feb3d1a1680", size = 139922, upload-time = "2025-06-24T19:29:01.545Z" },
] ]
[[package]] [[package]]
name = "botocore" name = "botocore"
version = "1.38.38" version = "1.38.43"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "jmespath" }, { name = "jmespath" },
{ name = "python-dateutil" }, { name = "python-dateutil" },
{ name = "urllib3" }, { name = "urllib3" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/22/f5/d05258ac4ae68769a956779192bfbd322e571ef9fc17a27f02d35c026b4b/botocore-1.38.38.tar.gz", hash = "sha256:acf9ae5b2d99c1f416f94fa5b4f8c044ecb76ffcb7fb1b1daec583f36892a8e2", size = 14009715, upload-time = "2025-06-17T19:32:52.705Z" } sdist = { url = "https://files.pythonhosted.org/packages/1d/ff/8ace3f46fa1a32c09ee994b5401c7853613a283e134449fdc136bb753b40/botocore-1.38.43.tar.gz", hash = "sha256:c453c5c16c157c5427058bb3cc2c5ad35ee2e43336f0ccbfcc6092c5635505c6", size = 14044468, upload-time = "2025-06-24T19:28:52.803Z" }
wheels = [ wheels = [
{ url = "https://files.pythonhosted.org/packages/7b/c6/74f27ffe941dc1438b7fef620b402b982a9f9ab90a04ee47bd0314a02384/botocore-1.38.38-py3-none-any.whl", hash = "sha256:aa5cc63bf885819d862852edb647d6276fe423c60113e8db375bb7ad8d88a5d9", size = 13669107, upload-time = "2025-06-17T19:32:47.503Z" }, { url = "https://files.pythonhosted.org/packages/15/12/0ebcfb91738d0cf9560220ee4e0db351acab14026fac74bbce9ab3881fd9/botocore-1.38.43-py3-none-any.whl", hash = "sha256:2ee60ac0b08e80e9be2aa2841d42e438d5bc4f82549560a682837655097a3db7", size = 13706448, upload-time = "2025-06-24T19:28:47.877Z" },
] ]
[[package]] [[package]]
@ -2090,47 +2090,43 @@ wheels = [
[[package]] [[package]]
name = "multidict" name = "multidict"
version = "6.5.0" version = "6.5.1"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/46/b5/59f27b4ce9951a4bce56b88ba5ff5159486797ab18863f2b4c1c5e8465bd/multidict-6.5.0.tar.gz", hash = "sha256:942bd8002492ba819426a8d7aefde3189c1b87099cdf18aaaefefcf7f3f7b6d2", size = 98512, upload-time = "2025-06-17T14:15:56.556Z" } sdist = { url = "https://files.pythonhosted.org/packages/5c/43/2d90c414d9efc4587d6e7cebae9f2c2d8001bcb4f89ed514ae837e9dcbe6/multidict-6.5.1.tar.gz", hash = "sha256:a835ea8103f4723915d7d621529c80ef48db48ae0c818afcabe0f95aa1febc3a", size = 98690, upload-time = "2025-06-24T22:16:05.117Z" }
wheels = [ wheels = [
{ url = "https://files.pythonhosted.org/packages/1a/c9/092c4e9402b6d16de761cff88cb842a5c8cc50ccecaf9c4481ba53264b9e/multidict-6.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:53d92df1752df67a928fa7f884aa51edae6f1cf00eeb38cbcf318cf841c17456", size = 73486, upload-time = "2025-06-17T14:14:37.238Z" }, { url = "https://files.pythonhosted.org/packages/19/3f/c2e07031111d2513d260157933a8697ad52a935d8a2a2b8b7b317ddd9a96/multidict-6.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:98011312f36d1e496f15454a95578d1212bc2ffc25650a8484752b06d304fd9b", size = 73588, upload-time = "2025-06-24T22:14:54.332Z" },
{ url = "https://files.pythonhosted.org/packages/08/f9/6f7ddb8213f5fdf4db48d1d640b78e8aef89b63a5de8a2313286db709250/multidict-6.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:680210de2c38eef17ce46b8df8bf2c1ece489261a14a6e43c997d49843a27c99", size = 43745, upload-time = "2025-06-17T14:14:38.32Z" }, { url = "https://files.pythonhosted.org/packages/95/bb/f47aa21827202a9f889fd66de9a1db33d0e4bbaaa2567156e4efb3cc0e5e/multidict-6.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bae589fb902b47bd94e6f539b34eefe55a1736099f616f614ec1544a43f95b05", size = 43756, upload-time = "2025-06-24T22:14:55.748Z" },
{ url = "https://files.pythonhosted.org/packages/f3/a7/b9be0163bfeee3bb08a77a1705e24eb7e651d594ea554107fac8a1ca6a4d/multidict-6.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e279259bcb936732bfa1a8eec82b5d2352b3df69d2fa90d25808cfc403cee90a", size = 42135, upload-time = "2025-06-17T14:14:39.897Z" }, { url = "https://files.pythonhosted.org/packages/9f/ec/24549de092c9b0bc3167e0beb31a11be58e8595dbcfed2b7821795bb3923/multidict-6.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6eb3bf26cd94eb306e4bc776d0964cc67a7967e4ad9299309f0ff5beec3c62be", size = 42222, upload-time = "2025-06-24T22:14:57.418Z" },
{ url = "https://files.pythonhosted.org/packages/8e/30/93c8203f943a417bda3c573a34d5db0cf733afdfffb0ca78545c7716dbd8/multidict-6.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1c185fc1069781e3fc8b622c4331fb3b433979850392daa5efbb97f7f9959bb", size = 238585, upload-time = "2025-06-17T14:14:41.332Z" }, { url = "https://files.pythonhosted.org/packages/13/45/54452027ebc0ba660667aab67ae11afb9aaba91f4b5d63cddef045279d94/multidict-6.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e5e1a5a99c72d1531501406fcc06b6bf699ebd079dacd6807bb43fc0ff260e5c", size = 253014, upload-time = "2025-06-24T22:14:58.738Z" },
{ url = "https://files.pythonhosted.org/packages/9d/fe/2582b56a1807604774f566eeef183b0d6b148f4b89d1612cd077567b2e1e/multidict-6.5.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6bb5f65ff91daf19ce97f48f63585e51595539a8a523258b34f7cef2ec7e0617", size = 236174, upload-time = "2025-06-17T14:14:42.602Z" }, { url = "https://files.pythonhosted.org/packages/97/3c/76e7b4c0ce3a8bb43efca679674fba421333fbc8429134072db80e13dcb8/multidict-6.5.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:38755bcba18720cb2338bea23a5afcff234445ee75fa11518f6130e22f2ab970", size = 235939, upload-time = "2025-06-24T22:15:00.138Z" },
{ url = "https://files.pythonhosted.org/packages/9b/c4/d8b66d42d385bd4f974cbd1eaa8b265e6b8d297249009f312081d5ded5c7/multidict-6.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8646b4259450c59b9286db280dd57745897897284f6308edbdf437166d93855", size = 250145, upload-time = "2025-06-17T14:14:43.944Z" }, { url = "https://files.pythonhosted.org/packages/86/ce/48e3123a9af61ff2f60e3764b0b15cf4fca22b1299aac281252ac3a590d6/multidict-6.5.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f42fef9bcba3c32fd4e4a23c5757fc807d218b249573aaffa8634879f95feb73", size = 262940, upload-time = "2025-06-24T22:15:01.52Z" },
{ url = "https://files.pythonhosted.org/packages/bc/64/62feda5093ee852426aae3df86fab079f8bf1cdbe403e1078c94672ad3ec/multidict-6.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d245973d4ecc04eea0a8e5ebec7882cf515480036e1b48e65dffcfbdf86d00be", size = 243470, upload-time = "2025-06-17T14:14:45.343Z" }, { url = "https://files.pythonhosted.org/packages/b3/ab/bccd739faf87051b55df619a0967c8545b4d4a4b90258c5f564ab1752f15/multidict-6.5.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:071b962f4cc87469cda90c7cc1c077b76496878b39851d7417a3d994e27fe2c6", size = 260652, upload-time = "2025-06-24T22:15:02.988Z" },
{ url = "https://files.pythonhosted.org/packages/67/dc/9f6fa6e854625cf289c0e9f4464b40212a01f76b2f3edfe89b6779b4fb93/multidict-6.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a133e7ddc9bc7fb053733d0ff697ce78c7bf39b5aec4ac12857b6116324c8d75", size = 236968, upload-time = "2025-06-17T14:14:46.609Z" }, { url = "https://files.pythonhosted.org/packages/9a/9c/01f654aad28a5d0d74f2678c1541ae15e711f99603fd84c780078205966e/multidict-6.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:627ba4b7ce7c0115981f0fd91921f5d101dfb9972622178aeef84ccce1c2bbf3", size = 250011, upload-time = "2025-06-24T22:15:04.317Z" },
{ url = "https://files.pythonhosted.org/packages/46/ae/4b81c6e3745faee81a156f3f87402315bdccf04236f75c03e37be19c94ff/multidict-6.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80d696fa38d738fcebfd53eec4d2e3aeb86a67679fd5e53c325756682f152826", size = 236575, upload-time = "2025-06-17T14:14:47.929Z" }, { url = "https://files.pythonhosted.org/packages/5c/bc/edf08906e1db7385c6bf36e4179957307f50c44a889493e9b251255be79c/multidict-6.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:05dcaed3e5e54f0d0f99a39762b0195274b75016cbf246f600900305581cf1a2", size = 248242, upload-time = "2025-06-24T22:15:06.035Z" },
{ url = "https://files.pythonhosted.org/packages/8a/fa/4089d7642ea344226e1bfab60dd588761d4791754f8072e911836a39bedf/multidict-6.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:20d30c9410ac3908abbaa52ee5967a754c62142043cf2ba091e39681bd51d21a", size = 247632, upload-time = "2025-06-17T14:14:49.525Z" }, { url = "https://files.pythonhosted.org/packages/b7/c3/1ad054b88b889fda8b62ea9634ac7082567e8dc42b9b794a2c565ef102ab/multidict-6.5.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:11f5ecf3e741a18c578d118ad257c5588ca33cc7c46d51c0487d7ae76f072c32", size = 244683, upload-time = "2025-06-24T22:15:07.731Z" },
{ url = "https://files.pythonhosted.org/packages/16/ee/a353dac797de0f28fb7f078cc181c5f2eefe8dd16aa11a7100cbdc234037/multidict-6.5.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6c65068cc026f217e815fa519d8e959a7188e94ec163ffa029c94ca3ef9d4a73", size = 243520, upload-time = "2025-06-17T14:14:50.83Z" }, { url = "https://files.pythonhosted.org/packages/57/63/119a76b2095e1bb765816175cafeac7b520f564691abef2572fb80f4f246/multidict-6.5.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b948eb625411c20b15088fca862c51a39140b9cf7875b5fb47a72bb249fa2f42", size = 257626, upload-time = "2025-06-24T22:15:09.013Z" },
{ url = "https://files.pythonhosted.org/packages/50/ec/560deb3d2d95822d6eb1bcb1f1cb728f8f0197ec25be7c936d5d6a5d133c/multidict-6.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e355ac668a8c3e49c2ca8daa4c92f0ad5b705d26da3d5af6f7d971e46c096da7", size = 248551, upload-time = "2025-06-17T14:14:52.229Z" }, { url = "https://files.pythonhosted.org/packages/26/a9/b91a76af5ff49bd088ee76d11eb6134227f5ea50bcd5f6738443b2fe8e05/multidict-6.5.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc993a96dfc8300befd03d03df46efdb1d8d5a46911b014e956a4443035f470d", size = 251077, upload-time = "2025-06-24T22:15:10.366Z" },
{ url = "https://files.pythonhosted.org/packages/10/85/ddf277e67c78205f6695f2a7639be459bca9cc353b962fd8085a492a262f/multidict-6.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:08db204213d0375a91a381cae0677ab95dd8c67a465eb370549daf6dbbf8ba10", size = 258362, upload-time = "2025-06-17T14:14:53.934Z" }, { url = "https://files.pythonhosted.org/packages/2a/fe/b1dc57aaa4de9f5a27543e28bd1f8bff00a316888b7344b5d33258b14b0a/multidict-6.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2d333380f22d35a56c6461f4579cfe186e143cd0b010b9524ac027de2a34cd", size = 244715, upload-time = "2025-06-24T22:15:11.76Z" },
{ url = "https://files.pythonhosted.org/packages/02/fc/d64ee1df9b87c5210f2d4c419cab07f28589c81b4e5711eda05a122d0614/multidict-6.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ffa58e3e215af8f6536dc837a990e456129857bb6fd546b3991be470abd9597a", size = 253862, upload-time = "2025-06-17T14:14:55.323Z" }, { url = "https://files.pythonhosted.org/packages/51/55/47a82690f71d0141eea49a623bbcc00a4d28770efc7cba8ead75602c9b90/multidict-6.5.1-cp313-cp313-win32.whl", hash = "sha256:5891e3327e6a426ddd443c87339b967c84feb8c022dd425e0c025fa0fcd71e68", size = 41156, upload-time = "2025-06-24T22:15:13.139Z" },
{ url = "https://files.pythonhosted.org/packages/c9/7c/a2743c00d9e25f4826d3a77cc13d4746398872cf21c843eef96bb9945665/multidict-6.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3e86eb90015c6f21658dbd257bb8e6aa18bdb365b92dd1fba27ec04e58cdc31b", size = 247391, upload-time = "2025-06-17T14:14:57.293Z" }, { url = "https://files.pythonhosted.org/packages/25/b3/43306e4d7d3a9898574d1dc156b9607540dad581b1d767c992030751b82d/multidict-6.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:fcdaa72261bff25fad93e7cb9bd7112bd4bac209148e698e380426489d8ed8a9", size = 44933, upload-time = "2025-06-24T22:15:14.639Z" },
{ url = "https://files.pythonhosted.org/packages/9b/03/7773518db74c442904dbd349074f1e7f2a854cee4d9529fc59e623d3949e/multidict-6.5.0-cp313-cp313-win32.whl", hash = "sha256:f34a90fbd9959d0f857323bd3c52b3e6011ed48f78d7d7b9e04980b8a41da3af", size = 41115, upload-time = "2025-06-17T14:14:59.33Z" }, { url = "https://files.pythonhosted.org/packages/30/e2/34cb83c8a4e01b28e2abf30dc90178aa63c9db042be22fa02472cb744b86/multidict-6.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:84292145303f354a35558e601c665cdf87059d87b12777417e2e57ba3eb98903", size = 41967, upload-time = "2025-06-24T22:15:15.856Z" },
{ url = "https://files.pythonhosted.org/packages/eb/9a/6fc51b1dc11a7baa944bc101a92167d8b0f5929d376a8c65168fc0d35917/multidict-6.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:fcb2aa79ac6aef8d5b709bbfc2fdb1d75210ba43038d70fbb595b35af470ce06", size = 44768, upload-time = "2025-06-17T14:15:00.427Z" }, { url = "https://files.pythonhosted.org/packages/64/08/17d2de9cf749ea9589ecfb7532ab4988e8b113b7624826dba6b7527a58f3/multidict-6.5.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f8316e58db799a1972afbc46770dfaaf20b0847003ab80de6fcb9861194faa3f", size = 80513, upload-time = "2025-06-24T22:15:16.946Z" },
{ url = "https://files.pythonhosted.org/packages/82/2d/0d010be24b663b3c16e3d3307bbba2de5ae8eec496f6027d5c0515b371a8/multidict-6.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:6dcee5e7e92060b4bb9bb6f01efcbb78c13d0e17d9bc6eec71660dd71dc7b0c2", size = 41770, upload-time = "2025-06-17T14:15:01.854Z" }, { url = "https://files.pythonhosted.org/packages/3e/b9/c9392465a21f7dff164633348b4cf66eef55c4ee48bdcdc00f0a71792779/multidict-6.5.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3468f0db187aca59eb56e0aa9f7c8c5427bcb844ad1c86557b4886aeb4484d8", size = 46854, upload-time = "2025-06-24T22:15:18.116Z" },
{ url = "https://files.pythonhosted.org/packages/aa/d1/a71711a5f32f84b7b036e82182e3250b949a0ce70d51a2c6a4079e665449/multidict-6.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:cbbc88abea2388fde41dd574159dec2cda005cb61aa84950828610cb5010f21a", size = 80450, upload-time = "2025-06-17T14:15:02.968Z" }, { url = "https://files.pythonhosted.org/packages/2e/24/d79cbed5d0573304bc907dff0e5ad8788a4de891eec832809812b319930e/multidict-6.5.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:228533a5f99f1248cd79f6470779c424d63bc3e10d47c82511c65cc294458445", size = 45724, upload-time = "2025-06-24T22:15:19.241Z" },
{ url = "https://files.pythonhosted.org/packages/0f/a2/953a9eede63a98fcec2c1a2c1a0d88de120056219931013b871884f51b43/multidict-6.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70b599f70ae6536e5976364d3c3cf36f40334708bd6cebdd1e2438395d5e7676", size = 46971, upload-time = "2025-06-17T14:15:04.149Z" }, { url = "https://files.pythonhosted.org/packages/ec/22/232be6c077183719c78131f0e3c3d7134eb2d839e6e50e1c1e69e5ef5965/multidict-6.5.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527076fdf5854901b1246c589af9a8a18b4a308375acb0020b585f696a10c794", size = 251895, upload-time = "2025-06-24T22:15:20.564Z" },
{ url = "https://files.pythonhosted.org/packages/44/61/60250212953459edda2c729e1d85130912f23c67bd4f585546fe4bdb1578/multidict-6.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:828bab777aa8d29d59700018178061854e3a47727e0611cb9bec579d3882de3b", size = 45548, upload-time = "2025-06-17T14:15:05.666Z" }, { url = "https://files.pythonhosted.org/packages/57/80/85985e1441864b946e79538355b7b47f36206bf6bbaa2fa6d74d8232f2ab/multidict-6.5.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9a17a17bad5c22f43e6a6b285dd9c16b1e8f8428202cd9bc22adaac68d0bbfed", size = 229357, upload-time = "2025-06-24T22:15:21.949Z" },
{ url = "https://files.pythonhosted.org/packages/11/b6/e78ee82e96c495bc2582b303f68bed176b481c8d81a441fec07404fce2ca/multidict-6.5.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9695fc1462f17b131c111cf0856a22ff154b0480f86f539d24b2778571ff94d", size = 238545, upload-time = "2025-06-17T14:15:06.88Z" }, { url = "https://files.pythonhosted.org/packages/b1/14/0024d1428b05aedaeea211da232aa6b6ad5c556a8a38b0942df1e54e1fa5/multidict-6.5.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:efd1951edab4a6cb65108d411867811f2b283f4b972337fb4269e40142f7f6a6", size = 259262, upload-time = "2025-06-24T22:15:23.455Z" },
{ url = "https://files.pythonhosted.org/packages/5a/0f/6132ca06670c8d7b374c3a4fd1ba896fc37fbb66b0de903f61db7d1020ec/multidict-6.5.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b5ac6ebaf5d9814b15f399337ebc6d3a7f4ce9331edd404e76c49a01620b68d", size = 229931, upload-time = "2025-06-17T14:15:08.24Z" }, { url = "https://files.pythonhosted.org/packages/b1/cc/3fe63d61ffc9a48d62f36249e228e330144d990ac01f61169b615a3be471/multidict-6.5.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c07d5f38b39acb4f8f61a7aa4166d140ed628245ff0441630df15340532e3b3c", size = 257998, upload-time = "2025-06-24T22:15:24.907Z" },
{ url = "https://files.pythonhosted.org/packages/c0/63/d9957c506e6df6b3e7a194f0eea62955c12875e454b978f18262a65d017b/multidict-6.5.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84a51e3baa77ded07be4766a9e41d977987b97e49884d4c94f6d30ab6acaee14", size = 248181, upload-time = "2025-06-17T14:15:09.907Z" }, { url = "https://files.pythonhosted.org/packages/e8/e4/46b38b9a565ccc5d86f55787090670582d51ab0a0d37cfeaf4313b053f7b/multidict-6.5.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a6605dc74cd333be279e1fcb568ea24f7bdf1cf09f83a77360ce4dd32d67f14", size = 247951, upload-time = "2025-06-24T22:15:26.274Z" },
{ url = "https://files.pythonhosted.org/packages/43/3f/7d5490579640db5999a948e2c41d4a0efd91a75989bda3e0a03a79c92be2/multidict-6.5.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8de67f79314d24179e9b1869ed15e88d6ba5452a73fc9891ac142e0ee018b5d6", size = 241846, upload-time = "2025-06-17T14:15:11.596Z" }, { url = "https://files.pythonhosted.org/packages/af/78/58a9bc0674401f1f26418cd58a5ebf35ce91ead76a22b578908acfe0f4e2/multidict-6.5.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d64e30ae9ba66ce303a567548a06d64455d97c5dff7052fe428d154274d7174", size = 246786, upload-time = "2025-06-24T22:15:27.695Z" },
{ url = "https://files.pythonhosted.org/packages/e1/f7/252b1ce949ece52bba4c0de7aa2e3a3d5964e800bce71fb778c2e6c66f7c/multidict-6.5.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17f78a52c214481d30550ec18208e287dfc4736f0c0148208334b105fd9e0887", size = 232893, upload-time = "2025-06-17T14:15:12.946Z" }, { url = "https://files.pythonhosted.org/packages/66/24/51142ccee295992e22881cccc54b291308423bbcc836fcf4d2edef1a88d0/multidict-6.5.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2fb5dde79a7f6d98ac5e26a4c9de77ccd2c5224a7ce89aeac6d99df7bbe06464", size = 235030, upload-time = "2025-06-24T22:15:29.391Z" },
{ url = "https://files.pythonhosted.org/packages/45/7e/0070bfd48c16afc26e056f2acce49e853c0d604a69c7124bc0bbdb1bcc0a/multidict-6.5.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2966d0099cb2e2039f9b0e73e7fd5eb9c85805681aa2a7f867f9d95b35356921", size = 228567, upload-time = "2025-06-17T14:15:14.267Z" }, { url = "https://files.pythonhosted.org/packages/4b/9a/a6f7b75460d3e35b16bf7745c9e3ebb3293324a4295e586563bf50d361f4/multidict-6.5.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:8a0d22e8b07cf620e9aeb1582340d00f0031e6a1f3e39d9c2dcbefa8691443b4", size = 253964, upload-time = "2025-06-24T22:15:31.689Z" },
{ url = "https://files.pythonhosted.org/packages/2a/31/90551c75322113ebf5fd9c5422e8641d6952f6edaf6b6c07fdc49b1bebdd/multidict-6.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:86fb42ed5ed1971c642cc52acc82491af97567534a8e381a8d50c02169c4e684", size = 246188, upload-time = "2025-06-17T14:15:15.985Z" }, { url = "https://files.pythonhosted.org/packages/3d/f8/0b690674bf8f78604eb0a2b0a85d1380ff3003f270440d40def2a3de8cf4/multidict-6.5.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0120ed5cff2082c7a0ed62a8f80f4f6ac266010c722381816462f279bfa19487", size = 247370, upload-time = "2025-06-24T22:15:33.114Z" },
{ url = "https://files.pythonhosted.org/packages/cc/e2/aa4b02a55e7767ff292871023817fe4db83668d514dab7ccbce25eaf7659/multidict-6.5.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:4e990cbcb6382f9eae4ec720bcac6a1351509e6fc4a5bb70e4984b27973934e6", size = 235178, upload-time = "2025-06-17T14:15:17.395Z" }, { url = "https://files.pythonhosted.org/packages/7f/7d/ca55049d1041c517f294c1755c786539cb7a8dc5033361f20ce3a3d817be/multidict-6.5.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3dea06ba27401c4b54317aa04791182dc9295e7aa623732dd459071a0e0f65db", size = 242920, upload-time = "2025-06-24T22:15:34.669Z" },
{ url = "https://files.pythonhosted.org/packages/7d/5c/f67e726717c4b138b166be1700e2b56e06fbbcb84643d15f9a9d7335ff41/multidict-6.5.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d99a59d64bb1f7f2117bec837d9e534c5aeb5dcedf4c2b16b9753ed28fdc20a3", size = 243422, upload-time = "2025-06-17T14:15:18.939Z" }, { url = "https://files.pythonhosted.org/packages/1e/65/f4afa14f0921751864bb3ef80267f15ecae423483e8da9bc5d3757632bfa/multidict-6.5.1-cp313-cp313t-win32.whl", hash = "sha256:93b21be44f3cfee3be68ed5cd8848a3c0420d76dbd12d74f7776bde6b29e5f33", size = 46968, upload-time = "2025-06-24T22:15:36.023Z" },
{ url = "https://files.pythonhosted.org/packages/e5/1c/15fa318285e26a50aa3fa979bbcffb90f9b4d5ec58882d0590eda067d0da/multidict-6.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:e8ef15cc97c9890212e1caf90f0d63f6560e1e101cf83aeaf63a57556689fb34", size = 254898, upload-time = "2025-06-17T14:15:20.31Z" }, { url = "https://files.pythonhosted.org/packages/00/0a/13d08be1ca1523df515fb4efd3cf10f153e62d533f55c53f543cd73041e8/multidict-6.5.1-cp313-cp313t-win_amd64.whl", hash = "sha256:c5c18f8646a520cc34d00f65f9f6f77782b8a8c59fd8de10713e0de7f470b5d0", size = 52353, upload-time = "2025-06-24T22:15:37.247Z" },
{ url = "https://files.pythonhosted.org/packages/ad/3d/d6c6d1c2e9b61ca80313912d30bb90d4179335405e421ef0a164eac2c0f9/multidict-6.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:b8a09aec921b34bd8b9f842f0bcfd76c6a8c033dc5773511e15f2d517e7e1068", size = 247129, upload-time = "2025-06-17T14:15:21.665Z" }, { url = "https://files.pythonhosted.org/packages/4b/dd/84aaf725b236677597a9570d8c1c99af0ba03712149852347969e014d826/multidict-6.5.1-cp313-cp313t-win_arm64.whl", hash = "sha256:eb27128141474a1d545f0531b496c7c2f1c4beff50cb5a828f36eb62fef16c67", size = 44500, upload-time = "2025-06-24T22:15:38.445Z" },
{ url = "https://files.pythonhosted.org/packages/29/15/1568258cf0090bfa78d44be66247cfdb16e27dfd935c8136a1e8632d3057/multidict-6.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ff07b504c23b67f2044533244c230808a1258b3493aaf3ea2a0785f70b7be461", size = 243841, upload-time = "2025-06-17T14:15:23.38Z" }, { url = "https://files.pythonhosted.org/packages/07/9f/d4719ce55a1d8bf6619e8bb92f1e2e7399026ea85ae0c324ec77ee06c050/multidict-6.5.1-py3-none-any.whl", hash = "sha256:895354f4a38f53a1df2cc3fa2223fa714cff2b079a9f018a76cad35e7f0f044c", size = 12185, upload-time = "2025-06-24T22:16:03.816Z" },
{ url = "https://files.pythonhosted.org/packages/65/57/64af5dbcfd61427056e840c8e520b502879d480f9632fbe210929fd87393/multidict-6.5.0-cp313-cp313t-win32.whl", hash = "sha256:9232a117341e7e979d210e41c04e18f1dc3a1d251268df6c818f5334301274e1", size = 46761, upload-time = "2025-06-17T14:15:24.733Z" },
{ url = "https://files.pythonhosted.org/packages/26/a8/cac7f7d61e188ff44f28e46cb98f9cc21762e671c96e031f06c84a60556e/multidict-6.5.0-cp313-cp313t-win_amd64.whl", hash = "sha256:44cb5c53fb2d4cbcee70a768d796052b75d89b827643788a75ea68189f0980a1", size = 52112, upload-time = "2025-06-17T14:15:25.906Z" },
{ url = "https://files.pythonhosted.org/packages/51/9f/076533feb1b5488d22936da98b9c217205cfbf9f56f7174e8c5c86d86fe6/multidict-6.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:51d33fafa82640c0217391d4ce895d32b7e84a832b8aee0dcc1b04d8981ec7f4", size = 44358, upload-time = "2025-06-17T14:15:27.117Z" },
{ url = "https://files.pythonhosted.org/packages/44/d8/45e8fc9892a7386d074941429e033adb4640e59ff0780d96a8cf46fe788e/multidict-6.5.0-py3-none-any.whl", hash = "sha256:5634b35f225977605385f56153bd95a7133faffc0ffe12ad26e10517537e8dfc", size = 12181, upload-time = "2025-06-17T14:15:55.156Z" },
] ]
[[package]] [[package]]
@ -2153,11 +2149,11 @@ wheels = [
[[package]] [[package]]
name = "oauthlib" name = "oauthlib"
version = "3.3.0" version = "3.3.1"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/98/8a/6ea75ff7acf89f43afb157604429af4661a9840b1f2cece602b6a13c1893/oauthlib-3.3.0.tar.gz", hash = "sha256:4e707cf88d7dfc22a8cce22ca736a2eef9967c1dd3845efc0703fc922353eeb2", size = 190292, upload-time = "2025-06-17T23:19:18.309Z" } sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" }
wheels = [ wheels = [
{ url = "https://files.pythonhosted.org/packages/e1/3d/760b1456010ed11ce87c0109007f0166078dfdada7597f0091ae76eb7305/oauthlib-3.3.0-py3-none-any.whl", hash = "sha256:a2b3a0a2a4ec2feb4b9110f56674a39b2cc2f23e14713f4ed20441dfba14e934", size = 165155, upload-time = "2025-06-17T23:19:16.771Z" }, { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" },
] ]
[[package]] [[package]]
@ -2540,11 +2536,11 @@ wheels = [
[[package]] [[package]]
name = "pygments" name = "pygments"
version = "2.19.1" version = "2.19.2"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload-time = "2025-01-06T17:26:30.443Z" } sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" }
wheels = [ wheels = [
{ url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload-time = "2025-01-06T17:26:25.553Z" }, { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
] ]
[[package]] [[package]]
@ -2701,11 +2697,11 @@ wheels = [
[[package]] [[package]]
name = "python-dotenv" name = "python-dotenv"
version = "1.1.0" version = "1.1.1"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920, upload-time = "2025-03-25T10:14:56.835Z" } sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" }
wheels = [ wheels = [
{ url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256, upload-time = "2025-03-25T10:14:55.034Z" }, { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" },
] ]
[[package]] [[package]]

8
web/package-lock.json generated
View File

@ -22,7 +22,7 @@
"@floating-ui/dom": "^1.6.11", "@floating-ui/dom": "^1.6.11",
"@formatjs/intl-listformat": "^7.7.11", "@formatjs/intl-listformat": "^7.7.11",
"@fortawesome/fontawesome-free": "^6.7.2", "@fortawesome/fontawesome-free": "^6.7.2",
"@goauthentik/api": "^2025.6.2-1750801939", "@goauthentik/api": "^2025.6.2-1750856752",
"@lit/context": "^1.1.2", "@lit/context": "^1.1.2",
"@lit/localize": "^0.12.2", "@lit/localize": "^0.12.2",
"@lit/reactive-element": "^2.0.4", "@lit/reactive-element": "^2.0.4",
@ -1731,9 +1731,9 @@
} }
}, },
"node_modules/@goauthentik/api": { "node_modules/@goauthentik/api": {
"version": "2025.6.2-1750801939", "version": "2025.6.2-1750856752",
"resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2025.6.2-1750801939.tgz", "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2025.6.2-1750856752.tgz",
"integrity": "sha512-3s0pE6enhLEWVMD+zClORktBhUAw1vO/lCG0ATqm6xqbTfqGxPYWj5XMzYuX7+a2axxn1BFE134afWmdzDhThw==" "integrity": "sha512-Zf/1wa5Q1CBbfc4EyJYc/JieTnMS9V0k4wGlK3ojC+kTDJhGjYdHPWpOGiAV9GJXQWHXfHLpA9bqPtBx/0ww7A=="
}, },
"node_modules/@goauthentik/core": { "node_modules/@goauthentik/core": {
"resolved": "packages/core", "resolved": "packages/core",

View File

@ -93,7 +93,7 @@
"@floating-ui/dom": "^1.6.11", "@floating-ui/dom": "^1.6.11",
"@formatjs/intl-listformat": "^7.7.11", "@formatjs/intl-listformat": "^7.7.11",
"@fortawesome/fontawesome-free": "^6.7.2", "@fortawesome/fontawesome-free": "^6.7.2",
"@goauthentik/api": "^2025.6.2-1750801939", "@goauthentik/api": "^2025.6.2-1750856752",
"@lit/context": "^1.1.2", "@lit/context": "^1.1.2",
"@lit/localize": "^0.12.2", "@lit/localize": "^0.12.2",
"@lit/reactive-element": "^2.0.4", "@lit/reactive-element": "^2.0.4",

View File

@ -1,4 +1,4 @@
import { EventGeo, EventUser } from "@goauthentik/admin/events/utils"; import { EventGeo, renderEventUser } from "@goauthentik/admin/events/utils";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { EventWithContext } from "@goauthentik/common/events"; import { EventWithContext } from "@goauthentik/common/events";
import { actionToLabel } from "@goauthentik/common/labels"; import { actionToLabel } from "@goauthentik/common/labels";
@ -73,7 +73,7 @@ export class RecentEventsCard extends Table<Event> {
return [ return [
html`<div><a href="${`#/events/log/${item.pk}`}">${actionToLabel(item.action)}</a></div> html`<div><a href="${`#/events/log/${item.pk}`}">${actionToLabel(item.action)}</a></div>
<small>${item.app}</small>`, <small>${item.app}</small>`,
EventUser(item), renderEventUser(item),
html`<div>${formatElapsedTime(item.created)}</div> html`<div>${formatElapsedTime(item.created)}</div>
<small>${item.created.toLocaleString()}</small>`, <small>${item.created.toLocaleString()}</small>`,
html` <div>${item.clientIp || msg("-")}</div> html` <div>${item.clientIp || msg("-")}</div>

View File

@ -3,7 +3,7 @@ import { WithLicenseSummary } from "#elements/mixins/license";
import { updateURLParams } from "#elements/router/RouteMatch"; import { updateURLParams } from "#elements/router/RouteMatch";
import "@goauthentik/admin/events/EventMap"; import "@goauthentik/admin/events/EventMap";
import "@goauthentik/admin/events/EventVolumeChart"; import "@goauthentik/admin/events/EventVolumeChart";
import { EventGeo, EventUser } from "@goauthentik/admin/events/utils"; import { EventGeo, renderEventUser } from "@goauthentik/admin/events/utils";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { EventWithContext } from "@goauthentik/common/events"; import { EventWithContext } from "@goauthentik/common/events";
import { actionToLabel } from "@goauthentik/common/labels"; import { actionToLabel } from "@goauthentik/common/labels";
@ -113,7 +113,7 @@ export class EventListPage extends WithLicenseSummary(TablePage<Event>) {
return [ return [
html`<div>${actionToLabel(item.action)}</div> html`<div>${actionToLabel(item.action)}</div>
<small>${item.app}</small>`, <small>${item.app}</small>`,
EventUser(item), renderEventUser(item),
html`<div>${formatElapsedTime(item.created)}</div> html`<div>${formatElapsedTime(item.created)}</div>
<small>${item.created.toLocaleString()}</small>`, <small>${item.created.toLocaleString()}</small>`,
html`<div>${item.clientIp || msg("-")}</div> html`<div>${item.clientIp || msg("-")}</div>

View File

@ -8,6 +8,7 @@ import OlMap from "@openlayers-elements/core/ol-map";
import "@openlayers-elements/maps/ol-layer-openstreetmap"; import "@openlayers-elements/maps/ol-layer-openstreetmap";
import "@openlayers-elements/maps/ol-select"; import "@openlayers-elements/maps/ol-select";
import Feature from "ol/Feature"; import Feature from "ol/Feature";
import { isEmpty } from "ol/extent";
import { Point } from "ol/geom"; import { Point } from "ol/geom";
import { fromLonLat } from "ol/proj"; import { fromLonLat } from "ol/proj";
import Icon from "ol/style/Icon"; import Icon from "ol/style/Icon";
@ -92,7 +93,7 @@ export class EventMap extends AKElement {
// Re-add them // Re-add them
this.events?.results this.events?.results
.filter((event) => { .filter((event) => {
if (!Object.hasOwn(event.context, "geo")) { if (!Object.hasOwn(event.context || {}, "geo")) {
return false; return false;
} }
const geo = (event as EventWithContext).context.geo; const geo = (event as EventWithContext).context.geo;
@ -124,6 +125,9 @@ export class EventMap extends AKElement {
this.vectorLayer?.source?.addFeature(feature); this.vectorLayer?.source?.addFeature(feature);
}); });
// Zoom to show points better // Zoom to show points better
if (isEmpty(this.vectorLayer.source.getExtent())) {
return;
}
this.map.map.getView().fit(this.vectorLayer.source.getExtent(), { this.map.map.getView().fit(this.vectorLayer.source.getExtent(), {
padding: [ padding: [
this.zoomPaddingPx, this.zoomPaddingPx,

View File

@ -1,4 +1,4 @@
import { EventGeo, EventUser } from "#admin/events/utils"; import { EventGeo, renderEventUser } from "#admin/events/utils";
import { DEFAULT_CONFIG } from "#common/api/config"; import { DEFAULT_CONFIG } from "#common/api/config";
import { EventWithContext } from "#common/events"; import { EventWithContext } from "#common/events";
import { actionToLabel } from "#common/labels"; import { actionToLabel } from "#common/labels";
@ -92,7 +92,7 @@ export class EventViewPage extends AKElement {
</dt> </dt>
<dd class="pf-c-description-list__description"> <dd class="pf-c-description-list__description">
<div class="pf-c-description-list__text"> <div class="pf-c-description-list__text">
${EventUser(this.event)} ${renderEventUser(this.event)}
</div> </div>
</dd> </dd>
</div> </div>

View File

@ -1,9 +1,9 @@
import { EventWithContext } from "@goauthentik/common/events"; import { EventUser, EventWithContext } from "@goauthentik/common/events";
import { truncate } from "@goauthentik/common/utils"; import { truncate } from "@goauthentik/common/utils";
import { SlottedTemplateResult } from "@goauthentik/elements/types"; import { SlottedTemplateResult } from "@goauthentik/elements/types";
import { msg, str } from "@lit/localize"; import { msg, str } from "@lit/localize";
import { html, nothing } from "lit"; import { TemplateResult, html, nothing } from "lit";
/** /**
* Given event with a geographical context, format it into a string for display. * Given event with a geographical context, format it into a string for display.
@ -18,31 +18,48 @@ export function EventGeo(event: EventWithContext): SlottedTemplateResult {
return html`${parts.join(", ")}`; return html`${parts.join(", ")}`;
} }
export function EventUser( export function renderEventUser(
event: EventWithContext, event: EventWithContext,
truncateUsername?: number, truncateUsername?: number,
): SlottedTemplateResult { ): SlottedTemplateResult {
if (!event.user.username) return html`-`; if (!event.user.username) return html`-`;
let body: SlottedTemplateResult = nothing; const linkOrSpan = (inner: TemplateResult, evu: EventUser) => {
return html`${evu.pk && !evu.is_anonymous
? html`<a href="#/identity/users/${evu.pk}">${inner}</a>`
: html`<span>${inner}</span>`}`;
};
if (event.user.is_anonymous) { const renderUsername = (evu: EventUser) => {
body = html`<div>${msg("Anonymous user")}</div>`; let username = evu.username;
} else { if (evu.is_anonymous) {
body = html`<div> username = msg("Anonymous user");
<a href="#/identity/users/${event.user.pk}" }
>${truncateUsername if (truncateUsername) {
? truncate(event.user?.username, truncateUsername) return truncate(username, truncateUsername);
: event.user?.username}</a }
> return username;
</div>`; };
}
let body: SlottedTemplateResult = nothing;
body = html`<div>${linkOrSpan(html`${renderUsername(event.user)}`, event.user)}</div>`;
if (event.user.on_behalf_of) { if (event.user.on_behalf_of) {
return html`${body}<small> return html`${body}<small>
<a href="#/identity/users/${event.user.on_behalf_of.pk}" ${linkOrSpan(
>${msg(str`On behalf of ${event.user.on_behalf_of.username}`)}</a html`${msg(str`On behalf of ${renderUsername(event.user.on_behalf_of)}`)}`,
> event.user.on_behalf_of,
)}
</small>`;
}
if (event.user.authenticated_as) {
return html`${body}<small>
${linkOrSpan(
html`${msg(
str`Authenticated as ${renderUsername(event.user.authenticated_as)}`,
)}`,
event.user.authenticated_as,
)}
</small>`; </small>`;
} }

View File

@ -4,8 +4,9 @@ export interface EventUser {
pk: number; pk: number;
email?: string; email?: string;
username: string; username: string;
on_behalf_of?: EventUser;
is_anonymous?: boolean; is_anonymous?: boolean;
on_behalf_of?: EventUser;
authenticated_as?: EventUser;
} }
export interface EventGeo { export interface EventGeo {

View File

@ -1,4 +1,4 @@
import { EventGeo, EventUser } from "@goauthentik/admin/events/utils"; import { EventGeo, renderEventUser } from "@goauthentik/admin/events/utils";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { EventWithContext } from "@goauthentik/common/events"; import { EventWithContext } from "@goauthentik/common/events";
import { actionToLabel } from "@goauthentik/common/labels"; import { actionToLabel } from "@goauthentik/common/labels";
@ -72,7 +72,7 @@ export class ObjectChangelog extends Table<Event> {
row(item: EventWithContext): SlottedTemplateResult[] { row(item: EventWithContext): SlottedTemplateResult[] {
return [ return [
html`${actionToLabel(item.action)}`, html`${actionToLabel(item.action)}`,
EventUser(item), renderEventUser(item),
html`<div>${formatElapsedTime(item.created)}</div> html`<div>${formatElapsedTime(item.created)}</div>
<small>${item.created.toLocaleString()}</small>`, <small>${item.created.toLocaleString()}</small>`,
html`<div>${item.clientIp || msg("-")}</div> html`<div>${item.clientIp || msg("-")}</div>

View File

@ -1,4 +1,4 @@
import { EventUser } from "@goauthentik/admin/events/utils"; import { renderEventUser } from "@goauthentik/admin/events/utils";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { EventWithContext } from "@goauthentik/common/events"; import { EventWithContext } from "@goauthentik/common/events";
import { actionToLabel } from "@goauthentik/common/labels"; import { actionToLabel } from "@goauthentik/common/labels";
@ -46,7 +46,7 @@ export class UserEvents extends Table<Event> {
row(item: EventWithContext): SlottedTemplateResult[] { row(item: EventWithContext): SlottedTemplateResult[] {
return [ return [
html`${actionToLabel(item.action)}`, html`${actionToLabel(item.action)}`,
EventUser(item), renderEventUser(item),
html`<div>${formatElapsedTime(item.created)}</div> html`<div>${formatElapsedTime(item.created)}</div>
<small>${item.created.toLocaleString()}</small>`, <small>${item.created.toLocaleString()}</small>`,
html`<span>${item.clientIp || msg("-")}</span>`, html`<span>${item.clientIp || msg("-")}</span>`,

View File

@ -1,4 +1,4 @@
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2"> <?xml version="1.0" ?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="it" source-language="en" original="lit-localize-inputs" datatype="plaintext"> <file target-language="it" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body> <body>
<trans-unit id="s4caed5b7a7e5d89b"> <trans-unit id="s4caed5b7a7e5d89b">
@ -596,9 +596,9 @@
</trans-unit> </trans-unit>
<trans-unit id="saa0e2675da69651b"> <trans-unit id="saa0e2675da69651b">
<source>The URL "<x id="0" equiv-text="${this.url}"/>" was not found.</source> <source>The URL &quot;<x id="0" equiv-text="${this.url}"/>&quot; was not found.</source>
<target>La URL " <target>La URL &quot;
<x id="0" equiv-text="${this.url}"/>" non è stata trovata.</target> <x id="0" equiv-text="${this.url}"/>&quot; non è stata trovata.</target>
</trans-unit> </trans-unit>
<trans-unit id="s58cd9c2fe836d9c6"> <trans-unit id="s58cd9c2fe836d9c6">
@ -1100,7 +1100,7 @@
</trans-unit> </trans-unit>
<trans-unit id="sde949d0ef44572eb"> <trans-unit id="sde949d0ef44572eb">
<source>Requires the user to have a 'upn' attribute set, and falls back to hashed user ID. Use this mode only if you have different UPN and Mail domains.</source> <source>Requires the user to have a 'upn' attribute set, and falls back to hashed user ID. Use this mode only if you have different UPN and Mail domains.</source>
<target>Richiede che l'utente abbia un attributo "upn" impostato e ricorre all'ID utente con hash. Utilizza questa modalità solo se disponi di domini UPN e di posta diversi.</target> <target>Richiede che l'utente abbia un attributo &quot;upn&quot; impostato e ricorre all'ID utente con hash. Utilizza questa modalità solo se disponi di domini UPN e di posta diversi.</target>
</trans-unit> </trans-unit>
<trans-unit id="s9f23ed1799b4d49a"> <trans-unit id="s9f23ed1799b4d49a">
@ -1260,7 +1260,7 @@
</trans-unit> </trans-unit>
<trans-unit id="s211b75e868072162"> <trans-unit id="s211b75e868072162">
<source>Set this to the domain you wish the authentication to be valid for. Must be a parent domain of the URL above. If you're running applications as app1.domain.tld, app2.domain.tld, set this to 'domain.tld'.</source> <source>Set this to the domain you wish the authentication to be valid for. Must be a parent domain of the URL above. If you're running applications as app1.domain.tld, app2.domain.tld, set this to 'domain.tld'.</source>
<target>Impostalo sul dominio per il quale desideri che l'autenticazione sia valida. Deve essere un dominio principale dell'URL riportato sopra. Se esegui applicazioni come app1.domain.tld, app2.domain.tld, impostalo su "domain.tld".</target> <target>Impostalo sul dominio per il quale desideri che l'autenticazione sia valida. Deve essere un dominio principale dell'URL riportato sopra. Se esegui applicazioni come app1.domain.tld, app2.domain.tld, impostalo su &quot;domain.tld&quot;.</target>
</trans-unit> </trans-unit>
<trans-unit id="s2345170f7e272668"> <trans-unit id="s2345170f7e272668">
@ -1709,8 +1709,8 @@
</trans-unit> </trans-unit>
<trans-unit id="sa90b7809586c35ce"> <trans-unit id="sa90b7809586c35ce">
<source>Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test".</source> <source>Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon &quot;fa-test&quot;.</source>
<target>Inserisci un URL completo, un percorso relativo oppure utilizza "fa://fa-test" per utilizzare l'icona "fa-test" di Font Awesome.</target> <target>Inserisci un URL completo, un percorso relativo oppure utilizza &quot;fa://fa-test&quot; per utilizzare l'icona &quot;fa-test&quot; di Font Awesome.</target>
</trans-unit> </trans-unit>
<trans-unit id="s0410779cb47de312"> <trans-unit id="s0410779cb47de312">
@ -3134,7 +3134,7 @@ doesn't pass when either or both of the selected options are equal or above the
</trans-unit> </trans-unit>
<trans-unit id="s3198c384c2f68b08"> <trans-unit id="s3198c384c2f68b08">
<source>Time offset when temporary users should be deleted. This only applies if your IDP uses the NameID Format 'transient', and the user doesn't log out manually.</source> <source>Time offset when temporary users should be deleted. This only applies if your IDP uses the NameID Format 'transient', and the user doesn't log out manually.</source>
<target>Tempo da attendere quando gli utenti temporanei devono essere eliminati. Questo vale solo se l'IDP utilizza il formato NameID "Transient" e l'utente non si disconnette manualmente.</target> <target>Tempo da attendere quando gli utenti temporanei devono essere eliminati. Questo vale solo se l'IDP utilizza il formato NameID &quot;Transient&quot; e l'utente non si disconnette manualmente.</target>
</trans-unit> </trans-unit>
<trans-unit id="sb32e9c1faa0b8673"> <trans-unit id="sb32e9c1faa0b8673">
@ -3276,7 +3276,7 @@ doesn't pass when either or both of the selected options are equal or above the
</trans-unit> </trans-unit>
<trans-unit id="s9f8aac89fe318acc"> <trans-unit id="s9f8aac89fe318acc">
<source>Optionally set the 'FriendlyName' value of the Assertion attribute.</source> <source>Optionally set the 'FriendlyName' value of the Assertion attribute.</source>
<target>Opzionale: imposta il valore "friendlyname" dell'attributo di asserzione.</target> <target>Opzionale: imposta il valore &quot;friendlyname&quot; dell'attributo di asserzione.</target>
</trans-unit> </trans-unit>
<trans-unit id="s851c108679653d2a"> <trans-unit id="s851c108679653d2a">
@ -3757,10 +3757,10 @@ doesn't pass when either or both of the selected options are equal or above the
</trans-unit> </trans-unit>
<trans-unit id="sa95a538bfbb86111"> <trans-unit id="sa95a538bfbb86111">
<source>Are you sure you want to update <x id="0" equiv-text="${this.objectLabel}"/> "<x id="1" equiv-text="${this.obj?.name}"/>"?</source> <source>Are you sure you want to update <x id="0" equiv-text="${this.objectLabel}"/> &quot;<x id="1" equiv-text="${this.obj?.name}"/>&quot;?</source>
<target>Sei sicuro di voler aggiornare <target>Sei sicuro di voler aggiornare
<x id="0" equiv-text="${this.objectLabel}"/>" <x id="0" equiv-text="${this.objectLabel}"/>&quot;
<x id="1" equiv-text="${this.obj?.name}"/>"?</target> <x id="1" equiv-text="${this.obj?.name}"/>&quot;?</target>
</trans-unit> </trans-unit>
<trans-unit id="sc92d7cfb6ee1fec6"> <trans-unit id="sc92d7cfb6ee1fec6">
@ -4133,7 +4133,7 @@ doesn't pass when either or both of the selected options are equal or above the
</trans-unit> </trans-unit>
<trans-unit id="s7520286c8419a266"> <trans-unit id="s7520286c8419a266">
<source>Optional data which is loaded into the flow's 'prompt_data' context variable. YAML or JSON.</source> <source>Optional data which is loaded into the flow's 'prompt_data' context variable. YAML or JSON.</source>
<target>Dati facoltativi che vengono caricati nella variabile di contesto "prompt_data" del flusso. YAML o JSON.</target> <target>Dati facoltativi che vengono caricati nella variabile di contesto &quot;prompt_data&quot; del flusso. YAML o JSON.</target>
</trans-unit> </trans-unit>
<trans-unit id="sb8795b799c70776a"> <trans-unit id="sb8795b799c70776a">
@ -4826,8 +4826,8 @@ doesn't pass when either or both of the selected options are equal or above the
</trans-unit> </trans-unit>
<trans-unit id="sdf1d8edef27236f0"> <trans-unit id="sdf1d8edef27236f0">
<source>A "roaming" authenticator, like a YubiKey</source> <source>A &quot;roaming&quot; authenticator, like a YubiKey</source>
<target>Un autenticatore "roaming", come un YubiKey</target> <target>Un autenticatore &quot;roaming&quot;, come un YubiKey</target>
</trans-unit> </trans-unit>
<trans-unit id="sfffba7b23d8fb40c"> <trans-unit id="sfffba7b23d8fb40c">
@ -5132,7 +5132,7 @@ doesn't pass when either or both of the selected options are equal or above the
</trans-unit> </trans-unit>
<trans-unit id="s5170f9ef331949c0"> <trans-unit id="s5170f9ef331949c0">
<source>Show arbitrary input fields to the user, for example during enrollment. Data is saved in the flow context under the 'prompt_data' variable.</source> <source>Show arbitrary input fields to the user, for example during enrollment. Data is saved in the flow context under the 'prompt_data' variable.</source>
<target>Mostra campi di input arbitrari all'utente, ad esempio durante l'iscrizione. I dati vengono salvati nel contesto di flusso nell'ambito della variabile "prompt_data".</target> <target>Mostra campi di input arbitrari all'utente, ad esempio durante l'iscrizione. I dati vengono salvati nel contesto di flusso nell'ambito della variabile &quot;prompt_data&quot;.</target>
</trans-unit> </trans-unit>
<trans-unit id="s36cb242ac90353bc"> <trans-unit id="s36cb242ac90353bc">
@ -5185,8 +5185,8 @@ doesn't pass when either or both of the selected options are equal or above the
</trans-unit> </trans-unit>
<trans-unit id="s1608b2f94fa0dbd4"> <trans-unit id="s1608b2f94fa0dbd4">
<source>If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here.</source> <source>If set to a duration above 0, the user will have the option to choose to &quot;stay signed in&quot;, which will extend their session by the time specified here.</source>
<target>Se impostato su una durata superiore a 0, l'utente avrà la possibilità di scegliere di "rimanere firmato", che estenderà la sessione entro il momento specificato qui.</target> <target>Se impostato su una durata superiore a 0, l'utente avrà la possibilità di scegliere di &quot;rimanere firmato&quot;, che estenderà la sessione entro il momento specificato qui.</target>
</trans-unit> </trans-unit>
<trans-unit id="s542a71bb8f41e057"> <trans-unit id="s542a71bb8f41e057">
@ -5207,7 +5207,7 @@ doesn't pass when either or both of the selected options are equal or above the
<trans-unit id="s927398c400970760"> <trans-unit id="s927398c400970760">
<source>Write any data from the flow's context's 'prompt_data' to the currently pending user. If no user <source>Write any data from the flow's context's 'prompt_data' to the currently pending user. If no user
is pending, a new user is created, and data is written to them.</source> is pending, a new user is created, and data is written to them.</source>
<target>Scrivi qualsiasi dati dal contesto del flusso "prompt_data" all'utente attualmente in sospeso. Se nessun utente <target>Scrivi qualsiasi dati dal contesto del flusso &quot;prompt_data&quot; all'utente attualmente in sospeso. Se nessun utente
è in sospeso, viene creato un nuovo utente e vengono scritti dati.</target> è in sospeso, viene creato un nuovo utente e vengono scritti dati.</target>
</trans-unit> </trans-unit>
<trans-unit id="sb379d861cbed0b47"> <trans-unit id="sb379d861cbed0b47">
@ -7336,7 +7336,7 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s070fdfb03034ca9b"> <trans-unit id="s070fdfb03034ca9b">
<source>One hint, 'New Application Wizard', is currently hidden</source> <source>One hint, 'New Application Wizard', is currently hidden</source>
<target>Un suggerimento, "New Application Wizard", è attualmente nascosto</target> <target>Un suggerimento, &quot;New Application Wizard&quot;, è attualmente nascosto</target>
</trans-unit> </trans-unit>
<trans-unit id="s1cc306d8e28c4464"> <trans-unit id="s1cc306d8e28c4464">
<source>Deny message</source> <source>Deny message</source>
@ -7451,7 +7451,7 @@ Bindings to groups/users are checked against the user of the event.</source>
<target>Utente creato con successo e aggiunto al gruppo <x id="0" equiv-text="${this.group.name}"/></target> <target>Utente creato con successo e aggiunto al gruppo <x id="0" equiv-text="${this.group.name}"/></target>
</trans-unit> </trans-unit>
<trans-unit id="s824e0943a7104668"> <trans-unit id="s824e0943a7104668">
<source>This user will be added to the group "<x id="0" equiv-text="${this.targetGroup.name}"/>".</source> <source>This user will be added to the group &quot;<x id="0" equiv-text="${this.targetGroup.name}"/>&quot;.</source>
<target>Questo utente sarà aggiunto al gruppo &amp;quot;<x id="0" equiv-text="${this.targetGroup.name}"/>&amp;quot;.</target> <target>Questo utente sarà aggiunto al gruppo &amp;quot;<x id="0" equiv-text="${this.targetGroup.name}"/>&amp;quot;.</target>
</trans-unit> </trans-unit>
<trans-unit id="s62e7f6ed7d9cb3ca"> <trans-unit id="s62e7f6ed7d9cb3ca">
@ -8598,7 +8598,7 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s9dda0789d278f5c5"> <trans-unit id="s9dda0789d278f5c5">
<source>Provide users with a 'show password' button.</source> <source>Provide users with a 'show password' button.</source>
<target>Fornisci agli utenti un pulsante "Mostra password".</target> <target>Fornisci agli utenti un pulsante &quot;Mostra password&quot;.</target>
</trans-unit> </trans-unit>
<trans-unit id="s2f7f35f6a5b733f5"> <trans-unit id="s2f7f35f6a5b733f5">
<source>Show password</source> <source>Show password</source>
@ -8733,7 +8733,7 @@ Bindings to groups/users are checked against the user of the event.</source>
<target>Gruppo di sincronizzazione</target> <target>Gruppo di sincronizzazione</target>
</trans-unit> </trans-unit>
<trans-unit id="s2d5f69929bb7221d"> <trans-unit id="s2d5f69929bb7221d">
<source><x id="0" equiv-text="${p.name}"/> ("<x id="1" equiv-text="${p.fieldKey}"/>", of type <x id="2" equiv-text="${p.type}"/>)</source> <source><x id="0" equiv-text="${p.name}"/> (&quot;<x id="1" equiv-text="${p.fieldKey}"/>&quot;, of type <x id="2" equiv-text="${p.type}"/>)</source>
<target><x id="0" equiv-text="${p.name}"/> (&amp;quot;<x id="1" equiv-text="${p.fieldKey}"/>&amp;quot;, del tipo <x id="2" equiv-text="${p.type}"/>)</target> <target><x id="0" equiv-text="${p.name}"/> (&amp;quot;<x id="1" equiv-text="${p.fieldKey}"/>&amp;quot;, del tipo <x id="2" equiv-text="${p.type}"/>)</target>
</trans-unit> </trans-unit>
<trans-unit id="s25bacc19d98b444e"> <trans-unit id="s25bacc19d98b444e">
@ -8981,8 +8981,8 @@ Bindings to groups/users are checked against the user of the event.</source>
<target>URI di reindirizzamento validi dopo un flusso di autorizzazione riuscito. Specificare anche eventuali origini per i flussi impliciti.</target> <target>URI di reindirizzamento validi dopo un flusso di autorizzazione riuscito. Specificare anche eventuali origini per i flussi impliciti.</target>
</trans-unit> </trans-unit>
<trans-unit id="s4c49d27de60a532b"> <trans-unit id="s4c49d27de60a532b">
<source>To allow any redirect URI, set the mode to Regex and the value to ".*". Be aware of the possible security implications this can have.</source> <source>To allow any redirect URI, set the mode to Regex and the value to &quot;.*&quot;. Be aware of the possible security implications this can have.</source>
<target>Per consentire qualsiasi URI di reindirizzamento, imposta la modalità su Regex e il valore su ".*". Tieni presente le possibili implicazioni per la sicurezza.</target> <target>Per consentire qualsiasi URI di reindirizzamento, imposta la modalità su Regex e il valore su &quot;.*&quot;. Tieni presente le possibili implicazioni per la sicurezza.</target>
</trans-unit> </trans-unit>
<trans-unit id="sa52bf79fe1ccb13e"> <trans-unit id="sa52bf79fe1ccb13e">
<source>Federated OIDC Sources</source> <source>Federated OIDC Sources</source>
@ -9648,7 +9648,7 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="s17359123e1f24504"> <trans-unit id="s17359123e1f24504">
<source>Field which contains DNs of groups the user is a member of. This field is used to lookup groups from users, e.g. 'memberOf'. To lookup nested groups in an Active Directory environment use 'memberOf:1.2.840.113556.1.4.1941:'.</source> <source>Field which contains DNs of groups the user is a member of. This field is used to lookup groups from users, e.g. 'memberOf'. To lookup nested groups in an Active Directory environment use 'memberOf:1.2.840.113556.1.4.1941:'.</source>
<target>Campo che contiene i ND dei gruppi di cui l'utente è membro. Questo campo viene utilizzato per cercare i gruppi degli utenti, ad esempio "memberOf". Per cercare gruppi nidificati in un ambiente Active Directory, utilizzare "memberOf:1.2.840.113556.1.4.1941:".</target> <target>Campo che contiene i ND dei gruppi di cui l'utente è membro. Questo campo viene utilizzato per cercare i gruppi degli utenti, ad esempio &quot;memberOf&quot;. Per cercare gruppi nidificati in un ambiente Active Directory, utilizzare &quot;memberOf:1.2.840.113556.1.4.1941:&quot;.</target>
</trans-unit> </trans-unit>
<trans-unit id="s891cd64acabf23bf"> <trans-unit id="s891cd64acabf23bf">
<source>Initial Permissions</source> <source>Initial Permissions</source>
@ -9731,8 +9731,8 @@ Bindings to groups/users are checked against the user of the event.</source>
<target>Come eseguire l'autenticazione durante un flusso di richiesta del token authorization_code</target> <target>Come eseguire l'autenticazione durante un flusso di richiesta del token authorization_code</target>
</trans-unit> </trans-unit>
<trans-unit id="s844baf19a6c4a9b4"> <trans-unit id="s844baf19a6c4a9b4">
<source>Enable "Remember me on this device"</source> <source>Enable &quot;Remember me on this device&quot;</source>
<target>Abilita "Ricordami su questo dispositivo"</target> <target>Abilita &quot;Ricordami su questo dispositivo&quot;</target>
</trans-unit> </trans-unit>
<trans-unit id="sfa72bca733f40692"> <trans-unit id="sfa72bca733f40692">
<source>When enabled, the user can save their username in a cookie, allowing them to skip directly to entering their password.</source> <source>When enabled, the user can save their username in a cookie, allowing them to skip directly to entering their password.</source>
@ -9884,7 +9884,7 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="se630f2ccd39bf9e6"> <trans-unit id="se630f2ccd39bf9e6">
<source>If no group is selected and 'Send notification to event user' is disabled the rule is disabled. </source> <source>If no group is selected and 'Send notification to event user' is disabled the rule is disabled. </source>
<target>Se non viene selezionato alcun gruppo e l'opzione "Invia notifica all'utente dell'evento" è disabilitata, la regola è disabilitata.</target> <target>Se non viene selezionato alcun gruppo e l'opzione &quot;Invia notifica all'utente dell'evento&quot; è disabilitata, la regola è disabilitata.</target>
</trans-unit> </trans-unit>
<trans-unit id="s47966b2a708694e2"> <trans-unit id="s47966b2a708694e2">
<source>Send notification to event user</source> <source>Send notification to event user</source>
@ -9892,7 +9892,7 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="sd30f00ff2135589c"> <trans-unit id="sd30f00ff2135589c">
<source>When enabled, notification will be sent to the user that triggered the event in addition to any users in the group above. The event user will always be the first user, to send a notification only to the event user enabled 'Send once' in the notification transport.</source> <source>When enabled, notification will be sent to the user that triggered the event in addition to any users in the group above. The event user will always be the first user, to send a notification only to the event user enabled 'Send once' in the notification transport.</source>
<target>Se abilitata, la notifica verrà inviata all'utente che ha attivato l'evento, oltre a tutti gli utenti del gruppo sopra indicato. L'utente dell'evento sarà sempre il primo a inviare una notifica solo all'utente dell'evento che ha abilitato "Invia una volta" nel trasporto delle notifiche.</target> <target>Se abilitata, la notifica verrà inviata all'utente che ha attivato l'evento, oltre a tutti gli utenti del gruppo sopra indicato. L'utente dell'evento sarà sempre il primo a inviare una notifica solo all'utente dell'evento che ha abilitato &quot;Invia una volta&quot; nel trasporto delle notifiche.</target>
</trans-unit> </trans-unit>
<trans-unit id="sbd65aeeb8a3b9bbc"> <trans-unit id="sbd65aeeb8a3b9bbc">
<source>Maximum registration attempts</source> <source>Maximum registration attempts</source>
@ -9904,7 +9904,8 @@ Bindings to groups/users are checked against the user of the event.</source>
</trans-unit> </trans-unit>
<trans-unit id="sab4db6a3bd6abc1e"> <trans-unit id="sab4db6a3bd6abc1e">
<source>This application does currently not have any application entitlements defined.</source> <source>This application does currently not have any application entitlements defined.</source>
<target>Questa applicazione al momento non ha eventuali diritti applicativi definiti.</target>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>
</xliff> </xliff>

View File

@ -1,25 +1,11 @@
# Website # authentik documentation source
This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. This directory contains the source files for the [authentik technical documentation](https://docs.goauthentik.io/docs?utm_source=github) and the [authentik integration guides](https://docs.goauthentik.io/integrations?utm_source=github).
## Installation Contributions are welcome! Please refer to our [contributor guidelines](https://docs.goauthentik.io/docs/developer-docs?utm_source=github) for details about contributing code or docs.
```console For instructions to set up your local environment for building docs locally, refer to our [Docs development environment](https://docs.goauthentik.io/docs/developer-docs/setup/website-dev-environment?utm_source=github) page.
npm ci
```
## Local Development For instructions for writing the docs and then testing in your local build, plus tips on writing, links to our Style Guide and templates, see the [Writing documentation guide](https://docs.goauthentik.io/docs/developer-docs/docs/writing-documentation?utm_source=github).
```console To ensure a smooth review process, we encourage you to build the documentation locally to preview and test your documentation contributions. Be sure to test locally before opening a pull request. Let us know if you have any questions or want help with any part of the process.
npm run watch
```
This command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server.
## Build
```console
npm run build
```
This command generates static content into the `build` directory and can be served using any static contents hosting service.

View File

@ -10,10 +10,7 @@ support_level: community
> >
> -- https://sssd.io/ > -- https://sssd.io/
Note that authentik supports _only_ user and group objects. As Note that authentik supports _only_ user and group objects. As a consequence, it cannot be used to provide automount or sudo configuration, nor can it provide netgroups or services to `nss`. Kerberos is also not supported.
a consequence, it cannot be used to provide automount or sudo
configuration nor can it provide netgroups or services to `nss`.
Kerberos is also not supported.
## Preparation ## Preparation
@ -21,15 +18,10 @@ The following placeholders are used in this guide:
- `authentik.company` is the FQDN of the authentik LDAP outpost installation. - `authentik.company` is the FQDN of the authentik LDAP outpost installation.
- `ldap.baseDN` is the Base DN you configure in the LDAP provider. - `ldap.baseDN` is the Base DN you configure in the LDAP provider.
- `ldap.domain` is (typically) an FQDN for your domain. Usually - `ldap.domain` is typically a fully qualified domain name (FQDN) representing your domain. Its often derived from the components of your base DN. For example, if `ldap.baseDN` is `dc=ldap,dc=goauthentik,dc=io`, then the domain would be `ldap.goauthentik.io`.
it is just the components of your base DN. For example, if - `ldap.searchGroup` refers to the "Search Group" that has permission to view all users and groups within authentik.
`ldap.baseDN` is `dc=ldap,dc=goauthentik,dc=io` then the domain
might be `ldap.goauthentik.io`.
- `ldap.searchGroup` is the "Search Group" that can can see all
users and groups in authentik.
- `sssd.serviceAccount` is a service account created in authentik - `sssd.serviceAccount` is a service account created in authentik
- `sssd.serviceAccountToken` is the service account token generated - `sssd.serviceAccountToken` is the service account token generated by authentik.
by authentik.
:::note :::note
This documentation lists only the settings that you need to change from their default values. Be aware that any changes other than those explicitly mentioned in this guide could cause issues accessing your application. This documentation lists only the settings that you need to change from their default values. Be aware that any changes other than those explicitly mentioned in this guide could cause issues accessing your application.
@ -45,19 +37,13 @@ Follow [official documentation](/docs/add-secure-apps/outposts/#create-and-confi
## sssd configuration ## sssd configuration
First, install the necessary sssd packages on your host. Very likely First, install the necessary sssd packages on your host. Very likely the package is just `sssd`.
the package is just `sssd`.
:::note :::note
This guide well help you configure the `sssd.conf` for LDAP only. You This guide will help you configure the `sssd.conf` file for LDAP only. You will likely need to perform other tasks for a usable setup like setting up auto-mounted or auto-created home directories that are beyond the scope of this guide. See the "additional resources" section for some help.
will likely need to perform other tasks for a usable setup
like setting up automounted or autocreated home directories that
are beyond the scope of this guide. See the "additional resources"
section for some help.
::: :::
Create a file at `/etc/sssd/sssd.conf` with contents similar to Create a file at `/etc/sssd/sssd.conf` with contents similar to the following:
the following:
```ini ```ini
[nss] [nss]
@ -100,29 +86,30 @@ ldap_default_bind_dn = cn=${sssd.serviceAccount},ou=users,${ldap.baseDN}
ldap_default_authtok = ${sssd.serviceAccountToken} ldap_default_authtok = ${sssd.serviceAccountToken}
``` ```
You should now be able to start sssd; however, the system may not You should now be able to start sssd; however, the system may not yet be set up to use it. Depending on your platform, you might need to use `authconfig` or `pam-auth-update` to configure your system. See the additional resources section for details.
yet be setup to use it. Depending on your platform, you may need to
use `authconfig` or `pam-auth-update` to configure your system. See
the additional resources section for details.
:::note :::note
You can store SSH authorized keys in LDAP by adding the You can store SSH authorized keys in LDAP by adding the `sshPublicKey` attribute to any user with their public key as the value.
`sshPublicKey` attribute to any user with their public key as
the value. Please note that by default, sssd returns all user accounts; active and disabled. This means that disabled user accounts can still authenticate via `sshPublicKey`. To prevent this, you can filter out disabled user accounts by adding the following lines to the LDAP section of your `sssd.conf` file:
```ini
#ldap_access_order = filter
#ldap_access_filter = ak-active=true
```
::: :::
## Additional Resources ## Additional Resources
The setup of sssd may vary based on Linux distribution and version, The setup of sssd might vary based on Linux distribution and version; here are some resources that can help you get this set up:
here are some resources that can help you get this setup:
:::note :::note
authentik is providing a simple LDAP server, not an Active Directory authentik is providing a simple LDAP server, not an Active Directory domain. Be sure you're looking at the correct sections in these guides.
domain. Be sure you're looking at the correct sections in these guides.
::: :::
- https://sssd.io/docs/quick-start.html#quick-start-ldap - [SSSD Docs - Quick Start LDAP](https://sssd.io/docs/quick-start.html#quick-start-ldap)
- https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system-level_authentication_guide/configuring_services - [RedHat Docs - Configuring System Services for SSSD](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system-level_authentication_guide/configuring_services)
- https://ubuntu.com/server/docs/service-sssd - [Ubuntu Docs - Introduction to network user authentication with SSSD](https://ubuntu.com/server/docs/service-sssd)
- https://manpages.debian.org/unstable/sssd-ldap/sssd-ldap.5.en.html - [Debian Manpages - SSSD LDAP provider](https://manpages.debian.org/unstable/sssd-ldap/sssd-ldap.5.en.html)
- https://wiki.archlinux.org/title/LDAP_authentication - [Arch Linux Wiki - LDAP authentication](https://wiki.archlinux.org/title/LDAP_authentication)