Merge branch 'JakubOnderka-to_dict_json_format'

pull/779/head
Raphaël Vinot 2021-08-05 11:22:45 +02:00
commit 81e7db14bb
3 changed files with 27 additions and 8 deletions

View File

@ -179,7 +179,7 @@ class AbstractMISP(MutableMapping, MISPFileCache, metaclass=ABCMeta):
"""Load a JSON string""" """Load a JSON string"""
self.from_dict(**loads(json_string)) self.from_dict(**loads(json_string))
def to_dict(self) -> Dict: def to_dict(self, json_format: bool = False) -> Dict:
"""Dump the class to a dictionary. """Dump the class to a dictionary.
This method automatically removes the timestamp recursively in every object This method automatically removes the timestamp recursively in every object
that has been edited is order to let MISP update the event accordingly.""" that has been edited is order to let MISP update the event accordingly."""
@ -192,6 +192,16 @@ class AbstractMISP(MutableMapping, MISPFileCache, metaclass=ABCMeta):
continue continue
elif isinstance(val, str): elif isinstance(val, str):
val = val.strip() val = val.strip()
elif json_format:
if isinstance(val, AbstractMISP):
val = val.to_json(True)
elif isinstance(val, (datetime, date)):
val = val.isoformat()
elif isinstance(val, Enum):
val = val.value
elif isinstance(val, UUID):
val = str(val)
if attribute == 'timestamp': if attribute == 'timestamp':
if not self.__force_timestamps and is_edited: if not self.__force_timestamps and is_edited:
# In order to be accepted by MISP, the timestamp of an object # In order to be accepted by MISP, the timestamp of an object
@ -201,7 +211,7 @@ class AbstractMISP(MutableMapping, MISPFileCache, metaclass=ABCMeta):
continue continue
else: else:
val = self._datetime_to_timestamp(val) val = self._datetime_to_timestamp(val)
if (attribute in ['first_seen', 'last_seen', 'datetime'] if (attribute in ('first_seen', 'last_seen', 'datetime')
and isinstance(val, datetime) and isinstance(val, datetime)
and not val.tzinfo): and not val.tzinfo):
# Need to make sure the timezone is set. Otherwise, it will be processed as UTC on the server # Need to make sure the timezone is set. Otherwise, it will be processed as UTC on the server

View File

@ -528,8 +528,8 @@ class MISPAttribute(AbstractMISP):
super().from_dict(**kwargs) super().from_dict(**kwargs)
def to_dict(self) -> Dict: def to_dict(self, json_format: bool = False) -> Dict:
to_return = super().to_dict() to_return = super().to_dict(json_format)
if self.data: if self.data:
to_return['data'] = base64.b64encode(self.data.getvalue()).decode() to_return['data'] = base64.b64encode(self.data.getvalue()).decode()
return to_return return to_return
@ -967,10 +967,10 @@ class MISPObject(AbstractMISP):
to_return.append(a) to_return.append(a)
return to_return return to_return
def to_dict(self, strict: bool = False) -> Dict: def to_dict(self, json_format: bool = False, strict: bool = False) -> Dict:
if strict or self._strict and self._known_template: if strict or self._strict and self._known_template:
self._validate() self._validate()
return super(MISPObject, self).to_dict() return super(MISPObject, self).to_dict(json_format)
def to_json(self, sort_keys: bool = False, indent: Optional[int] = None, strict: bool = False): def to_json(self, sort_keys: bool = False, indent: Optional[int] = None, strict: bool = False):
if strict or self._strict and self._known_template: if strict or self._strict and self._known_template:
@ -1728,8 +1728,8 @@ class MISPEvent(AbstractMISP):
super(MISPEvent, self).from_dict(**kwargs) super(MISPEvent, self).from_dict(**kwargs)
def to_dict(self) -> Dict: def to_dict(self, json_format: bool = False) -> Dict:
to_return = super().to_dict() to_return = super().to_dict(json_format)
if to_return.get('date'): if to_return.get('date'):
if isinstance(self.date, datetime): if isinstance(self.date, datetime):

View File

@ -87,6 +87,15 @@ class TestMISPEvent(unittest.TestCase):
ref_json = json.load(f) ref_json = json.load(f)
self.assertEqual(self.mispevent.to_json(sort_keys=True, indent=2), json.dumps(ref_json, sort_keys=True, indent=2)) self.assertEqual(self.mispevent.to_json(sort_keys=True, indent=2), json.dumps(ref_json, sort_keys=True, indent=2))
def test_to_dict_json_format(self):
misp_event = MISPEvent()
av_signature_object = MISPObject("av-signature")
av_signature_object.add_attribute("signature", "EICAR")
av_signature_object.add_attribute("software", "ClamAv")
misp_event.add_object(av_signature_object)
self.assertEqual(json.loads(misp_event.to_json()), misp_event.to_dict(json_format=True))
def test_object_tag(self): def test_object_tag(self):
self.mispevent.add_object(name='file', strict=True) self.mispevent.add_object(name='file', strict=True)
a = self.mispevent.objects[0].add_attribute('filename', value='') a = self.mispevent.objects[0].add_attribute('filename', value='')