From ada55dfdfbc16e8d5663126ebeddb289ce1bb0df Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 21 Apr 2020 14:50:15 -0400 Subject: [PATCH] Fixes #4510: Enforce address family for device primary IPv4/v6 addresses --- docs/release-notes/version-2.8.md | 1 + netbox/dcim/models/__init__.py | 14 ++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index 0f4e0ba48..b0f5754b2 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -14,6 +14,7 @@ * [#4388](https://github.com/netbox-community/netbox/issues/4388) - Fix detection of connected endpoints when connecting rear ports * [#4489](https://github.com/netbox-community/netbox/issues/4489) - Fix display of parent/child role on device type view * [#4496](https://github.com/netbox-community/netbox/issues/4496) - Fix exception when validating certain models via REST API +* [#4510](https://github.com/netbox-community/netbox/issues/4510) - Enforce address family for device primary IPv4/v6 addresses --- diff --git a/netbox/dcim/models/__init__.py b/netbox/dcim/models/__init__.py index e0953839a..b90131ca5 100644 --- a/netbox/dcim/models/__init__.py +++ b/netbox/dcim/models/__init__.py @@ -1514,24 +1514,30 @@ class Device(ChangeLoggedModel, ConfigContextModel, CustomFieldModel): # Validate primary IP addresses vc_interfaces = self.vc_interfaces.all() if self.primary_ip4: + if self.primary_ip4.family != 4: + raise ValidationError({ + 'primary_ip4': f"{self.primary_ip4} is not an IPv4 address." + }) if self.primary_ip4.interface in vc_interfaces: pass elif self.primary_ip4.nat_inside is not None and self.primary_ip4.nat_inside.interface in vc_interfaces: pass else: raise ValidationError({ - 'primary_ip4': "The specified IP address ({}) is not assigned to this device.".format( - self.primary_ip4), + 'primary_ip4': f"The specified IP address ({self.primary_ip4}) is not assigned to this device." }) if self.primary_ip6: + if self.primary_ip6.family != 6: + raise ValidationError({ + 'primary_ip6': f"{self.primary_ip4} is not an IPv6 address." + }) if self.primary_ip6.interface in vc_interfaces: pass elif self.primary_ip6.nat_inside is not None and self.primary_ip6.nat_inside.interface in vc_interfaces: pass else: raise ValidationError({ - 'primary_ip6': "The specified IP address ({}) is not assigned to this device.".format( - self.primary_ip6), + 'primary_ip6': f"The specified IP address ({self.primary_ip6}) is not assigned to this device." }) # Validate manufacturer/platform