Skip to content

Commit 5d712f7

Browse files
author
Bryan Worrell
committed
Removed init_typed_fields() methods. Replaced functionality with TypedField lazy type resolution capabilities (passing a string python path into the type_ kwarg.)
1 parent 4bc632e commit 5d712f7

10 files changed

Lines changed: 19 additions & 89 deletions

File tree

stix/__init__.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,3 @@ def supported_stix_version():
131131
132132
"""
133133
return ('1.1.1', '1.2')
134-
135-
# because common depends on base, we can only set the TypeFields types on
136-
# BaseCoreComponent to common classes after both common and base are imported
137-
BaseCoreComponent._init_typed_fields()

stix/base.py

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -472,23 +472,12 @@ class BaseCoreComponent(Cached, Entity):
472472
title = ElementField("Title")
473473
id_ = fields.IdField("id")
474474
idref = fields.IdrefField("idref")
475+
descriptions = fields.TypedField("Description", type_="stix.common.StructuredTextList", key_name="description")
476+
short_descriptions = fields.TypedField("Short_Description", type_="stix.common.StructuredTextList", key_name="short_description")
475477
version = AttributeField("version", preset_hook=_validate_version)
476478
timestamp = fields.DateTimeField("timestamp")
479+
handling = fields.TypedField("Handling", type_="stix.data_marking.Marking")
477480

478-
# These are defined in init_typed_fields due to circular imports
479-
handling = None
480-
descriptions = None
481-
short_descriptions = None
482-
483-
484-
@classmethod
485-
def _init_typed_fields(cls):
486-
from stix.data_marking import Marking
487-
from stix.common.structured_text import StructuredTextList, StructuredTextListField
488-
489-
cls.handling = fields.TypedField("Handling", Marking)
490-
cls.descriptions = StructuredTextListField("Description", StructuredTextList, key_name="description")
491-
cls.short_descriptions = StructuredTextListField("Short_Description", StructuredTextList, key_name="short_description")
492481

493482
def __init__(self, id_=None, idref=None, timestamp=None, title=None,
494483
description=None, short_description=None):

stix/common/__init__.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,3 @@ def __str__(self):
8181

8282
def __unicode__(self):
8383
return unicode(self.value)
84-
85-
86-
# Initialize typed fields which could not be done in the class definition
87-
Statement._init_typed_fields()
88-
Identity._init_typed_fields()
89-
Confidence._init_typed_fields()

stix/common/confidence.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class Confidence(stix.Entity):
2424
descriptions = StructuredTextListField("Description", StructuredTextList, key_name="description")
2525
timestamp = DateTimeField("timestamp")
2626
timestamp_precision = AttributeField("timestamp_precision", preset_hook=validate_precision)
27-
source = ElementField("Source")
27+
source = ElementField("Source", type_="stix.common.InformationSource")
2828

2929
def __init__(self, value=None, timestamp=None, description=None, source=None):
3030
super(Confidence, self).__init__()
@@ -37,12 +37,6 @@ def __init__(self, value=None, timestamp=None, description=None, source=None):
3737

3838
# TODO: support confidence_assertion_chain
3939
# self.confidence_assertion_chain = None
40-
41-
# called in stix.common.related
42-
@classmethod
43-
def _init_typed_fields(cls):
44-
from .information_source import InformationSource
45-
cls.source.type_ = InformationSource
4640

4741
@property
4842
def description(self):

stix/common/identity.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@
1212
from stix.bindings.stix_common import IdentityType
1313

1414

15-
16-
17-
1815
class Identity(Cached, stix.Entity):
1916
_binding = common_binding
2017
_namespace = 'http://stix.mitre.org/common-1'
@@ -23,13 +20,7 @@ class Identity(Cached, stix.Entity):
2320
id_ = fields.IdField("id")
2421
idref = fields.IdrefField("idref")
2522
name = ElementField("Name")
26-
27-
# Set in _init_typed_fields() due to circular imports
28-
related_identities = None
29-
30-
@classmethod
31-
def _init_typed_fields(cls):
32-
cls.related_identities = ElementField("Related_Identities", RelatedIdentities)
23+
related_identities = fields.TypedField("Related_Identities", type_="stix.common.identity.RelatedIdentities")
3324

3425
def __init__(self, id_=None, idref=None, name=None, related_identities=None):
3526
super(Identity, self).__init__()

stix/common/information_source.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,12 @@ class InformationSource(stix.Entity):
2525

2626
identity = ElementField("Identity", Identity)
2727
descriptions = StructuredTextListField("Description", StructuredTextList, key_name="description")
28-
contributing_sources = ElementField("Contributing_Sources")
28+
contributing_sources = ElementField("Contributing_Sources", type_="stix.common.information_source.ContributingSources")
2929
time = ElementField("Time", cybox.common.Time)
3030
roles = ElementField("Role", VocabString, multiple=True, key_name="roles")
3131
tools = ElementField("Tools", ToolInformationList)
3232
references = ElementField("References", References)
3333

34-
@classmethod
35-
def _init_typed_fields(cls):
36-
cls.contributing_sources.type_ = ContributingSources
37-
3834
def __init__(self, description=None, identity=None, time=None, tools=None, contributing_sources=None, references=None):
3935
super(InformationSource, self).__init__()
4036

@@ -98,6 +94,3 @@ class ContributingSources(stix.EntityList):
9894
_contained_type = InformationSource
9995
_inner_name = "sources"
10096

101-
102-
# finally, initialize field types that would be circular dependencies
103-
InformationSource._init_typed_fields()

stix/common/statement.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
from __future__ import absolute_import
55

6+
from mixbox import fields
7+
68
import stix
79
import stix.utils as utils
810
import stix.bindings.stix_common as common_binding
@@ -25,9 +27,7 @@ class Statement(stix.Entity):
2527
value = VocabField("Value", HighMediumLow)
2628
descriptions = ElementField("Description", StructuredTextList)
2729
confidence = ElementField("Confidence", Confidence)
28-
29-
# Set by init_typed_fields() to avoid
30-
source = None
30+
source = fields.TypedField("Source", type_="stix.common.InformationSource")
3131

3232
def __init__(self, value=None, timestamp=None, description=None,
3333
source=None):
@@ -40,11 +40,6 @@ def __init__(self, value=None, timestamp=None, description=None,
4040
self.source = source
4141
self.confidence = None
4242

43-
@classmethod
44-
def _init_typed_fields(cls):
45-
from stix.common.information_source import InformationSource
46-
cls.source = ElementField("Source", InformationSource)
47-
4843
@property
4944
def description(self):
5045
"""A single description about the contents or purpose of this object.

