Procházet zdrojové kódy

Fixes #3588: Enforce object-form JSON for local context data on devices and VMs

Jeremy Stretch před 6 roky
rodič
revize
d849a49842

+ 1 - 0
docs/release-notes/version-2.6.md

@@ -10,6 +10,7 @@
 * [#3574](https://github.com/netbox-community/netbox/issues/3574) - Change `device` to `parent` in interface editing VLAN filtering logic
 * [#3575](https://github.com/netbox-community/netbox/issues/3575) - Restore label for comments field when bulk editing circuits
 * [#3582](https://github.com/netbox-community/netbox/issues/3582) - Enforce view permissions on global search results
+* [#3588](https://github.com/netbox-community/netbox/issues/3588) - Enforce object-form JSON for local context data on devices and VMs
 
 ## Enhancements
 

+ 2 - 0
netbox/dcim/models.py

@@ -1609,6 +1609,8 @@ class Device(ChangeLoggedModel, ConfigContextModel, CustomFieldModel):
 
     def clean(self):
 
+        super().clean()
+
         # Validate site/rack combination
         if self.rack and self.site != self.rack.site:
             raise ValidationError({

+ 14 - 1
netbox/extras/models.py

@@ -805,7 +805,10 @@ class ConfigContext(models.Model):
 
 
 class ConfigContextModel(models.Model):
-
+    """
+    A model which includes local configuration context data. This local data will override any inherited data from
+    ConfigContexts.
+    """
     local_context_data = JSONField(
         blank=True,
         null=True,
@@ -830,6 +833,16 @@ class ConfigContextModel(models.Model):
 
         return data
 
+    def clean(self):
+
+        super().clean()
+
+        # Verify that JSON data is provided as an object
+        if self.local_context_data and type(self.local_context_data) is not dict:
+            raise ValidationError(
+                {'local_context_data': 'JSON data must be in object form. Example: {"foo": 123}'}
+            )
+
 
 #
 # Custom scripts

+ 2 - 0
netbox/virtualization/models.py

@@ -255,6 +255,8 @@ class VirtualMachine(ChangeLoggedModel, ConfigContextModel, CustomFieldModel):
 
     def clean(self):
 
+        super().clean()
+
         # Validate primary IP addresses
         interfaces = self.interfaces.all()
         for field in ['primary_ip4', 'primary_ip6']: