mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
* 9856 base strawberry integration * 9856 user and group * 9856 user and circuits base * 9856 extras and mixins * 9856 fk * 9856 update strawberry version * 9856 update imports * 9856 compatability fixes * 9856 compatability fixes * 9856 update strawberry types * 9856 update strawberry types * 9856 core schema * 9856 dcim schema * 9856 extras schema * 9856 ipam and tenant schema * 9856 virtualization, vpn, wireless schema * 9856 fix old decorator * 9856 cleanup * 9856 cleanup * 9856 fixes to circuits type specifiers * 9856 fixes to circuits type specifiers * 9856 update types * 9856 GFK working * 9856 GFK working * 9856 _name * 9856 misc fixes * 9856 type updates * 9856 _name to types * 9856 update types * 9856 update types * 9856 update types * 9856 update types * 9856 update types * 9856 update types * 9856 update types * 9856 update types * 9856 update types * 9856 GraphQLView * 9856 GraphQLView * 9856 fix OrganizationalObjectType * 9856 single item query for schema * 9856 circuits graphql tests working * 9856 test fixes * 9856 test fixes * 9856 test fixes * 9856 test fix vpn * 9856 test fixes * 9856 test fixes * 9856 test fixes * 9856 circuits test sans DjangoModelType * 9856 core test sans DjangoModelType * 9856 temp checkin * 9856 fix extas FK * 9856 fix tenancy FK * 9856 fix virtualization FK * 9856 fix vpn FK * 9856 fix wireless FK * 9856 fix ipam FK * 9856 fix partial dcim FK * 9856 fix dcim FK * 9856 fix virtualization FK * 9856 fix tests / remove debug code * 9856 fix test imagefield * 9856 cleanup graphene * 9856 fix plugin schema * 9856 fix requirements * 9856 fix requirements * 9856 fix docs * 9856 fix docs * 9856 temp fix tests * 9856 first filterset * 9856 first filterset * 9856 fix tests * 9856 fix tests * 9856 working auto filter generation * 9856 filter types * 9856 filter types * 9856 filter types * 9856 fix graphiql test * 9856 fix counter fields and merge feature * 9856 temp fix tests * 9856 fix tests * 9856 fix tenancy, ipam filter definitions * 9856 cleanup * 9856 cleanup * 9856 cleanup * 9856 review changes * 9856 review changes * 9856 review changes * 9856 fix base-requirements * 9856 add wrapper to graphiql * 9856 remove old graphiql debug toolbar * 9856 review changes * 9856 update strawberry * 9856 remove superfluous check --------- Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
55 lines
2.0 KiB
Python
55 lines
2.0 KiB
Python
import json
|
|
|
|
from django.conf import settings
|
|
from django.contrib.auth.views import redirect_to_login
|
|
from django.http import HttpResponseNotFound, HttpResponseForbidden
|
|
from django.http import HttpResponse
|
|
from django.template import loader
|
|
from django.urls import reverse
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
from rest_framework.exceptions import AuthenticationFailed
|
|
from strawberry.django.views import GraphQLView
|
|
|
|
from netbox.api.authentication import TokenAuthentication
|
|
from netbox.config import get_config
|
|
|
|
|
|
class NetBoxGraphQLView(GraphQLView):
|
|
"""
|
|
Extends strawberry's GraphQLView to support DRF's token-based authentication.
|
|
"""
|
|
graphiql_template = 'graphiql.html'
|
|
|
|
@csrf_exempt
|
|
def dispatch(self, request, *args, **kwargs):
|
|
config = get_config()
|
|
|
|
# Enforce GRAPHQL_ENABLED
|
|
if not config.GRAPHQL_ENABLED:
|
|
return HttpResponseNotFound("The GraphQL API is not enabled.")
|
|
|
|
# Attempt to authenticate the user using a DRF token, if provided
|
|
if not request.user.is_authenticated:
|
|
authenticator = TokenAuthentication()
|
|
try:
|
|
auth_info = authenticator.authenticate(request)
|
|
if auth_info is not None:
|
|
request.user = auth_info[0] # User object
|
|
except AuthenticationFailed as exc:
|
|
return HttpResponseForbidden(exc.detail)
|
|
|
|
# Enforce LOGIN_REQUIRED
|
|
if settings.LOGIN_REQUIRED and not request.user.is_authenticated:
|
|
if request.accepts("text/html"):
|
|
return redirect_to_login(reverse('graphql'))
|
|
else:
|
|
return HttpResponseForbidden("No credentials provided.")
|
|
|
|
return super().dispatch(request, *args, **kwargs)
|
|
|
|
def render_graphql_ide(self, request):
|
|
template = loader.get_template("graphiql.html")
|
|
context = {"SUBSCRIPTION_ENABLED": json.dumps(self.subscriptions_enabled)}
|
|
|
|
return HttpResponse(template.render(context, request))
|