mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-22 20:12:00 -06:00
Fix bulk creation of Secrets via API
This commit is contained in:
parent
e5c13d2d72
commit
9c27d18d6c
@ -50,8 +50,15 @@ class WritableSecretSerializer(serializers.ModelSerializer):
|
|||||||
|
|
||||||
def validate(self, data):
|
def validate(self, data):
|
||||||
|
|
||||||
|
# Encrypt plaintext data using the master key provided from the view context
|
||||||
|
if data.get('plaintext'):
|
||||||
|
s = Secret(plaintext=data['plaintext'])
|
||||||
|
s.encrypt(self.context['master_key'])
|
||||||
|
data['ciphertext'] = s.ciphertext
|
||||||
|
data['hash'] = s.hash
|
||||||
|
|
||||||
# Validate uniqueness of name if one has been provided.
|
# Validate uniqueness of name if one has been provided.
|
||||||
if data.get('name', None):
|
if data.get('name'):
|
||||||
validator = UniqueTogetherValidator(queryset=Secret.objects.all(), fields=('device', 'role', 'name'))
|
validator = UniqueTogetherValidator(queryset=Secret.objects.all(), fields=('device', 'role', 'name'))
|
||||||
validator.set_context(self)
|
validator.set_context(self)
|
||||||
validator(data)
|
validator(data)
|
||||||
|
@ -56,17 +56,13 @@ class SecretViewSet(ModelViewSet):
|
|||||||
|
|
||||||
master_key = None
|
master_key = None
|
||||||
|
|
||||||
def _get_encrypted_fields(self, serializer):
|
def get_serializer_context(self):
|
||||||
"""
|
|
||||||
Since we can't call encrypt() on the serializer like we can on the Secret model, we need to calculate the
|
# Make the master key available to the serializer for encrypting plaintext values
|
||||||
ciphertext and hash values by encrypting a dummy copy. These can be passed to the serializer's save() method.
|
context = super(SecretViewSet, self).get_serializer_context()
|
||||||
"""
|
context['master_key'] = self.master_key
|
||||||
s = Secret(plaintext=serializer.validated_data['plaintext'])
|
|
||||||
s.encrypt(self.master_key)
|
return context
|
||||||
return ({
|
|
||||||
'ciphertext': s.ciphertext,
|
|
||||||
'hash': s.hash,
|
|
||||||
})
|
|
||||||
|
|
||||||
def initial(self, request, *args, **kwargs):
|
def initial(self, request, *args, **kwargs):
|
||||||
|
|
||||||
@ -128,12 +124,6 @@ class SecretViewSet(ModelViewSet):
|
|||||||
serializer = self.get_serializer(queryset, many=True)
|
serializer = self.get_serializer(queryset, many=True)
|
||||||
return Response(serializer.data)
|
return Response(serializer.data)
|
||||||
|
|
||||||
def perform_create(self, serializer):
|
|
||||||
serializer.save(**self._get_encrypted_fields(serializer))
|
|
||||||
|
|
||||||
def perform_update(self, serializer):
|
|
||||||
serializer.save(**self._get_encrypted_fields(serializer))
|
|
||||||
|
|
||||||
|
|
||||||
class GetSessionKeyViewSet(ViewSet):
|
class GetSessionKeyViewSet(ViewSet):
|
||||||
"""
|
"""
|
||||||
|
@ -213,6 +213,7 @@ class SecretTest(HttpStatusMixin, APITestCase):
|
|||||||
data = {
|
data = {
|
||||||
'device': self.device.pk,
|
'device': self.device.pk,
|
||||||
'role': self.secretrole1.pk,
|
'role': self.secretrole1.pk,
|
||||||
|
'name': 'Test Secret 4',
|
||||||
'plaintext': 'Secret #4 Plaintext',
|
'plaintext': 'Secret #4 Plaintext',
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,16 +234,19 @@ class SecretTest(HttpStatusMixin, APITestCase):
|
|||||||
{
|
{
|
||||||
'device': self.device.pk,
|
'device': self.device.pk,
|
||||||
'role': self.secretrole1.pk,
|
'role': self.secretrole1.pk,
|
||||||
|
'name': 'Test Secret 4',
|
||||||
'plaintext': 'Secret #4 Plaintext',
|
'plaintext': 'Secret #4 Plaintext',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'device': self.device.pk,
|
'device': self.device.pk,
|
||||||
'role': self.secretrole1.pk,
|
'role': self.secretrole1.pk,
|
||||||
|
'name': 'Test Secret 5',
|
||||||
'plaintext': 'Secret #5 Plaintext',
|
'plaintext': 'Secret #5 Plaintext',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'device': self.device.pk,
|
'device': self.device.pk,
|
||||||
'role': self.secretrole1.pk,
|
'role': self.secretrole1.pk,
|
||||||
|
'name': 'Test Secret 6',
|
||||||
'plaintext': 'Secret #6 Plaintext',
|
'plaintext': 'Secret #6 Plaintext',
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user