Skip to content

Commit f0370ac

Browse files
committed
Add Typed Fields to Indicator composition and Sightings
1 parent beee89f commit f0370ac

2 files changed

Lines changed: 14 additions & 122 deletions

File tree

stix/indicator/indicator.py

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# See LICENSE.txt for complete terms.
33

44
# external
5-
from mixbox import fields
5+
from mixbox import fields, entities
66

77
from cybox.core import Observable, ObservableComposition
88
from cybox.common import Time
@@ -190,7 +190,7 @@ class Indicator(stix.BaseCoreComponent):
190190
kill_chain_phases = fields.TypedField("Kill_Chain_Phases", KillChainPhasesReference)
191191
valid_time_positions = fields.TypedField("Valid_Time_Position", ValidTime, multiple=True, key_name="valid_time_positions")
192192
related_indicators = fields.TypedField("Related_Indicators", RelatedIndicators)
193-
related_campaigns = fields.TypedField("Related_Campaigns", type_="stix.indicator.RelatedCampaigns")
193+
related_campaigns = fields.TypedField("Related_Campaigns", type_="stix.indicator.RelatedCampaignRefs")
194194
likely_impact = fields.TypedField("Likely_Impact", Statement)
195195
negate = fields.TypedField("negate")
196196
related_packages = fields.TypedField("Related_Packages", RelatedPackageRefs)
@@ -745,8 +745,8 @@ def add_object(self, object_):
745745
self.add_observable(observable)
746746

747747

748-
def to_obj(self, return_obj=None, ns_info=None):
749-
obj = super(Indicator, self).to_obj(return_obj=return_obj, ns_info=ns_info)
748+
def to_obj(self, ns_info=None):
749+
obj = super(Indicator, self).to_obj(ns_info=ns_info)
750750

751751
if self.observables:
752752
if len(self.observables) > 1:
@@ -841,7 +841,7 @@ def from_dict(cls, dict_repr, return_obj=None):
841841
return return_obj
842842
"""
843843

844-
class CompositeIndicatorExpression(stix.EntityList):
844+
class CompositeIndicatorExpression(entities.EntityList):
845845
"""Implementation of the STIX ``CompositeIndicatorExpressionType``.
846846
847847
The ``CompositeIndicatorExpression`` class implements methods found on
@@ -891,26 +891,20 @@ class CompositeIndicatorExpression(stix.EntityList):
891891
OP_OR = "OR"
892892
OPERATORS = (OP_AND, OP_OR)
893893

894-
def __init__(self, operator="OR", *args):
895-
super(CompositeIndicatorExpression, self).__init__(*args)
896-
self.operator = operator
897-
898-
@property
899-
def operator(self):
900-
return self._operator
901-
902-
@operator.setter
903-
def operator(self, value):
894+
def check_operator(self, value):
895+
raise ValueError("always")
904896
if not value:
905897
raise ValueError("operator must not be None or empty")
906898
elif value not in self.OPERATORS:
907899
raise ValueError("operator must be one of: %s" % (self.OPERATORS,))
908-
else:
909-
self._operator = value
900+
901+
operator = fields.TypedField("operator", preset_hook=check_operator)
910902

911-
def __nonzero__(self):
912-
return super(CompositeIndicatorExpression, self).__nonzero__()
903+
def __init__(self, operator="OR", *args):
904+
super(CompositeIndicatorExpression, self).__init__(*args)
905+
self.operator = operator
913906

907+
"""
914908
def to_obj(self, return_obj=None, ns_info=None):
915909
list_obj = super(CompositeIndicatorExpression, self).to_obj(return_obj=return_obj, ns_info=ns_info)
916910
list_obj.operator = self.operator
@@ -943,7 +937,7 @@ def from_dict(cls, dict_repr, return_obj=None):
943937
super(CompositeIndicatorExpression, cls).from_dict(dict_repr, return_obj=return_obj)
944938
return_obj.operator = dict_repr.get('operator')
945939
return return_obj
946-
940+
"""
947941

948942
class RelatedCampaignRefs(GenericRelationshipList):
949943
_namespace = "http://stix.mitre.org/Indicator-2"

stix/indicator/sightings.py

