Skip to content

Commit 3017ae1

Browse files
author
Bryan Worrell
committed
Added support to TypedFields to stix.common.kill_chains code. Other typedfield cleanup.
1 parent 5d712f7 commit 3017ae1

4 files changed

Lines changed: 24 additions & 178 deletions

File tree

stix/base.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ def insert(self, idx, value):
460460
self._inner.insert(idx, value)
461461

462462

463-
def _validate_version(cls, instance, value):
463+
def _validate_version(instance, value):
464464
if value:
465465
utils.check_version(instance._ALL_VERSIONS, value)
466466

@@ -482,15 +482,13 @@ class BaseCoreComponent(Cached, Entity):
482482
def __init__(self, id_=None, idref=None, timestamp=None, title=None,
483483
description=None, short_description=None):
484484

485-
from stix.common.structured_text import StructuredTextList
486-
487485
super(BaseCoreComponent, self).__init__()
488486

489487
self.id_ = id_ or idgen.create_id(self._ID_PREFIX)
490488
self.idref = idref
491489
self.title = title
492-
self.descriptions = StructuredTextList(description)
493-
self.short_descriptions = StructuredTextList(short_description)
490+
self.descriptions = fields.TypedField(description)
491+
self.short_descriptions = fields.TypedField(short_description)
494492

495493
if timestamp:
496494
self.timestamp = timestamp

stix/common/kill_chains/__init__.py

Lines changed: 9 additions & 158 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Copyright (c) 2015, The MITRE Corporation. All rights reserved.
22
# See LICENSE.txt for complete terms.
33

4+
from mixbox import fields
5+
46
# internal
57
import stix
68
import stix.bindings.stix_common as common_binding
@@ -11,19 +13,16 @@ class KillChain(stix.Entity):
1113
_namespace = 'http://stix.mitre.org/common-1'
1214
_binding_class = _binding.KillChainType
1315

14-
id_ = AttributeField("id_")
16+
id_ = AttributeField("id")
1517
name = AttributeField("name")
1618
definer = AttributeField("definer")
1719
reference = AttributeField("reference")
1820
number_of_phases = AttributeField("number_of_phases")
19-
kill_chain_phases = ElementField("Kill_Chain_Phase", multiple=True, key_name="kill_chain_phases")
20-
21-
@classmethod
22-
def initClassField(cls):
23-
cls.kill_chain_phases.type_ = KillChainPhase
21+
kill_chain_phases = ElementField("Kill_Chain_Phase", type_="stix.common.kill_chains.KillChainPhase", multiple=True, key_name="kill_chain_phases")
2422

2523
def __init__(self, id_=None, name=None, definer=None, reference=None):
26-
self._fields = {}
24+
super(KillChain, self).__init__()
25+
2726
self.id_ = id_
2827
self.name = name
2928
self.definer = definer
@@ -33,23 +32,6 @@ def __init__(self, id_=None, name=None, definer=None, reference=None):
3332
def add_kill_chain_phase(self, value):
3433
self.kill_chain_phases.append(value)
3534

36-
"""
37-
def to_obj(self, return_obj=None, ns_info=None):
38-
super(KillChain, self).to_obj(return_obj=return_obj, ns_info=ns_info)
39-
40-
if not return_obj:
41-
return_obj = self._binding_class()
42-
43-
return_obj.id = self.id_
44-
return_obj.name = self.name
45-
return_obj.definer = self.definer
46-
return_obj.reference = self.reference
47-
return_obj.number_of_phases = self.number_of_phases
48-
return_obj.Kill_Chain_Phase = self.kill_chain_phases.to_obj(ns_info=ns_info)
49-
50-
return return_obj
51-
"""
52-
5335
def __eq__(self, other):
5436
if self is other:
5537
return True
@@ -62,41 +44,6 @@ def __eq__(self, other):
6244
def __ne__(self, other):
6345
return not self.__eq__(other)
6446

