Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def get_xml_validator_class(doc):
"""Returns the XML validator class required to validate the input
`doc`.
Args:
doc: An XML document. This can be a filename, file-like object,
``etree._Element``, or ``etree._ElementTree`` instance.
Returns:
An XML Schema validator class (not object instance) which provides
validation functionality required to validate `doc`.
"""
root = utils.get_etree_root(doc)
if utils.is_stix(root):
return STIXSchemaValidator
if utils.is_cybox(root):
return CyboxSchemaValidator
ns = utils.get_namespace(root)
error = (
"Unable determine validator class for input type. Root element "
"namespace: {0}"
).format(ns)
raise errors.ValidationError(error)
def _build_include_graph(self, schema_paths):
"""Builds a graph of ``xs:include`` directive sources and targets for
the schemas contained by the `schema_paths` list.
Args:
schema_paths: A list of schema file paths
Returns:
A graph representing ``xs:include`` statements found within the
schemas in `schema_paths`.
"""
graph = collections.defaultdict(list)
for fp in schema_paths:
root = utils.get_etree_root(fp)
includes = self._get_includes(fp, root)
graph[fp].extend(includes)
return graph
will be made to extract the version from `doc`.
Returns:
An instance of
:class:`.BestPracticeValidationResults`.
Raises:
.UnknownSTIXVersionError: If `version` was ``None`` and `doc`
did not contain any version information.
.InvalidSTIXVersionError: If discovered version or `version`
argument contains an invalid STIX version number.
.ValidationError: If there are any issues parsing `doc`.
"""
# Get the element for the input document
root = utils.get_etree_root(doc)
# Get the STIX version for the input `doc` if one is not passed in.
version = version or common.get_version(root)
# Check that the version number is a valid STIX version number
common.check_version(version)
# Run the best practice checks applicable for the STIX version number.
results = self._run_rules(root, version)
# Return the results
return results
def validate(self, doc):
"""Validates an XML instance document against a STIX profile.
Args:
doc: The STIX document. This can be a filename, file-like object,
``etree._Element``, or ``etree._ElementTree`` instance.
Returns:
An instance of
:class:`.ProfileValidationResults`.
Raises:
.ValidationError: If there are any issues parsing `doc`.
"""
root = utils.get_etree_root(doc)
is_valid = self._schematron.validate(root)
svrl_report = self._schematron.validation_report
results = ProfileValidationResults(is_valid, root, svrl_report)
return results
def inner(*args, **kwargs):
try:
doc = args[1]
except IndexError:
doc = kwargs['doc']
# Get the root element for the input doc
root = utils.get_etree_root(doc)
# Check that the root is a valid CybOX root-level element
check_root(root)
return func(*args, **kwargs)
def _build_required_imports(self, doc, schemaloc=False):
root = utils.get_etree_root(doc)
if schemaloc:
return self._parse_schemaloc(root)
return self._get_required_schemas(root)
``schema_dir``, no version checking or verification will occur.
Args:
doc: The XML document. This can be a filename, file-like object,
``etree._Element``, or ``etree._ElementTree`` instance.
version: The version of the XML document. If ``None`` an attempt
will be made to extract the version from `doc`.
schemaloc: If ``True``, the ``xsi:schemaLocation`` attribute on
`doc` will be used to drive the validation.
Returns:
An instance of
:class:`.XmlValidationResults`.
"""
root = utils.get_etree_root(doc)
if schemaloc:
validator = self._xml_validators[self._KEY_SCHEMALOC]
elif self._is_user_defined:
validator = self._xml_validators[self._KEY_USER_DEFINED]
else:
version = version or self._get_document_version(root)
validator = self._get_versioned_validator(version)
results = validator.validate(root, schemaloc)
return results
"""Returns the version of the `observables` ``Observables`` node.
Returns:
A dotted-decimal a version string from the ``cybox_major``,
``cybox_minor`` and ``cybox_update`` attribute values.
Raises:
UnknownVersionError: If `observables` does not contain any of the
following attributes:
* ``cybox_major_version``
* ``cybox_minor_version``
* ``cybox_update_version``
"""
observables = utils.get_etree_root(doc)
cybox_major = observables.attrib.get(TAG_CYBOX_MAJOR)
cybox_minor = observables.attrib.get(TAG_CYBOX_MINOR)
cybox_update = observables.attrib.get(TAG_CYBOX_UPDATE)
if not any((cybox_major, cybox_minor, cybox_update)):
error = "The input CybOX document has no version information."
raise errors.UnknownCyboxVersionError(error)
if cybox_update not in (None, '0'):
version = "%s.%s.%s" % (cybox_major, cybox_minor, cybox_update)
else:
version = "%s.%s" % (cybox_major, cybox_minor)
return version