16
16
from rest_framework .fields import CharField , FileField , SerializerMethodField
17
17
from rest_framework .parsers import MultiPartParser
18
18
from rest_framework .permissions import AllowAny
19
+ from rest_framework .renderers import BaseRenderer , JSONRenderer
19
20
from rest_framework .request import Request
20
21
from rest_framework .response import Response
21
22
from rest_framework .serializers import PrimaryKeyRelatedField , ValidationError
38
39
LOGGER = get_logger ()
39
40
40
41
42
+ class RawXMLDataRenderer (BaseRenderer ):
43
+ """Renderer to allow application/xml as value for 'Accept' in the metadata endpoint."""
44
+
45
+ media_type = "application/xml"
46
+ format = "xml"
47
+
48
+ def render (self , data , accepted_media_type = None , renderer_context = None ):
49
+ return data
50
+
51
+
41
52
class SAMLProviderSerializer (ProviderSerializer ):
42
53
"""SAMLProvider Serializer"""
43
54
@@ -238,9 +249,21 @@ class SAMLProviderViewSet(UsedByMixin, ModelViewSet):
238
249
],
239
250
description = "Optionally force the metadata to only include one binding." ,
240
251
),
252
+ # Explicitly excluded, because otherwise spectacular automatically
253
+ # add it when using multiple renderer_classes
254
+ OpenApiParameter (
255
+ name = "format" ,
256
+ exclude = True ,
257
+ required = False ,
258
+ ),
241
259
],
242
260
)
243
- @action (methods = ["GET" ], detail = True , permission_classes = [AllowAny ])
261
+ @action (
262
+ methods = ["GET" ],
263
+ detail = True ,
264
+ permission_classes = [AllowAny ],
265
+ renderer_classes = [JSONRenderer , RawXMLDataRenderer ],
266
+ )
244
267
def metadata (self , request : Request , pk : int ) -> Response :
245
268
"""Return metadata as XML string"""
246
269
# We don't use self.get_object() on purpose as this view is un-authenticated
@@ -258,9 +281,9 @@ def metadata(self, request: Request, pk: int) -> Response:
258
281
f'attachment; filename="{ provider .name } _authentik_meta.xml"'
259
282
)
260
283
return response
261
- return Response ({"metadata" : metadata })
284
+ return Response ({"metadata" : metadata }, content_type = "application/json" )
262
285
except Provider .application .RelatedObjectDoesNotExist :
263
- return Response ({"metadata" : "" })
286
+ return Response ({"metadata" : "" }, content_type = "application/json" )
264
287
265
288
@permission_required (
266
289
None ,
0 commit comments