diff --git a/pymisp/abstract.py b/pymisp/abstract.py index 6fc05d3..fa1a015 100644 --- a/pymisp/abstract.py +++ b/pymisp/abstract.py @@ -134,12 +134,12 @@ class AbstractMISP(MutableMapping, MISPFileCache): __misp_objects_path = misp_objects_path __describe_types = describe_types - def __init__(self, **kwargs): """Abstract class for all the MISP objects""" super(AbstractMISP, self).__init__() self.__edited = True # As we create a new object, we assume it is edited self.__not_jsonable = [] + self.__self_defined_describe_types = None if kwargs.get('force_timestamps') is not None: # Ignore the edited objects and keep the timestamps. @@ -157,11 +157,13 @@ class AbstractMISP(MutableMapping, MISPFileCache): @property def describe_types(self): + if self.__self_defined_describe_types: + return self.__self_defined_describe_types return self.__describe_types @describe_types.setter def describe_types(self, describe_types): - self.__describe_types = describe_types + self.__self_defined_describe_types = describe_types @property def resources_path(self): diff --git a/pymisp/api.py b/pymisp/api.py index 58da773..bc7a4af 100644 --- a/pymisp/api.py +++ b/pymisp/api.py @@ -140,14 +140,14 @@ class PyMISP(MISPFileCache): # pragma: no cover @deprecated(reason="Use ExpandedPyMISP.describe_types_remote", version='2.4.110', action='default') def get_live_describe_types(self): response = self._prepare_request('GET', urljoin(self.root_url, 'attributes/describeTypes.json')) - describe_types = self._check_response(response) - if describe_types.get('error'): - for e in describe_types.get('error'): + remote_describe_types = self._check_response(response) + if remote_describe_types.get('error'): + for e in remote_describe_types.get('error'): raise PyMISPError('Failed: {}'.format(e)) - describe_types = describe_types['result'] - if not describe_types.get('sane_defaults'): + remote_describe_types = describe_types['result'] + if not remote_describe_types.get('sane_defaults'): raise PyMISPError('The MISP server your are trying to reach is outdated (<2.4.52). Please use PyMISP v2.4.51.1 (pip install -I PyMISP==v2.4.51.1) and/or contact your administrator.') - return describe_types + return remote_describe_types def _prepare_request(self, request_type, url, data=None, background_callback=None, output_type='json'): diff --git a/pymisp/aping.py b/pymisp/aping.py index 931aca2..2a2a24a 100644 --- a/pymisp/aping.py +++ b/pymisp/aping.py @@ -112,8 +112,8 @@ class ExpandedPyMISP(PyMISP): def describe_types_remote(self): '''Returns the content of describe types from the remote instance''' response = self._prepare_request('GET', 'attributes/describeTypes.json') - describe_types = self._check_response(response, expect_json=True) - return describe_types['result'] + remote_describe_types = self._check_response(response, expect_json=True) + return remote_describe_types['result'] @property def recommended_pymisp_version(self): diff --git a/pymisp/tools/elfobject.py b/pymisp/tools/elfobject.py index 2dcdeb0..e57654b 100644 --- a/pymisp/tools/elfobject.py +++ b/pymisp/tools/elfobject.py @@ -25,6 +25,7 @@ except ImportError: class ELFObject(AbstractMISPObjectGenerator): def __init__(self, parsed=None, filepath=None, pseudofile=None, standalone=True, **kwargs): + super(ELFObject, self).__init__('elf', standalone=standalone, **kwargs) if not HAS_PYDEEP: logger.warning("Please install pydeep: pip install git+https://github.com/kbandla/pydeep.git") if not HAS_LIEF: @@ -44,7 +45,6 @@ class ELFObject(AbstractMISPObjectGenerator): self.__elf = parsed else: raise InvalidMISPObject('Not a lief.ELF.Binary: {}'.format(type(parsed))) - super(ELFObject, self).__init__('elf', standalone=standalone, **kwargs) self.generate_attributes() def generate_attributes(self): diff --git a/pymisp/tools/emailobject.py b/pymisp/tools/emailobject.py index 4a5b54f..0984336 100644 --- a/pymisp/tools/emailobject.py +++ b/pymisp/tools/emailobject.py @@ -13,6 +13,9 @@ logger = logging.getLogger('pymisp') class EMailObject(AbstractMISPObjectGenerator): def __init__(self, filepath=None, pseudofile=None, attach_original_email=True, standalone=True, **kwargs): + # PY3 way: + # super().__init__('file') + super(EMailObject, self).__init__('email', standalone=standalone, **kwargs) if filepath: with open(filepath, 'rb') as f: self.__pseudofile = BytesIO(f.read()) @@ -20,9 +23,6 @@ class EMailObject(AbstractMISPObjectGenerator): self.__pseudofile = pseudofile else: raise InvalidMISPObject('File buffer (BytesIO) or a path is required.') - # PY3 way: - # super().__init__('file') - super(EMailObject, self).__init__('email', standalone=standalone, **kwargs) self.__email = message_from_bytes(self.__pseudofile.getvalue(), policy=policy.default) if attach_original_email: self.add_attribute('eml', value='Full email.eml', data=self.__pseudofile) diff --git a/pymisp/tools/fileobject.py b/pymisp/tools/fileobject.py index e9b05cd..55e946c 100644 --- a/pymisp/tools/fileobject.py +++ b/pymisp/tools/fileobject.py @@ -29,6 +29,9 @@ except ImportError: class FileObject(AbstractMISPObjectGenerator): def __init__(self, filepath=None, pseudofile=None, filename=None, standalone=True, **kwargs): + # PY3 way: + # super().__init__('file') + super(FileObject, self).__init__('file', standalone=standalone, **kwargs) if not HAS_PYDEEP: logger.warning("Please install pydeep: pip install git+https://github.com/kbandla/pydeep.git") if not HAS_MAGIC: @@ -49,9 +52,6 @@ class FileObject(AbstractMISPObjectGenerator): self.__pseudofile = pseudofile else: raise InvalidMISPObject('File buffer (BytesIO) or a path is required.') - # PY3 way: - # super().__init__('file') - super(FileObject, self).__init__('file', standalone=standalone, **kwargs) self.__data = self.__pseudofile.getvalue() self.generate_attributes() diff --git a/pymisp/tools/machoobject.py b/pymisp/tools/machoobject.py index f0f11fb..984798b 100644 --- a/pymisp/tools/machoobject.py +++ b/pymisp/tools/machoobject.py @@ -26,6 +26,9 @@ except ImportError: class MachOObject(AbstractMISPObjectGenerator): def __init__(self, parsed=None, filepath=None, pseudofile=None, standalone=True, **kwargs): + # Python3 way + # super().__init__('elf') + super(MachOObject, self).__init__('macho', standalone=standalone, **kwargs) if not HAS_PYDEEP: logger.warning("Please install pydeep: pip install git+https://github.com/kbandla/pydeep.git") if not HAS_LIEF: @@ -45,9 +48,6 @@ class MachOObject(AbstractMISPObjectGenerator): self.__macho = parsed else: raise InvalidMISPObject('Not a lief.MachO.Binary: {}'.format(type(parsed))) - # Python3 way - # super().__init__('elf') - super(MachOObject, self).__init__('macho', standalone=standalone, **kwargs) self.generate_attributes() def generate_attributes(self): diff --git a/pymisp/tools/peobject.py b/pymisp/tools/peobject.py index b24d4cc..fa1b4e5 100644 --- a/pymisp/tools/peobject.py +++ b/pymisp/tools/peobject.py @@ -26,6 +26,9 @@ except ImportError: class PEObject(AbstractMISPObjectGenerator): def __init__(self, parsed=None, filepath=None, pseudofile=None, standalone=True, **kwargs): + # Python3 way + # super().__init__('pe') + super(PEObject, self).__init__('pe', standalone=standalone, **kwargs) if not HAS_PYDEEP: logger.warning("Please install pydeep: pip install git+https://github.com/kbandla/pydeep.git") if not HAS_LIEF: @@ -45,9 +48,6 @@ class PEObject(AbstractMISPObjectGenerator): self.__pe = parsed else: raise InvalidMISPObject('Not a lief.PE.Binary: {}'.format(type(parsed))) - # Python3 way - # super().__init__('pe') - super(PEObject, self).__init__('pe', standalone=standalone, **kwargs) self.generate_attributes() def _is_exe(self): diff --git a/pymisp/tools/sshauthkeyobject.py b/pymisp/tools/sshauthkeyobject.py index 30f675d..95bb937 100644 --- a/pymisp/tools/sshauthkeyobject.py +++ b/pymisp/tools/sshauthkeyobject.py @@ -12,6 +12,9 @@ logger = logging.getLogger('pymisp') class SSHAuthorizedKeysObject(AbstractMISPObjectGenerator): def __init__(self, authorized_keys_path=None, authorized_keys_pseudofile=None, standalone=True, **kwargs): + # PY3 way: + # super().__init__('file') + super(SSHAuthorizedKeysObject, self).__init__('ssh-authorized-keys', standalone=standalone, **kwargs) if authorized_keys_path: with open(authorized_keys_path, 'r') as f: self.__pseudofile = StringIO(f.read()) @@ -19,9 +22,6 @@ class SSHAuthorizedKeysObject(AbstractMISPObjectGenerator): self.__pseudofile = authorized_keys_path else: raise InvalidMISPObject('File buffer (StringIO) or a path is required.') - # PY3 way: - # super().__init__('file') - super(SSHAuthorizedKeysObject, self).__init__('ssh-authorized-keys', standalone=standalone, **kwargs) self.__data = self.__pseudofile.getvalue() self.generate_attributes() diff --git a/tests/testlive_comprehensive.py b/tests/testlive_comprehensive.py index 628de3f..170c6eb 100644 --- a/tests/testlive_comprehensive.py +++ b/tests/testlive_comprehensive.py @@ -1577,7 +1577,7 @@ class TestComprehensive(unittest.TestCase): remote_types = remote.pop('types') remote_categories = remote.pop('categories') remote_category_type_mappings = remote.pop('category_type_mappings') - local = self.admin_misp_connector.describe_types_local + local = dict(self.admin_misp_connector.describe_types_local) local_types = local.pop('types') local_categories = local.pop('categories') local_category_type_mappings = local.pop('category_type_mappings')