mirror of https://github.com/MISP/PyMISP
				
				
				
			chg: Cleanups and improvements
							parent
							
								
									f322e479cd
								
							
						
					
					
						commit
						3bb220c94b
					
				|  | @ -74,9 +74,9 @@ else: | |||
|     class MISPFileCache(object): | ||||
|         # cache up to 150 JSON structures in class attribute | ||||
| 
 | ||||
|         @classmethod | ||||
|         @staticmethod | ||||
|         @lru_cache(maxsize=150) | ||||
|         def _load_json(cls, path): | ||||
|         def _load_json(path): | ||||
|             with path.open('rb') as f: | ||||
|                 data = json.load(f) | ||||
|             return data | ||||
|  | @ -173,6 +173,8 @@ class AbstractMISP(MutableMapping, MISPFileCache): | |||
| 
 | ||||
|     @misp_objects_path.setter | ||||
|     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 | ||||
| 
 | ||||
|     @property | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ from deprecated import deprecated | |||
| from . import __version__, warning_2020 | ||||
| from .exceptions import PyMISPError, SearchError, NoURL, NoKey, PyMISPEmptyResponse | ||||
| 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') | ||||
| 
 | ||||
|  | @ -135,8 +135,7 @@ class PyMISP(MISPFileCache):  # pragma: no cover | |||
| 
 | ||||
|     @deprecated(reason="Use ExpandedPyMISP.describe_types_local", version='2.4.110', action='default') | ||||
|     def get_local_describe_types(self): | ||||
|         describe_types = self._load_json(os.path.join(self.resources_path, 'describeTypes.json')) | ||||
|         return describe_types['result'] | ||||
|         return describe_types | ||||
| 
 | ||||
|     @deprecated(reason="Use ExpandedPyMISP.describe_types_remote", version='2.4.110', action='default') | ||||
|     def get_live_describe_types(self): | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ from . import __version__ | |||
| from .exceptions import MISPServerError, PyMISPUnexpectedResponse, PyMISPNotImplementedYet, PyMISPError, NoURL, NoKey | ||||
| 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 .abstract import MISPEncode, MISPTag, AbstractMISP | ||||
| from .abstract import MISPEncode, MISPTag, AbstractMISP, describe_types | ||||
| 
 | ||||
| SearchType = TypeVar('SearchType', str, int) | ||||
| # str: string to search / list: values to search (OR) / dict: {'OR': [list], 'NOT': [list], 'AND': [list]} | ||||
|  | @ -106,8 +106,7 @@ class ExpandedPyMISP(PyMISP): | |||
|     @property | ||||
|     def describe_types_local(self): | ||||
|         '''Returns the content of describe types from the package''' | ||||
|         describe_types = self._load_json(str(self.resources_path / 'describeTypes.json')) | ||||
|         return describe_types['result'] | ||||
|         return describe_types | ||||
| 
 | ||||
|     @property | ||||
|     def describe_types_remote(self): | ||||
|  |  | |||
|  | @ -113,7 +113,7 @@ class MISPAttribute(AbstractMISP): | |||
|         if describe_types: | ||||
|             self.describe_types = describe_types | ||||
|         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.__sane_default = self.describe_types['sane_defaults'] | ||||
|         self.__strict = strict | ||||
|  | @ -125,7 +125,7 @@ class MISPAttribute(AbstractMISP): | |||
|     @property | ||||
|     def known_types(self): | ||||
|         """Returns a list of all the known MISP attributes types""" | ||||
|         return self._types | ||||
|         return self.__types | ||||
| 
 | ||||
|     @property | ||||
|     def malware_binary(self): | ||||
|  | @ -213,7 +213,7 @@ class MISPAttribute(AbstractMISP): | |||
|         if self.type is None: | ||||
|             raise NewAttributeError('The type of the attribute is required.') | ||||
|         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] | ||||
| 
 | ||||
|  | @ -434,7 +434,7 @@ class MISPEvent(AbstractMISP): | |||
|             # This variable is used in add_attribute in order to avoid duplicating the structure | ||||
|             self.describe_types = describe_types | ||||
| 
 | ||||
|         self._types = self.describe_types['types'] | ||||
|         self.__types = self.describe_types['types'] | ||||
|         self.Attribute = [] | ||||
|         self.Object = [] | ||||
|         self.RelatedEvent = [] | ||||
|  | @ -442,7 +442,7 @@ class MISPEvent(AbstractMISP): | |||
| 
 | ||||
|     @property | ||||
|     def known_types(self): | ||||
|         return self._types | ||||
|         return self.__types | ||||
| 
 | ||||
|     @property | ||||
|     def org(self): | ||||
|  | @ -1140,25 +1140,7 @@ class MISPObject(AbstractMISP): | |||
|         self.name = name | ||||
|         self._known_template = False | ||||
| 
 | ||||
|         if 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._set_template(kwargs.get('misp_objects_path_custom')) | ||||
| 
 | ||||
|         self.uuid = str(uuid.uuid4()) | ||||
|         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): | ||||
|         if object_name: | ||||
|             self.name = object_name | ||||
|         if sys.version_info >= (3, 6): | ||||
|             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._set_template(misp_objects_path_custom) | ||||
| 
 | ||||
|         self._known_template = self._load_template_path(template_path) | ||||
|         if not self._known_template: | ||||
|             raise UnknownMISPObjectTemplate('{} is unknown in the MISP object directory ({}).'.format(self.name, template_path)) | ||||
|     def _set_template(self, misp_objects_path_custom=None): | ||||
|         if misp_objects_path_custom: | ||||
|             # 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 | ||||
|     def disable_validation(self): | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Raphaël Vinot
						Raphaël Vinot