fix: Cache describeTypes at AbstractMISP level.

pull/470/head
Raphaël Vinot 2019-10-03 13:23:00 -07:00
parent a2b66e943b
commit 6c1f988b13
2 changed files with 36 additions and 16 deletions

View File

@ -80,8 +80,35 @@ class MISPEncode(JSONEncoder):
return JSONEncoder.default(self, obj) return JSONEncoder.default(self, obj)
if sys.version_info >= (3, 6):
from pathlib import Path
def cache_describe_types():
resources_path = Path(__file__).parent / 'data'
with (resources_path / 'describeTypes.json').open() as f:
dt = json.load(f)
return dt['result']
else:
import os
if (3, 0) <= sys.version_info < (3, 6):
OLD_PY3 = True
else:
OLD_PY3 = False
def cache_describe_types():
ressources_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'data')
with open(os.path.join(ressources_path, 'describeTypes.json'), 'rb') as f:
if OLD_PY3:
t = json.loads(f.read().decode())
else:
t = json.load(f)
return t['result']
class AbstractMISP(MutableMapping): class AbstractMISP(MutableMapping):
__describe_types = cache_describe_types()
def __init__(self, **kwargs): def __init__(self, **kwargs):
"""Abstract class for all the MISP objects""" """Abstract class for all the MISP objects"""
super(AbstractMISP, self).__init__() super(AbstractMISP, self).__init__()
@ -102,6 +129,10 @@ class AbstractMISP(MutableMapping):
setattr(AbstractMISP, 'add_tag', AbstractMISP.__add_tag) setattr(AbstractMISP, 'add_tag', AbstractMISP.__add_tag)
setattr(AbstractMISP, 'tags', property(AbstractMISP.__get_tags, AbstractMISP.__set_tags)) setattr(AbstractMISP, 'tags', property(AbstractMISP.__get_tags, AbstractMISP.__set_tags))
@property
def describe_types(self):
return self.__describe_types
@property @property
def properties(self): def properties(self):
"""All the class public properties that will be dumped in the dictionary, and the JSON export. """All the class public properties that will be dumped in the dictionary, and the JSON export.

View File

@ -110,15 +110,9 @@ class MISPAttribute(AbstractMISP):
""" """
super(MISPAttribute, self).__init__() super(MISPAttribute, self).__init__()
if not describe_types: if not describe_types:
ressources_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'data') describe_types = self.describe_types
with open(os.path.join(ressources_path, 'describeTypes.json'), 'rb') as f: self.__categories = frozenset(describe_types['categories'])
if OLD_PY3: self._types = frozenset(describe_types['types'])
t = json.loads(f.read().decode())
else:
t = json.load(f)
describe_types = t['result']
self.__categories = describe_types['categories']
self._types = describe_types['types']
self.__category_type_mapping = describe_types['category_type_mappings'] self.__category_type_mapping = describe_types['category_type_mappings']
self.__sane_default = describe_types['sane_defaults'] self.__sane_default = describe_types['sane_defaults']
self.__strict = strict self.__strict = strict
@ -442,14 +436,9 @@ class MISPEvent(AbstractMISP):
# This variable is used in add_attribute in order to avoid duplicating the structure # This variable is used in add_attribute in order to avoid duplicating the structure
self._describe_types = describe_types self._describe_types = describe_types
else: else:
with open(os.path.join(ressources_path, 'describeTypes.json'), 'rb') as f: self._describe_types = self.describe_types
if OLD_PY3:
t = json.loads(f.read().decode())
else:
t = json.load(f)
self._describe_types = t['result']
self._types = self._describe_types['types'] self._types = frozenset(self._describe_types['types'])
self.Attribute = [] self.Attribute = []
self.Object = [] self.Object = []
self.RelatedEvent = [] self.RelatedEvent = []