65-
"""
66-
@classmethod
67-
def from_obj(cls, obj, return_obj=None):
68-
if not obj:
69-
return None
70-
if not return_obj:
71-
return_obj = cls()
72-
73-
return_obj.id_ = obj.id
74-
return_obj.name = obj.name
75-
return_obj.definer = obj.definer
76-
return_obj.reference = obj.reference
77-
return_obj.number_of_phases = obj.number_of_phases
78-
return_obj.kill_chain_phases = _KillChainPhases.from_obj(obj.Kill_Chain_Phase)
79-
80-
return return_obj
81-
82-
@classmethod
83-
def from_dict(cls, d, return_obj=None):
84-
if not d:
85-
return None
86-
if not return_obj:
87-
return_obj = cls()
88-
89-
get = d.get
90-
return_obj.id_ = get('id')
91-
return_obj.name = get('name')
92-
return_obj.definer = get('definer')
93-
return_obj.reference = get('reference')
94-
return_obj.number_of_phases = get('number_of_phases')
95-
return_obj.kill_chain_phases = \
96-
_KillChainPhases.from_dict(get('kill_chain_phases'))
97-
98-
return return_obj
99-
"""
10047

10148
class KillChains(stix.EntityList):
10249
_binding = common_binding
@@ -114,41 +61,15 @@ class KillChainPhase(stix.Entity):
11461

11562
phase_id = AttributeField("phase_id")
11663
name = AttributeField("name")
117-
ordinality = AttributeField("ordinality")
64+
ordinality = fields.IntegerField("ordinality")
11865

11966
def __init__(self, phase_id=None, name=None, ordinality=None):
120-
self._fields = {}
67+
super(KillChainPhase, self).__init__()
68+
12169
self.phase_id = phase_id
12270
self.name = name
12371
self.ordinality = ordinality
12472

125-
126-
"""
127-
@property
128-
def ordinality(self):
129-
return self._ordinality
130-
131-
@ordinality.setter
132-
def ordinality(self, value):
133-
if value is not None:
134-
self._ordinality = int(value)
135-
else:
136-
self._ordinality = None
137-
"""
138-
"""
139-
def to_obj(self, return_obj=None, ns_info=None):
140-
if not return_obj:
141-
return_obj = self._binding_class()
142-
143-
super(KillChainPhase, self).to_obj(return_obj=return_obj, ns_info=ns_info)
144-
145-
return_obj.phase_id = self.phase_id
146-
return_obj.name = self.name
147-
return_obj.ordinality = self.ordinality
148-
149-
return return_obj
150-
"""
151-
15273
def __eq__(self, other):
15374
if other is self:
15475
return True
@@ -164,37 +85,6 @@ def __ne__(self, other):
16485
def __hash__(self):
16586
return hash(tuple(sorted(self.to_dict().items())))
16687

167-
"""
168-
@classmethod
169-
def from_obj(cls, obj, return_obj=None):
170-
if not obj:
171-
return None
172-
173-
if not return_obj:
174-
return_obj = cls()
175-
176-
return_obj.phase_id = obj.phase_id
177-
return_obj.name = obj.name
178-
return_obj.ordinality = obj.ordinality
179-
180-
return return_obj
181-
182-
@classmethod
183-
def from_dict(cls, d, return_obj=None):
184-
if not d:
185-
return None
186-
if not return_obj:
187-
return_obj = cls()
188-
189-
return_obj.phase_id = d.get('phase_id')
190-
return_obj.name = d.get('name')
191-
return_obj.ordinality = d.get('ordinality')
192-
193-
return return_obj
194-
195-
def to_dict(self):
196-
return super(KillChainPhase, self).to_dict()
197-
"""
19888

19989
class KillChainPhaseReference(KillChainPhase):
20090
_binding = common_binding
@@ -205,49 +95,10 @@ class KillChainPhaseReference(KillChainPhase):
20595
kill_chain_name = AttributeField("kill_chain_name")
20696

20797
def __init__(self, phase_id=None, name=None, ordinality=None, kill_chain_id=None, kill_chain_name=None):
208-
self._fields = {}
20998
super(KillChainPhaseReference, self).__init__(phase_id, name, ordinality)
21099
self.kill_chain_id = kill_chain_id
211100
self.kill_chain_name = kill_chain_name
212101

