Skip to content

Commit 84befae

Browse files
committed
WIP: Campaign/test fixes
1 parent 5c6b2a4 commit 84befae

3 files changed

Lines changed: 27 additions & 30 deletions

File tree

stix/base.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -414,13 +414,18 @@ def from_dict(cls, cls_dict=None, return_obj=None):
414414
for field in cls._get_vars():
415415
val = cls_dict.get(field.key_name)
416416
if field.type_:
417-
if issubclass(field.type_, EntityList):
418-
val = field.type_.from_list(val)
419-
elif field.multiple:
417+
if field.multiple:
420418
if val is not None:
421-
val = [field.type_.from_dict(x) for x in val]
419+
if type(val) is list:
420+
val = [field.type_.from_dict(x) for x in val]
421+
else:
422+
# sometimes multiple fields are supplied with a single dict as input instead of a list
423+
# TypedList (now obsolete) used to do this; now TypedField has to
424+
val = [field.type_.from_dict(val)]
422425
else:
423426
val = []
427+
elif issubclass(field.type_, EntityList):
428+
val = field.type_.from_list(val)
424429
else:
425430
val = field.type_.from_dict(val)
426431
else:
@@ -624,6 +629,9 @@ def from_dict(cls, dict_repr, return_obj=None, contained_type=None,
624629
if not inner_name:
625630
inner_name = cls._inner_name
626631

632+
if inner_name == "attribution":
633+
pass
634+
627635
for item in dict_repr.get(inner_name, []):
628636
return_obj.append(contained_type.from_dict(item))
629637

@@ -795,7 +803,7 @@ def initClassFields(cls):
795803
import data_marking
796804
import common
797805
from stix.common.structured_text import StructuredTextList, StructuredTextListField
798-
cls.handling.type_ = data_marking.MarkingStructure
806+
cls.handling.type_ = data_marking.Marking
799807
#cls.information_source.type_ = common.InformationSource
800808
cls.descriptions = StructuredTextListField("Description", StructuredTextList, key_name="description")
801809
cls.short_descriptions = StructuredTextListField("Short_Description", StructuredTextList, key_name="short_description")

stix/campaign/__init__.py

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import stix.bindings.campaign as campaign_binding
1313
from stix.common.structured_text import StructuredTextList, StructuredTextListField
1414
from stix.base import ElementField, AttributeField
15+
from stix.common.information_source import InformationSource
1516

1617
class AssociatedCampaigns(GenericRelationshipList):
1718
_namespace = "http://stix.mitre.org/Campaign-1"
@@ -43,7 +44,7 @@ def __init__(self, scope=None, *args):
4344
_binding_var = "Attributed_Threat_Actor"
4445
_contained_type = RelatedThreatActor
4546
_inner_name = "threat_actors"
46-
"""
47+
"""
4748

4849
class RelatedIncidents(GenericRelationshipList):
4950
_namespace = "http://stix.mitre.org/Campaign-1"
@@ -121,6 +122,7 @@ class Campaign(stix.BaseCoreComponent):
121122
related_incidents = ElementField("Related_Incidents", RelatedIncidents)
122123
related_indicators = ElementField("Related_Indicators", RelatedIndicators)
123124
related_packages = ElementField("Related_Packages", RelatedPackageRefs)
125+
information_source = ElementField("Information_Source", InformationSource)
124126

125127
def __init__(self, id_=None, idref=None, timestamp=None, title=None,
126128
description=None, short_description=None):
@@ -134,23 +136,15 @@ def __init__(self, id_=None, idref=None, timestamp=None, title=None,
134136
short_description=short_description
135137
)
136138

137-
self.names = None
138-
self.intended_effects = _IntendedEffects()
139-
self.status = None
140139
self.related_ttps = RelatedTTPs()
141140
self.related_incidents = RelatedIncidents()
142141
self.related_indicators = RelatedIndicators()
143-
self.attribution = Attribution()
144-
self.confidence = None
145-
#self.activity = _Activities()
146142
self.related_packages = RelatedPackageRefs()
147143

148144

149145
def add_intended_effect(self, value):
150146
self.intended_effects.append(value)
151147

152-
153-
154148
def add_activity(self, value):
155149
"""Adds an :class:`.Activity` object to the :attr:`activity`
156150
collection.
@@ -301,12 +295,8 @@ def from_dict(cls, dict_repr, return_obj=None):
301295
"""
302296

303297
# Not Actual STIX Types!
304-
class _AttributionList(stix.TypedList):
305-
_contained_type = Attribution
306-
307-
308-
class _Activities(stix.TypedList):
309-
_contained_type = Activity
298+
#class _Activities(stix.TypedList):
299+
# _contained_type = Activity
310300

311301

312302
class _IntendedEffects(stix.TypedList):

stix/test/campaign_test.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ class AttributionTests(EntityTestCase, unittest.TestCase):
7979

8080

8181
class AttributionListTests(TypedListTestCase, unittest.TestCase):
82-
klass = campaign._AttributionList
82+
klass = campaign.Campaign
8383

84-
_full_dict = [
84+
_full_dict = { 'attribution': [
8585
AttributionTests._full_dict
86-
]
86+
] }
8787

8888

8989
class AssociatedCampaignsTests(EntityTestCase, unittest.TestCase):
@@ -97,12 +97,11 @@ class AssociatedCampaignsTests(EntityTestCase, unittest.TestCase):
9797
}
9898

9999

100-
class ActivitiesTests(TypedListTestCase, unittest.TestCase):
101-
klass = campaign._Activities
100+
class ActivityTests(TypedListTestCase, unittest.TestCase):
101+
klass = campaign.Activity
102102

103-
_full_dict = [
104-
activity_test.ActivityTests._full_dict
105-
]
103+
_full_dict = activity_test.ActivityTests._full_dict
104+
106105

107106

108107
class CampaignTest(EntityTestCase, unittest.TestCase):
@@ -123,10 +122,10 @@ class CampaignTest(EntityTestCase, unittest.TestCase):
123122
'related_ttps': RelatedTTPsTest._full_dict,
124123
'related_incidents': RelatedIncidentsTests._full_dict,
125124
'related_indicators': RelatedIndicatorsTests._full_dict,
126-
'attribution': AttributionListTests._full_dict,
125+
'attribution': [AttributionTests._full_dict],
127126
'associated_campaigns': AssociatedCampaignsTests._full_dict,
128127
'confidence': confidence_test.ConfidenceTests._full_dict,
129-
'activity': ActivitiesTests._full_dict,
128+
'activity': [ActivityTests._full_dict],
130129
'information_source': information_source_test.InformationSourceTests._full_dict,
131130
'handling': data_marking_test.MarkingTests._full_dict,
132131
'related_packages': related_test.RelatedPackageRefsTests._full_dict

0 commit comments

Comments
 (0)