Skip to content

Commit b0a1dcf

Browse files
committed
add: [stix2 import] Handling clusters sharing group id for content converter from external STIX 2.x
1 parent c55b54e commit b0a1dcf

File tree

4 files changed

+22
-8
lines changed

4 files changed

+22
-8
lines changed

misp_stix_converter/__init__.py

+4
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,10 @@ def main():
151151
'-cd', '--cluster_distribution', type=int, default=0,
152152
help='Galaxy Clusters distribution level in case of External STIX 2 content.'
153153
)
154+
import_parser.add_argument(
155+
'-cg', '--cluster_sharing_group', type=int, default=None,
156+
help='Galaxy Clusters sharing group ID in case of External STIX 2 content.'
157+
)
154158
import_parser.set_defaults(func=_stix_to_misp)
155159

156160
stix_args = parser.parse_args()

misp_stix_converter/misp_stix_converter.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,7 @@ def stix_1_to_misp(
662662

663663
def stix_2_to_misp(filename: _files_type,
664664
cluster_distribution: Optional[int] = 0,
665+
cluster_sharing_group_id: Optional[int] = None,
665666
debug: Optional[bool] = False,
666667
distribution: Optional[int] = 0,
667668
galaxies_as_tags: Optional[bool] = False,
@@ -680,7 +681,7 @@ def stix_2_to_misp(filename: _files_type,
680681
return {'errors': [f'{filename} - {error.__str__()}']}
681682
parser, args = _get_stix2_parser(
682683
_from_misp(bundle.objects), distribution, sharing_group_id,
683-
galaxies_as_tags, cluster_distribution
684+
galaxies_as_tags, cluster_distribution, cluster_sharing_group_id
684685
)
685686
stix_parser = parser(*args)
686687
stix_parser.load_stix_bundle(bundle)
@@ -715,7 +716,7 @@ def _from_misp(stix_objects):
715716

716717
def _get_stix2_parser(from_misp: bool, *args: tuple) -> tuple:
717718
if from_misp:
718-
return InternalSTIX2toMISPParser, args[:-1]
719+
return InternalSTIX2toMISPParser, args[:-2]
719720
return ExternalSTIX2toMISPParser, args
720721

721722
def _load_stix_event(filename, tries=0):
@@ -1016,6 +1017,7 @@ def _stix_to_misp(stix_args):
10161017
for filename in stix_args.file:
10171018
traceback = method(
10181019
filename, cluster_distribution=stix_args.cluster_distribution,
1020+
cluster_sharing_group_id=stix_args.cluster_sharing_group,
10191021
debug=stix_args.debug, distribution=stix_args.distribution,
10201022
galaxies_as_tags=stix_args.galaxies_as_tags,
10211023
output_dir=stix_args.output_dir,

misp_stix_converter/stix2misp/converters/stix2converter.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -257,9 +257,8 @@ def _create_cluster_args(
257257
cluster_value: Optional[str] = None) -> dict:
258258
value = cluster_value or stix_object.name
259259
cluster_args = {
260-
'distribution': self.main_parser.cluster_distribution,
261260
'uuid': self.main_parser._sanitise_uuid(stix_object.id),
262-
'value': value
261+
'value': value, **self.main_parser.cluster_distribution
263262
}
264263
if galaxy_type is None:
265264
version = getattr(stix_object, 'spec_version', '2.0')

misp_stix_converter/stix2misp/external_stix2_to_misp.py

+13-4
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,12 @@ class ExternalSTIX2toMISPParser(STIX2toMISPParser):
133133
def __init__(self, distribution: Optional[int] = 0,
134134
sharing_group_id: Optional[int] = None,
135135
galaxies_as_tags: Optional[bool] = False,
136-
cluster_distribution: Optional[int] = 0):
136+
cluster_distribution: Optional[int] = 0,
137+
cluster_sharing_group_id: Optional[int] = None):
137138
super().__init__(distribution, sharing_group_id, galaxies_as_tags)
138-
self.__cluster_distribution = self._sanitise_distribution(
139-
cluster_distribution
139+
self._set_cluster_distribution(
140+
self._sanitise_distribution(cluster_distribution),
141+
self._sanitise_sharing_group_id(cluster_sharing_group_id)
140142
)
141143
self._mapping = ExternalSTIX2toMISPMapping
142144
# parsers
@@ -155,7 +157,7 @@ def __init__(self, distribution: Optional[int] = 0,
155157
self._vulnerability_parser: ExternalSTIX2VulnerabilityConverter
156158

157159
@property
158-
def cluster_distribution(self) -> int:
160+
def cluster_distribution(self) -> dict:
159161
return self.__cluster_distribution
160162

161163
@property
@@ -173,6 +175,13 @@ def _set_campaign_parser(self) -> ExternalSTIX2CampaignConverter:
173175
self._campaign_parser = ExternalSTIX2CampaignConverter(self)
174176
return self._campaign_parser
175177

178+
def _set_cluster_distribution(
179+
self, distribution: int, sharing_group_id: Union[int, None]):
180+
cluster_distribution = {'distribution': distribution}
181+
if distribution == 4 and sharing_group_id is not None:
182+
cluster_distribution['sharing_group_id'] = sharing_group_id
183+
self.__cluster_distribution = cluster_distribution
184+
176185
def _set_course_of_action_parser(self) -> ExternalSTIX2CourseOfActionConverter:
177186
self._course_of_action_parser = ExternalSTIX2CourseOfActionConverter(self)
178187
return self._course_of_action_parser

0 commit comments

Comments
 (0)