1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Converted GetSessionKey and RSAKeyGeneratorView to ViewSets

This commit is contained in:
Jeremy Stretch
2017-03-08 17:57:51 -05:00
parent c19725506d
commit 7e6d061646
3 changed files with 28 additions and 14 deletions

View File

@ -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) {

View File

@ -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'),
] ]

View File

@ -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 ViewSet, ModelViewSet
from rest_framework.viewsets import 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)