Merge branch 'main' into celery-2-dramatiq
Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
This commit is contained in:
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@ -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",
|
||||||
|
@ -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",
|
||||||
|
@ -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,
|
||||||
|
@ -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):
|
||||||
|
@ -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):
|
||||||
|
@ -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"""
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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 = [
|
||||||
|
196
schema.yml
196
schema.yml
@ -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
104
uv.lock
generated
@ -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
8
web/package-lock.json
generated
@ -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",
|
||||||
|
@ -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",
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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,
|
||||||
|
@ -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>
|
||||||
|
@ -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>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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>
|
||||||
|
@ -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>`,
|
||||||
|
@ -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 "<x id="0" equiv-text="${this.url}"/>" was not found.</source>
|
||||||
<target>La URL "
|
<target>La URL "
|
||||||
<x id="0" equiv-text="${this.url}"/>" non è stata trovata.</target>
|
<x id="0" equiv-text="${this.url}"/>" 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 "upn" 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 "domain.tld".</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 "fa-test".</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 "fa://fa-test" per utilizzare l'icona "fa-test" 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 "Transient" 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 "friendlyname" 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}"/> "<x id="1" equiv-text="${this.obj?.name}"/>"?</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}"/>"
|
||||||
<x id="1" equiv-text="${this.obj?.name}"/>"?</target>
|
<x id="1" equiv-text="${this.obj?.name}"/>"?</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 "prompt_data" 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 "roaming" authenticator, like a YubiKey</source>
|
||||||
<target>Un autenticatore "roaming", come un YubiKey</target>
|
<target>Un autenticatore "roaming", 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 "prompt_data".</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 "stay signed in", 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 "rimanere firmato", 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 "prompt_data" 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, "New Application Wizard", è 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 "<x id="0" equiv-text="${this.targetGroup.name}"/>".</source>
|
||||||
<target>Questo utente sarà aggiunto al gruppo &quot;<x id="0" equiv-text="${this.targetGroup.name}"/>&quot;.</target>
|
<target>Questo utente sarà aggiunto al gruppo &quot;<x id="0" equiv-text="${this.targetGroup.name}"/>&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 "Mostra password".</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}"/> ("<x id="1" equiv-text="${p.fieldKey}"/>", of type <x id="2" equiv-text="${p.type}"/>)</source>
|
||||||
<target><x id="0" equiv-text="${p.name}"/> (&quot;<x id="1" equiv-text="${p.fieldKey}"/>&quot;, del tipo <x id="2" equiv-text="${p.type}"/>)</target>
|
<target><x id="0" equiv-text="${p.name}"/> (&quot;<x id="1" equiv-text="${p.fieldKey}"/>&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 ".*". 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 ".*". 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 "memberOf". Per cercare gruppi nidificati in un ambiente Active Directory, utilizzare "memberOf:1.2.840.113556.1.4.1941:".</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 "Remember me on this device"</source>
|
||||||
<target>Abilita "Ricordami su questo dispositivo"</target>
|
<target>Abilita "Ricordami su questo dispositivo"</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 "Invia notifica all'utente dell'evento" è 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 "Invia una volta" 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>
|
@ -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.
|
|
||||||
|
@ -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. It’s 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)
|
||||||
|
Reference in New Issue
Block a user