|
@@ -11,6 +11,7 @@ from rest_framework.response import Response
|
|
from rest_framework.viewsets import ViewSet, ModelViewSet
|
|
from rest_framework.viewsets import ViewSet, ModelViewSet
|
|
|
|
|
|
from extras.api.renderers import FormlessBrowsableAPIRenderer, FreeRADIUSClientsRenderer
|
|
from extras.api.renderers import FormlessBrowsableAPIRenderer, FreeRADIUSClientsRenderer
|
|
|
|
+from secrets.exceptions import InvalidSessionKey
|
|
from secrets.filters import SecretFilter
|
|
from secrets.filters import SecretFilter
|
|
from secrets.models import Secret, SecretRole, SessionKey, UserKey
|
|
from secrets.models import Secret, SecretRole, SessionKey, UserKey
|
|
from utilities.api import WritableSerializerMixin
|
|
from utilities.api import WritableSerializerMixin
|
|
@@ -53,42 +54,50 @@ class SecretViewSet(WritableSerializerMixin, ModelViewSet):
|
|
authentication_classes = [BasicAuthentication, SessionAuthentication]
|
|
authentication_classes = [BasicAuthentication, SessionAuthentication]
|
|
permission_classes = [IsAuthenticated]
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
|
|
- def _get_master_key(self, request):
|
|
+ def _read_session_key(self, request):
|
|
|
|
|
|
|
|
|
|
if 'session_key' in request.COOKIES:
|
|
if 'session_key' in request.COOKIES:
|
|
- session_key = base64.b64decode(request.COOKIES['session_key'])
|
|
+ return base64.b64decode(request.COOKIES['session_key'])
|
|
elif 'HTTP_X_SESSION_KEY' in request.META:
|
|
elif 'HTTP_X_SESSION_KEY' in request.META:
|
|
- session_key = base64.b64decode(request.META['HTTP_X_SESSION_KEY'])
|
|
+ return base64.b64decode(request.META['HTTP_X_SESSION_KEY'])
|
|
- else:
|
|
+ return None
|
|
- return None
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- try:
|
|
|
|
- sk = SessionKey.objects.get(user=request.user)
|
|
|
|
- except SessionKey.DoesNotExist:
|
|
|
|
- return None
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- master_key = sk.get_master_key(session_key)
|
|
|
|
-
|
|
|
|
- return master_key
|
|
|
|
|
|
|
|
def retrieve(self, request, *args, **kwargs):
|
|
def retrieve(self, request, *args, **kwargs):
|
|
- master_key = self._get_master_key(request)
|
|
+
|
|
secret = self.get_object()
|
|
secret = self.get_object()
|
|
|
|
+ session_key = self._read_session_key(request)
|
|
|
|
|
|
- if master_key is not None:
|
|
+
|
|
- secret.decrypt(master_key)
|
|
+ if session_key is not None:
|
|
|
|
+ try:
|
|
|
|
+ sk = SessionKey.objects.get(user=request.user)
|
|
|
|
+ master_key = sk.get_master_key(session_key)
|
|
|
|
+ secret.decrypt(master_key)
|
|
|
|
+ except SessionKey.DoesNotExist:
|
|
|
|
+ return HttpResponseBadRequest("No active session key for current user.")
|
|
|
|
+ except InvalidSessionKey:
|
|
|
|
+ return HttpResponseBadRequest("Invalid session key.")
|
|
|
|
|
|
serializer = self.get_serializer(secret)
|
|
serializer = self.get_serializer(secret)
|
|
return Response(serializer.data)
|
|
return Response(serializer.data)
|
|
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
def list(self, request, *args, **kwargs):
|
|
- master_key = self._get_master_key(request)
|
|
+
|
|
queryset = self.filter_queryset(self.get_queryset())
|
|
queryset = self.filter_queryset(self.get_queryset())
|
|
|
|
|
|
|
|
+
|
|
|
|
+ session_key = self._read_session_key(request)
|
|
|
|
+ master_key = None
|
|
|
|
+ if session_key is not None:
|
|
|
|
+ try:
|
|
|
|
+ sk = SessionKey.objects.get(user=request.user)
|
|
|
|
+ master_key = sk.get_master_key(session_key)
|
|
|
|
+ except SessionKey.DoesNotExist:
|
|
|
|
+ return HttpResponseBadRequest("No active session key for current user.")
|
|
|
|
+ except InvalidSessionKey:
|
|
|
|
+ return HttpResponseBadRequest("Invalid session key.")
|
|
|
|
+
|
|
|
|
|
|
page = self.paginate_queryset(queryset)
|
|
page = self.paginate_queryset(queryset)
|
|
if page is not None:
|
|
if page is not None:
|