From 5c9a14525573ab580f6ec26f2ac6f5620a2979fd Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Mon, 19 Aug 2024 20:26:27 -0500 Subject: [PATCH] Fixes: #15924 - Prevent API payload from allowing tagged_vlans while interface mode is set to taged-all --- netbox/dcim/api/serializers_/device_components.py | 8 ++++++++ netbox/dcim/models/device_components.py | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/netbox/dcim/api/serializers_/device_components.py b/netbox/dcim/api/serializers_/device_components.py index fd32d95d0..9e021272d 100644 --- a/netbox/dcim/api/serializers_/device_components.py +++ b/netbox/dcim/api/serializers_/device_components.py @@ -1,3 +1,4 @@ +from django.utils.translation import gettext as _ from django.contrib.contenttypes.models import ContentType from drf_spectacular.utils import extend_schema_field from rest_framework import serializers @@ -246,6 +247,13 @@ class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect f"or it must be global." }) + # Validate that tagged-all payload does not include tagged_vlans + mode = data.get('mode') or self.instance.mode + if mode == InterfaceModeChoices.MODE_TAGGED_ALL and data.get('tagged_vlans'): + raise serializers.ValidationError({ + 'tagged_vlans': "Tagged-All interface mode must not include any tagged vlans" + }) + return super().validate(data) diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 9438b741f..5a087b495 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -912,6 +912,10 @@ class Interface(ModularComponentModel, BaseInterface, CabledObjectModel, PathEnd if self.rf_channel and not self.rf_channel_width: self.rf_channel_width = get_channel_attr(self.rf_channel, 'width') + # Clear any tagged vlans set when mode is tagged-all + if self.mode == InterfaceModeChoices.MODE_TAGGED_ALL and self.tagged_vlans: + self.tagged_vlans.set([]) + super().save(*args, **kwargs) @property