From 4abac4441168ef6c9081e63462565c8ea9b068c1 Mon Sep 17 00:00:00 2001 From: Ryan Petrello Date: Fri, 18 May 2018 14:38:08 -0400 Subject: [PATCH] prevent unicode in instance hostnames and instance group names see: https://github.com/ansible/tower/issues/1721 --- awx/main/models/ha.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/awx/main/models/ha.py b/awx/main/models/ha.py index 471276c560..42e8117061 100644 --- a/awx/main/models/ha.py +++ b/awx/main/models/ha.py @@ -3,6 +3,7 @@ from decimal import Decimal +from django.core.exceptions import ValidationError from django.db import models, connection from django.db.models.signals import post_save, post_delete from django.dispatch import receiver @@ -10,12 +11,14 @@ from django.utils.translation import ugettext_lazy as _ from django.conf import settings from django.utils.timezone import now, timedelta +import six from solo.models import SingletonModel from awx import __version__ as awx_application_version from awx.api.versioning import reverse from awx.main.managers import InstanceManager, InstanceGroupManager from awx.main.fields import JSONField +from awx.main.models.base import BaseModel from awx.main.models.inventory import InventoryUpdate from awx.main.models.jobs import Job from awx.main.models.projects import ProjectUpdate @@ -26,7 +29,16 @@ from awx.main.models.mixins import RelatedJobsMixin __all__ = ('Instance', 'InstanceGroup', 'JobOrigin', 'TowerScheduleState',) -class Instance(models.Model): +def validate_queuename(v): + # celery and kombu don't play nice with unicode in queue names + if v: + try: + '{}'.format(v.decode('utf-8')) + except UnicodeEncodeError: + raise ValidationError(_(six.text_type('{} contains unsupported characters')).format(v)) + + +class Instance(BaseModel): """A model representing an AWX instance running against this database.""" objects = InstanceManager() @@ -113,9 +125,13 @@ class Instance(models.Model): self.save(update_fields=['capacity', 'version', 'modified', 'cpu', 'memory', 'cpu_capacity', 'mem_capacity']) + def clean_hostname(self): + validate_queuename(self.hostname) + return self.hostname + -class InstanceGroup(models.Model, RelatedJobsMixin): +class InstanceGroup(BaseModel, RelatedJobsMixin): """A model representing a Queue/Group of AWX Instances.""" objects = InstanceGroupManager() @@ -167,6 +183,10 @@ class InstanceGroup(models.Model, RelatedJobsMixin): class Meta: app_label = 'main' + def clean_name(self): + validate_queuename(self.name) + return self.name + class TowerScheduleState(SingletonModel): schedule_last_run = models.DateTimeField(auto_now_add=True)