Explorar o código

Fixes #4418: Fail cleanly when trying to import multiple device types simultaneously

Jeremy Stretch %!s(int64=5) %!d(string=hai) anos
pai
achega
fb2868f8bb
Modificáronse 2 ficheiros con 16 adicións e 2 borrados
  1. 4 0
      docs/release-notes/version-2.7.md
  2. 12 2
      netbox/utilities/forms.py

+ 4 - 0
docs/release-notes/version-2.7.md

@@ -6,6 +6,10 @@
 
 * [#3676](https://github.com/netbox-community/netbox/issues/3676) - Reference VRF by name rather than RD during IP/prefix import
 
+### Bug Fixes
+
+* [#4418](https://github.com/netbox-community/netbox/issues/4418) - Fail cleanly when trying to import multiple device types simultaneously
+
 ---
 
 ## v2.7.11 (2020-03-27)

+ 12 - 2
netbox/utilities/forms.py

@@ -698,7 +698,7 @@ class ImportForm(BootstrapMixin, forms.Form):
     """
     data = forms.CharField(
         widget=forms.Textarea,
-        help_text="Enter object data in JSON or YAML format."
+        help_text="Enter object data in JSON or YAML format. Note: Only a single object/document is supported."
     )
     format = forms.ChoiceField(
         choices=(
@@ -717,14 +717,24 @@ class ImportForm(BootstrapMixin, forms.Form):
         if format == 'json':
             try:
                 self.cleaned_data['data'] = json.loads(data)
+                # Check for multiple JSON objects
+                if type(self.cleaned_data['data']) is not dict:
+                    raise forms.ValidationError({
+                        'data': "Import is limited to one object at a time."
+                    })
             except json.decoder.JSONDecodeError as err:
                 raise forms.ValidationError({
                     'data': "Invalid JSON data: {}".format(err)
                 })
         else:
+            # Check for multiple YAML documents
+            if '\n---' in data:
+                raise forms.ValidationError({
+                    'data': "Import is limited to one object at a time."
+                })
             try:
                 self.cleaned_data['data'] = yaml.load(data, Loader=yaml.SafeLoader)
-            except yaml.scanner.ScannerError as err:
+            except yaml.error.YAMLError as err:
                 raise forms.ValidationError({
                     'data': "Invalid YAML data: {}".format(err)
                 })