Source code for cybsi.utils.views
import uuid
from typing import List, Optional, Union, cast
from cybsi.api.internal import JsonObjectView
from cybsi.api.observable import (
AbstractEntityView,
AttributeNames,
EntityKeyView,
EntityTypes,
)
[docs]
class BasicEntityView(JsonObjectView):
"""Builtin basic entity view.
Includes only entity type and natual keys.
.. versionadded:: 2.9
"""
@property
def uuid(self) -> uuid.UUID:
"""Entity UUID."""
return uuid.UUID(self._get("uuid"))
@property
def type(self) -> EntityTypes:
"""Entity type."""
return EntityTypes(self._get("type"))
@property
def keys(self) -> List[EntityKeyView]:
"""Entity natural keys."""
return [EntityKeyView(x) for x in self._get("naturalKeys")]
[docs]
class PTMSEntityView(AbstractEntityView):
"""Entity view tailored for consumption by PT Multiscanner.
.. versionadded:: 2.9
"""
@classmethod
def _view_uuid(cls) -> uuid.UUID:
return uuid.UUID("190b4e72-7887-4555-a9a9-6bec33c6529d")
@property
def entity(self) -> BasicEntityView:
"""Basic entity view."""
return BasicEntityView(self._get("entity"))
@property
def malware_classes(self) -> Optional[List[str]]:
"""Malware classes.
Expected, but not required for File entity type.
:data:`None` for other entity types."""
return self._map_list_optional("malwareClasses", str)
@property
def malware_family(self) -> Optional[str]:
"""Malware family value having the highest confidence.
Expected, but not required for File entity type.
:data:`None` for other entity types.
"""
return self._get_optional("malwareFamily")
@property
def related_malware_family(self) -> Optional[str]:
"""Related malware family value having the highest confidence.
Expected, but not required for DomainName, URL,
IPAddress, EmailAddress entity types.
:data:`None` for other entity types."""
return self._get_optional("relatedMalwareFamily")
[docs]
class CybsiEntityView(AbstractEntityView):
"""Entity view tailored for consumption by Cybsi-Cybsi relay.
.. versionadded:: 2.10
"""
@classmethod
def _view_uuid(cls) -> uuid.UUID:
return uuid.UUID("4bd21f23-e4b9-45ab-bde8-078f7115b0b8")
@property
def entity(self) -> BasicEntityView:
"""Basic entity view."""
return BasicEntityView(self._get("entity"))
@property
def attribute_values(self) -> List["AttributeValuesView"]:
"""Natural and associated attributes forecast of the entity.
Natural attributes only from the list:
For `File` entity type: `Size`, `Names`, `MalwareNames`.
"""
attributes = self._get("attributeValues")
return [AttributeValuesView(x) for x in attributes]
[docs]
class AttributeValuesView(JsonObjectView):
"""Attribute value view."""
@property
def name(self) -> AttributeNames:
"""Attribute name."""
return AttributeNames(self._get("name"))
@property
def values(self) -> List["ValuesView"]:
"""Attribute values.
Method returns list of forecasted attribute values and their confidence.
"""
return [ValuesView(x) for x in self._get("values")]
[docs]
class ValuesView(JsonObjectView):
"""Values view"""
@property
def value(self) -> Union[str, bool, int]:
"""Forecast attribute value.
Return type depends on attribute name.
Use :meth:`~cybsi.utils.converters.convert_attribute_value`
to get attribute value form to create a general observation.
"""
return self._get("value")
@property
def confidence(self) -> float:
"""Attribute confidence."""
return float(cast(float, self._get("confidence")))