Lines changed: 0 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -62,65 +62,6 @@ def add_description(self, description):
6262
6363
"""
6464
self.descriptions.add(description)
65-
66-
"""
67-
def to_obj(self, return_obj=None, ns_info=None):
68-
super(Sighting, self).to_obj(return_obj=return_obj, ns_info=ns_info)
69-
70-
if not return_obj:
71-
return_obj = self._binding_class()
72-
73-
return_obj.timestamp = utils.dates.serialize_value(self.timestamp)
74-
return_obj.timestamp_precision = self.timestamp_precision
75-
return_obj.Reference = self.reference
76-
77-
if self.source:
78-
return_obj.Source = self.source.to_obj(ns_info=ns_info)
79-
if self.confidence:
80-
return_obj.Confidence = self.confidence.to_obj(ns_info=ns_info)
81-
if self.descriptions:
82-
return_obj.Description = self.descriptions.to_obj(ns_info=ns_info)
83-
if self.related_observables:
84-
return_obj.Related_Observables = self.related_observables.to_obj(ns_info=ns_info)
85-
86-
return return_obj
87-
88-
def to_dict(self):
89-
return super(Sighting, self).to_dict()
90-
91-
@classmethod
92-
def from_obj(cls, obj, return_obj=None):
93-
if not obj:
94-
return None
95-
96-
if return_obj is None:
97-
return_obj = cls()
98-
99-
return_obj.timestamp = obj.timestamp
100-
return_obj.timestamp_precision = obj.timestamp_precision
101-
return_obj.source = InformationSource.from_obj(obj.Source)
102-
return_obj.reference = obj.Reference
103-
return_obj.confidence = Confidence.from_obj(obj.Confidence)
104-
return_obj.descriptions = StructuredTextList.from_obj(obj.Description)
105-
return_obj.related_observables = RelatedObservables.from_obj(obj.Related_Observables)
106-
return return_obj
107-
108-
@classmethod
109-
def from_dict(cls, d, return_obj=None):
110-
if not d:
111-
return None
112-
if return_obj is None:
113-
return_obj = cls()
114-
115-
return_obj.timestamp = d.get('timestamp')
116-
return_obj.timestamp_precision = d.get('timestamp_precision')
117-
return_obj.source = InformationSource.from_dict(d.get('source'))
118-
return_obj.reference = d.get('reference')
119-
return_obj.confidence = Confidence.from_dict(d.get('confidence'))
120-
return_obj.descriptions = StructuredTextList.from_dict(d.get('description'))
121-
return_obj.related_observables = RelatedObservables.from_dict(d.get('related_observables'))
122-
return return_obj
123-
"""
12465

12566
class Sightings(stix.EntityList):
12667
_namespace = "http://stix.mitre.org/Indicator-2"
@@ -139,49 +80,6 @@ def __init__(self, sightings_count=None, *args):
13980
def __nonzero__(self):
14081
return super(Sightings, self).__nonzero__() or bool(self.sightings_count)
14182

142-
"""
143-
@property
144-
def sightings_count(self):
145-
return self._sightings_count
146-
147-
@sightings_count.setter
148-
def sightings_count(self, value):
149-
self._set_var(int, sightings_count=value)
150-
"""
151-
152-
def to_obj(self, return_obj=None, ns_info=None):
153-
list_obj = super(Sightings, self).to_obj(return_obj=return_obj, ns_info=ns_info)
154-
list_obj.sightings_count = self.sightings_count
155-
return list_obj
156-
157-
def to_dict(self):
158-
d = super(Sightings, self).to_dict()
159-
if self.sightings_count:
160-
d['sightings_count'] = self.sightings_count
161-
return d
162-
163-
@classmethod
164-
def from_obj(cls, obj, return_obj=None):
165-
if not obj:
166-
return None
167-
if return_obj is None:
168-
return_obj = cls()
169-
170-
super(Sightings, cls).from_obj(obj, return_obj=return_obj)
171-
return_obj.sightings_count = obj.sightings_count
172-
return return_obj
173-
174-
@classmethod
175-
def from_dict(cls, dict_repr, return_obj=None):
176-
if not dict_repr:
177-
return None
178-
if return_obj is None:
179-
return_obj = cls()
180-
181-
super(Sightings, cls).from_dict(dict_repr, return_obj=return_obj)
182-
return_obj.sightings_count = dict_repr.get('sightings_count')
183-
return return_obj
184-
18583

18684
class RelatedObservables(GenericRelationshipList):
18785
_namespace = "http://stix.mitre.org/Indicator-2"

0 commit comments

Comments
 (0)