Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def prepare(self):
"""Called before each verb handler"""
# Used for calculating request handling duration
self.request.created_time = datetime.datetime.utcnow()
content_type = self.request.headers.get("content-type", "")
if self.request.method.upper() in ["POST", "PATCH"] and content_type:
content_type = content_type.split(";")
self.request.mime_type = content_type[0]
if self.request.mime_type not in [
"application/json",
"application/x-www-form-urlencoded",
]:
raise ModelValidationError("Unsupported or missing content-type header")
# Attempt to parse out the charset and decode the body, default to utf-8
charset = "utf-8"
if len(content_type) > 1:
search_result = self.charset_re.search(content_type[1])
if search_result:
charset = search_result.group(1)
self.request.charset = charset
self.request.decoded_body = self.request.body.decode(charset)
def _validate_no_extra_request_parameter_keys(
self, request_parameters, command_parameters
):
"""Validate that all the parameters passed in were valid keys. If there is a key
specified that is not noted in the database, then a validation error is thrown"""
self.logger.debug("Validating Keys")
valid_keys = [cp.key for cp in command_parameters]
self.logger.debug("Valid Keys are : %s" % valid_keys)
for key in request_parameters:
if key not in valid_keys:
raise ModelValidationError(
"Unknown key '%s' provided in the parameters. Valid Keys are: %s"
% (key, valid_keys)
)
def _validate_regex(self, value, command_parameter):
"""Validate that the value matches the regex"""
if value is not None and not command_parameter.optional:
if command_parameter.regex:
if not re.match(command_parameter.regex, value):
raise ModelValidationError(
"Value %s does not match regular expression %s"
% (value, command_parameter.regex)
)
def clean(self):
"""Validate before saving to the database"""
if not self.nullable and self.optional and self.default is None:
raise ModelValidationError(
f"Can not save Parameter {self}: For this Parameter nulls are not "
f"allowed, but the parameter is optional with no default defined."
)
if len(self.parameters) != len(
set(parameter.key for parameter in self.parameters)
):
raise ModelValidationError(
f"Can not save Parameter {self}: Contains Parameters with duplicate keys"
)
if isinstance(allowed, dict):
allowed_values.append(allowed["value"])
else:
allowed_values.append(allowed)
if command_parameter.multi:
for single_value in value:
if single_value not in allowed_values:
raise ModelValidationError(
"Value '%s' is not a valid choice for parameter with key "
"'%s'. Valid choices are: %s"
% (single_value, command_parameter.key, allowed_values)
)
else:
if value not in allowed_values:
raise ModelValidationError(
"Value '%s' is not a valid choice for parameter with key '%s'. "
"Valid choices are: %s"
% (value, command_parameter.key, allowed_values)
)
else:
raise TypeError("Invalid value for boolean (%s)" % value)
elif parameter.type.upper() == "DICTIONARY":
dict_value = dict(value)
if parameter.parameters:
self.logger.debug("Found Nested Parameters.")
return self.get_and_validate_parameters(
request, command, parameter.parameters, dict_value
)
return dict_value
elif parameter.type.upper() == "DATE":
return int(value)
elif parameter.type.upper() == "DATETIME":
return int(value)
else:
raise ModelValidationError(
"Unknown type for parameter. Please contact a system administrator."
)
except TypeError as ex:
self.logger.exception(ex)
raise ModelValidationError(
"Value for key: %s is not the correct type. Should be: %s"
% (parameter.key, parameter.type)
)
except ValueError as ex:
self.logger.exception(ex)
raise ModelValidationError(
"Value for key: %s is not the correct type. Should be: %s"
% (parameter.key, parameter.type)
)
% (command_parameter.key, Choices.TYPES)
)
# At this point raw_allowed is a list, but that list can potentially contain
# {"value": "", "text": ""} dicts. Need to collapse those to strings
allowed_values = []
for allowed in raw_allowed:
if isinstance(allowed, dict):
allowed_values.append(allowed["value"])
else:
allowed_values.append(allowed)
if command_parameter.multi:
for single_value in value:
if single_value not in allowed_values:
raise ModelValidationError(
"Value '%s' is not a valid choice for parameter with key "
"'%s'. Valid choices are: %s"
% (single_value, command_parameter.key, allowed_values)
)
else:
if value not in allowed_values:
raise ModelValidationError(
"Value '%s' is not a valid choice for parameter with key '%s'. "
"Valid choices are: %s"
% (value, command_parameter.key, allowed_values)
)
elif op.path == "/output":
if req.output == op.value:
continue
if status_before in Request.COMPLETED_STATUSES:
raise ModelValidationError(
"Cannot update output for a request "
"that is already completed"
)
req.output = op.value
elif op.path == "/error_class":
if req.error_class == op.value:
continue
if status_before in Request.COMPLETED_STATUSES:
raise ModelValidationError(
"Cannot update error_class for a "
"request that is already completed"
)
req.error_class = op.value
self.request.event.error = True
else:
error_msg = "Unsupported path '%s'" % op.path
self.logger.warning(error_msg)
raise ModelValidationError(error_msg)
else:
error_msg = "Unsupported operation '%s'" % op.operation
self.logger.warning(error_msg)
raise ModelValidationError(error_msg)
req.save()
)
system.commands = new_commands
system = db.update(system)
elif op.path in ["/description", "/icon_name", "/display_name"]:
# If we set an attribute to None mongoengine marks that
# attribute for deletion, so we don't do that.
value = "" if op.value is None else op.value
attr = op.path.strip("/")
setattr(system, attr, value)
system = db.update(system)
else:
raise ModelValidationError(f"Unsupported path for replace '{op.path}'")
elif op.operation == "add":
if op.path == "/instance":
instance = SchemaParser.parse_instance(op.value)
if len(system.instances) >= system.max_instances:
raise ModelValidationError(
f"Unable to add instance {instance.name} as it would exceed "
f"the system instance limit ({system.max_instances})"
)
system.instances.append(instance)
system = db.create(system)
else:
raise ModelValidationError(f"Unsupported path for add '{op.path}'")
elif op.operation == "update":
elif op.value.upper() in BrewtilsRequest.COMPLETED_STATUSES:
self.request.event.name = Events.REQUEST_COMPLETED.name
if request_id in brew_view.request_map:
wait_event = brew_view.request_map[request_id]
else:
error_msg = "Unsupported status value '%s'" % op.value
self.logger.warning(error_msg)
raise ModelValidationError(error_msg)
elif op.path == "/output":
if req.output == op.value:
continue
if status_before in Request.COMPLETED_STATUSES:
raise ModelValidationError(
"Cannot update output for a request "
"that is already completed"
)
req.output = op.value
elif op.path == "/error_class":
if req.error_class == op.value:
continue
if status_before in Request.COMPLETED_STATUSES:
raise ModelValidationError(
"Cannot update error_class for a "
"request that is already completed"
)
req.error_class = op.value
self.request.event.error = True
else: