in server/api/plugins/openapi.py [0:0]
def validateSchema(self, pdef, formdata, schema = None):
""" Validate (sub)parameters against OpenAPI specs """
# allOf: list of schemas to validate against
if 'allOf' in pdef:
for subdef in pdef['allOf']:
self.validateSchema(subdef, formdata)
where = "JSON body"
# Symbolic link??
if 'schema' in pdef:
schema = pdef['schema']['$ref']
if '$ref' in pdef:
schema = pdef['$ref']
if schema:
# #/foo/bar/baz --> dict['foo']['bar']['baz']
pdef = functools.reduce(operator.getitem, schema.split('/')[1:], self.API)
where = "item matching schema %s" % schema
# Check that all required fields are present
if 'required' in pdef:
for field in pdef['required']:
if not field in formdata:
raise OpenAPIException("OpenAPI mismatch: Missing input field '%s' in %s!" % (field, where))
# Now check for valid format of input data
for field in formdata:
if 'properties' not in pdef or field not in pdef['properties'] :
raise OpenAPIException("Unknown input field '%s' in %s!" % (field, where))
if 'type' not in pdef['properties'][field]:
raise OpenAPIException("OpenAPI mismatch: Field '%s' was found in api.yaml, but no format was specified in specs!" % field)
ftype = pdef['properties'][field]['type']
self.validateType(field, formdata[field], ftype)
# Validate sub-arrays
if ftype == 'array' and 'items' in pdef['properties'][field]:
for item in formdata[field]:
if '$ref' in pdef['properties'][field]['items']:
self.validateSchema(pdef['properties'][field]['items'], item)
else:
self.validateType(field, formdata[field], pdef['properties'][field]['items']['type'])
# Validate sub-hashes
if ftype == 'hash' and 'schema' in pdef['properties'][field]:
self.validateSchema(pdef['properties'][field], formdata[field])