Disallow invalid characters in project tags
Change-Id: I94060392fcc20291ccba2a460868afe63e5a379b
This commit is contained in:
parent
0eb5de0fca
commit
bb91786345
@ -3,6 +3,7 @@ from wsmeext.pecan import wsexpose
|
|||||||
|
|
||||||
from orm.common.orm_common.utils import api_error_utils as err_utils
|
from orm.common.orm_common.utils import api_error_utils as err_utils
|
||||||
from orm.common.orm_common.utils import utils
|
from orm.common.orm_common.utils import utils
|
||||||
|
from orm.services.customer_manager.cms_rest.data.sql_alchemy.models import CustomerMetadata
|
||||||
from orm.services.customer_manager.cms_rest.logger import get_logger
|
from orm.services.customer_manager.cms_rest.logger import get_logger
|
||||||
from orm.services.customer_manager.cms_rest.logic.error_base import ErrorStatus
|
from orm.services.customer_manager.cms_rest.logic.error_base import ErrorStatus
|
||||||
import orm.services.customer_manager.cms_rest.logic.metadata_logic as logic
|
import orm.services.customer_manager.cms_rest.logic.metadata_logic as logic
|
||||||
@ -13,10 +14,17 @@ LOG = get_logger(__name__)
|
|||||||
|
|
||||||
|
|
||||||
class MetadataController(rest.RestController):
|
class MetadataController(rest.RestController):
|
||||||
|
|
||||||
|
def check_metadata_values(self, metadata):
|
||||||
|
cust_metadata = CustomerMetadata()
|
||||||
|
for key, value in metadata.metadata.iteritems():
|
||||||
|
cust_metadata.validate_metadata(key, value)
|
||||||
|
|
||||||
@wsexpose(CustomerResultWrapper, str, body=MetadataWrapper, rest_content_types='json')
|
@wsexpose(CustomerResultWrapper, str, body=MetadataWrapper, rest_content_types='json')
|
||||||
def post(self, customer_uuid, metadata):
|
def post(self, customer_uuid, metadata):
|
||||||
authentication.authorize(request, 'customers:add_metadata')
|
authentication.authorize(request, 'customers:add_metadata')
|
||||||
try:
|
try:
|
||||||
|
self.check_metadata_values(metadata)
|
||||||
res = logic.add_customer_metadata(customer_uuid, metadata, request.transaction_id)
|
res = logic.add_customer_metadata(customer_uuid, metadata, request.transaction_id)
|
||||||
|
|
||||||
event_details = 'Customer {} metadata added'.format(customer_uuid)
|
event_details = 'Customer {} metadata added'.format(customer_uuid)
|
||||||
@ -30,10 +38,13 @@ class MetadataController(rest.RestController):
|
|||||||
except ValueError as ex:
|
except ValueError as ex:
|
||||||
raise err_utils.get_error(request.transaction_id,
|
raise err_utils.get_error(request.transaction_id,
|
||||||
message=ex.message, status_code=404)
|
message=ex.message, status_code=404)
|
||||||
|
|
||||||
except ErrorStatus as ex:
|
except ErrorStatus as ex:
|
||||||
LOG.log_exception("MetaDataController - Failed to add metadata", ex)
|
LOG.log_exception("MetaDataController - Failed to add metadata", ex)
|
||||||
raise err_utils.get_error(request.transaction_id,
|
raise err_utils.get_error(request.transaction_id,
|
||||||
status_code=ex.status_code)
|
message=ex.message,
|
||||||
|
status_code=ex.status_code)
|
||||||
|
|
||||||
except LookupError as ex:
|
except LookupError as ex:
|
||||||
LOG.log_exception("MetaDataController - {0}".format(ex.message), ex)
|
LOG.log_exception("MetaDataController - {0}".format(ex.message), ex)
|
||||||
raise err_utils.get_error(request.transaction_id,
|
raise err_utils.get_error(request.transaction_id,
|
||||||
@ -47,6 +58,8 @@ class MetadataController(rest.RestController):
|
|||||||
def put(self, customer_uuid, metadata):
|
def put(self, customer_uuid, metadata):
|
||||||
authentication.authorize(request, 'customers:update_metadata')
|
authentication.authorize(request, 'customers:update_metadata')
|
||||||
try:
|
try:
|
||||||
|
|
||||||
|
self.check_metadata_values(metadata)
|
||||||
res = logic.update_customer_metadata(customer_uuid, metadata, request.transaction_id)
|
res = logic.update_customer_metadata(customer_uuid, metadata, request.transaction_id)
|
||||||
|
|
||||||
event_details = 'Customer {} metadata updated'.format(customer_uuid)
|
event_details = 'Customer {} metadata updated'.format(customer_uuid)
|
||||||
@ -63,6 +76,7 @@ class MetadataController(rest.RestController):
|
|||||||
except ErrorStatus as ex:
|
except ErrorStatus as ex:
|
||||||
LOG.log_exception("MetaDataController - Failed to add metadata", ex)
|
LOG.log_exception("MetaDataController - Failed to add metadata", ex)
|
||||||
raise err_utils.get_error(request.transaction_id,
|
raise err_utils.get_error(request.transaction_id,
|
||||||
|
message=ex.message,
|
||||||
status_code=ex.status_code)
|
status_code=ex.status_code)
|
||||||
except LookupError as ex:
|
except LookupError as ex:
|
||||||
LOG.log_exception("MetaDataController - {0}".format(ex.message), ex)
|
LOG.log_exception("MetaDataController - {0}".format(ex.message), ex)
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
from orm.services.customer_manager.cms_rest.data.sql_alchemy.base import Base
|
from orm.services.customer_manager.cms_rest.data.sql_alchemy.base import Base
|
||||||
|
from orm.services.customer_manager.cms_rest.logic.error_base import ErrorStatus
|
||||||
import orm.services.customer_manager.cms_rest.model.GroupModels as GroupWsmeModels
|
import orm.services.customer_manager.cms_rest.model.GroupModels as GroupWsmeModels
|
||||||
import orm.services.customer_manager.cms_rest.model.Models as WsmeModels
|
import orm.services.customer_manager.cms_rest.model.Models as WsmeModels
|
||||||
from oslo_db.sqlalchemy import models
|
from oslo_db.sqlalchemy import models
|
||||||
|
import re
|
||||||
|
|
||||||
from sqlalchemy import Column, ForeignKey, Integer, SmallInteger, String
|
from sqlalchemy import Column, ForeignKey, Integer, SmallInteger, String
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
@ -538,18 +540,40 @@ class Customer(Base, CMSBaseModel):
|
|||||||
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
' CustomerMetadata is a DataObject and contains all the fields defined in customer_metadata table record.
|
' CustomerMetadata is a DataObject and contains all the fields defined in customer_metadata
|
||||||
' defined as SqlAlchemy model map to a table
|
' table record, defined as SqlAlchemy model map to a table
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
class CustomerMetadata(Base, CMSBaseModel):
|
class CustomerMetadata(Base, CMSBaseModel):
|
||||||
__tablename__ = "customer_metadata"
|
__tablename__ = "customer_metadata"
|
||||||
|
|
||||||
customer_id = Column(Integer, ForeignKey('customer.id'), primary_key=True, nullable=False)
|
customer_id = Column(Integer, ForeignKey('customer.id'), primary_key=True,
|
||||||
|
nullable=False)
|
||||||
field_key = Column(String(64), primary_key=True, nullable=False)
|
field_key = Column(String(64), primary_key=True, nullable=False)
|
||||||
field_value = Column(String(64), nullable=False)
|
field_value = Column(String(64), nullable=False)
|
||||||
|
|
||||||
|
def validate_metadata(self, field_key, field_value):
|
||||||
|
''' Check invalid chars in metadata key/value pair
|
||||||
|
|
||||||
|
Metadata key/value strings must not have special
|
||||||
|
characters listed inside square bracket
|
||||||
|
as follows [ ',' '/', ':', '=', '?']
|
||||||
|
'''
|
||||||
|
|
||||||
|
invalid_chars = '[/,?=:]'
|
||||||
|
bad_key = re.findall(invalid_chars, field_key)
|
||||||
|
bad_value = re.findall(invalid_chars, field_value)
|
||||||
|
|
||||||
|
if bad_key:
|
||||||
|
raise ErrorStatus(
|
||||||
|
400, "Metadata key '%s' contains one or more invalid "
|
||||||
|
"characters %s" % (field_key, str(list(set(bad_key)))))
|
||||||
|
if bad_value:
|
||||||
|
raise ErrorStatus(
|
||||||
|
400, "Metadata value '%s' contains one or more invalid "
|
||||||
|
"characters %s" % (field_value, str(list(set(bad_value)))))
|
||||||
|
|
||||||
def __json__(self):
|
def __json__(self):
|
||||||
return dict(
|
return dict(
|
||||||
customer_id=self.customer_id,
|
customer_id=self.customer_id,
|
||||||
|
@ -20,6 +20,7 @@ LOG = get_logger(__name__)
|
|||||||
|
|
||||||
class CustomerLogic(object):
|
class CustomerLogic(object):
|
||||||
def build_full_customer(self, customer, uuid, datamanager):
|
def build_full_customer(self, customer, uuid, datamanager):
|
||||||
|
cust_metadata = CustomerMetadata()
|
||||||
if any(char in ":" for char in customer.name):
|
if any(char in ":" for char in customer.name):
|
||||||
raise ErrorStatus(400, "Customer Name does not allow colon(:).")
|
raise ErrorStatus(400, "Customer Name does not allow colon(:).")
|
||||||
|
|
||||||
@ -29,6 +30,7 @@ class CustomerLogic(object):
|
|||||||
sql_customer = datamanager.add_customer(customer, uuid)
|
sql_customer = datamanager.add_customer(customer, uuid)
|
||||||
|
|
||||||
for key, value in customer.metadata.iteritems():
|
for key, value in customer.metadata.iteritems():
|
||||||
|
cust_metadata.validate_metadata(key, value)
|
||||||
metadata = CustomerMetadata(field_key=key, field_value=value)
|
metadata = CustomerMetadata(field_key=key, field_value=value)
|
||||||
sql_customer.customer_metadata.append(metadata)
|
sql_customer.customer_metadata.append(metadata)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user