Просмотр исходного кода

Closes #22198: Restrict ExportTemplate querysets for UI & REST API (#22199)

Jeremy Stretch 1 неделя назад
Родитель
Сommit
d4408f3d5d

+ 2 - 2
netbox/extras/tests/test_views.py

@@ -399,7 +399,7 @@ class ExportTemplateExportFlowTest(TestCase):
         broken_template.object_types.set([site_type])
         broken_template.object_types.set([site_type])
 
 
     def test_export_template_invocation(self):
     def test_export_template_invocation(self):
-        self.add_permissions('dcim.view_site')
+        self.add_permissions('dcim.view_site', 'extras.view_exporttemplate')
         url = reverse('dcim:site_list')
         url = reverse('dcim:site_list')
 
 
         response = self.client.get(f'{url}?export=Sites Export')
         response = self.client.get(f'{url}?export=Sites Export')
@@ -412,7 +412,7 @@ class ExportTemplateExportFlowTest(TestCase):
         self.assertEqual(rendered_names, {'Site A', 'Site B'})
         self.assertEqual(rendered_names, {'Site A', 'Site B'})
 
 
     def test_export_template_render_error_redirects(self):
     def test_export_template_render_error_redirects(self):
-        self.add_permissions('dcim.view_site')
+        self.add_permissions('dcim.view_site', 'extras.view_exporttemplate')
         url = reverse('dcim:site_list')
         url = reverse('dcim:site_list')
 
 
         # A broken template surfaces an exception during render; the view catches it and redirects
         # A broken template surfaces an exception during render; the view catches it and redirects

+ 4 - 1
netbox/netbox/api/viewsets/mixins.py

@@ -41,7 +41,10 @@ class ExportTemplatesMixin:
     def list(self, request, *args, **kwargs):
     def list(self, request, *args, **kwargs):
         if 'export' in request.GET:
         if 'export' in request.GET:
             object_type = ObjectType.objects.get_for_model(self.get_serializer_class().Meta.model)
             object_type = ObjectType.objects.get_for_model(self.get_serializer_class().Meta.model)
-            et = ExportTemplate.objects.filter(object_types=object_type, name=request.GET['export']).first()
+            et = ExportTemplate.objects.restrict(request.user, 'view').filter(
+                object_types=object_type,
+                name=request.GET['export'],
+            ).first()
             if et is None:
             if et is None:
                 raise Http404
                 raise Http404
             queryset = self.filter_queryset(self.get_queryset())
             queryset = self.filter_queryset(self.get_queryset())

+ 5 - 1
netbox/netbox/views/generic/bulk_views.py

@@ -185,7 +185,11 @@ class ObjectListView(BaseMultiObjectView, ActionsMixin, TableMixin):
 
 
             # Render an ExportTemplate
             # Render an ExportTemplate
             if request.GET['export']:
             if request.GET['export']:
-                template = get_object_or_404(ExportTemplate, object_types=object_type, name=request.GET['export'])
+                template = get_object_or_404(
+                    ExportTemplate.objects.restrict(request.user, 'view'),
+                    object_types=object_type,
+                    name=request.GET['export'],
+                )
                 return self.export_template(template, request)
                 return self.export_template(template, request)
 
 
             # Check for YAML export support on the model
             # Check for YAML export support on the model