Merge branch 'master' into 365-versioned-classes
						commit
						03cb225932
					
				|  | @ -1,4 +1,4 @@ | |||
| sudo: false | ||||
| os: linux | ||||
| language: python | ||||
| cache: pip | ||||
| dist: xenial | ||||
|  |  | |||
|  | @ -233,3 +233,16 @@ class STIXDeprecationWarning(DeprecationWarning): | |||
|     Represents usage of a deprecated component of a STIX specification. | ||||
|     """ | ||||
|     pass | ||||
| 
 | ||||
| 
 | ||||
| class DuplicateRegistrationError(STIXError): | ||||
|     """A STIX object with the same type as an existing object is being registered""" | ||||
| 
 | ||||
|     def __init__(self, obj_type, reg_obj_type): | ||||
|         super(DuplicateRegistrationError, self).__init__() | ||||
|         self.obj_type = obj_type | ||||
|         self.reg_obj_type = reg_obj_type | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         msg = "A(n) {0} with type '{1}' already exists and cannot be registered again" | ||||
|         return msg.format(self.obj_type, self.reg_obj_type) | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ import re | |||
| import stix2 | ||||
| 
 | ||||
| from .base import _DomainObject, _Observable | ||||
| from .exceptions import ParseError | ||||
| from .exceptions import DuplicateRegistrationError, ParseError | ||||
| from .utils import PREFIX_21_REGEX, _get_dict | ||||
| 
 | ||||
| STIX2_OBJ_MAPS = {} | ||||
|  | @ -217,6 +217,8 @@ def _register_object(new_type, version=None): | |||
|         v = 'v' + stix2.DEFAULT_VERSION.replace('.', '') | ||||
| 
 | ||||
|     OBJ_MAP = STIX2_OBJ_MAPS[v]['objects'] | ||||
|     if new_type._type in OBJ_MAP.keys(): | ||||
|         raise DuplicateRegistrationError("STIX Object", new_type._type) | ||||
|     OBJ_MAP[new_type._type] = new_type | ||||
| 
 | ||||
| 
 | ||||
|  | @ -244,6 +246,8 @@ def _register_marking(new_marking, version=None): | |||
|         v = 'v' + stix2.DEFAULT_VERSION.replace('.', '') | ||||
| 
 | ||||
|     OBJ_MAP_MARKING = STIX2_OBJ_MAPS[v]['markings'] | ||||
|     if new_marking._type in OBJ_MAP_MARKING.keys(): | ||||
|         raise DuplicateRegistrationError("STIX Marking", new_marking._type) | ||||
|     OBJ_MAP_MARKING[new_marking._type] = new_marking | ||||
| 
 | ||||
| 
 | ||||
|  | @ -266,6 +270,8 @@ def _register_observable(new_observable, version=None): | |||
|         v = 'v' + stix2.DEFAULT_VERSION.replace('.', '') | ||||
| 
 | ||||
|     OBJ_MAP_OBSERVABLE = STIX2_OBJ_MAPS[v]['observables'] | ||||
|     if new_observable._type in OBJ_MAP_OBSERVABLE.keys(): | ||||
|         raise DuplicateRegistrationError("Cyber Observable", new_observable._type) | ||||
|     OBJ_MAP_OBSERVABLE[new_observable._type] = new_observable | ||||
| 
 | ||||
| 
 | ||||
|  | @ -292,11 +298,6 @@ def _register_observable_extension( | |||
| 
 | ||||
|     temp_prop = stix2.properties.TypeProperty(ext_type, spec_version=version) | ||||
|     temp_prop.clean(ext_type) | ||||
|     if not ext_type.endswith('-ext'): | ||||
|         raise ValueError( | ||||
|             "Invalid extension type name '%s': must end with '-ext'." % | ||||
|             ext_type, | ||||
|         ) | ||||
| 
 | ||||
|     if not new_extension._properties: | ||||
|         raise ValueError( | ||||
|  | @ -305,6 +306,12 @@ def _register_observable_extension( | |||
|         ) | ||||
| 
 | ||||
|     if version == "2.1": | ||||
|         if not ext_type.endswith('-ext'): | ||||
|             raise ValueError( | ||||
|                 "Invalid extension type name '%s': must end with '-ext'." % | ||||
|                 ext_type, | ||||
|             ) | ||||
| 
 | ||||
|         for prop_name, prop_value in properties.items(): | ||||
|             if not re.match(PREFIX_21_REGEX, prop_name): | ||||
|                 raise ValueError("Property name '%s' must begin with an alpha character." % prop_name) | ||||
|  | @ -323,6 +330,8 @@ def _register_observable_extension( | |||
|     EXT_MAP = STIX2_OBJ_MAPS[v]['observable-extensions'] | ||||
| 
 | ||||
|     try: | ||||
|         if ext_type in EXT_MAP[observable_type].keys(): | ||||
|             raise DuplicateRegistrationError("Observable Extension", ext_type) | ||||
|         EXT_MAP[observable_type][ext_type] = new_extension | ||||
|     except KeyError: | ||||
|         if observable_type not in OBJ_MAP_OBSERVABLE: | ||||
|  |  | |||
|  | @ -3,8 +3,6 @@ import pytest | |||
| import stix2 | ||||
| from stix2 import exceptions, parsing | ||||
| 
 | ||||
| from .constants import IDENTITY_ID | ||||
| 
 | ||||
| BUNDLE = { | ||||
|     "type": "bundle", | ||||
|     "spec_version": "2.0", | ||||
|  | @ -68,109 +66,9 @@ def test_parse_observable_with_no_version(): | |||
|     assert v in str(obs_obj.__class__) | ||||
| 
 | ||||
| 
 | ||||
| def test_register_object_with_version(): | ||||
|     bundle = parsing.dict_to_stix2(BUNDLE, version='2.0') | ||||
|     parsing._register_object(bundle.objects[0].__class__, version='2.0') | ||||
|     v = 'v20' | ||||
| 
 | ||||
|     assert bundle.objects[0].type in parsing.STIX2_OBJ_MAPS[v]['objects'] | ||||
|     # spec_version is not in STIX 2.0, and is required in 2.1, so this | ||||
|     # suffices as a test for a STIX 2.0 object. | ||||
|     assert "spec_version" not in bundle.objects[0] | ||||
| 
 | ||||
| 
 | ||||
| def test_register_marking_with_version(): | ||||
|     parsing._register_marking(stix2.v20.TLP_WHITE.__class__, version='2.0') | ||||
|     v = 'v20' | ||||
| 
 | ||||
|     assert stix2.v20.TLP_WHITE.definition._type in parsing.STIX2_OBJ_MAPS[v]['markings'] | ||||
|     assert v in str(stix2.v20.TLP_WHITE.__class__) | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.xfail(reason="The default version is no longer 2.0", condition=stix2.DEFAULT_VERSION != "2.0") | ||||
| def test_register_marking_with_no_version(): | ||||
|     # Uses default version (2.0 in this case) | ||||
|     parsing._register_marking(stix2.v20.TLP_WHITE.__class__) | ||||
|     v = 'v20' | ||||
| 
 | ||||
|     assert stix2.v20.TLP_WHITE.definition._type in parsing.STIX2_OBJ_MAPS[v]['markings'] | ||||
|     assert v in str(stix2.v20.TLP_WHITE.__class__) | ||||
| 
 | ||||
| 
 | ||||
| def test_register_observable_with_version(): | ||||
|     observed_data = stix2.v20.ObservedData( | ||||
|         id="observed-data--b67d30ff-02ac-498a-92f9-32f845f448cf", | ||||
|         created_by_ref=IDENTITY_ID, | ||||
|         created="2016-04-06T19:58:16.000Z", | ||||
|         modified="2016-04-06T19:58:16.000Z", | ||||
|         first_observed="2015-12-21T19:00:00Z", | ||||
|         last_observed="2015-12-21T19:00:00Z", | ||||
|         number_observed=50, | ||||
|         objects={ | ||||
|             "0": { | ||||
|                 "name": "foo.exe", | ||||
|                 "type": "file", | ||||
|                 "extensions": { | ||||
|                     "ntfs-ext": { | ||||
|                         "alternate_data_streams": [ | ||||
|                             { | ||||
|                                 "name": "second.stream", | ||||
|                                 "size": 25536, | ||||
|                             }, | ||||
|                         ], | ||||
|                     }, | ||||
|                 }, | ||||
|             }, | ||||
|             "1": { | ||||
|                 "type": "directory", | ||||
|                 "path": "/usr/home", | ||||
|                 "contains_refs": ["0"], | ||||
|             }, | ||||
|         }, | ||||
|     ) | ||||
|     parsing._register_observable(observed_data.objects['0'].__class__, version='2.0') | ||||
|     v = 'v20' | ||||
| 
 | ||||
|     assert observed_data.objects['0'].type in parsing.STIX2_OBJ_MAPS[v]['observables'] | ||||
|     assert v in str(observed_data.objects['0'].__class__) | ||||
| 
 | ||||
| 
 | ||||
| def test_register_observable_extension_with_version(): | ||||
|     observed_data = stix2.v20.ObservedData( | ||||
|         id="observed-data--b67d30ff-02ac-498a-92f9-32f845f448cf", | ||||
|         created_by_ref=IDENTITY_ID, | ||||
|         created="2016-04-06T19:58:16.000Z", | ||||
|         modified="2016-04-06T19:58:16.000Z", | ||||
|         first_observed="2015-12-21T19:00:00Z", | ||||
|         last_observed="2015-12-21T19:00:00Z", | ||||
|         number_observed=50, | ||||
|         objects={ | ||||
|             "0": { | ||||
|                 "name": "foo.exe", | ||||
|                 "type": "file", | ||||
|                 "extensions": { | ||||
|                     "ntfs-ext": { | ||||
|                         "alternate_data_streams": [ | ||||
|                             { | ||||
|                                 "name": "second.stream", | ||||
|                                 "size": 25536, | ||||
|                             }, | ||||
|                         ], | ||||
|                     }, | ||||
|                 }, | ||||
|             }, | ||||
|             "1": { | ||||
|                 "type": "directory", | ||||
|                 "path": "/usr/home", | ||||
|                 "contains_refs": ["0"], | ||||
|             }, | ||||
|         }, | ||||
|     ) | ||||
|     parsing._register_observable_extension(observed_data.objects['0'], observed_data.objects['0'].extensions['ntfs-ext'].__class__, version='2.0') | ||||
|     v = 'v20' | ||||
| 
 | ||||
|     assert observed_data.objects['0'].type in parsing.STIX2_OBJ_MAPS[v]['observables'] | ||||
|     assert v in str(observed_data.objects['0'].__class__) | ||||
| 
 | ||||
|     assert observed_data.objects['0'].extensions['ntfs-ext']._type in parsing.STIX2_OBJ_MAPS[v]['observable-extensions']['file'] | ||||
|     assert v in str(observed_data.objects['0'].extensions['ntfs-ext'].__class__) | ||||
|  |  | |||
|  | @ -1,9 +1,10 @@ | |||
| import pytest | ||||
| 
 | ||||
| import stix2 | ||||
| from stix2 import parsing | ||||
| import stix2.v20 | ||||
| 
 | ||||
| from ...exceptions import InvalidValueError | ||||
| from ...exceptions import DuplicateRegistrationError, InvalidValueError | ||||
| from .constants import FAKE_TIME, IDENTITY_ID, MARKING_DEFINITION_ID | ||||
| 
 | ||||
| IDENTITY_CUSTOM_PROP = stix2.v20.Identity( | ||||
|  | @ -449,7 +450,7 @@ def test_custom_observable_raises_exception(): | |||
| 
 | ||||
| def test_custom_observable_object_no_init_1(): | ||||
|     @stix2.v20.CustomObservable( | ||||
|         'x-new-observable', [ | ||||
|         'x-new-observable-1', [ | ||||
|             ('property1', stix2.properties.StringProperty()), | ||||
|         ], | ||||
|     ) | ||||
|  | @ -1011,3 +1012,123 @@ def test_custom_object_nested_dictionary(data): | |||
|     ) | ||||
| 
 | ||||
|     assert data == str(example) | ||||
| 
 | ||||
| 
 | ||||
| @stix2.v20.CustomObject( | ||||
|     'x-new-type-2', [ | ||||
|         ('property1', stix2.properties.StringProperty()), | ||||
|         ('property2', stix2.properties.IntegerProperty()), | ||||
|     ], | ||||
| ) | ||||
| class NewType2(object): | ||||
|     pass | ||||
| 
 | ||||
| 
 | ||||
| def test_register_custom_object_with_version(): | ||||
|     custom_obj_1 = { | ||||
|         "type": "x-new-type-2", | ||||
|         "id": "x-new-type-2--00000000-0000-4000-8000-000000000007", | ||||
|     } | ||||
| 
 | ||||
|     cust_obj_1 = parsing.dict_to_stix2(custom_obj_1, version='2.0') | ||||
|     v = 'v20' | ||||
| 
 | ||||
|     assert cust_obj_1.type in parsing.STIX2_OBJ_MAPS[v]['objects'] | ||||
|     # spec_version is not in STIX 2.0, and is required in 2.1, so this | ||||
|     # suffices as a test for a STIX 2.0 object. | ||||
|     assert "spec_version" not in cust_obj_1 | ||||
| 
 | ||||
| 
 | ||||
| def test_register_duplicate_object_with_version(): | ||||
|     with pytest.raises(DuplicateRegistrationError) as excinfo: | ||||
|         @stix2.v20.CustomObject( | ||||
|             'x-new-type-2', [ | ||||
|                 ('property1', stix2.properties.StringProperty()), | ||||
|                 ('property2', stix2.properties.IntegerProperty()), | ||||
|             ], | ||||
|         ) | ||||
|         class NewType2(object): | ||||
|             pass | ||||
|     assert "cannot be registered again" in str(excinfo.value) | ||||
| 
 | ||||
| 
 | ||||
| @stix2.v20.CustomObservable( | ||||
|     'x-new-observable-2', [ | ||||
|         ('property1', stix2.properties.StringProperty()), | ||||
|     ], | ||||
| ) | ||||
| class NewObservable2(object): | ||||
|     pass | ||||
| 
 | ||||
| 
 | ||||
| def test_register_observable_with_version(): | ||||
|     custom_obs = NewObservable2(property1="Test Observable") | ||||
|     v = 'v20' | ||||
| 
 | ||||
|     assert custom_obs.type in parsing.STIX2_OBJ_MAPS[v]['observables'] | ||||
| 
 | ||||
| 
 | ||||
| def test_register_duplicate_observable_with_version(): | ||||
|     with pytest.raises(DuplicateRegistrationError) as excinfo: | ||||
|         @stix2.v20.CustomObservable( | ||||
|             'x-new-observable-2', [ | ||||
|                 ('property1', stix2.properties.StringProperty()), | ||||
|             ], | ||||
|         ) | ||||
|         class NewObservable2(object): | ||||
|             pass | ||||
|     assert "cannot be registered again" in str(excinfo.value) | ||||
| 
 | ||||
| 
 | ||||
| def test_register_marking_with_version(): | ||||
|     @stix2.v20.CustomMarking( | ||||
|         'x-new-obj-2', [ | ||||
|             ('property1', stix2.properties.StringProperty(required=True)), | ||||
|         ], | ||||
|     ) | ||||
|     class NewObj2(): | ||||
|         pass | ||||
|     v = 'v20' | ||||
| 
 | ||||
|     no = NewObj2(property1='something') | ||||
|     assert no._type in parsing.STIX2_OBJ_MAPS[v]['markings'] | ||||
| 
 | ||||
| 
 | ||||
| def test_register_observable_extension_with_version(): | ||||
|     @stix2.v20.CustomExtension( | ||||
|         stix2.v20.UserAccount, 'some-extension-2', [ | ||||
|             ('keys', stix2.properties.StringProperty(required=True)), | ||||
|         ], | ||||
|     ) | ||||
|     class SomeCustomExtension2: | ||||
|         pass | ||||
| 
 | ||||
|     v = 'v20' | ||||
|     example = SomeCustomExtension2(keys='test123') | ||||
| 
 | ||||
|     assert example._type in parsing.STIX2_OBJ_MAPS[v]['observable-extensions']['user-account'] | ||||
| 
 | ||||
| 
 | ||||
| def test_register_duplicate_observable_extension(): | ||||
|     with pytest.raises(DuplicateRegistrationError) as excinfo: | ||||
|         @stix2.v20.CustomExtension( | ||||
|             stix2.v20.UserAccount, 'some-extension-2', [ | ||||
|                 ('property1', stix2.properties.StringProperty(required=True)), | ||||
|                 ('property2', stix2.properties.IntegerProperty()), | ||||
|             ], | ||||
|         ) | ||||
|         class NewExtension2(): | ||||
|             pass | ||||
|     assert "cannot be registered again" in str(excinfo.value) | ||||
| 
 | ||||
| 
 | ||||
| def test_register_duplicate_marking(): | ||||
|     with pytest.raises(DuplicateRegistrationError) as excinfo: | ||||
|         @stix2.v20.CustomMarking( | ||||
|             'x-new-obj-2', [ | ||||
|                 ('property1', stix2.properties.StringProperty(required=True)), | ||||
|             ], | ||||
|         ) | ||||
|         class NewObj2(): | ||||
|             pass | ||||
|     assert "cannot be registered again" in str(excinfo.value) | ||||
|  |  | |||
|  | @ -635,7 +635,7 @@ def test_filesystem_object_with_custom_property_in_bundle(fs_store): | |||
| 
 | ||||
| def test_filesystem_custom_object(fs_store): | ||||
|     @stix2.v20.CustomObject( | ||||
|         'x-new-obj', [ | ||||
|         'x-new-obj-2', [ | ||||
|             ('property1', stix2.properties.StringProperty(required=True)), | ||||
|         ], | ||||
|     ) | ||||
|  | @ -650,7 +650,7 @@ def test_filesystem_custom_object(fs_store): | |||
|     assert newobj_r["property1"] == 'something' | ||||
| 
 | ||||
|     # remove dir | ||||
|     shutil.rmtree(os.path.join(FS_PATH, "x-new-obj"), True) | ||||
|     shutil.rmtree(os.path.join(FS_PATH, "x-new-obj-2"), True) | ||||
| 
 | ||||
| 
 | ||||
| def test_relationships(rel_fs_store): | ||||
|  |  | |||
|  | @ -329,7 +329,7 @@ def test_memory_store_object_with_custom_property_in_bundle(mem_store): | |||
| 
 | ||||
| def test_memory_store_custom_object(mem_store): | ||||
|     @CustomObject( | ||||
|         'x-new-obj', [ | ||||
|         'x-new-obj-3', [ | ||||
|             ('property1', properties.StringProperty(required=True)), | ||||
|         ], | ||||
|     ) | ||||
|  |  | |||
|  | @ -392,7 +392,7 @@ def test_dictionary_property_invalid(d): | |||
| 
 | ||||
| def test_property_list_of_dictionary(): | ||||
|     @stix2.v20.CustomObject( | ||||
|         'x-new-obj', [ | ||||
|         'x-new-obj-4', [ | ||||
|             ('property1', ListProperty(DictionaryProperty(spec_version="2.0"), required=True)), | ||||
|         ], | ||||
|     ) | ||||
|  |  | |||
|  | @ -3,8 +3,6 @@ import pytest | |||
| import stix2 | ||||
| from stix2 import exceptions, parsing | ||||
| 
 | ||||
| from .constants import IDENTITY_ID, OBSERVED_DATA_ID | ||||
| 
 | ||||
| BUNDLE = { | ||||
|     "type": "bundle", | ||||
|     "id": "bundle--00000000-0000-4000-8000-000000000007", | ||||
|  | @ -73,15 +71,6 @@ def test_parse_observable_with_no_version(): | |||
|     assert v in str(obs_obj.__class__) | ||||
| 
 | ||||
| 
 | ||||
| def test_register_object_with_version(): | ||||
|     bundle = parsing.dict_to_stix2(BUNDLE, version='2.1') | ||||
|     parsing._register_object(bundle.objects[0].__class__) | ||||
|     v = 'v21' | ||||
| 
 | ||||
|     assert bundle.objects[0].type in parsing.STIX2_OBJ_MAPS[v]['objects'] | ||||
|     assert bundle.objects[0].spec_version == "2.1" | ||||
| 
 | ||||
| 
 | ||||
| def test_register_marking_with_version(): | ||||
|     parsing._register_marking(stix2.v21.TLP_WHITE.__class__, version='2.1') | ||||
|     v = 'v21' | ||||
|  | @ -98,82 +87,3 @@ def test_register_marking_with_no_version(): | |||
| 
 | ||||
|     assert stix2.v21.TLP_WHITE.definition._type in parsing.STIX2_OBJ_MAPS[v]['markings'] | ||||
|     assert v in str(stix2.v21.TLP_WHITE.__class__) | ||||
| 
 | ||||
| 
 | ||||
| def test_register_observable_with_default_version(): | ||||
|     observed_data = stix2.v21.ObservedData( | ||||
|         id=OBSERVED_DATA_ID, | ||||
|         created_by_ref=IDENTITY_ID, | ||||
|         created="2016-04-06T19:58:16.000Z", | ||||
|         modified="2016-04-06T19:58:16.000Z", | ||||
|         first_observed="2015-12-21T19:00:00Z", | ||||
|         last_observed="2015-12-21T19:00:00Z", | ||||
|         number_observed=50, | ||||
|         objects={ | ||||
|             "0": { | ||||
|                 "name": "foo.exe", | ||||
|                 "type": "file", | ||||
|                 "extensions": { | ||||
|                     "ntfs-ext": { | ||||
|                         "alternate_data_streams": [ | ||||
|                             { | ||||
|                                 "name": "second.stream", | ||||
|                                 "size": 25536, | ||||
|                             }, | ||||
|                         ], | ||||
|                     }, | ||||
|                 }, | ||||
|             }, | ||||
|             "1": { | ||||
|                 "type": "directory", | ||||
|                 "path": "/usr/home", | ||||
|                 "contains_refs": ["file--420bc087-8b53-5ae9-8210-20d27d5e96c8"], | ||||
|             }, | ||||
|         }, | ||||
|     ) | ||||
|     parsing._register_observable(observed_data.objects['0'].__class__) | ||||
|     v = 'v21' | ||||
| 
 | ||||
|     assert observed_data.objects['0'].type in parsing.STIX2_OBJ_MAPS[v]['observables'] | ||||
|     assert v in str(observed_data.objects['0'].__class__) | ||||
| 
 | ||||
| 
 | ||||
| def test_register_observable_extension_with_default_version(): | ||||
|     observed_data = stix2.v21.ObservedData( | ||||
|         id=OBSERVED_DATA_ID, | ||||
|         created_by_ref=IDENTITY_ID, | ||||
|         created="2016-04-06T19:58:16.000Z", | ||||
|         modified="2016-04-06T19:58:16.000Z", | ||||
|         first_observed="2015-12-21T19:00:00Z", | ||||
|         last_observed="2015-12-21T19:00:00Z", | ||||
|         number_observed=50, | ||||
|         objects={ | ||||
|             "0": { | ||||
|                 "name": "foo.exe", | ||||
|                 "type": "file", | ||||
|                 "extensions": { | ||||
|                     "ntfs-ext": { | ||||
|                         "alternate_data_streams": [ | ||||
|                             { | ||||
|                                 "name": "second.stream", | ||||
|                                 "size": 25536, | ||||
|                             }, | ||||
|                         ], | ||||
|                     }, | ||||
|                 }, | ||||
|             }, | ||||
|             "1": { | ||||
|                 "type": "directory", | ||||
|                 "path": "/usr/home", | ||||
|                 "contains_refs": ["file--420bc087-8b53-5ae9-8210-20d27d5e96c8"], | ||||
|             }, | ||||
|         }, | ||||
|     ) | ||||
|     parsing._register_observable_extension(observed_data.objects['0'], observed_data.objects['0'].extensions['ntfs-ext'].__class__) | ||||
|     v = 'v21' | ||||
| 
 | ||||
|     assert observed_data.objects['0'].type in parsing.STIX2_OBJ_MAPS[v]['observables'] | ||||
|     assert v in str(observed_data.objects['0'].__class__) | ||||
| 
 | ||||
|     assert observed_data.objects['0'].extensions['ntfs-ext']._type in parsing.STIX2_OBJ_MAPS[v]['observable-extensions']['file'] | ||||
|     assert v in str(observed_data.objects['0'].extensions['ntfs-ext'].__class__) | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ import stix2 | |||
| import stix2.base | ||||
| import stix2.v21 | ||||
| 
 | ||||
| from ...exceptions import InvalidValueError | ||||
| from ...exceptions import DuplicateRegistrationError, InvalidValueError | ||||
| from .constants import FAKE_TIME, IDENTITY_ID, MARKING_DEFINITION_ID | ||||
| 
 | ||||
| # Custom Properties in SDOs | ||||
|  | @ -574,7 +574,7 @@ def test_custom_observable_raises_exception(): | |||
| 
 | ||||
| def test_custom_observable_object_no_init_1(): | ||||
|     @stix2.v21.CustomObservable( | ||||
|         'x-new-observable', [ | ||||
|         'x-new-observable-2', [ | ||||
|             ('property1', stix2.properties.StringProperty()), | ||||
|         ], | ||||
|     ) | ||||
|  | @ -1231,3 +1231,110 @@ def test_custom_object_nested_dictionary(data): | |||
|     ) | ||||
| 
 | ||||
|     assert data == str(example) | ||||
| 
 | ||||
| 
 | ||||
| @stix2.v21.CustomObject( | ||||
|     'x-new-type-2', [ | ||||
|         ('property1', stix2.properties.StringProperty()), | ||||
|         ('property2', stix2.properties.IntegerProperty()), | ||||
|     ], | ||||
| ) | ||||
| class NewType3(object): | ||||
|     pass | ||||
| 
 | ||||
| 
 | ||||
| def test_register_custom_object_with_version(): | ||||
|     custom_obj_1 = { | ||||
|         "type": "x-new-type-2", | ||||
|         "id": "x-new-type-2--00000000-0000-4000-8000-000000000007", | ||||
|         "spec_version": "2.1", | ||||
|     } | ||||
| 
 | ||||
|     cust_obj_1 = stix2.parsing.dict_to_stix2(custom_obj_1, version='2.1') | ||||
|     v = 'v21' | ||||
| 
 | ||||
|     assert cust_obj_1.type in stix2.parsing.STIX2_OBJ_MAPS[v]['objects'] | ||||
|     assert cust_obj_1.spec_version == "2.1" | ||||
| 
 | ||||
| 
 | ||||
| def test_register_duplicate_object_with_version(): | ||||
|     with pytest.raises(DuplicateRegistrationError) as excinfo: | ||||
|         @stix2.v21.CustomObject( | ||||
|             'x-new-type-2', [ | ||||
|                 ('property1', stix2.properties.StringProperty()), | ||||
|                 ('property2', stix2.properties.IntegerProperty()), | ||||
|             ], | ||||
|         ) | ||||
|         class NewType2(object): | ||||
|             pass | ||||
|     assert "cannot be registered again" in str(excinfo.value) | ||||
| 
 | ||||
| 
 | ||||
| @stix2.v21.CustomObservable( | ||||
|     'x-new-observable-3', [ | ||||
|         ('property1', stix2.properties.StringProperty()), | ||||
|     ], | ||||
| ) | ||||
| class NewObservable3(object): | ||||
|     pass | ||||
| 
 | ||||
| 
 | ||||
| def test_register_observable(): | ||||
|     custom_obs = NewObservable3(property1="Test Observable") | ||||
|     v = 'v21' | ||||
| 
 | ||||
|     assert custom_obs.type in stix2.parsing.STIX2_OBJ_MAPS[v]['observables'] | ||||
| 
 | ||||
| 
 | ||||
| def test_register_duplicate_observable(): | ||||
|     with pytest.raises(DuplicateRegistrationError) as excinfo: | ||||
|         @stix2.v21.CustomObservable( | ||||
|             'x-new-observable-2', [ | ||||
|                 ('property1', stix2.properties.StringProperty()), | ||||
|             ], | ||||
|         ) | ||||
|         class NewObservable2(object): | ||||
|             pass | ||||
|     assert "cannot be registered again" in str(excinfo.value) | ||||
| 
 | ||||
| 
 | ||||
| def test_register_observable_custom_extension(): | ||||
|     @stix2.v21.CustomExtension( | ||||
|         stix2.v21.DomainName, 'x-new-2-ext', [ | ||||
|             ('property1', stix2.properties.StringProperty(required=True)), | ||||
|             ('property2', stix2.properties.IntegerProperty()), | ||||
|         ], | ||||
|     ) | ||||
|     class NewExtension2(): | ||||
|         pass | ||||
| 
 | ||||
|     example = NewExtension2(property1="Hi there") | ||||
|     v = 'v21' | ||||
| 
 | ||||
|     assert 'domain-name' in stix2.parsing.STIX2_OBJ_MAPS[v]['observables'] | ||||
|     assert example._type in stix2.parsing.STIX2_OBJ_MAPS[v]['observable-extensions']['domain-name'] | ||||
| 
 | ||||
| 
 | ||||
| def test_register_duplicate_observable_extension(): | ||||
|     with pytest.raises(DuplicateRegistrationError) as excinfo: | ||||
|         @stix2.v21.CustomExtension( | ||||
|             stix2.v21.DomainName, 'x-new-2-ext', [ | ||||
|                 ('property1', stix2.properties.StringProperty(required=True)), | ||||
|                 ('property2', stix2.properties.IntegerProperty()), | ||||
|             ], | ||||
|         ) | ||||
|         class NewExtension2(): | ||||
|             pass | ||||
|     assert "cannot be registered again" in str(excinfo.value) | ||||
| 
 | ||||
| 
 | ||||
| def test_register_duplicate_marking(): | ||||
|     with pytest.raises(DuplicateRegistrationError) as excinfo: | ||||
|         @stix2.v21.CustomMarking( | ||||
|             'x-new-obj', [ | ||||
|                 ('property1', stix2.properties.StringProperty(required=True)), | ||||
|             ], | ||||
|         ) | ||||
|         class NewObj2(): | ||||
|             pass | ||||
|     assert "cannot be registered again" in str(excinfo.value) | ||||
|  |  | |||
|  | @ -656,7 +656,7 @@ def test_filesystem_object_with_custom_property_in_bundle(fs_store): | |||
| 
 | ||||
| def test_filesystem_custom_object(fs_store): | ||||
|     @stix2.v21.CustomObject( | ||||
|         'x-new-obj', [ | ||||
|         'x-new-obj-2', [ | ||||
|             ('property1', stix2.properties.StringProperty(required=True)), | ||||
|         ], | ||||
|     ) | ||||
|  | @ -671,7 +671,7 @@ def test_filesystem_custom_object(fs_store): | |||
|     assert newobj_r["property1"] == 'something' | ||||
| 
 | ||||
|     # remove dir | ||||
|     shutil.rmtree(os.path.join(FS_PATH, "x-new-obj"), True) | ||||
|     shutil.rmtree(os.path.join(FS_PATH, "x-new-obj-2"), True) | ||||
| 
 | ||||
| 
 | ||||
| def test_relationships(rel_fs_store): | ||||
|  |  | |||
|  | @ -344,7 +344,7 @@ def test_memory_store_object_with_custom_property_in_bundle(mem_store): | |||
| 
 | ||||
| def test_memory_store_custom_object(mem_store): | ||||
|     @CustomObject( | ||||
|         'x-new-obj', [ | ||||
|         'x-new-obj-3', [ | ||||
|             ('property1', properties.StringProperty(required=True)), | ||||
|         ], | ||||
|     ) | ||||
|  |  | |||
|  | @ -404,7 +404,7 @@ def test_dictionary_property_invalid(d): | |||
| 
 | ||||
| def test_property_list_of_dictionary(): | ||||
|     @stix2.v21.CustomObject( | ||||
|         'x-new-obj', [ | ||||
|         'x-new-obj-4', [ | ||||
|             ('property1', ListProperty(DictionaryProperty(spec_version='2.1'), required=True)), | ||||
|         ], | ||||
|     ) | ||||
|  |  | |||
|  | @ -9,9 +9,8 @@ from .base import _STIXBase21 | |||
| 
 | ||||
| 
 | ||||
| class Bundle(_STIXBase21): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_nuwp4rox8c7r>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'bundle' | ||||
|  |  | |||
|  | @ -16,9 +16,8 @@ from .base import _STIXBase21 | |||
| 
 | ||||
| 
 | ||||
| class ExternalReference(_STIXBase21): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_bajcvqteiard>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _properties = OrderedDict([ | ||||
|  | @ -51,9 +50,8 @@ class ExternalReference(_STIXBase21): | |||
| 
 | ||||
| 
 | ||||
| class KillChainPhase(_STIXBase21): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_i4tjv75ce50h>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _properties = OrderedDict([ | ||||
|  | @ -63,9 +61,8 @@ class KillChainPhase(_STIXBase21): | |||
| 
 | ||||
| 
 | ||||
| class GranularMarking(_STIXBase21): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_robezi5egfdr>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _properties = OrderedDict([ | ||||
|  | @ -80,9 +77,8 @@ class GranularMarking(_STIXBase21): | |||
| 
 | ||||
| 
 | ||||
| class LanguageContent(_STIXBase21): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_nfwr8z9ax2bi>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'language-content' | ||||
|  | @ -108,9 +104,8 @@ class LanguageContent(_STIXBase21): | |||
| 
 | ||||
| 
 | ||||
| class TLPMarking(_STIXBase21): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_yd3ar14ekwrs>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'tlp' | ||||
|  | @ -120,9 +115,8 @@ class TLPMarking(_STIXBase21): | |||
| 
 | ||||
| 
 | ||||
| class StatementMarking(_STIXBase21): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_3ru8r05saera>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'statement' | ||||
|  | @ -151,9 +145,8 @@ class MarkingProperty(Property): | |||
| 
 | ||||
| 
 | ||||
| class MarkingDefinition(_STIXBase21, _MarkingsMixin): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_hr5vgqxjk7ns>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'marking-definition' | ||||
|  |  | |||
|  | @ -22,9 +22,8 @@ from .common import GranularMarking | |||
| 
 | ||||
| 
 | ||||
| class Artifact(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_rqwyxo6gp7cv>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'artifact' | ||||
|  | @ -52,9 +51,8 @@ class Artifact(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class AutonomousSystem(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_bxebwa6l91fb>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'autonomous-system' | ||||
|  | @ -74,9 +72,8 @@ class AutonomousSystem(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class Directory(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_vhpkn06q7fvl>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'directory' | ||||
|  | @ -100,9 +97,8 @@ class Directory(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class DomainName(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_i2zf5h7vnrd9>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'domain-name' | ||||
|  | @ -121,9 +117,8 @@ class DomainName(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class EmailAddress(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_am7srelb9c14>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'email-addr' | ||||
|  | @ -143,9 +138,8 @@ class EmailAddress(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class EmailMIMEComponent(_STIXBase21): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_kzv52qqc0xw1>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _properties = OrderedDict([ | ||||
|  | @ -161,9 +155,8 @@ class EmailMIMEComponent(_STIXBase21): | |||
| 
 | ||||
| 
 | ||||
| class EmailMessage(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_loz634bn09om>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'email-message' | ||||
|  | @ -202,9 +195,8 @@ class EmailMessage(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class ArchiveExt(_Extension): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_mm25z9wuw4tr>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'archive-ext' | ||||
|  | @ -215,9 +207,8 @@ class ArchiveExt(_Extension): | |||
| 
 | ||||
| 
 | ||||
| class AlternateDataStream(_STIXBase21): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_nbqgazg6fsma>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _properties = OrderedDict([ | ||||
|  | @ -228,9 +219,8 @@ class AlternateDataStream(_STIXBase21): | |||
| 
 | ||||
| 
 | ||||
| class NTFSExt(_Extension): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_tb77nk1g3y6f>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'ntfs-ext' | ||||
|  | @ -241,9 +231,8 @@ class NTFSExt(_Extension): | |||
| 
 | ||||
| 
 | ||||
| class PDFExt(_Extension): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_30hzxqrmkg8w>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'pdf-ext' | ||||
|  | @ -257,9 +246,8 @@ class PDFExt(_Extension): | |||
| 
 | ||||
| 
 | ||||
| class RasterImageExt(_Extension): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_20mnz0u5ppxr>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'raster-image-ext' | ||||
|  | @ -272,9 +260,8 @@ class RasterImageExt(_Extension): | |||
| 
 | ||||
| 
 | ||||
| class WindowsPEOptionalHeaderType(_STIXBase21): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_wyp5qdc2wugy>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _properties = OrderedDict([ | ||||
|  | @ -317,9 +304,8 @@ class WindowsPEOptionalHeaderType(_STIXBase21): | |||
| 
 | ||||
| 
 | ||||
| class WindowsPESection(_STIXBase21): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_wiqw87xsov3t>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _properties = OrderedDict([ | ||||
|  | @ -331,9 +317,8 @@ class WindowsPESection(_STIXBase21): | |||
| 
 | ||||
| 
 | ||||
| class WindowsPEBinaryExt(_Extension): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_5f9bgdmj91h5>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'windows-pebinary-ext' | ||||
|  | @ -354,9 +339,8 @@ class WindowsPEBinaryExt(_Extension): | |||
| 
 | ||||
| 
 | ||||
| class File(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_vq03pryd7u32>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'file' | ||||
|  | @ -390,9 +374,8 @@ class File(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class IPv4Address(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_ta83c412bfsc>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'ipv4-addr' | ||||
|  | @ -412,9 +395,8 @@ class IPv4Address(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class IPv6Address(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_f76hsv2pvwwq>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'ipv6-addr' | ||||
|  | @ -434,9 +416,8 @@ class IPv6Address(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class MACAddress(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_6lhrrdef8852>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'mac-addr' | ||||
|  | @ -454,9 +435,8 @@ class MACAddress(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class Mutex(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_u65ia5eoc7cv>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'mutex' | ||||
|  | @ -474,9 +454,8 @@ class Mutex(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class HTTPRequestExt(_Extension): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_60k6dn28qicj>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'http-request-ext' | ||||
|  | @ -493,7 +472,7 @@ class HTTPRequestExt(_Extension): | |||
| class ICMPExt(_Extension): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_3g6wds21zwzl>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'icmp-ext' | ||||
|  | @ -504,9 +483,8 @@ class ICMPExt(_Extension): | |||
| 
 | ||||
| 
 | ||||
| class SocketExt(_Extension): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_f54f1hripxsg>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'socket-ext' | ||||
|  | @ -566,9 +544,8 @@ class SocketExt(_Extension): | |||
| 
 | ||||
| 
 | ||||
| class TCPExt(_Extension): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_2z78x4m8ewcw>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'tcp-ext' | ||||
|  | @ -579,9 +556,8 @@ class TCPExt(_Extension): | |||
| 
 | ||||
| 
 | ||||
| class NetworkTraffic(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_e5nyr5squmsd>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'network-traffic' | ||||
|  | @ -635,9 +611,8 @@ class NetworkTraffic(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class WindowsProcessExt(_Extension): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_4wfs4ve800kf>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'windows-process-ext' | ||||
|  | @ -660,9 +635,8 @@ class WindowsProcessExt(_Extension): | |||
| 
 | ||||
| 
 | ||||
| class WindowsServiceExt(_Extension): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_s2rmoe7djlt>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'windows-service-ext' | ||||
|  | @ -704,9 +678,8 @@ class WindowsServiceExt(_Extension): | |||
| 
 | ||||
| 
 | ||||
| class Process(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_ur7snm473t1d>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'process' | ||||
|  | @ -749,9 +722,8 @@ class Process(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class Software(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_jru33yeokrmh>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'software' | ||||
|  | @ -770,13 +742,12 @@ class Software(_Observable): | |||
|         ('granular_markings', ListProperty(GranularMarking)), | ||||
|         ('defanged', BooleanProperty(default=lambda: False)), | ||||
|     ]) | ||||
|     _id_contributing_properties = ["name", "cpe", "vendor", "version"] | ||||
|     _id_contributing_properties = ["name", "cpe", "swid", "vendor", "version"] | ||||
| 
 | ||||
| 
 | ||||
| class URL(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_6bsklda6vc0c>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'url' | ||||
|  | @ -794,9 +765,8 @@ class URL(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class UNIXAccountExt(_Extension): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_z25gmwyz67kl>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'unix-account-ext' | ||||
|  | @ -809,9 +779,8 @@ class UNIXAccountExt(_Extension): | |||
| 
 | ||||
| 
 | ||||
| class UserAccount(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_hah33g4ntxnx>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'user-account' | ||||
|  | @ -842,9 +811,8 @@ class UserAccount(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class WindowsRegistryValueType(_STIXBase21): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_6jiqabgqp2hp>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'windows-registry-value-type' | ||||
|  | @ -872,9 +840,8 @@ class WindowsRegistryValueType(_STIXBase21): | |||
| 
 | ||||
| 
 | ||||
| class WindowsRegistryKey(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_bdim4of4dl37>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'windows-registry-key' | ||||
|  | @ -897,9 +864,8 @@ class WindowsRegistryKey(_Observable): | |||
| 
 | ||||
| 
 | ||||
| class X509V3ExtenstionsType(_STIXBase21): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_c1kt4dheb6vz>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'x509-v3-extensions-type' | ||||
|  | @ -924,9 +890,8 @@ class X509V3ExtenstionsType(_STIXBase21): | |||
| 
 | ||||
| 
 | ||||
| class X509Certificate(_Observable): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_g3kniyun8ykv>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'x509-certificate' | ||||
|  |  | |||
|  | @ -22,9 +22,8 @@ from .common import ExternalReference, GranularMarking, KillChainPhase | |||
| 
 | ||||
| 
 | ||||
| class AttackPattern(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_4ohsa4pay4h4>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'attack-pattern' | ||||
|  | @ -50,9 +49,8 @@ class AttackPattern(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class Campaign(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_vvysvm8mt434>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'campaign' | ||||
|  | @ -90,9 +88,8 @@ class Campaign(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class CourseOfAction(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_d5yf99f0a230>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'course-of-action' | ||||
|  | @ -116,9 +113,8 @@ class CourseOfAction(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class Grouping(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_9e3uldaqqha2>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'grouping' | ||||
|  | @ -144,9 +140,8 @@ class Grouping(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class Identity(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_ru8fmldl2p6w>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'identity' | ||||
|  | @ -174,9 +169,8 @@ class Identity(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class Indicator(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_wfiae74706sw>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'indicator' | ||||
|  | @ -234,9 +228,8 @@ class Indicator(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class Infrastructure(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_l2alfbbcmfep>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'infrastructure' | ||||
|  | @ -275,9 +268,8 @@ class Infrastructure(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class IntrusionSet(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_ticprjb32bc4>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'intrusion-set' | ||||
|  | @ -318,9 +310,8 @@ class IntrusionSet(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class Location(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_sqez6sri9vtz>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'location' | ||||
|  | @ -426,9 +417,8 @@ class Location(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class Malware(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_gc4ooz6oaz7y>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'malware' | ||||
|  | @ -479,9 +469,8 @@ class Malware(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class MalwareAnalysis(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_dw67pa20zss5>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'malware-analysis' | ||||
|  | @ -524,9 +513,8 @@ class MalwareAnalysis(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class Note(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_hr77jvcbs9jk>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'note' | ||||
|  | @ -552,9 +540,8 @@ class Note(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class ObservedData(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_h1590esrzg5f>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'observed-data' | ||||
|  | @ -608,9 +595,8 @@ class ObservedData(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class Opinion(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_sr2hswmu5t1>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'opinion' | ||||
|  | @ -646,9 +632,8 @@ class Opinion(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class Report(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_ha4fpad0r9pf>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'report' | ||||
|  | @ -675,9 +660,8 @@ class Report(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class ThreatActor(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_2wowmlcbkqst>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'threat-actor' | ||||
|  | @ -722,9 +706,8 @@ class ThreatActor(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class Tool(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_m21z3a1f3lou>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'tool' | ||||
|  | @ -752,9 +735,8 @@ class Tool(_DomainObject): | |||
| 
 | ||||
| 
 | ||||
| class Vulnerability(_DomainObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_d9f0iay06wtx>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'vulnerability' | ||||
|  |  | |||
|  | @ -12,9 +12,8 @@ from .common import ExternalReference, GranularMarking | |||
| 
 | ||||
| 
 | ||||
| class Relationship(_RelationshipObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_al0fb8fcd9e7>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _invalid_source_target_types = ['bundle', 'language-content', 'marking-definition', 'relationship', 'sighting'] | ||||
|  | @ -69,9 +68,8 @@ class Relationship(_RelationshipObject): | |||
| 
 | ||||
| 
 | ||||
| class Sighting(_RelationshipObject): | ||||
|     # TODO: Add link | ||||
|     """For more detailed information on this object's properties, see | ||||
|     `the STIX 2.1 specification <link here>`__. | ||||
|     `the STIX 2.1 specification <https://docs.oasis-open.org/cti/stix/v2.1/cs01/stix-v2.1-cs01.html#_7p0n81ikux8f>`__. | ||||
|     """ | ||||
| 
 | ||||
|     _type = 'sighting' | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Chris Lenk
						Chris Lenk