diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index f2e9406bf..357d13302 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -1647,7 +1647,7 @@ class DeviceTest(APIViewTestCases.APIViewTestCase): device.config_template = default_template device.save() - self.add_permissions('dcim.render_config_device', 'dcim.view_device') + self.add_permissions('dcim.render_config_device', 'dcim.view_device', 'extras.view_configtemplate') url = reverse('dcim-api:device-render-config', kwargs={'pk': device.pk}) # Render with override template @@ -1655,10 +1655,19 @@ class DeviceTest(APIViewTestCases.APIViewTestCase): self.assertHttpStatus(response, status.HTTP_200_OK) self.assertEqual(response.data['content'], f'Override config for {device.name}') - # Render with invalid config_template_id + # Render with nonexistent config_template_id response = self.client.post(url, {'config_template_id': 999999}, format='json', **self.header) self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + # Render with non-integer config_template_id + response = self.client.post(url, {'config_template_id': 'abc'}, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + + # Without view_configtemplate permission, override template should not be accessible + self.remove_permissions('extras.view_configtemplate') + response = self.client.post(url, {'config_template_id': override_template.pk}, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + class ModuleTest(APIViewTestCases.APIViewTestCase): model = Module diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 370e92738..86cb3db1a 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -2375,7 +2375,7 @@ class DeviceTestCase(ViewTestCases.PrimaryObjectViewTestCase): device.config_template = default_template device.save() - self.add_permissions('dcim.view_device', 'dcim.render_config_device') + self.add_permissions('dcim.view_device', 'dcim.render_config_device', 'extras.view_configtemplate') url = reverse('dcim:device_render-config', kwargs={'pk': device.pk}) # Render with override config_template_id @@ -2383,11 +2383,22 @@ class DeviceTestCase(ViewTestCases.PrimaryObjectViewTestCase): self.assertHttpStatus(response, 200) self.assertIn(b'Override config for', response.content) - # Render with invalid config_template_id still returns 200 with error message + # Render with nonexistent config_template_id still returns 200 with error message response = self.client.get(url, {'config_template_id': 999999}) self.assertHttpStatus(response, 200) self.assertIn(b'Error rendering template', response.content) + # Render with non-integer config_template_id still returns 200 with error message + response = self.client.get(url, {'config_template_id': 'abc'}) + self.assertHttpStatus(response, 200) + self.assertIn(b'Error rendering template', response.content) + + # Without view_configtemplate permission, override template should not be accessible + self.remove_permissions('extras.view_configtemplate') + response = self.client.get(url, {'config_template_id': override_template.pk}) + self.assertHttpStatus(response, 200) + self.assertIn(b'Error rendering template', response.content) + def test_device_role_display_colored(self): parent_role = DeviceRole.objects.create(name='Parent Role', slug='parent-role', color='111111') child_role = DeviceRole.objects.create(name='Child Role', slug='child-role', parent=parent_role, color='aa00bb') diff --git a/netbox/virtualization/tests/test_api.py b/netbox/virtualization/tests/test_api.py index bf5e93a76..97e179de3 100644 --- a/netbox/virtualization/tests/test_api.py +++ b/netbox/virtualization/tests/test_api.py @@ -358,7 +358,8 @@ class VirtualMachineTest(APIViewTestCases.APIViewTestCase): vm.save() self.add_permissions( - 'virtualization.render_config_virtualmachine', 'virtualization.view_virtualmachine' + 'virtualization.render_config_virtualmachine', 'virtualization.view_virtualmachine', + 'extras.view_configtemplate' ) url = reverse('virtualization-api:virtualmachine-render-config', kwargs={'pk': vm.pk}) @@ -367,10 +368,19 @@ class VirtualMachineTest(APIViewTestCases.APIViewTestCase): self.assertHttpStatus(response, status.HTTP_200_OK) self.assertEqual(response.data['content'], f'Override config for {vm.name}') - # Render with invalid config_template_id + # Render with nonexistent config_template_id response = self.client.post(url, {'config_template_id': 999999}, format='json', **self.header) self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + # Render with non-integer config_template_id + response = self.client.post(url, {'config_template_id': 'abc'}, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + + # Without view_configtemplate permission, override template should not be accessible + self.remove_permissions('extras.view_configtemplate') + response = self.client.post(url, {'config_template_id': override_template.pk}, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + class VMInterfaceTest(APIViewTestCases.APIViewTestCase): model = VMInterface diff --git a/netbox/virtualization/tests/test_views.py b/netbox/virtualization/tests/test_views.py index 12a4eca4b..435e9579e 100644 --- a/netbox/virtualization/tests/test_views.py +++ b/netbox/virtualization/tests/test_views.py @@ -357,6 +357,46 @@ class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase): self.remove_permissions('virtualization.view_virtualmachine') self.assertHttpStatus(self.client.get(url), 403) + def test_virtualmachine_renderconfig_with_config_template_id(self): + default_template = ConfigTemplate.objects.create( + name='Default Template', + template_code='Default config for {{ virtualmachine.name }}' + ) + override_template = ConfigTemplate.objects.create( + name='Override Template', + template_code='Override config for {{ virtualmachine.name }}' + ) + vm = VirtualMachine.objects.first() + vm.config_template = default_template + vm.save() + + self.add_permissions( + 'virtualization.view_virtualmachine', 'virtualization.render_config_virtualmachine', + 'extras.view_configtemplate' + ) + url = reverse('virtualization:virtualmachine_render-config', kwargs={'pk': vm.pk}) + + # Render with override config_template_id + response = self.client.get(url, {'config_template_id': override_template.pk}) + self.assertHttpStatus(response, 200) + self.assertIn(b'Override config for', response.content) + + # Render with nonexistent config_template_id still returns 200 with error message + response = self.client.get(url, {'config_template_id': 999999}) + self.assertHttpStatus(response, 200) + self.assertIn(b'Error rendering template', response.content) + + # Render with non-integer config_template_id still returns 200 with error message + response = self.client.get(url, {'config_template_id': 'abc'}) + self.assertHttpStatus(response, 200) + self.assertIn(b'Error rendering template', response.content) + + # Without view_configtemplate permission, override template should not be accessible + self.remove_permissions('extras.view_configtemplate') + response = self.client.get(url, {'config_template_id': override_template.pk}) + self.assertHttpStatus(response, 200) + self.assertIn(b'Error rendering template', response.content) + class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): model = VMInterface