stix/incident/__init__.py

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,15 @@ class Incident(stix.BaseCoreComponent):
5050
status = ElementField("Status", vocabs.IncidentStatus)
5151
time = ElementField("Time", Time)
5252
victims = ElementField("Victim", Identity, multiple=True, key_name="victims")
53-
attributed_threat_actors = ElementField("Attributed_Threat_Actors")
54-
related_indicators = ElementField("Related_Indicators")
55-
related_observables = ElementField("Related_Observables")
56-
related_incidents = ElementField("Related_Incidents")
53+
attributed_threat_actors = ElementField("Attributed_Threat_Actors", type_="stix.incident.AttributedThreatActors")
54+
related_indicators = ElementField("Related_Indicators", type_="stix.incident.RelatedIndicators")
55+
related_observables = ElementField("Related_Observables", type_="stix.incident.RelatedObservables")
56+
related_incidents = ElementField("Related_Incidents", type_="stix.incident.RelatedIncidents")
5757
related_packages = ElementField("Related_Packages", RelatedPackageRefs)
58-
affected_assets = ElementField("Affected_Assets")
59-
categories = ElementField("Categories")
58+
affected_assets = ElementField("Affected_Assets", type_="stix.incident.AffectedAssets")
59+
categories = ElementField("Categories", type_="stix.incident.IncidentCategories")
6060
intended_effects = ElementField("Intended_Effect", Statement, multiple=True, key_name="intended_effects")
61-
leveraged_ttps = ElementField("Leveraged_TTPs")
61+
leveraged_ttps = ElementField("Leveraged_TTPs", type_="stix.incident.LeveragedTTPs")
6262
discovery_methods = ElementField("Discovery_Method", vocabs.DiscoveryMethod, multiple=True, key_name="discovery_methods")
6363
reporter = ElementField("Reporter", InformationSource)
6464
responders = ElementField("Responder", InformationSource, multiple=True, key_name="responders")
@@ -71,16 +71,6 @@ class Incident(stix.BaseCoreComponent):
7171
coa_requested = ElementField("COA_Requested", COARequested, multiple=True)
7272
history = ElementField("History", History)
7373

