From d47dd7a1275e1aa01dca1dafbd81b28268779818 Mon Sep 17 00:00:00 2001 From: kkthxbye-code Date: Mon, 31 Jul 2023 23:49:53 +0200 Subject: [PATCH 1/3] Fixes #12639 - Make sure name expansions throws a validation error on decrementing ranges --- netbox/dcim/forms/object_create.py | 7 ++++++- netbox/utilities/forms/utils.py | 7 +++++++ netbox/utilities/tests/test_forms.py | 5 +++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/netbox/dcim/forms/object_create.py b/netbox/dcim/forms/object_create.py index 9589ab5335e..59ea2a5ba92 100644 --- a/netbox/dcim/forms/object_create.py +++ b/netbox/dcim/forms/object_create.py @@ -52,7 +52,12 @@ def clean(self): super().clean() # Validate that all replication fields generate an equal number of values - pattern_count = len(self.cleaned_data[self.replication_fields[0]]) + patterns = self.cleaned_data.get(self.replication_fields[0]) + + if not patterns: + return + + pattern_count = len(patterns) for field_name in self.replication_fields: value_count = len(self.cleaned_data[field_name]) if self.cleaned_data[field_name] and value_count != pattern_count: diff --git a/netbox/utilities/forms/utils.py b/netbox/utilities/forms/utils.py index 5100b1714f8..08fe358d8b1 100644 --- a/netbox/utilities/forms/utils.py +++ b/netbox/utilities/forms/utils.py @@ -60,6 +60,9 @@ def parse_alphanumeric_range(string): except ValueError: begin, end = dash_range, dash_range if begin.isdigit() and end.isdigit(): + if int(begin) > int(end): + raise forms.ValidationError(f'Range "{dash_range}" is invalid.') + for n in list(range(int(begin), int(end) + 1)): values.append(n) else: @@ -71,6 +74,10 @@ def parse_alphanumeric_range(string): # Not a valid range (more than a single character) if not len(begin) == len(end) == 1: raise forms.ValidationError(f'Range "{dash_range}" is invalid.') + + if ord(begin) > ord(end): + raise forms.ValidationError(f'Range "{dash_range}" is invalid.') + for n in list(range(ord(begin), ord(end) + 1)): values.append(chr(n)) return values diff --git a/netbox/utilities/tests/test_forms.py b/netbox/utilities/tests/test_forms.py index b8cff299696..79ba3f4d8bd 100644 --- a/netbox/utilities/tests/test_forms.py +++ b/netbox/utilities/tests/test_forms.py @@ -264,8 +264,9 @@ def test_invalid_range_alphanumeric(self): self.assertEqual(sorted(expand_alphanumeric_pattern('r[a-9]a')), []) def test_invalid_range_bounds(self): - self.assertEqual(sorted(expand_alphanumeric_pattern('r[9-8]a')), []) - self.assertEqual(sorted(expand_alphanumeric_pattern('r[b-a]a')), []) + with self.assertRaises(forms.ValidationError): + sorted(expand_alphanumeric_pattern('r[9-8]a')) + sorted(expand_alphanumeric_pattern('r[b-a]a')) def test_invalid_range_len(self): with self.assertRaises(forms.ValidationError): From ab0df4bbae3821770e58a66e3dfe62300bcdc688 Mon Sep 17 00:00:00 2001 From: kkthxbye-code Date: Tue, 1 Aug 2023 11:04:30 +0200 Subject: [PATCH 2/3] Fix pep8 --- netbox/utilities/forms/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/utilities/forms/utils.py b/netbox/utilities/forms/utils.py index 08fe358d8b1..92698aa2382 100644 --- a/netbox/utilities/forms/utils.py +++ b/netbox/utilities/forms/utils.py @@ -74,10 +74,10 @@ def parse_alphanumeric_range(string): # Not a valid range (more than a single character) if not len(begin) == len(end) == 1: raise forms.ValidationError(f'Range "{dash_range}" is invalid.') - + if ord(begin) > ord(end): raise forms.ValidationError(f'Range "{dash_range}" is invalid.') - + for n in list(range(ord(begin), ord(end) + 1)): values.append(chr(n)) return values From 9972ed7cfa86a6771261f9b60cc4913f711f6788 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 11 Aug 2023 11:37:26 -0400 Subject: [PATCH 3/3] Also fail on equal start & end values --- netbox/dcim/forms/object_create.py | 4 +--- netbox/utilities/forms/utils.py | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/netbox/dcim/forms/object_create.py b/netbox/dcim/forms/object_create.py index 59ea2a5ba92..f37edee0a48 100644 --- a/netbox/dcim/forms/object_create.py +++ b/netbox/dcim/forms/object_create.py @@ -52,9 +52,7 @@ def clean(self): super().clean() # Validate that all replication fields generate an equal number of values - patterns = self.cleaned_data.get(self.replication_fields[0]) - - if not patterns: + if not (patterns := self.cleaned_data.get(self.replication_fields[0])): return pattern_count = len(patterns) diff --git a/netbox/utilities/forms/utils.py b/netbox/utilities/forms/utils.py index 92698aa2382..4d737f16321 100644 --- a/netbox/utilities/forms/utils.py +++ b/netbox/utilities/forms/utils.py @@ -60,7 +60,7 @@ def parse_alphanumeric_range(string): except ValueError: begin, end = dash_range, dash_range if begin.isdigit() and end.isdigit(): - if int(begin) > int(end): + if int(begin) >= int(end): raise forms.ValidationError(f'Range "{dash_range}" is invalid.') for n in list(range(int(begin), int(end) + 1)): @@ -75,7 +75,7 @@ def parse_alphanumeric_range(string): if not len(begin) == len(end) == 1: raise forms.ValidationError(f'Range "{dash_range}" is invalid.') - if ord(begin) > ord(end): + if ord(begin) >= ord(end): raise forms.ValidationError(f'Range "{dash_range}" is invalid.') for n in list(range(ord(begin), ord(end) + 1)):