From ab752c801e68b5d85e7e37dd25a4eab6bb283d4c Mon Sep 17 00:00:00 2001 From: Robin <167366979+allrob23@users.noreply.github.com> Date: Fri, 11 Apr 2025 18:19:43 +0000 Subject: [PATCH 1/2] refactor: enums to use CaseInsensitiveMixin for has_value --- pycti/utils/constants.py | 64 ++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 42 deletions(-) diff --git a/pycti/utils/constants.py b/pycti/utils/constants.py index 642d0a69..b5f5bebb 100644 --- a/pycti/utils/constants.py +++ b/pycti/utils/constants.py @@ -12,7 +12,22 @@ from stix2.utils import NOW -class StixCyberObservableTypes(Enum): +class CaseInsensitiveMixin: + """Mixin providing case-insensitive value checking for Enum classes.""" + _lower_values_cache = None + + @classmethod + def _get_lower_values(cls): + if cls._lower_values_cache is None: + cls._lower_values_cache = {v.lower() for v in cls._value2member_map_} + return cls._lower_values_cache + + @classmethod + def has_value(cls, value): + return value.lower() in cls._get_lower_values() + + +class StixCyberObservableTypes(CaseInsensitiveMixin, Enum): AUTONOMOUS_SYSTEM = "Autonomous-System" DIRECTORY = "Directory" DOMAIN_NAME = "Domain-Name" @@ -47,48 +62,28 @@ class StixCyberObservableTypes(Enum): SIMPLE_OBSERVABLE = "Simple-Observable" PERSONA = "Persona" - @classmethod - def has_value(cls, value): - lower_attr = list(map(lambda x: x.lower(), cls._value2member_map_)) - return value.lower() in lower_attr - -class IdentityTypes(Enum): +class IdentityTypes(CaseInsensitiveMixin, Enum): SECTOR = "Sector" ORGANIZATION = "Organization" INDIVIDUAL = "Individual" SYSTEM = "System" - @classmethod - def has_value(cls, value): - lower_attr = list(map(lambda x: x.lower(), cls._value2member_map_)) - return value.lower() in lower_attr - -class ThreatActorTypes(Enum): +class ThreatActorTypes(CaseInsensitiveMixin, Enum): THREAT_ACTOR_GROUP = "Threat-Actor-Group" THREAT_ACTOR_INDIVIDUAL = "Threat-Actor-Individual" - @classmethod - def has_value(cls, value): - lower_attr = list(map(lambda x: x.lower(), cls._value2member_map_)) - return value.lower() in lower_attr - -class LocationTypes(Enum): +class LocationTypes(CaseInsensitiveMixin, Enum): REGION = "Region" COUNTRY = "Country" ADMINISTRATIVE_AREA = "Administrative-Area" CITY = "City" POSITION = "Position" - @classmethod - def has_value(cls, value): - lower_attr = list(map(lambda x: x.lower(), cls._value2member_map_)) - return value.lower() in lower_attr - -class ContainerTypes(Enum): +class ContainerTypes(CaseInsensitiveMixin, Enum): NOTE = "Note" OBSERVED_DATA = "Observed-Data" OPINION = "Opinion" @@ -96,25 +91,15 @@ class ContainerTypes(Enum): GROUPING = "Grouping" CASE = "Case" - @classmethod - def has_value(cls, value): - lower_attr = list(map(lambda x: x.lower(), cls._value2member_map_)) - return value.lower() in lower_attr - -class StixMetaTypes(Enum): +class StixMetaTypes(CaseInsensitiveMixin, Enum): MARKING_DEFINITION = "Marking-Definition" LABEL = "Label" EXTERNAL_REFERENCE = "External-Reference" KILL_CHAIN_PHASE = "Kill-Chain-Phase" - @classmethod - def has_value(cls, value): - lower_attr = list(map(lambda x: x.lower(), cls._value2member_map_)) - return value.lower() in lower_attr - -class MultipleRefRelationship(Enum): +class MultipleRefRelationship(CaseInsensitiveMixin, Enum): OPERATING_SYSTEM = "operating-system" SAMPLE = "sample" CONTAINS = "contains" @@ -132,11 +117,6 @@ class MultipleRefRelationship(Enum): INSTALLED_SOFTWARE = "installed-software" RELATION_ANALYSIS_SCO = "analysis-sco" - @classmethod - def has_value(cls, value): - lower_attr = list(map(lambda x: x.lower(), cls._value2member_map_)) - return value.lower() in lower_attr - # Custom objects From eedf9940bf5ba782bcfbe319bfe1f3ed0533f167 Mon Sep 17 00:00:00 2001 From: Robin <167366979+allrob23@users.noreply.github.com> Date: Fri, 11 Apr 2025 18:54:48 +0000 Subject: [PATCH 2/2] refactor: black lint --- pycti/utils/constants.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pycti/utils/constants.py b/pycti/utils/constants.py index b5f5bebb..5252b727 100644 --- a/pycti/utils/constants.py +++ b/pycti/utils/constants.py @@ -14,6 +14,7 @@ class CaseInsensitiveMixin: """Mixin providing case-insensitive value checking for Enum classes.""" + _lower_values_cache = None @classmethod