74-
@classmethod
75-
def _init_typed_fields(cls):
76-
cls.attributed_threat_actors.type_ = AttributedThreatActors
77-
cls.related_indicators.type_ = RelatedIndicators
78-
cls.related_observables.type_ = RelatedObservables
79-
cls.related_incidents.type_ = RelatedIncidents
80-
cls.affected_assets.type_ = AffectedAssets
81-
cls.categories.type_ = IncidentCategories
82-
cls.leveraged_ttps.type_ = LeveragedTTPs
83-
8474
def __init__(self, id_=None, idref=None, timestamp=None, title=None, description=None, short_description=None):
8575
super(Incident, self).__init__(
8676
id_=id_,
@@ -482,7 +472,3 @@ class _IntendedEffects(stix.TypedList):
482472

483473
def _fix_value(self, value):
484474
return Statement(value=vocabs.IntendedEffect(value))
485-
486-
487-
Incident._init_typed_fields()
488-

stix/indicator/indicator.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,11 @@ class Indicator(stix.BaseCoreComponent):
194194
kill_chain_phases = ElementField("Kill_Chain_Phases", KillChainPhasesReference)
195195
valid_time_positions = ElementField("Valid_Time_Position", ValidTime, multiple=True, key_name="valid_time_positions")
196196
related_indicators = ElementField("Related_Indicators", RelatedIndicators)
197-
related_campaigns = ElementField("Related_Campaigns")
197+
related_campaigns = ElementField("Related_Campaigns", type_="stix.indicator.RelatedCampaigns")
198198
likely_impact = ElementField("Likely_Impact", Statement)
199199
negate = AttributeField("negate")
200200
related_packages = ElementField("Related_Packages", RelatedPackageRefs)
201201

202-
@classmethod
203-
def _init_typed_fields(cls):
204-
cls.related_campaigns.type_ = RelatedCampaignRefs
205202

206203
def __init__(self, id_=None, idref=None, timestamp=None, title=None,
207204
description=None, short_description=None):
@@ -1023,5 +1020,3 @@ class _IndicatedTTPs(stix.TypedList):
10231020

10241021
class _Observables(stix.TypedList):
10251022
_contained_type = Observable
1026-
1027-
Indicator._init_typed_fields()

stix/indicator/sightings.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from stix.base import AttributeField, ElementField
1212
from stix.common.structured_text import StructuredTextListField
1313

14+
1415
class Sighting(stix.Entity):
1516
_namespace = "http://stix.mitre.org/Indicator-2"
1617
_binding = indicator_binding
@@ -22,7 +23,7 @@ class Sighting(stix.Entity):
2223
source = ElementField("Source", InformationSource)
2324
reference = ElementField("Reference")
2425
confidence = ElementField("Confidence", Confidence)
25-
related_observables = ElementField("Related_Observables")
26+
related_observables = ElementField("Related_Observables", "stix.indicator.sightings.RelatedObservables")
2627

2728
def __init__(self, timestamp=None, timestamp_precision=None, description=None):
2829
self._fields = {}
@@ -33,10 +34,6 @@ def __init__(self, timestamp=None, timestamp_precision=None, description=None):
3334
self.reference = None
3435
self.confidence = None
3536

36-
@classmethod
37-
def _init_typed_fields(cls):
38-
cls.related_observables.type_ = RelatedObservables
39-
4037
"""
4138
@timestamp.setter
4239
def timestamp(self, value):

0 commit comments

Comments
 (0)