From 3ca7537a99e11b192d233ed5ad471c1c3d91c540 Mon Sep 17 00:00:00 2001
From: VakarisZ <vakarisz@yahoo.com>
Date: Wed, 17 Mar 2021 10:02:13 +0200
Subject: [PATCH] ScoutSuite performance upgrades.

---
 monkey/common/utils/code_utils.py                      | 10 ++++++++++
 .../cc/services/telemetry/processing/scoutsuite.py     |  7 ++++---
 .../zero_trust/scoutsuite/data_parsing/rule_parser.py  |  5 ++---
 .../rule_path_building/abstract_rule_path_creator.py   |  4 ++--
 4 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/monkey/common/utils/code_utils.py b/monkey/common/utils/code_utils.py
index 214e6d108..d9ad573b1 100644
--- a/monkey/common/utils/code_utils.py
+++ b/monkey/common/utils/code_utils.py
@@ -1,5 +1,8 @@
 # abstract, static method decorator
 # noinspection PyPep8Naming
+from typing import List
+
+
 class abstractstatic(staticmethod):
     __slots__ = ()
 
@@ -8,3 +11,10 @@ class abstractstatic(staticmethod):
         function.__isabstractmethod__ = True
 
     __isabstractmethod__ = True
+
+
+def get_value_from_dict(dict_data: dict, path: List[str]):
+    current_data = dict_data
+    for key in path:
+        current_data = current_data[key]
+    return current_data
diff --git a/monkey/monkey_island/cc/services/telemetry/processing/scoutsuite.py b/monkey/monkey_island/cc/services/telemetry/processing/scoutsuite.py
index 8ee4737e8..9160861ea 100644
--- a/monkey/monkey_island/cc/services/telemetry/processing/scoutsuite.py
+++ b/monkey/monkey_island/cc/services/telemetry/processing/scoutsuite.py
@@ -3,6 +3,7 @@ import json
 from monkey_island.cc.database import mongo
 from monkey_island.cc.models.zero_trust.scoutsuite_data_json import ScoutSuiteRawDataJson
 from monkey_island.cc.services.zero_trust.scoutsuite.consts.scoutsuite_findings_list import SCOUTSUITE_FINDINGS
+from monkey_island.cc.services.zero_trust.scoutsuite.consts.service_consts import SERVICES
 from monkey_island.cc.services.zero_trust.scoutsuite.data_parsing.rule_parser import RuleParser
 from monkey_island.cc.services.zero_trust.scoutsuite.scoutsuite_rule_service import ScoutSuiteRuleService
 from monkey_island.cc.services.zero_trust.scoutsuite.scoutsuite_zt_finding_service import ScoutSuiteZTFindingService
@@ -13,14 +14,14 @@ def process_scoutsuite_telemetry(telemetry_json):
     telemetry_json['data'] = json.dumps(telemetry_json['data'])
     ScoutSuiteRawDataJson.add_scoutsuite_data(telemetry_json['data'])
     scoutsuite_data = json.loads(telemetry_json['data'])['data']
-    create_scoutsuite_findings(scoutsuite_data)
+    create_scoutsuite_findings(scoutsuite_data[SERVICES])
     update_data(telemetry_json)
 
 
-def create_scoutsuite_findings(scoutsuite_data):
+def create_scoutsuite_findings(cloud_services: dict):
     for finding in SCOUTSUITE_FINDINGS:
         for rule in finding.rules:
-            rule_data = RuleParser.get_rule_data(scoutsuite_data, rule)
+            rule_data = RuleParser.get_rule_data(cloud_services, rule)
             rule = ScoutSuiteRuleService.get_rule_from_rule_data(rule_data)
             ScoutSuiteZTFindingService.process_rule(finding, rule)
 
diff --git a/monkey/monkey_island/cc/services/zero_trust/scoutsuite/data_parsing/rule_parser.py b/monkey/monkey_island/cc/services/zero_trust/scoutsuite/data_parsing/rule_parser.py
index e07431541..935f1c989 100644
--- a/monkey/monkey_island/cc/services/zero_trust/scoutsuite/data_parsing/rule_parser.py
+++ b/monkey/monkey_island/cc/services/zero_trust/scoutsuite/data_parsing/rule_parser.py
@@ -1,7 +1,6 @@
 from enum import Enum
 
-import dpath.util
-
+from common.utils.code_utils import get_value_from_dict
 from common.utils.exceptions import RulePathCreatorNotFound
 from monkey_island.cc.services.zero_trust.scoutsuite.data_parsing.rule_path_building.rule_path_creators_list import \
     RULE_PATH_CREATORS_LIST
@@ -23,7 +22,7 @@ class RuleParser:
     @staticmethod
     def get_rule_data(scoutsuite_data: dict, rule_name: Enum) -> dict:
         rule_path = RuleParser._get_rule_path(rule_name)
-        return dpath.util.get(scoutsuite_data, rule_path)
+        return get_value_from_dict(scoutsuite_data, rule_path)
 
     @staticmethod
     def _get_rule_path(rule_name: Enum):
diff --git a/monkey/monkey_island/cc/services/zero_trust/scoutsuite/data_parsing/rule_path_building/abstract_rule_path_creator.py b/monkey/monkey_island/cc/services/zero_trust/scoutsuite/data_parsing/rule_path_building/abstract_rule_path_creator.py
index b4767124b..ee7f7c38b 100644
--- a/monkey/monkey_island/cc/services/zero_trust/scoutsuite/data_parsing/rule_path_building/abstract_rule_path_creator.py
+++ b/monkey/monkey_island/cc/services/zero_trust/scoutsuite/data_parsing/rule_path_building/abstract_rule_path_creator.py
@@ -3,7 +3,7 @@ from enum import Enum
 from typing import List, Type
 
 from monkey_island.cc.services.zero_trust.scoutsuite.consts.rule_names.rule_name_enum import RuleNameEnum
-from monkey_island.cc.services.zero_trust.scoutsuite.consts.service_consts import FINDINGS, SERVICES, SERVICE_TYPES
+from monkey_island.cc.services.zero_trust.scoutsuite.consts.service_consts import FINDINGS, SERVICE_TYPES
 
 
 class AbstractRulePathCreator(ABC):
@@ -21,4 +21,4 @@ class AbstractRulePathCreator(ABC):
     @classmethod
     def build_rule_path(cls, rule_name: Enum) -> List[str]:
         assert(rule_name in cls.supported_rules)
-        return [SERVICES, cls.service_type.value, FINDINGS, rule_name.value]
+        return [cls.service_type.value, FINDINGS, rule_name.value]