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']
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(
type=class_name,
field=prop_name,
expected=prop_metadata.get('expected',
prop_metadata['default'])(cls),
prop_metadata.get('default', lambda x: ''))(cls),
)
raise ValueError(msg)
elif prop_metadata.get('fixed'):

View File

@ -1,5 +1,6 @@
"""STIX 2 Common Data Types and Properties"""
import re
from .base import _STIXBase
from .utils import NOW
@ -15,6 +16,14 @@ ID_PROPERTY = {
'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 = {
'type': TYPE_PROPERTY,
'id': ID_PROPERTY,
@ -24,6 +33,7 @@ COMMON_PROPERTIES = {
'modified': {
'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"
MALWARE_ID = "malware--fedcba98-7654-3210-fedc-ba9876543210"
RELATIONSHIP_ID = "relationship--00000000-1111-2222-3333-444444444444"
IDENTITY_ID = "identity--d4d765ce-cff7-40e8-b7a6-e205d005ac2c"
# Minimum required args for an Indicator instance
INDICATOR_KWARGS = dict(
@ -175,6 +176,12 @@ def test_indicator_required_field_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):
with pytest.raises(ValueError) as excinfo:
indicator.valid_from = dt.datetime.now()