213-
"""
214-
def to_obj(self, return_obj=None, ns_info=None):
215-
if not return_obj:
216-
return_obj = self._binding_class()
217-
218-
super(KillChainPhaseReference, self).to_obj(return_obj=return_obj, ns_info=ns_info)
219-
return_obj.kill_chain_id = self.kill_chain_id
220-
return_obj.kill_chain_name = self.kill_chain_name
221-
return return_obj
222-
223-
@classmethod
224-
def from_obj(cls, obj, return_obj=None):
225-
if not obj:
226-
return None
227-
if not return_obj:
228-
return_obj = cls()
229-
230-
super(KillChainPhaseReference, cls).from_obj(obj, return_obj=return_obj)
231-
232-
return_obj.kill_chain_id = obj.kill_chain_id
233-
return_obj.kill_chain_name = obj.kill_chain_name
234-
return return_obj
235-
236-
def to_dict(self):
237-
return super(KillChainPhaseReference, self).to_dict()
238-
239-
@classmethod
240-
def from_dict(cls, d, return_obj=None):
241-
if not d:
242-
return None
243-
if not return_obj:
244-
return_obj = cls()
245-
246-
super(KillChainPhaseReference, cls).from_dict(d, return_obj=return_obj)
247-
return_obj.kill_chain_id = d.get('kill_chain_id')
248-
return_obj.kill_chain_name = d.get('kill_chain_name')
249-
return return_obj
250-
"""
251102

252103
class KillChainPhasesReference(stix.EntityList):
253104
_binding = common_binding

stix/data_marking.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# See LICENSE.txt for complete terms.
33

44
# external
5+
from mixbox import fields
56
from mixbox.cache import Cached
67

78
# internal

stix/indicator/sightings.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
# Copyright (c) 2015, The MITRE Corporation. All rights reserved.
22
# See LICENSE.txt for complete terms.
33

4+
from mixbox import fields
5+
46
import stix
57
import stix.utils as utils
6-
from stix.common import (
7-
GenericRelationshipList, RelatedObservable, StructuredTextList, Confidence,
8-
InformationSource
9-
)
8+
from stix.common import (GenericRelationshipList, RelatedObservable,
9+
StructuredTextList, Confidence, InformationSource)
10+
from stix.common.datetimewithprecision import validate_precision
11+
1012
import stix.bindings.indicator as indicator_binding
1113
from stix.base import AttributeField, ElementField
1214
from stix.common.structured_text import StructuredTextListField
@@ -17,29 +19,24 @@ class Sighting(stix.Entity):
1719
_binding = indicator_binding
1820
_binding_class = _binding.SightingType
1921

20-
timestamp = AttributeField("timestamp")
21-
timestamp_precision = AttributeField("timestamp_precision")
22+
timestamp = fields.DateTimeField("timestamp")
23+
timestamp_precision = fields.TypedField("timestamp_precision", preset_hook=validate_precision)
2224
descriptions = StructuredTextListField("Description", StructuredTextList, key_name="description")
2325
source = ElementField("Source", InformationSource)
2426
reference = ElementField("Reference")
2527
confidence = ElementField("Confidence", Confidence)
26-
related_observables = ElementField("Related_Observables", "stix.indicator.sightings.RelatedObservables")
28+
related_observables = ElementField("Related_Observables", type_="stix.indicator.sightings.RelatedObservables")
2729

2830
def __init__(self, timestamp=None, timestamp_precision=None, description=None):
29-
self._fields = {}
31+
super(Sighting, self).__init__()
32+
3033
self.timestamp = timestamp or utils.dates.now()
3134
self.timestamp_precision = timestamp_precision
3235
self.descriptions = description
3336
self.source = None
3437
self.reference = None
3538
self.confidence = None
3639

37-
"""
38-
@timestamp.setter
39-
def timestamp(self, value):
40-
self._timestamp = utils.dates.parse_value(value)
41-
"""
42-
4340
@property
4441
def description(self):
4542
"""A single description about the contents or purpose of this object.
@@ -138,7 +135,6 @@ class Sightings(stix.EntityList):
138135
sightings_count = AttributeField("sightings_count")
139136

140137
def __init__(self, sightings_count=None, *args):
141-
self._fields = {}
142138
super(Sightings, self).__init__(*args)
143139
self.sightings_count = sightings_count
144140

0 commit comments

Comments
 (0)