Browse Source

Converted GetSessionKey and RSAKeyGeneratorView to ViewSets

Jeremy Stretch 8 years ago
parent
commit
7e6d061646
3 changed files with 28 additions and 14 deletions
  1. 1 1
      netbox/project-static/js/secrets.js
  2. 3 4
      netbox/secrets/api/urls.py
  3. 24 9
      netbox/secrets/api/views.py

+ 1 - 1
netbox/project-static/js/secrets.js

@@ -92,7 +92,7 @@ $(document).ready(function() {
     $('#generate_keypair').click(function() {
     $('#generate_keypair').click(function() {
         $('#new_keypair_modal').modal('show');
         $('#new_keypair_modal').modal('show');
         $.ajax({
         $.ajax({
-            url: netbox_api_path + 'secrets/generate-keys/',
+            url: netbox_api_path + 'secrets/generate-rsa-key-pair/',
             type: 'GET',
             type: 'GET',
             dataType: 'json',
             dataType: 'json',
             success: function (response, status) {
             success: function (response, status) {

+ 3 - 4
netbox/secrets/api/urls.py

@@ -6,15 +6,14 @@ from . import views
 
 
 
 
 router = routers.DefaultRouter()
 router = routers.DefaultRouter()
+
 router.register(r'secret-roles', views.SecretRoleViewSet)
 router.register(r'secret-roles', views.SecretRoleViewSet)
 router.register(r'secrets', views.SecretViewSet)
 router.register(r'secrets', views.SecretViewSet)
+router.register(r'get-session-key', views.GetSessionKeyViewSet, base_name='get-session-key')
+router.register(r'generate-rsa-key-pair', views.GenerateRSAKeyPairViewSet, base_name='generate-rsa-key-pair')
 
 
 urlpatterns = [
 urlpatterns = [
 
 
     url(r'', include(router.urls)),
     url(r'', include(router.urls)),
 
 
-    # Miscellaneous
-    url(r'^get-session-key/$', views.GetSessionKey.as_view(), name='get_session_key'),
-    url(r'^generate-keys/$', views.RSAKeyGeneratorView.as_view(), name='generate_keys'),
-
 ]
 ]

+ 24 - 9
netbox/secrets/api/views.py

@@ -7,14 +7,12 @@ from rest_framework.authentication import BasicAuthentication, SessionAuthentica
 from rest_framework.permissions import IsAuthenticated
 from rest_framework.permissions import IsAuthenticated
 from rest_framework.renderers import JSONRenderer
 from rest_framework.renderers import JSONRenderer
 from rest_framework.response import Response
 from rest_framework.response import Response
-from rest_framework.views import APIView
-from rest_framework.viewsets import ModelViewSet
+from rest_framework.viewsets import ViewSet, ModelViewSet
 
 
 from extras.api.renderers import FormlessBrowsableAPIRenderer, FreeRADIUSClientsRenderer
 from extras.api.renderers import FormlessBrowsableAPIRenderer, FreeRADIUSClientsRenderer
 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
-
 from . import serializers
 from . import serializers
 
 
 
 
@@ -107,13 +105,25 @@ class SecretViewSet(WritableSerializerMixin, ModelViewSet):
         return Response(serializer.data)
         return Response(serializer.data)
 
 
 
 
-class GetSessionKey(APIView):
+class GetSessionKeyViewSet(ViewSet):
     """
     """
-    Cache an encrypted copy of the master key derived from the submitted private key.
+    Retrieve a temporary session key to use for encrypting and decrypting secrets via the API. The user's private RSA
+    key is POSTed with the name `private_key`. An example:
+
+        curl -v -X POST -H "Authorization: Token <token>" -H "Accept: application/json; indent=4" \\
+        --data-urlencode "private_key@<filename>" https://netbox/api/secrets/get-session-key/
+
+    This request will yield a session key to be included in an `X-Session-Key` header in future requests, as well as its
+    expiration time:
+
+        {
+            "expiration_time": "2017-03-09T10:42:23.095267Z",
+            "session_key": "+8t4SI6XikgVmB5+/urhozx9O5qCQANyOk1MNe6taRf="
+        }
     """
     """
     permission_classes = [IsAuthenticated]
     permission_classes = [IsAuthenticated]
 
 
-    def post(self, request):
+    def create(self, request):
 
 
         # Read private key
         # Read private key
         private_key = request.POST.get('private_key', None)
         private_key = request.POST.get('private_key', None)
@@ -150,13 +160,18 @@ class GetSessionKey(APIView):
         return response
         return response
 
 
 
 
-class RSAKeyGeneratorView(APIView):
+class GenerateRSAKeyPairViewSet(ViewSet):
     """
     """
-    Generate a new RSA key pair for a user. Authenticated because it's a ripe avenue for DoS.
+    This endpoint can be used to generate a new RSA key pair. The keys are returned in PEM format.
+
+        {
+            "public_key": "<public key>",
+            "private_key": "<private key>"
+        }
     """
     """
     permission_classes = [IsAuthenticated]
     permission_classes = [IsAuthenticated]
 
 
-    def get(self, request):
+    def list(self, request):
 
 
         # Determine what size key to generate
         # Determine what size key to generate
         key_size = request.GET.get('key_size', 2048)
         key_size = request.GET.get('key_size', 2048)