From f9363f8688163662471d13bbe8c43df16b3d183a Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Tue, 21 Jul 2026 09:41:04 +0200 Subject: [PATCH] fix(ipam): Fix format string in IP address/prefix validation errors Add missing keyword argument to format() calls in validation error messages. This ensures the invalid data value is properly included in the error message returned to the user. Fixes #22719 --- netbox/ipam/api/field_serializers.py | 4 ++-- netbox/ipam/tests/test_api.py | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/netbox/ipam/api/field_serializers.py b/netbox/ipam/api/field_serializers.py index f22f9abfb..6aa233291 100644 --- a/netbox/ipam/api/field_serializers.py +++ b/netbox/ipam/api/field_serializers.py @@ -20,7 +20,7 @@ class IPAddressField(serializers.CharField): try: return IPNetwork(data) except AddrFormatError: - raise serializers.ValidationError(_("Invalid IP address format: {data}").format(data)) + raise serializers.ValidationError(_("Invalid IP address format: {data}").format(data=data)) except (TypeError, ValueError) as e: raise serializers.ValidationError(e) @@ -40,7 +40,7 @@ class IPNetworkField(serializers.CharField): try: return IPNetwork(data) except AddrFormatError: - raise serializers.ValidationError(_("Invalid IP prefix format: {data}").format(data)) + raise serializers.ValidationError(_("Invalid IP prefix format: {data}").format(data=data)) except (TypeError, ValueError) as e: raise serializers.ValidationError(e) diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index 70d884b5e..fb05e2a55 100644 --- a/netbox/ipam/tests/test_api.py +++ b/netbox/ipam/tests/test_api.py @@ -452,6 +452,19 @@ class PrefixTestCase(APIViewTestCases.APIViewTestCase): ) Prefix.objects.bulk_create(prefixes) + @tag('regression') + def test_create_with_invalid_prefix(self): + """ + POST of a malformed prefix value returns a 400 validation error. + """ + self.add_permissions('ipam.add_prefix') + url = reverse('ipam-api:prefix-list') + + response = self.client.post(url, {'prefix': 'invalid'}, format='json', **self.header) + + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + self.assertEqual(response.data['prefix'][0], 'Invalid IP prefix format: invalid') + @tag('regression') def test_clean_validates_scope(self): prefix = Prefix.objects.first() @@ -858,6 +871,19 @@ class IPAddressTestCase(APIViewTestCases.APIViewTestCase): ) IPAddress.objects.bulk_create(ip_addresses) + @tag('regression') + def test_create_with_invalid_address(self): + """ + POST of a malformed address value returns a 400 validation error. + """ + self.add_permissions('ipam.add_ipaddress') + url = reverse('ipam-api:ipaddress-list') + + response = self.client.post(url, {'address': 'invalid'}, format='json', **self.header) + + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + self.assertEqual(response.data['address'][0], 'Invalid IP address format: invalid') + def test_assign_object(self): """ Test the creation of available IP addresses within a parent IP range.