Skip to content

Commit 16e0db4

Browse files
committed
Validate token registration semantic version
1 parent 6536e52 commit 16e0db4

3 files changed

Lines changed: 19 additions & 1 deletion

File tree

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ firebase-admin==4.3.0
2121
gnosis-py==2.5.6
2222
gunicorn[gevent]==20.0.4
2323
hexbytes==0.2.1
24+
packaging>=19.2
2425
psycopg2-binary==2.8.5
2526
redis==3.5.3
2627
requests==2.24.0

safe_transaction_service/notifications/serializers.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from django.db import IntegrityError
55

6+
from packaging import version as semantic_version
67
from rest_framework import serializers
78

89
from gnosis.eth.django.serializers import EthereumAddressField
@@ -23,9 +24,16 @@ class FirebaseDeviceSerializer(serializers.Serializer):
2324

2425
def validate_safes(self, safes: Sequence[str]):
2526
if SafeContract.objects.filter(address__in=safes).count() != len(safes):
26-
raise serializers.ValidationError("At least one Safe provided was not found")
27+
raise serializers.ValidationError('At least one Safe provided was not found')
2728
return safes
2829

30+
def validate_version(self, value: str):
31+
try:
32+
semantic_version.Version(value)
33+
except semantic_version.InvalidVersion:
34+
raise serializers.ValidationError('Semantic version was expected')
35+
return value
36+
2937
def save(self, **kwargs):
3038
try:
3139
firebase_device, _ = FirebaseDevice.objects.update_or_create(

safe_transaction_service/notifications/tests/test_views.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,20 @@ def test_notifications_devices_create_view(self):
6767
self.assertEqual(FirebaseDevice.objects.first().safes.count(), 2)
6868

6969
# Use not valid deviceType
70+
previous_device_type = data['deviceType']
7071
data['deviceType'] = 'RANGER-MORPHER'
7172
response = self.client.post(reverse('v1:notifications-devices'), format='json', data=data)
7273
self.assertIn('is not a valid choice', response.content.decode())
7374
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
7475
self.assertEqual(safe_contract.firebase_devices.count(), 1)
76+
data['deviceType'] = previous_device_type
77+
78+
# Use not valid version
79+
data['version'] = 'Megazord'
80+
response = self.client.post(reverse('v1:notifications-devices'), format='json', data=data)
81+
self.assertIn('Semantic version was expected', response.content.decode())
82+
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
83+
self.assertEqual(safe_contract.firebase_devices.count(), 1)
7584

7685
def test_notifications_devices_delete_view(self):
7786
safe_contract = SafeContractFactory()

0 commit comments

Comments
 (0)