Skip to content

Commit 34c1e10

Browse files
committed
[change] Disable API operations on deactivated devices
1 parent ecc2165 commit 34c1e10

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

Diff for: openwisp_firmware_upgrader/api/views.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from django.http import Http404
44
from django_filters.rest_framework import DjangoFilterBackend
55
from rest_framework import filters, generics, pagination, serializers, status
6-
from rest_framework.exceptions import NotFound
6+
from rest_framework.exceptions import NotFound, PermissionDenied
77
from rest_framework.request import clone_request
88
from rest_framework.response import Response
99
from rest_framework.utils.serializer_helpers import ReturnDict
@@ -257,6 +257,12 @@ class DeviceFirmwareDetailView(
257257
lookup_url_kwarg = 'pk'
258258
organization_field = 'device__organization'
259259

260+
def get_object(self):
261+
obj = super().get_object()
262+
if self.request.method not in ('GET', 'HEAD') and obj.device.is_deactivated():
263+
raise PermissionDenied
264+
return obj
265+
260266
def get_serializer_context(self):
261267
context = super().get_serializer_context()
262268
context.update({'device_id': self.kwargs['pk']})

Diff for: openwisp_firmware_upgrader/tests/test_api.py

+21
Original file line numberDiff line numberDiff line change
@@ -924,6 +924,27 @@ def test_device_firmware_detail_400(self):
924924
self.assertEqual(r.status_code, 400)
925925
self.assertIn('Invalid pk', r.json()['image'][0])
926926

927+
def test_deactivated_device(self):
928+
device_fw = self._create_device_firmware()
929+
device_fw.device.deactivate()
930+
url = reverse('upgrader:api_devicefirmware_detail', args=[device_fw.device.pk])
931+
932+
with self.subTest('Test retrieving DeviceFirmwareImage'):
933+
response = self.client.get(url)
934+
self.assertEqual(response.status_code, 200)
935+
936+
with self.subTest('Test updating DeviceFirmwareImage'):
937+
response = self.client.put(
938+
url,
939+
data={'image': device_fw.image.pk},
940+
content_type='application/json',
941+
)
942+
self.assertEqual(response.status_code, 403)
943+
944+
with self.subTest('Test deleting DeviceFirmwareImage'):
945+
response = self.client.delete(url)
946+
self.assertEqual(response.status_code, 403)
947+
927948
def test_device_firmware_detail_delete(self):
928949
device_fw = self._create_device_firmware()
929950
self.assertEqual(DeviceFirmware.objects.count(), 1)

0 commit comments

Comments
 (0)