From d00fbcea825ac36bacbd98e93a1cb410506404ab Mon Sep 17 00:00:00 2001 From: Te Hung Tseng <te-hung.tseng@ess.eu> Date: Tue, 23 Mar 2021 13:41:48 +0100 Subject: [PATCH] added name validation for ansible group names --- app/models.py | 15 +++++++++++++++ app/validators.py | 1 + 2 files changed, 16 insertions(+) diff --git a/app/models.py b/app/models.py index ab17530..80c80a2 100644 --- a/app/models.py +++ b/app/models.py @@ -32,6 +32,7 @@ from .plugins import FlaskUserPlugin from .validators import ( ICS_ID_RE, HOST_NAME_RE, + GROUP_NAME_RE, INTERFACE_NAME_RE, VLAN_NAME_RE, MAC_ADDRESS_RE, @@ -1169,6 +1170,20 @@ class AnsibleGroup(CreatedMixin, SearchableMixin, db.Model): check_parents(self) return child + @validates("name") + def validate_name(self, key, string): + """Ensure the name matches the required format""" + if string is None: + return None + # Force the string to lowercase + lower_string = string.lower() + if GROUP_NAME_RE.fullmatch(lower_string) is None: + raise ValidationError(f"Group name shall match {GROUP_NAME_RE.pattern}") + existing_group_name = AnsibleGroup.query.filter_by(name=lower_string).first() + if existing_group_name: + raise ValidationError("Group name matches an existing group") + return lower_string + @property def is_dynamic(self): return self.type != AnsibleGroupType.STATIC diff --git a/app/validators.py b/app/validators.py index d6b2221..e084d55 100644 --- a/app/validators.py +++ b/app/validators.py @@ -16,6 +16,7 @@ from wtforms import ValidationError, SelectField ICS_ID_RE = re.compile(r"^[A-Z]{3}[0-9]{3}$") HOST_NAME_RE = re.compile(r"^[a-z0-9\-]{2,24}$") +GROUP_NAME_RE = re.compile(r"^[a-z0-9\-\_]{2,50}$") # Interface name needs to be at least 5 characters more than the hostname (Every interface name have to start with the hostname) INTERFACE_NAME_RE = re.compile(r"^[a-z0-9\-]{2,29}$") VLAN_NAME_RE = re.compile(r"^[A-Za-z0-9\-]{3,25}$") -- GitLab