Add created_by_ref common property

stix2.1
clenk 2017-02-15 17:10:30 -05:00
parent 87330fcf74
commit e2f60bc8c5
3 changed files with 20 additions and 2 deletions

View File

@ -61,12 +61,13 @@ class _STIXBase(collections.Mapping):
kwargs[prop_name] = prop_metadata['fixed'] kwargs[prop_name] = prop_metadata['fixed']
if prop_metadata.get('validate'): if prop_metadata.get('validate'):
if not prop_metadata['validate'](cls, kwargs[prop_name]): if (prop_name in kwargs and
not prop_metadata['validate'](cls, kwargs[prop_name])):
msg = prop_metadata.get('error_msg', DEFAULT_ERROR).format( msg = prop_metadata.get('error_msg', DEFAULT_ERROR).format(
type=class_name, type=class_name,
field=prop_name, field=prop_name,
expected=prop_metadata.get('expected', expected=prop_metadata.get('expected',
prop_metadata['default'])(cls), prop_metadata.get('default', lambda x: ''))(cls),
) )
raise ValueError(msg) raise ValueError(msg)
elif prop_metadata.get('fixed'): elif prop_metadata.get('fixed'):

View File

@ -1,5 +1,6 @@
"""STIX 2 Common Data Types and Properties""" """STIX 2 Common Data Types and Properties"""
import re
from .base import _STIXBase from .base import _STIXBase
from .utils import NOW from .utils import NOW
@ -15,6 +16,14 @@ ID_PROPERTY = {
'error_msg': "{type} {field} values must begin with '{expected}'." 'error_msg': "{type} {field} values must begin with '{expected}'."
} }
ref_regex = ("^[a-z][a-z-]+[a-z]--[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}"
"-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")
REF_PROPERTY = {
'validate': (lambda x, val: re.match(ref_regex, val)),
'error_msg': "{type} {field} values must consist of a valid STIX type name and a valid UUID, separated by '--'."
}
COMMON_PROPERTIES = { COMMON_PROPERTIES = {
'type': TYPE_PROPERTY, 'type': TYPE_PROPERTY,
'id': ID_PROPERTY, 'id': ID_PROPERTY,
@ -24,6 +33,7 @@ COMMON_PROPERTIES = {
'modified': { 'modified': {
'default': NOW, 'default': NOW,
}, },
'created_by_ref': REF_PROPERTY
} }

View File

@ -54,6 +54,7 @@ def test_my_uuid4_fixture(uuid4):
INDICATOR_ID = "indicator--01234567-89ab-cdef-0123-456789abcdef" INDICATOR_ID = "indicator--01234567-89ab-cdef-0123-456789abcdef"
MALWARE_ID = "malware--fedcba98-7654-3210-fedc-ba9876543210" MALWARE_ID = "malware--fedcba98-7654-3210-fedc-ba9876543210"
RELATIONSHIP_ID = "relationship--00000000-1111-2222-3333-444444444444" RELATIONSHIP_ID = "relationship--00000000-1111-2222-3333-444444444444"
IDENTITY_ID = "identity--d4d765ce-cff7-40e8-b7a6-e205d005ac2c"
# Minimum required args for an Indicator instance # Minimum required args for an Indicator instance
INDICATOR_KWARGS = dict( INDICATOR_KWARGS = dict(
@ -175,6 +176,12 @@ def test_indicator_required_field_pattern():
assert str(excinfo.value) == "Missing required field(s) for Indicator: (pattern)." assert str(excinfo.value) == "Missing required field(s) for Indicator: (pattern)."
def test_indicator_created_ref_invalid_format():
with pytest.raises(ValueError) as excinfo:
indicator = stix2.Indicator(created_by_ref='myprefix--12345678', **INDICATOR_KWARGS)
assert str(excinfo.value) == "Indicator created_by_ref values must consist of a valid STIX type name and a valid UUID, separated by '--'."
def test_cannot_assign_to_indicator_attributes(indicator): def test_cannot_assign_to_indicator_attributes(indicator):
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
indicator.valid_from = dt.datetime.now() indicator.valid_from = dt.datetime.now()