def test_can_load_ciq_extension(self): from cybox.bindings.extensions.location import ciq_address_3_0 addr = ciq_address_3_0.CIQAddress3_0InstanceType() # Really basic test to verify the extension works. s = StringIO() addr.export(s.write, 0) xml = s.getvalue() self.assertEqual(165, len(xml))
def test_can_load_ciq_extension(self): from cybox.bindings.extensions.location import ciq_address_3_0 addr = ciq_address_3_0.CIQAddress3_0InstanceType() # Really basic test to verify the extension works. s = StringIO() addr.export(s.write, 0) xml = s.getvalue() self.assertEqual(165, len(xml))
def test_description_output(self): incident = incident_binding.IncidentType() assets = incident_binding.AffectedAssetsType() asset = incident_binding.AffectedAssetType() description = StructuredText("A Description") asset.Structured_Description = description.to_obj() assets.add_Affected_Asset(asset) incident.Affected_Assets = assets s = StringIO() incident.export(s.write, 0, {'http://stix.mitre.org/Incident-1': 'incident'}) xml = s.getvalue() self.assertTrue("A Description" in xml, "Description not exported")
def test_description_output(self): incident = incident_binding.IncidentType() assets = incident_binding.AffectedAssetsType() asset = incident_binding.AffectedAssetType() description = StructuredText("A Description") asset.Structured_Description = description.to_obj() assets.add_Affected_Asset(asset) incident.Affected_Assets = assets s = StringIO() incident.export(s.write, 0, {'http://stix.mitre.org/Incident-1': 'incident'}) xml = s.getvalue() self.assertTrue("A Description" in xml, "Description not exported")
def to_xml(self, include_namespaces=True, include_schemalocs=False, ns_dict=None, schemaloc_dict=None, pretty=True, auto_namespace=True, encoding='utf-8'): """Serializes a :class:`Entity` instance to an XML string. The default character encoding is ``utf-8`` and can be set via the `encoding` parameter. If `encoding` is ``None``, a string (unicode in Python 2, str in Python 3) is returned. Args: auto_namespace: Automatically discover and export XML namespaces for a STIX :class:`Entity` instance. include_namespaces: Export namespace definitions in the output XML. Default is ``True``. include_schemalocs: Export ``xsi:schemaLocation`` attribute in the output document. This will attempt to associate namespaces declared in the STIX document with schema locations. If a namespace cannot be resolved to a schemaLocation, a Python warning will be raised. Schemalocations will only be exported if `include_namespaces` is also ``True``. ns_dict: Dictionary of XML definitions (namespace is key, alias is value) to include in the exported document. This must be passed in if `auto_namespace` is ``False``. schemaloc_dict: Dictionary of XML ``namespace: schema location`` mappings to include in the exported document. These will only be included if `auto_namespace` is ``False``. pretty: Pretty-print the XML. encoding: The output character encoding. Default is ``utf-8``. If `encoding` is set to ``None``, a string (unicode in Python 2, str in Python 3) is returned. Returns: An XML string for this :class:`Entity` instance. Default character encoding is ``utf-8``. """ from .utils import nsparser parser = nsparser.NamespaceParser() if auto_namespace: ns_info = nsparser.NamespaceInfo() else: ns_info = None obj = self.to_obj(ns_info=ns_info) if (not auto_namespace) and (not ns_dict): raise Exception( "Auto-namespacing was disabled but ns_dict was empty " "or missing." ) if auto_namespace: ns_info.finalize(ns_dict=ns_dict, schemaloc_dict=schemaloc_dict) obj_ns_dict = ns_info.binding_namespaces else: ns_info = nsparser.NamespaceInfo() ns_info.finalized_namespaces = ns_dict or {} ns_info.finalized_schemalocs = schemaloc_dict or {} obj_ns_dict = dict( itertools.chain( iteritems(ns_dict), iteritems(nsparser.DEFAULT_STIX_NAMESPACES) ) ) namespace_def = "" if include_namespaces: xmlns = parser.get_xmlns_str(ns_info.finalized_namespaces) namespace_def += ("\n\t" + xmlns) if include_schemalocs and include_namespaces: schemaloc = parser.get_schemaloc_str(ns_info.finalized_schemalocs) namespace_def += ("\n\t" + schemaloc) if not pretty: namespace_def = namespace_def.replace('\n\t', ' ') with save_encoding(encoding): sio = StringIO() obj.export( sio.write, # output buffer 0, # output level obj_ns_dict, # namespace dictionary pretty_print=pretty, # pretty printing namespacedef_=namespace_def # namespace/schemaloc def string ) # Ensure that the StringIO buffer is unicode s = text_type(sio.getvalue()) if encoding: return s.encode(encoding) return s
def to_xml(self, include_namespaces=True, include_schemalocs=False, ns_dict=None, schemaloc_dict=None, pretty=True, auto_namespace=True, encoding='utf-8'): """Serializes a :class:`Entity` instance to an XML string. The default character encoding is ``utf-8`` and can be set via the `encoding` parameter. If `encoding` is ``None``, a string (unicode in Python 2, str in Python 3) is returned. Args: auto_namespace: Automatically discover and export XML namespaces for a STIX :class:`Entity` instance. include_namespaces: Export namespace definitions in the output XML. Default is ``True``. include_schemalocs: Export ``xsi:schemaLocation`` attribute in the output document. This will attempt to associate namespaces declared in the STIX document with schema locations. If a namespace cannot be resolved to a schemaLocation, a Python warning will be raised. Schemalocations will only be exported if `include_namespaces` is also ``True``. ns_dict: Dictionary of XML definitions (namespace is key, alias is value) to include in the exported document. This must be passed in if `auto_namespace` is ``False``. schemaloc_dict: Dictionary of XML ``namespace: schema location`` mappings to include in the exported document. These will only be included if `auto_namespace` is ``False``. pretty: Pretty-print the XML. encoding: The output character encoding. Default is ``utf-8``. If `encoding` is set to ``None``, a string (unicode in Python 2, str in Python 3) is returned. Returns: An XML string for this :class:`Entity` instance. Default character encoding is ``utf-8``. """ from mixbox.entities import NamespaceCollector if (not auto_namespace) and (not ns_dict): raise Exception( "Auto-namespacing was disabled but ns_dict was empty " "or missing.") ns_info = NamespaceCollector() obj = self.to_obj(ns_info=ns_info if auto_namespace else None) ns_info.finalize(ns_dict=ns_dict, schemaloc_dict=schemaloc_dict) if auto_namespace: obj_ns_dict = ns_info.binding_namespaces else: obj_ns_dict = dict( itertools.chain(iteritems(ns_info.binding_namespaces), iteritems(namespaces.get_full_ns_map()))) namespace_def = "" if include_namespaces: delim = "\n\t" if pretty else " " xmlns = ns_info.get_xmlns_string(delim) namespace_def += (delim + xmlns) if include_schemalocs: schemaloc = ns_info.get_schema_location_string(delim) namespace_def += (delim + schemaloc) with binding_utils.save_encoding(encoding): sio = StringIO() obj.export( sio.write, # output buffer 0, # output level obj_ns_dict, # namespace dictionary pretty_print=pretty, # pretty printing namespacedef_=namespace_def # namespace/schemaloc def string ) # Ensure that the StringIO buffer is unicode s = text_type(sio.getvalue()) if encoding: return s.encode(encoding) return s