mirror of https://github.com/MISP/PyMISP
chg: Cleanups and improvements
parent
f322e479cd
commit
3bb220c94b
|
@ -74,9 +74,9 @@ else:
|
||||||
class MISPFileCache(object):
|
class MISPFileCache(object):
|
||||||
# cache up to 150 JSON structures in class attribute
|
# cache up to 150 JSON structures in class attribute
|
||||||
|
|
||||||
@classmethod
|
@staticmethod
|
||||||
@lru_cache(maxsize=150)
|
@lru_cache(maxsize=150)
|
||||||
def _load_json(cls, path):
|
def _load_json(path):
|
||||||
with path.open('rb') as f:
|
with path.open('rb') as f:
|
||||||
data = json.load(f)
|
data = json.load(f)
|
||||||
return data
|
return data
|
||||||
|
@ -173,6 +173,8 @@ class AbstractMISP(MutableMapping, MISPFileCache):
|
||||||
|
|
||||||
@misp_objects_path.setter
|
@misp_objects_path.setter
|
||||||
def misp_objects_path(self, misp_objects_path):
|
def misp_objects_path(self, misp_objects_path):
|
||||||
|
if sys.version_info >= (3, 0) and isinstance(misp_objects_path, str):
|
||||||
|
misp_objects_path = Path(misp_objects_path)
|
||||||
self.__misp_objects_path = misp_objects_path
|
self.__misp_objects_path = misp_objects_path
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|
|
@ -19,7 +19,7 @@ from deprecated import deprecated
|
||||||
from . import __version__, warning_2020
|
from . import __version__, warning_2020
|
||||||
from .exceptions import PyMISPError, SearchError, NoURL, NoKey, PyMISPEmptyResponse
|
from .exceptions import PyMISPError, SearchError, NoURL, NoKey, PyMISPEmptyResponse
|
||||||
from .mispevent import MISPEvent, MISPAttribute, MISPUser, MISPOrganisation, MISPSighting, MISPFeed, MISPObject, MISPSharingGroup
|
from .mispevent import MISPEvent, MISPAttribute, MISPUser, MISPOrganisation, MISPSighting, MISPFeed, MISPObject, MISPSharingGroup
|
||||||
from .abstract import AbstractMISP, MISPEncode, MISPFileCache
|
from .abstract import AbstractMISP, MISPEncode, MISPFileCache, describe_types
|
||||||
|
|
||||||
logger = logging.getLogger('pymisp')
|
logger = logging.getLogger('pymisp')
|
||||||
|
|
||||||
|
@ -135,8 +135,7 @@ class PyMISP(MISPFileCache): # pragma: no cover
|
||||||
|
|
||||||
@deprecated(reason="Use ExpandedPyMISP.describe_types_local", version='2.4.110', action='default')
|
@deprecated(reason="Use ExpandedPyMISP.describe_types_local", version='2.4.110', action='default')
|
||||||
def get_local_describe_types(self):
|
def get_local_describe_types(self):
|
||||||
describe_types = self._load_json(os.path.join(self.resources_path, 'describeTypes.json'))
|
return describe_types
|
||||||
return describe_types['result']
|
|
||||||
|
|
||||||
@deprecated(reason="Use ExpandedPyMISP.describe_types_remote", version='2.4.110', action='default')
|
@deprecated(reason="Use ExpandedPyMISP.describe_types_remote", version='2.4.110', action='default')
|
||||||
def get_live_describe_types(self):
|
def get_live_describe_types(self):
|
||||||
|
|
|
@ -19,7 +19,7 @@ from . import __version__
|
||||||
from .exceptions import MISPServerError, PyMISPUnexpectedResponse, PyMISPNotImplementedYet, PyMISPError, NoURL, NoKey
|
from .exceptions import MISPServerError, PyMISPUnexpectedResponse, PyMISPNotImplementedYet, PyMISPError, NoURL, NoKey
|
||||||
from .api import everything_broken, PyMISP
|
from .api import everything_broken, PyMISP
|
||||||
from .mispevent import MISPEvent, MISPAttribute, MISPSighting, MISPLog, MISPObject, MISPUser, MISPOrganisation, MISPShadowAttribute, MISPWarninglist, MISPTaxonomy, MISPGalaxy, MISPNoticelist, MISPObjectReference, MISPObjectTemplate, MISPSharingGroup, MISPRole, MISPServer, MISPFeed, MISPEventDelegation, MISPCommunity
|
from .mispevent import MISPEvent, MISPAttribute, MISPSighting, MISPLog, MISPObject, MISPUser, MISPOrganisation, MISPShadowAttribute, MISPWarninglist, MISPTaxonomy, MISPGalaxy, MISPNoticelist, MISPObjectReference, MISPObjectTemplate, MISPSharingGroup, MISPRole, MISPServer, MISPFeed, MISPEventDelegation, MISPCommunity
|
||||||
from .abstract import MISPEncode, MISPTag, AbstractMISP
|
from .abstract import MISPEncode, MISPTag, AbstractMISP, describe_types
|
||||||
|
|
||||||
SearchType = TypeVar('SearchType', str, int)
|
SearchType = TypeVar('SearchType', str, int)
|
||||||
# str: string to search / list: values to search (OR) / dict: {'OR': [list], 'NOT': [list], 'AND': [list]}
|
# str: string to search / list: values to search (OR) / dict: {'OR': [list], 'NOT': [list], 'AND': [list]}
|
||||||
|
@ -106,8 +106,7 @@ class ExpandedPyMISP(PyMISP):
|
||||||
@property
|
@property
|
||||||
def describe_types_local(self):
|
def describe_types_local(self):
|
||||||
'''Returns the content of describe types from the package'''
|
'''Returns the content of describe types from the package'''
|
||||||
describe_types = self._load_json(str(self.resources_path / 'describeTypes.json'))
|
return describe_types
|
||||||
return describe_types['result']
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def describe_types_remote(self):
|
def describe_types_remote(self):
|
||||||
|
|
|
@ -113,7 +113,7 @@ class MISPAttribute(AbstractMISP):
|
||||||
if describe_types:
|
if describe_types:
|
||||||
self.describe_types = describe_types
|
self.describe_types = describe_types
|
||||||
self.__categories = self.describe_types['categories']
|
self.__categories = self.describe_types['categories']
|
||||||
self._types = self.describe_types['types']
|
self.__types = self.describe_types['types']
|
||||||
self.__category_type_mapping = self.describe_types['category_type_mappings']
|
self.__category_type_mapping = self.describe_types['category_type_mappings']
|
||||||
self.__sane_default = self.describe_types['sane_defaults']
|
self.__sane_default = self.describe_types['sane_defaults']
|
||||||
self.__strict = strict
|
self.__strict = strict
|
||||||
|
@ -125,7 +125,7 @@ class MISPAttribute(AbstractMISP):
|
||||||
@property
|
@property
|
||||||
def known_types(self):
|
def known_types(self):
|
||||||
"""Returns a list of all the known MISP attributes types"""
|
"""Returns a list of all the known MISP attributes types"""
|
||||||
return self._types
|
return self.__types
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def malware_binary(self):
|
def malware_binary(self):
|
||||||
|
@ -213,7 +213,7 @@ class MISPAttribute(AbstractMISP):
|
||||||
if self.type is None:
|
if self.type is None:
|
||||||
raise NewAttributeError('The type of the attribute is required.')
|
raise NewAttributeError('The type of the attribute is required.')
|
||||||
if self.type not in self.known_types:
|
if self.type not in self.known_types:
|
||||||
raise NewAttributeError('{} is invalid, type has to be in {}'.format(self.type, (', '.join(self._types))))
|
raise NewAttributeError('{} is invalid, type has to be in {}'.format(self.type, (', '.join(self.known_types))))
|
||||||
|
|
||||||
type_defaults = self.__sane_default[self.type]
|
type_defaults = self.__sane_default[self.type]
|
||||||
|
|
||||||
|
@ -434,7 +434,7 @@ 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
|
||||||
|
|
||||||
self._types = self.describe_types['types']
|
self.__types = self.describe_types['types']
|
||||||
self.Attribute = []
|
self.Attribute = []
|
||||||
self.Object = []
|
self.Object = []
|
||||||
self.RelatedEvent = []
|
self.RelatedEvent = []
|
||||||
|
@ -442,7 +442,7 @@ class MISPEvent(AbstractMISP):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def known_types(self):
|
def known_types(self):
|
||||||
return self._types
|
return self.__types
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def org(self):
|
def org(self):
|
||||||
|
@ -1140,25 +1140,7 @@ class MISPObject(AbstractMISP):
|
||||||
self.name = name
|
self.name = name
|
||||||
self._known_template = False
|
self._known_template = False
|
||||||
|
|
||||||
if kwargs.get('misp_objects_path_custom'):
|
self._set_template(kwargs.get('misp_objects_path_custom'))
|
||||||
# If misp_objects_path_custom is given, and an object with the given name exists, use that.
|
|
||||||
if sys.version_info >= (3, 6):
|
|
||||||
self._known_template = self._load_template_path(Path(kwargs.get('misp_objects_path_custom')) / self.name / 'definition.json')
|
|
||||||
else:
|
|
||||||
self._known_template = self._load_template_path(os.path.join(kwargs.get('misp_objects_path_custom'), self.name, 'definition.json'))
|
|
||||||
|
|
||||||
if not self._known_template:
|
|
||||||
# Check if the object is known in the default templates bundled in with PyMISP
|
|
||||||
if sys.version_info >= (3, 6):
|
|
||||||
self._known_template = self._load_template_path(self.misp_objects_path / self.name / 'definition.json')
|
|
||||||
else:
|
|
||||||
self._known_template = self._load_template_path(os.path.join(self.misp_objects_path, self.name, 'definition.json'))
|
|
||||||
|
|
||||||
if not self._known_template and self._strict:
|
|
||||||
raise UnknownMISPObjectTemplate('{} is unknown in the MISP object directory.'.format(self.name))
|
|
||||||
else:
|
|
||||||
# Then we have no meta-category, template_uuid, description and template_version
|
|
||||||
pass
|
|
||||||
|
|
||||||
self.uuid = str(uuid.uuid4())
|
self.uuid = str(uuid.uuid4())
|
||||||
self.__fast_attribute_access = defaultdict(list) # Hashtable object_relation: [attributes]
|
self.__fast_attribute_access = defaultdict(list) # Hashtable object_relation: [attributes]
|
||||||
|
@ -1206,14 +1188,24 @@ class MISPObject(AbstractMISP):
|
||||||
def force_misp_objects_path_custom(self, misp_objects_path_custom, object_name=None):
|
def force_misp_objects_path_custom(self, misp_objects_path_custom, object_name=None):
|
||||||
if object_name:
|
if object_name:
|
||||||
self.name = object_name
|
self.name = object_name
|
||||||
if sys.version_info >= (3, 6):
|
self._set_template(misp_objects_path_custom)
|
||||||
template_path = Path(misp_objects_path_custom) / self.name / 'definition.json'
|
|
||||||
else:
|
|
||||||
template_path = os.path.join(misp_objects_path_custom, self.name, 'definition.json')
|
|
||||||
|
|
||||||
self._known_template = self._load_template_path(template_path)
|
def _set_template(self, misp_objects_path_custom=None):
|
||||||
if not self._known_template:
|
if misp_objects_path_custom:
|
||||||
raise UnknownMISPObjectTemplate('{} is unknown in the MISP object directory ({}).'.format(self.name, template_path))
|
# If misp_objects_path_custom is given, and an object with the given name exists, use that.
|
||||||
|
self.misp_objects_path = misp_objects_path_custom
|
||||||
|
|
||||||
|
# Try to get the template
|
||||||
|
if sys.version_info >= (3, 6):
|
||||||
|
self._known_template = self._load_template_path(self.misp_objects_path / self.name / 'definition.json')
|
||||||
|
else:
|
||||||
|
self._known_template = self._load_template_path(os.path.join(self.misp_objects_path, self.name, 'definition.json'))
|
||||||
|
|
||||||
|
if not self._known_template and self._strict:
|
||||||
|
raise UnknownMISPObjectTemplate('{} is unknown in the MISP object directory.'.format(self.name))
|
||||||
|
else:
|
||||||
|
# Then we have no meta-category, template_uuid, description and template_version
|
||||||
|
pass
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def disable_validation(self):
|
def disable_validation(self):
|
||||||
|
|
Loading…
Reference in New Issue