diff --git a/core/serializers.py b/core/serializers.py index 3a1ed65..e2cb4fb 100644 --- a/core/serializers.py +++ b/core/serializers.py @@ -1,4 +1,4 @@ -from django.contrib.auth.models import User, Permission, Group +from django.contrib.auth.models import Group, Permission, User from rest_framework import serializers from .models import LogEntry @@ -31,6 +31,8 @@ class Meta: class SystemGroupSerializer(serializers.ModelSerializer): + permissions = SystemPermissionSerializer(many=True) + class Meta: model = Group fields = ("id", "name", "permissions") diff --git a/core/views.py b/core/views.py index 7b70fc8..03feb26 100644 --- a/core/views.py +++ b/core/views.py @@ -1,6 +1,7 @@ +from django.conf import settings from django.contrib.auth.models import Group, Permission, User from django.http import JsonResponse -from rest_framework import generics, permissions, status, viewsets +from rest_framework import filters, generics, permissions, status, viewsets from rest_framework.response import Response from .models import Actions, LogEntry, Modules, log @@ -13,21 +14,23 @@ def index(request): - return JsonResponse({"i'm": "ok"}) + return JsonResponse({"status": "ok", "version": settings.VERSION}) class UserView(generics.GenericAPIView): - permission_classes = [permissions.IsAuthenticated] serializer_class = SystemUserSerializer + permission_classes = [permissions.IsAuthenticated] def get(self, request): return Response(SystemUserSerializer(instance=request.user).data) class SystemUserViewSet(viewsets.ModelViewSet): - queryset = User.objects.all().order_by("-id") + queryset = User.objects.all() serializer_class = SystemUserSerializer permission_classes = [permissions.IsAdminUser] + filter_backends = [filters.OrderingFilter] + ordering_fields = ["id", "username"] def create(self, request, *args, **kwargs): instance = None @@ -105,9 +108,11 @@ def list(self, request, *args, **kwargs): class SystemGroupViewSet(viewsets.ModelViewSet): - queryset = Group.objects.all().order_by("-id") + queryset = Group.objects.all() serializer_class = SystemGroupSerializer permission_classes = [permissions.IsAdminUser] + filter_backends = [filters.OrderingFilter] + ordering_fields = ["id", "name"] def create(self, request, *args, **kwargs): instance = None @@ -168,9 +173,11 @@ def list(self, request, *args, **kwargs): class SystemPermissionViewSet(viewsets.ModelViewSet): - queryset = Permission.objects.all().order_by("-id") + queryset = Permission.objects.all() serializer_class = SystemPermissionSerializer permission_classes = [permissions.IsAdminUser] + filter_backends = [filters.OrderingFilter] + ordering_fields = ["id", "name"] http_method_names = ["get"] @@ -188,6 +195,8 @@ class SystemLogEntryViewSet(viewsets.ModelViewSet): queryset = LogEntry.objects.all() serializer_class = SystemLogEntrySerializer permission_classes = [permissions.IsAdminUser] + filter_backends = [filters.OrderingFilter] + ordering_fields = ["date", "user", "module", "action"] http_method_names = ["get"] diff --git a/ocsp/views.py b/ocsp/views.py index a574c0c..bef8339 100644 --- a/ocsp/views.py +++ b/ocsp/views.py @@ -2,7 +2,7 @@ from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt from django_filters import rest_framework -from rest_framework import permissions, viewsets +from rest_framework import filters, permissions, viewsets from rest_framework.response import Response from core.models import Actions, Modules, log @@ -124,8 +124,12 @@ class SourceViewSet(viewsets.ModelViewSet): queryset = Source.objects.all() serializer_class = SourceSerializer permission_classes = [permissions.IsAuthenticated] - filter_backends = [rest_framework.DjangoFilterBackend] + filter_backends = [ + rest_framework.DjangoFilterBackend, + filters.OrderingFilter, + ] filterset_fields = ["name", "host", "addr"] + ordering_fields = ["id", "name", "host", "addr"] def create(self, request, *args, **kwargs): instance = None @@ -206,8 +210,12 @@ class RequestLogViewSet(viewsets.ModelViewSet): queryset = RequestLog.objects.all() serializer_class = RequestLogSerializer permission_classes = [permissions.IsAuthenticated] - filter_backends = [rest_framework.DjangoFilterBackend] + filter_backends = [ + rest_framework.DjangoFilterBackend, + filters.OrderingFilter, + ] filterset_class = RequestLogFilterSet + ordering_fields = ["date", "host", "addr"] http_method_names = ["get"] diff --git a/sunflower/settings.py b/sunflower/settings.py index 4c95c86..111f9e2 100644 --- a/sunflower/settings.py +++ b/sunflower/settings.py @@ -32,6 +32,8 @@ DEBUG = os.environ.get("DEBUG", "False") == "True" TEMPLATE_DEBUG = DEBUG +VERSION = "0.1.5" + FORCE_SCRIPT_NAME = os.environ.get("FORCE_SCRIPT_NAME", "/") ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS", ["*"]) diff --git a/x509/views.py b/x509/views.py index b565ccc..14b49c5 100644 --- a/x509/views.py +++ b/x509/views.py @@ -54,9 +54,11 @@ class KeyViewSet(viewsets.ModelViewSet): filter_backends = [ rest_framework.DjangoFilterBackend, filters.SearchFilter, + filters.OrderingFilter, ] filterset_class = KeyFilterSet search_fields = ["name", "fingerprint"] + ordering_fields = ["created_at", "algo", "used"] def create(self, request, *args, **kwargs): instance = None @@ -181,9 +183,11 @@ class CSRViewSet(viewsets.ModelViewSet): filter_backends = [ rest_framework.DjangoFilterBackend, filters.SearchFilter, + filters.OrderingFilter, ] filterset_class = CSRFilterSet search_fields = ["name"] + ordering_fields = ["created_at", "name", "signed", "ca"] def create(self, request, *args, **kwargs): instance = None @@ -316,9 +320,11 @@ class CertificateViewSet(viewsets.ModelViewSet): filter_backends = [ rest_framework.DjangoFilterBackend, filters.SearchFilter, + filters.OrderingFilter, ] filterset_class = CertificateFilterSet search_fields = ["csr__name", "fingerprint"] + ordering_fields = ["created_at", "revoked_at", "imported", "revoked"] http_method_names = ["get", "post", "put"] @@ -594,9 +600,9 @@ def get(self, request, key_id, *args, **kwargs): data = key_to_der(key.private_as_object(), private=True) response = HttpResponse(data, content_type=CTYPE[key_format]) - response[ - "Content-Disposition" - ] = f"attachment; filename='{key.name}'" + response["Content-Disposition"] = ( + f"attachment; filename='{key.name}'" + ) return response else: @@ -606,9 +612,9 @@ def get(self, request, key_id, *args, **kwargs): data = key_to_der(key.public_as_object()) response = HttpResponse(data, content_type=CTYPE[key_format]) - response[ - "Content-Disposition" - ] = f"attachment; filename='{key.name}'" + response["Content-Disposition"] = ( + f"attachment; filename='{key.name}'" + ) return response @@ -646,15 +652,15 @@ def get(self, request, cert_id, *args, **kwargs): else: response = HttpResponse( cert_to_der(cert.as_object()), - content_type=CTYPE["der_ca"] - if cert.is_ca - else CTYPE["der_enduser"], + content_type=( + CTYPE["der_ca"] if cert.is_ca else CTYPE["der_enduser"] + ), ) # TODO: Add PKCS12 - response[ - "Content-Disposition" - ] = f"attachment; filename='{cert.cn}'" + response["Content-Disposition"] = ( + f"attachment; filename='{cert.cn}'" + ) return response