![dependabot[bot]](/assets/img/avatar_default.png)
* core: bump goauthentik/fips-python from 3.12.7-slim-bookworm-fips to 3.13.1-slim-bookworm-fips Dependabot couldn't find the original pull request head commit, 57d3f7b1d72de7f2448d0ce661c74de53412bdd5. * upgrade the rest Signed-off-by: Jens Langhammer <jens@goauthentik.io> * format Signed-off-by: Jens Langhammer <jens@goauthentik.io> * update dev env Signed-off-by: Jens Langhammer <jens@goauthentik.io> * silence docker build action about env name Signed-off-by: Jens Langhammer <jens@goauthentik.io> * bump to 3.13.3 Signed-off-by: Jens Langhammer <jens@goauthentik.io> --------- Signed-off-by: Jens Langhammer <jens@goauthentik.io> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jens Langhammer <jens@goauthentik.io>
114 lines
3.8 KiB
Python
114 lines
3.8 KiB
Python
"""Error Response schema, from https://github.com/axnsan12/drf-yasg/issues/224"""
|
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
from drf_spectacular.generators import SchemaGenerator
|
|
from drf_spectacular.plumbing import (
|
|
ResolvedComponent,
|
|
build_array_type,
|
|
build_basic_type,
|
|
build_object_type,
|
|
)
|
|
from drf_spectacular.settings import spectacular_settings
|
|
from drf_spectacular.types import OpenApiTypes
|
|
from rest_framework.settings import api_settings
|
|
|
|
from authentik.api.apps import AuthentikAPIConfig
|
|
from authentik.api.pagination import PAGINATION_COMPONENT_NAME, PAGINATION_SCHEMA
|
|
|
|
|
|
def build_standard_type(obj, **kwargs):
|
|
"""Build a basic type with optional add owns."""
|
|
schema = build_basic_type(obj)
|
|
schema.update(kwargs)
|
|
return schema
|
|
|
|
|
|
GENERIC_ERROR = build_object_type(
|
|
description=_("Generic API Error"),
|
|
properties={
|
|
"detail": build_standard_type(OpenApiTypes.STR),
|
|
"code": build_standard_type(OpenApiTypes.STR),
|
|
},
|
|
required=["detail"],
|
|
)
|
|
VALIDATION_ERROR = build_object_type(
|
|
description=_("Validation Error"),
|
|
properties={
|
|
api_settings.NON_FIELD_ERRORS_KEY: build_array_type(build_standard_type(OpenApiTypes.STR)),
|
|
"code": build_standard_type(OpenApiTypes.STR),
|
|
},
|
|
required=[],
|
|
additionalProperties={},
|
|
)
|
|
|
|
|
|
def create_component(generator: SchemaGenerator, name, schema, type_=ResolvedComponent.SCHEMA):
|
|
"""Register a component and return a reference to it."""
|
|
component = ResolvedComponent(
|
|
name=name,
|
|
type=type_,
|
|
schema=schema,
|
|
object=name,
|
|
)
|
|
generator.registry.register_on_missing(component)
|
|
return component
|
|
|
|
|
|
def postprocess_schema_responses(result, generator: SchemaGenerator, **kwargs):
|
|
"""Workaround to set a default response for endpoints.
|
|
Workaround suggested at
|
|
<https://github.com/tfranzel/drf-spectacular/issues/119#issuecomment-656970357>
|
|
for the missing drf-spectacular feature discussed in
|
|
<https://github.com/tfranzel/drf-spectacular/issues/101>.
|
|
"""
|
|
|
|
create_component(generator, PAGINATION_COMPONENT_NAME, PAGINATION_SCHEMA)
|
|
|
|
generic_error = create_component(generator, "GenericError", GENERIC_ERROR)
|
|
validation_error = create_component(generator, "ValidationError", VALIDATION_ERROR)
|
|
|
|
for path in result["paths"].values():
|
|
for method in path.values():
|
|
method["responses"].setdefault(
|
|
"400",
|
|
{
|
|
"content": {
|
|
"application/json": {
|
|
"schema": validation_error.ref,
|
|
}
|
|
},
|
|
"description": "",
|
|
},
|
|
)
|
|
method["responses"].setdefault(
|
|
"403",
|
|
{
|
|
"content": {
|
|
"application/json": {
|
|
"schema": generic_error.ref,
|
|
}
|
|
},
|
|
"description": "",
|
|
},
|
|
)
|
|
|
|
result["components"] = generator.registry.build(spectacular_settings.APPEND_COMPONENTS)
|
|
|
|
# This is a workaround for authentik/stages/prompt/stage.py
|
|
# since the serializer PromptChallengeResponse
|
|
# accepts dynamic keys
|
|
for component in result["components"]["schemas"]:
|
|
if component == "PromptChallengeResponseRequest":
|
|
comp = result["components"]["schemas"][component]
|
|
comp["additionalProperties"] = {}
|
|
return result
|
|
|
|
|
|
def preprocess_schema_exclude_non_api(endpoints, **kwargs):
|
|
"""Filter out all API Views which are not mounted under /api"""
|
|
return [
|
|
(path, path_regex, method, callback)
|
|
for path, path_regex, method, callback in endpoints
|
|
if path.startswith("/" + AuthentikAPIConfig.mountpoint)
|
|
]
|