devsecops-engine-tools 1.11.1__py3-none-any.whl → 1.11.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of devsecops-engine-tools might be problematic. Click here for more details.

Files changed (26) hide show
  1. devsecops_engine_tools/engine_core/src/applications/runner_engine_core.py +1 -1
  2. devsecops_engine_tools/engine_core/src/domain/usecases/handle_scan.py +2 -1
  3. devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/aws/secrets_manager.py +1 -1
  4. devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py +2 -1
  5. devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kics/kics_tool.py +13 -14
  6. devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kubescape/kubescape_deserealizator.py +1 -1
  7. devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kubescape/kubescape_tool.py +6 -7
  8. devsecops_engine_tools/engine_sast/engine_secret/src/applications/runner_secret_scan.py +3 -2
  9. devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/DeserializeConfigTool.py +3 -0
  10. devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/gateway/tool_gateway.py +5 -4
  11. devsecops_engine_tools/engine_sast/engine_secret/src/domain/usecases/secret_scan.py +6 -5
  12. devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/trufflehog_run.py +43 -5
  13. devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/entry_points/entry_point_tool.py +2 -2
  14. devsecops_engine_tools/engine_sca/engine_dependencies/src/applications/runner_dependencies_scan.py +21 -3
  15. devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/dependency_check/__init__.py +0 -0
  16. devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/dependency_check/dependency_check_deserialize.py +62 -0
  17. devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/dependency_check/dependency_check_tool.py +120 -0
  18. devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/xray_tool/xray_manager_scan.py +4 -98
  19. devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/helpers/get_artifacts.py +107 -0
  20. devsecops_engine_tools/engine_utilities/utils/utils.py +8 -0
  21. devsecops_engine_tools/version.py +1 -1
  22. {devsecops_engine_tools-1.11.1.dist-info → devsecops_engine_tools-1.11.3.dist-info}/METADATA +6 -2
  23. {devsecops_engine_tools-1.11.1.dist-info → devsecops_engine_tools-1.11.3.dist-info}/RECORD +26 -21
  24. {devsecops_engine_tools-1.11.1.dist-info → devsecops_engine_tools-1.11.3.dist-info}/WHEEL +0 -0
  25. {devsecops_engine_tools-1.11.1.dist-info → devsecops_engine_tools-1.11.3.dist-info}/entry_points.txt +0 -0
  26. {devsecops_engine_tools-1.11.1.dist-info → devsecops_engine_tools-1.11.3.dist-info}/top_level.txt +0 -0
@@ -144,7 +144,7 @@ def get_inputs_from_cli(args):
144
144
  parser.add_argument(
145
145
  "--token_external_checks",
146
146
  required=False,
147
- help="Token for downloading external checks from engine_iac if is necessary. Ej: github:token, ssh:privatekey:pass",
147
+ help="Token for downloading external checks from engine_iac or engine_secret if is necessary. Ej: github:token, ssh:privatekey:pass",
148
148
  )
149
149
  parser.add_argument(
150
150
  "--xray_mode",
@@ -136,7 +136,8 @@ class HandleScan:
136
136
  findings_list, input_core = runner_secret_scan(
137
137
  dict_args,
138
138
  config_tool["ENGINE_SECRET"]["TOOL"],
139
- self.devops_platform_gateway
139
+ self.devops_platform_gateway,
140
+ secret_tool
140
141
  )
141
142
  if (
142
143
  dict_args["use_vulnerability_management"] == "true"
@@ -36,5 +36,5 @@ class SecretsManager(SecretsManagerGateway):
36
36
  secret_dict = json.loads(secret)
37
37
  return secret_dict
38
38
  except NoCredentialsError as e:
39
- logger.error("Error getting secret: {e}")
39
+ logger.error(f"Error getting secret: {e}")
40
40
  return None
@@ -65,7 +65,8 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
65
65
  "TRIVY": "Trivy Scan",
66
66
  "KUBESCAPE": "Kubescape Scanner",
67
67
  "KICS": "KICS Scanner",
68
- "BEARER": "Bearer CLI"
68
+ "BEARER": "Bearer CLI",
69
+ "DEPENDENCY_CHECK": "Dependency Check Scan"
69
70
  }
70
71
 
71
72
  if any(
@@ -11,7 +11,7 @@ from devsecops_engine_tools.engine_sast.engine_iac.src.infrastructure.driven_ada
11
11
  )
12
12
  from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
13
13
  from devsecops_engine_tools.engine_utilities import settings
14
- from devsecops_engine_tools.engine_utilities.github.infrastructure.github_api import GithubApi
14
+ from devsecops_engine_tools.engine_utilities.utils.utils import Utils
15
15
 
16
16
  logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
17
17
 
@@ -28,7 +28,7 @@ class KicsTool(ToolGateway):
28
28
  logger.error(f"An error ocurred downloading {file} {ex}")
29
29
 
30
30
  def install_tool(self, file, url, command_prefix):
31
- github_api = GithubApi()
31
+ utils = Utils()
32
32
  kics = f"./{command_prefix}/kics"
33
33
  installed = subprocess.run(
34
34
  ["which", command_prefix],
@@ -38,7 +38,7 @@ class KicsTool(ToolGateway):
38
38
  if installed.returncode == 1:
39
39
  try:
40
40
  self.download(file, url)
41
- github_api.unzip_file(file, command_prefix)
41
+ utils.unzip_file(file, command_prefix)
42
42
  subprocess.run(["chmod", "+x", kics])
43
43
  return kics
44
44
  except Exception as e:
@@ -56,9 +56,9 @@ class KicsTool(ToolGateway):
56
56
  return command_prefix
57
57
  except:
58
58
  try:
59
- github_api = GithubApi()
59
+ utils = Utils()
60
60
  self.download(file, url)
61
- github_api.unzip_file(file, command_prefix)
61
+ utils.unzip_file(file, command_prefix)
62
62
  return f"./{command_prefix}/kics"
63
63
 
64
64
  except Exception as e:
@@ -81,34 +81,32 @@ class KicsTool(ToolGateway):
81
81
  logger.error(f"An error ocurred loading KICS results {ex}")
82
82
  return None
83
83
 
84
- def select_operative_system(self, os_platform, folders_to_scan, config_tool, path_kics):
84
+ def select_operative_system(self, os_platform, config_tool, path_kics):
85
85
  command_prefix = path_kics
86
86
  if os_platform == "Linux":
87
87
  kics_zip = "kics_linux.zip"
88
88
  url_kics = config_tool[self.TOOL_KICS]["KICS_LINUX"]
89
- command_prefix = self.install_tool(kics_zip, url_kics, command_prefix)
89
+ return self.install_tool(kics_zip, url_kics, command_prefix)
90
90
  elif os_platform == "Windows":
91
91
  kics_zip = "kics_windows.zip"
92
92
  url_kics = config_tool[self.TOOL_KICS]["KICS_WINDOWS"]
93
- command_prefix = self.install_tool_windows(kics_zip, url_kics, command_prefix)
93
+ return self.install_tool_windows(kics_zip, url_kics, command_prefix)
94
94
  elif os_platform == "Darwin":
95
95
  kics_zip = "kics_macos.zip"
96
96
  url_kics = config_tool[self.TOOL_KICS]["KICS_MAC"]
97
- command_prefix = self.install_tool(kics_zip, url_kics, command_prefix)
97
+ return self.install_tool(kics_zip, url_kics, command_prefix)
98
98
  else:
99
99
  logger.warning(f"{os_platform} is not supported.")
100
100
  return [], None
101
101
 
102
- self.execute_kics(folders_to_scan, command_prefix)
103
-
104
102
  def get_assets(self, kics_version):
105
103
  name_zip = "assets_compressed.zip"
106
104
  assets_url = f"https://github.com/Checkmarx/kics/releases/download/v{kics_version}/extracted-info.zip"
107
105
  self.download(name_zip, assets_url)
108
106
 
109
107
  directory_assets = "kics_assets"
110
- github_api = GithubApi()
111
- github_api.unzip_file(name_zip, directory_assets)
108
+ utils = Utils()
109
+ utils.unzip_file(name_zip, directory_assets)
112
110
 
113
111
  def run_tool(
114
112
  self, config_tool, folders_to_scan, **kwargs
@@ -120,7 +118,8 @@ class KicsTool(ToolGateway):
120
118
  self.get_assets(kics_version)
121
119
 
122
120
  os_platform = platform.system()
123
- self.select_operative_system(os_platform, folders_to_scan, config_tool, path_kics)
121
+ command_prefix = self.select_operative_system(os_platform, config_tool, path_kics)
122
+ self.execute_kics(folders_to_scan, command_prefix)
124
123
 
125
124
  data = self.load_results()
126
125
  if data:
@@ -46,7 +46,7 @@ class KubescapeDeserealizator:
46
46
  resource = resources.get(resource_id)
47
47
 
48
48
  if resource:
49
- relative_path = resource.get("source", {}).get("path", "").replace("\\", "/")
49
+ relative_path = resource.get("source", {}).get("relativePath", "").replace("\\", "/")
50
50
  severity_score = self.get_severity_score(frameworks, control_id)
51
51
 
52
52
  result_extracted_data.append({
@@ -72,30 +72,28 @@ class KubescapeTool(ToolGateway):
72
72
  logger.error("The JSON result is empty.")
73
73
  return None
74
74
 
75
- def select_operative_system(self, os_platform, folders_to_scan, base_url):
75
+ def select_operative_system(self, os_platform, base_url):
76
76
  if os_platform == "Linux":
77
77
  distro_name = distro.name()
78
78
  if distro_name == "Ubuntu":
79
79
  file = "kubescape-ubuntu-latest"
80
80
  self.install_tool(file, base_url + file)
81
- command_prefix = f"./{file}"
81
+ return f"./{file}"
82
82
  else:
83
83
  logger.warning(f"{distro_name} is not supported.")
84
84
  return None
85
85
  elif os_platform == "Windows":
86
86
  file = "kubescape-windows-latest.exe"
87
87
  self.install_tool_windows(file, base_url + file)
88
- command_prefix = f"./{file}"
88
+ return f"./{file}"
89
89
  elif os_platform == "Darwin":
90
90
  file = "kubescape-macos-latest"
91
91
  self.install_tool(file, base_url + file)
92
- command_prefix = f"./{file}"
92
+ return f"./{file}"
93
93
  else:
94
94
  logger.warning(f"{os_platform} is not supported.")
95
95
  return [], None
96
96
 
97
- self.execute_kubescape(folders_to_scan, command_prefix)
98
-
99
97
  def run_tool(self, config_tool, folders_to_scan, platform_to_scan, **kwargs):
100
98
 
101
99
  if folders_to_scan and "k8s" in platform_to_scan:
@@ -103,7 +101,8 @@ class KubescapeTool(ToolGateway):
103
101
  kubescape_version = config_tool["KUBESCAPE"]["VERSION"]
104
102
  os_platform = platform.system()
105
103
  base_url = f"https://github.com/kubescape/kubescape/releases/download/v{kubescape_version}/"
106
- self.select_operative_system(os_platform, folders_to_scan, base_url)
104
+ command_prefix = self.select_operative_system(os_platform, base_url)
105
+ self.execute_kubescape(folders_to_scan, command_prefix)
107
106
 
108
107
  json_name = "results_kubescape.json"
109
108
  data = self.load_json(json_name)
@@ -11,7 +11,7 @@ from devsecops_engine_tools.engine_utilities.git_cli.infrastructure.git_run impo
11
11
  GitRun
12
12
  )
13
13
 
14
- def runner_secret_scan(dict_args, tool, devops_platform_gateway):
14
+ def runner_secret_scan(dict_args, tool, devops_platform_gateway, secret_tool):
15
15
  try:
16
16
  tool_deserealizator = None
17
17
  tool_gateway = None
@@ -25,7 +25,8 @@ def runner_secret_scan(dict_args, tool, devops_platform_gateway):
25
25
  dict_args = dict_args,
26
26
  tool=tool,
27
27
  tool_deserealizator = tool_deserealizator,
28
- git_gateway = git_gateway
28
+ git_gateway = git_gateway,
29
+ secret_tool = secret_tool
29
30
  )
30
31
  except Exception as e:
31
32
  raise Exception(f"Error engine_secret : {str(e)}")
@@ -9,3 +9,6 @@ class DeserializeConfigTool:
9
9
  self.exclude_path = json_data[tool]["EXCLUDE_PATH"]
10
10
  self.number_threads = json_data[tool]["NUMBER_THREADS"]
11
11
  self.target_branches = json_data["TARGET_BRANCHES"]
12
+ self.enable_custom_rules = json_data[tool]["ENABLE_CUSTOM_RULES"]
13
+ self.external_dir_owner = json_data[tool]["EXTERNAL_DIR_OWNER"]
14
+ self.external_dir_repo = json_data[tool]["EXTERNAL_DIR_REPOSITORY"]
@@ -1,5 +1,5 @@
1
1
  from abc import ABCMeta, abstractmethod
2
-
2
+ from devsecops_engine_tools.engine_sast.engine_secret.src.domain.model.DeserializeConfigTool import DeserializeConfigTool
3
3
 
4
4
  class ToolGateway(metaclass=ABCMeta):
5
5
  @abstractmethod
@@ -8,9 +8,10 @@ class ToolGateway(metaclass=ABCMeta):
8
8
  @abstractmethod
9
9
  def run_tool_secret_scan(self,
10
10
  files_pullrequest: dict,
11
- exclude_path: dict,
12
11
  agent_os: str,
13
12
  agent_work_folder: str,
14
- num_threads: int,
15
- repository_name: str) -> str:
13
+ repository_name: str,
14
+ config_tool: DeserializeConfigTool,
15
+ secret_tool,
16
+ secret_external_checks) -> str:
16
17
  "run tool secret scan"
@@ -28,9 +28,10 @@ class SecretScan:
28
28
  self.tool_deserialize = tool_deserialize
29
29
  self.git_gateway = git_gateway
30
30
 
31
- def process(self, skip_tool, config_tool):
31
+ def process(self, skip_tool, config_tool, secret_tool, dict_args):
32
32
  finding_list = []
33
33
  file_path_findings = ""
34
+ secret_external_checks=dict_args["token_external_checks"]
34
35
  if skip_tool == False:
35
36
  self.tool_gateway.install_tool(self.devops_platform_gateway.get_variable("os"), self.devops_platform_gateway.get_variable("temp_directory"))
36
37
  files_pullrequest = self.git_gateway.get_files_pull_request(
@@ -45,12 +46,12 @@ class SecretScan:
45
46
  self.devops_platform_gateway.get_variable("repository_provider"))
46
47
  findings, file_path_findings = self.tool_gateway.run_tool_secret_scan(
47
48
  files_pullrequest,
48
- config_tool.exclude_path,
49
49
  self.devops_platform_gateway.get_variable("os"),
50
50
  self.devops_platform_gateway.get_variable("path_directory"),
51
- config_tool.number_threads,
52
- self.devops_platform_gateway.get_variable("repository")
53
- )
51
+ self.devops_platform_gateway.get_variable("repository"),
52
+ config_tool,
53
+ secret_tool,
54
+ secret_external_checks)
54
55
  finding_list = self.tool_deserialize.get_list_vulnerability(
55
56
  findings,
56
57
  self.devops_platform_gateway.get_variable("os"),
@@ -7,6 +7,13 @@ import concurrent.futures
7
7
  from devsecops_engine_tools.engine_sast.engine_secret.src.domain.model.gateway.tool_gateway import (
8
8
  ToolGateway,
9
9
  )
10
+ from devsecops_engine_tools.engine_utilities.github.infrastructure.github_api import (
11
+ GithubApi,
12
+ )
13
+ from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
14
+ from devsecops_engine_tools.engine_utilities import settings
15
+
16
+ logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
10
17
 
11
18
  result = []
12
19
 
@@ -40,20 +47,34 @@ class TrufflehogRun(ToolGateway):
40
47
  def run_tool_secret_scan(
41
48
  self,
42
49
  files_commits,
43
- exclude_paths,
44
50
  agent_os,
45
51
  agent_work_folder,
46
- num_threads,
47
52
  repository_name,
53
+ config_tool,
54
+ secret_tool,
55
+ secret_external_checks
48
56
  ):
49
57
  trufflehog_command = "trufflehog"
50
58
  if "Windows" in agent_os:
51
59
  trufflehog_command = "C:/Trufflehog/bin/trufflehog.exe"
52
60
  with open(f"{agent_work_folder}/excludedPath.txt", "w") as file:
53
- file.write("\n".join(exclude_paths))
61
+ file.write("\n".join(config_tool.exclude_path))
54
62
  exclude_path = f"{agent_work_folder}/excludedPath.txt"
55
63
  include_paths = self.config_include_path(files_commits, agent_work_folder)
56
- with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor:
64
+ enable_custom_rules = config_tool.enable_custom_rules.lower()
65
+ secret = None
66
+
67
+ if secret_tool is not None:
68
+ secret = secret_tool["github_token"] if "github" in secret_tool else None
69
+ elif secret_external_checks is not None:
70
+ secret = secret_external_checks.split("github:")[1] if "github" in secret_external_checks else None
71
+
72
+ if enable_custom_rules == "true" and secret is not None:
73
+ self.configurate_external_checks(config_tool, secret)
74
+ else: #In case that remote config from tool is enable but in the args dont send any type of secrets. So dont modified command
75
+ enable_custom_rules == "false"
76
+
77
+ with concurrent.futures.ThreadPoolExecutor(max_workers=config_tool.number_threads) as executor:
57
78
  results = executor.map(
58
79
  self.run_trufflehog,
59
80
  [trufflehog_command] * len(include_paths),
@@ -61,6 +82,7 @@ class TrufflehogRun(ToolGateway):
61
82
  [exclude_path] * len(include_paths),
62
83
  include_paths,
63
84
  [repository_name] * len(include_paths),
85
+ [enable_custom_rules],
64
86
  )
65
87
  findings, file_findings = self.create_file(self.decode_output(results), agent_work_folder)
66
88
  return findings, file_findings
@@ -90,8 +112,13 @@ class TrufflehogRun(ToolGateway):
90
112
  exclude_path,
91
113
  include_path,
92
114
  repository_name,
115
+ enable_custom_rules
93
116
  ):
94
117
  command = f"{trufflehog_command} filesystem {agent_work_folder + '/' + repository_name} --include-paths {include_path} --exclude-paths {exclude_path} --no-verification --json"
118
+
119
+ if enable_custom_rules == "true":
120
+ command = command.replace("--no-verification --json", "--config /tmp/rules/trufflehog/custom-rules.yaml --no-verification --json")
121
+
95
122
  result = subprocess.run(command, capture_output=True, shell=True, text=True)
96
123
  return result.stdout.strip()
97
124
 
@@ -115,4 +142,15 @@ class TrufflehogRun(ToolGateway):
115
142
  find["SourceMetadata"]["Data"]["Filesystem"]["file"] = where_text
116
143
  json_str = json.dumps(find)
117
144
  file.write(json_str + '\n')
118
- return findings, file_findings
145
+ return findings, file_findings
146
+
147
+ def configurate_external_checks(self, config_tool, secret):
148
+ try:
149
+ github_api = GithubApi(secret)
150
+ github_api.download_latest_release_assets(
151
+ config_tool.external_dir_owner,
152
+ config_tool.external_dir_repo,
153
+ "/tmp",
154
+ )
155
+ except Exception as ex:
156
+ logger.error(f"An error ocurred download external checks {ex}")
@@ -4,13 +4,13 @@ from devsecops_engine_tools.engine_sast.engine_secret.src.domain.usecases.set_in
4
4
  SetInputCore,
5
5
  )
6
6
 
7
- def engine_secret_scan(devops_platform_gateway, tool_gateway, dict_args, tool, tool_deserealizator, git_gateway):
7
+ def engine_secret_scan(devops_platform_gateway, tool_gateway, dict_args, tool, tool_deserealizator, git_gateway, secret_tool):
8
8
  exclusions = devops_platform_gateway.get_remote_config(
9
9
  dict_args["remote_config_repo"], "engine_sast/engine_secret/Exclusions.json"
10
10
  )
11
11
  secret_scan = SecretScan(tool_gateway, devops_platform_gateway, tool_deserealizator, git_gateway)
12
12
  config_tool = secret_scan.complete_config_tool(dict_args, tool)
13
13
  skip_tool = secret_scan.skip_from_exclusion(exclusions)
14
- finding_list, file_path_findings = secret_scan.process(skip_tool, config_tool)
14
+ finding_list, file_path_findings = secret_scan.process(skip_tool, config_tool, secret_tool, dict_args)
15
15
  input_core = SetInputCore(devops_platform_gateway, dict_args, tool, config_tool)
16
16
  return finding_list, input_core.set_input_core(file_path_findings)
@@ -4,6 +4,12 @@ from devsecops_engine_tools.engine_sca.engine_dependencies.src.infrastructure.dr
4
4
  from devsecops_engine_tools.engine_sca.engine_dependencies.src.infrastructure.driven_adapters.xray_tool.xray_deserialize_output import (
5
5
  XrayDeserializator,
6
6
  )
7
+ from devsecops_engine_tools.engine_sca.engine_dependencies.src.infrastructure.driven_adapters.dependency_check.dependency_check_tool import (
8
+ DependencyCheckTool,
9
+ )
10
+ from devsecops_engine_tools.engine_sca.engine_dependencies.src.infrastructure.driven_adapters.dependency_check.dependency_check_deserialize import (
11
+ DependencyCheckDeserialize,
12
+ )
7
13
  from devsecops_engine_tools.engine_sca.engine_dependencies.src.infrastructure.entry_points.entry_point_tool import (
8
14
  init_engine_dependencies,
9
15
  )
@@ -11,9 +17,21 @@ from devsecops_engine_tools.engine_sca.engine_dependencies.src.infrastructure.en
11
17
 
12
18
  def runner_engine_dependencies(dict_args, config_tool, secret_tool, devops_platform_gateway):
13
19
  try:
14
- if config_tool["ENGINE_DEPENDENCIES"]["TOOL"] == "XRAY":
15
- tool_run = XrayScan()
16
- tool_deserializator = XrayDeserializator()
20
+ tools_mapping = {
21
+ "XRAY": {
22
+ "tool_run": XrayScan,
23
+ "tool_deserializator": XrayDeserializator
24
+ },
25
+ "DEPENDENCY_CHECK": {
26
+ "tool_run": DependencyCheckTool,
27
+ "tool_deserializator": DependencyCheckDeserialize
28
+ }
29
+ }
30
+
31
+ selected_tool = config_tool["ENGINE_DEPENDENCIES"]["TOOL"]
32
+ tool_run = tools_mapping[selected_tool]["tool_run"]()
33
+ tool_deserializator = tools_mapping[selected_tool]["tool_deserializator"]()
34
+
17
35
 
18
36
  return init_engine_dependencies(
19
37
  tool_run,
@@ -0,0 +1,62 @@
1
+ from devsecops_engine_tools.engine_sca.engine_dependencies.src.domain.model.gateways.deserializator_gateway import (
2
+ DeserializatorGateway,
3
+ )
4
+ from devsecops_engine_tools.engine_core.src.domain.model.finding import (
5
+ Finding,
6
+ Category,
7
+ )
8
+ from dataclasses import dataclass
9
+ from datetime import datetime
10
+ import json
11
+ import os
12
+ from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
13
+ from devsecops_engine_tools.engine_utilities import settings
14
+
15
+ logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
16
+
17
+ @dataclass
18
+ class DependencyCheckDeserialize(DeserializatorGateway):
19
+
20
+ def get_list_findings(self, dependencies_scanned_file) -> "list[Finding]":
21
+ filename, extension = os.path.splitext(dependencies_scanned_file)
22
+ if extension.lower() != ".json":
23
+ dependencies_scanned_file = f"{filename}.json"
24
+
25
+ data_result = self.load_results(dependencies_scanned_file)
26
+
27
+ list_open_vulnerabilities = []
28
+ for dependency in data_result.get("dependencies", []):
29
+ for vulnerability in dependency.get("vulnerabilities", []):
30
+ vulnerable_software = vulnerability.get("vulnerableSoftware", [])
31
+ fix = (
32
+ vulnerable_software[0]
33
+ .get("software", {})
34
+ .get("versionEndExcluding", None)
35
+ if vulnerable_software
36
+ else None
37
+ )
38
+ finding_open = Finding(
39
+ id=vulnerability["name"][:20],
40
+ cvss=str(vulnerability.get("cvssv3", {})),
41
+ where=dependency.get("fileName").split(':')[-1].strip(),
42
+ description=vulnerability["description"][:170].replace("\n\n", " "),
43
+ severity=vulnerability["severity"].lower(),
44
+ identification_date=datetime.now().strftime("%d%m%Y"),
45
+ published_date_cve=None,
46
+ module="engine_dependencies",
47
+ category=Category.VULNERABILITY,
48
+ requirements=fix,
49
+ tool="DEPENDENCY_CHECK"
50
+ )
51
+ list_open_vulnerabilities.append(finding_open)
52
+
53
+ return list_open_vulnerabilities
54
+
55
+ def load_results(self, dependencies_scanned_file):
56
+ try:
57
+ with open(dependencies_scanned_file) as f:
58
+ data = json.load(f)
59
+ return data
60
+ except Exception as ex:
61
+ logger.error(f"An error ocurred loading dependency-check results {ex}")
62
+ return None
@@ -0,0 +1,120 @@
1
+ from devsecops_engine_tools.engine_sca.engine_dependencies.src.domain.model.gateways.tool_gateway import (
2
+ ToolGateway,
3
+ )
4
+
5
+ import requests
6
+ import subprocess
7
+ import os
8
+ import platform
9
+ import shutil
10
+
11
+ from devsecops_engine_tools.engine_utilities.utils.utils import Utils
12
+ from devsecops_engine_tools.engine_sca.engine_dependencies.src.infrastructure.helpers.get_artifacts import GetArtifacts
13
+ from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
14
+ from devsecops_engine_tools.engine_utilities import settings
15
+
16
+ logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
17
+
18
+
19
+ class DependencyCheckTool(ToolGateway):
20
+ def download_tool(self, cli_version):
21
+ try:
22
+ url = f"https://github.com/jeremylong/DependencyCheck/releases/download/v{cli_version}/dependency-check-{cli_version}-release.zip"
23
+ response = requests.get(url, allow_redirects=True)
24
+ home_directory = os.path.expanduser("~")
25
+ zip_name = os.path.join(home_directory, f"dependency_check_{cli_version}.zip")
26
+ with open(zip_name, "wb") as f:
27
+ f.write(response.content)
28
+
29
+ utils = Utils()
30
+ utils.unzip_file(zip_name, home_directory)
31
+ except Exception as ex:
32
+ logger.error(f"An error ocurred downloading dependency-check {ex}")
33
+
34
+ def install_tool(self, cli_version, is_windows=False):
35
+ command_prefix = "dependency-check.bat" if is_windows else "dependency-check.sh"
36
+
37
+ installed = shutil.which(command_prefix)
38
+ if installed:
39
+ return command_prefix
40
+
41
+ home_directory = os.path.expanduser("~")
42
+ bin_route = os.path.join(home_directory, f"dependency-check/bin/{command_prefix}")
43
+
44
+ if shutil.which(bin_route):
45
+ return bin_route
46
+
47
+ self.download_tool(cli_version)
48
+
49
+ try:
50
+ if os.path.exists(bin_route):
51
+ if not is_windows:
52
+ subprocess.run(["chmod", "+x", bin_route], check=True)
53
+ return bin_route
54
+ except Exception as e:
55
+ logger.error(f"Error installing OWASP dependency check: {e}")
56
+ return None
57
+
58
+ def scan_dependencies(self, command_prefix, file_to_scan, token):
59
+ try:
60
+ command = [command_prefix, "--format", "JSON", "--format", "XML", "--nvdApiKey", token, "--scan", file_to_scan,]
61
+
62
+ if not token:
63
+ print("¡¡Remember!!, it is recommended to use the API key for faster vulnerability database downloads.")
64
+ command = [command_prefix, "--format", "JSON", "--format", "XML", "--scan", file_to_scan,]
65
+
66
+ subprocess.run(command, capture_output=True, check=True)
67
+ except subprocess.CalledProcessError as error:
68
+ logger.error(f"Error executing OWASP dependency check scan: {error}")
69
+
70
+ def select_operative_system(self, cli_version):
71
+ os_platform = platform.system()
72
+
73
+ if os_platform in ["Linux", "Darwin"]:
74
+ return self.install_tool(cli_version, is_windows=False)
75
+ elif os_platform == "Windows":
76
+ return self.install_tool(cli_version, is_windows=True)
77
+ else:
78
+ logger.warning(f"{os_platform} is not supported.")
79
+ return None
80
+
81
+ def search_result(self):
82
+ try:
83
+ file_result = os.path.join(os.getcwd(), "dependency-check-report.xml")
84
+ return file_result
85
+ except Exception as ex:
86
+ logger.error(f"An error ocurred search dependency-check results {ex}")
87
+ return None
88
+
89
+ def is_java_installed(self):
90
+ return shutil.which("java") is not None
91
+
92
+ def run_tool_dependencies_sca(
93
+ self,
94
+ remote_config,
95
+ dict_args,
96
+ exclusion,
97
+ pipeline_name,
98
+ to_scan,
99
+ token,
100
+ token_engine_dependencies
101
+ ):
102
+ if not self.is_java_installed():
103
+ logger.error("Java is not installed, please install it to run dependency check")
104
+ return None
105
+
106
+ cli_version = remote_config["DEPENDENCY_CHECK"]["CLI_VERSION"]
107
+
108
+ get_artifacts = GetArtifacts()
109
+
110
+ pattern = get_artifacts.excluded_files(remote_config, pipeline_name, exclusion, "DEPENDENCY_CHECK")
111
+ to_scan = get_artifacts.find_artifacts(
112
+ to_scan, pattern, remote_config["DEPENDENCY_CHECK"]["PACKAGES_TO_SCAN"]
113
+ )
114
+
115
+ if not to_scan:
116
+ return None
117
+
118
+ command_prefix = self.select_operative_system(cli_version)
119
+ self.scan_dependencies(command_prefix, to_scan, token_engine_dependencies)
120
+ return self.search_result()
@@ -8,9 +8,8 @@ import requests
8
8
  import re
9
9
  import os
10
10
  import json
11
- import shutil
12
- import tarfile
13
11
 
12
+ from devsecops_engine_tools.engine_sca.engine_dependencies.src.infrastructure.helpers.get_artifacts import GetArtifacts
14
13
  from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
15
14
  from devsecops_engine_tools.engine_utilities import settings
16
15
 
@@ -18,100 +17,6 @@ logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
18
17
 
19
18
 
20
19
  class XrayScan(ToolGateway):
21
- def excluded_files(self, remote_config, pipeline_name, exclusions):
22
- pattern = remote_config["XRAY"]["REGEX_EXPRESSION_EXTENSIONS"]
23
- if pipeline_name in exclusions:
24
- for ex in exclusions[pipeline_name]["XRAY"]:
25
- if ex.get("SKIP_FILES", 0):
26
- exclusion = ex.get("SKIP_FILES")
27
- if exclusion.get("files", 0):
28
- excluded_file_types = exclusion["files"]
29
- pattern2 = pattern
30
- for ext in excluded_file_types:
31
- pattern2 = (
32
- pattern2.replace("|" + ext, "")
33
- .replace(ext + "|", "")
34
- .replace(ext, "")
35
- )
36
- pattern = pattern2
37
-
38
- return pattern
39
-
40
- def find_packages(self, pattern, packages, working_dir):
41
- packages_list = []
42
- files_list = []
43
- extension_pattern = re.compile(pattern, re.IGNORECASE)
44
- for root, dirs, files in os.walk(working_dir):
45
- components = root.split(os.path.sep)
46
- flag = 0
47
- for package in packages:
48
- if not (package in components):
49
- flag = 1
50
- if package in dirs:
51
- packages_list.append(os.path.join(root, package))
52
- if flag:
53
- for file in files:
54
- if extension_pattern.search(file):
55
- files_list.append(os.path.join(root, file))
56
- return packages_list, files_list
57
-
58
- def compress_and_mv(self, tar_path, package):
59
- try:
60
- with tarfile.open(tar_path, "w") as tar:
61
- tar.add(
62
- package,
63
- arcname=os.path.basename(package),
64
- filter=lambda x: None if "/.bin/" in x.name else x,
65
- )
66
-
67
- except subprocess.CalledProcessError as e:
68
- logger.error(f"Error during {package} compression: {e}")
69
-
70
- def move_files(self, dir_to_scan_path, finded_files):
71
- for file in finded_files:
72
- target = os.path.join(dir_to_scan_path, os.path.basename(file))
73
- shutil.copy2(file, target)
74
- logger.debug(f"File to scan: {file}")
75
-
76
- def find_artifacts(self, to_scan, pattern, packages):
77
- dir_to_scan_path = os.path.join(to_scan, "dependencies_to_scan")
78
- if os.path.exists(dir_to_scan_path):
79
- shutil.rmtree(dir_to_scan_path)
80
- os.makedirs(dir_to_scan_path)
81
-
82
- packages_list, files_list = self.find_packages(pattern, packages, to_scan)
83
-
84
- for package in packages_list:
85
- tar_path = os.path.join(
86
- dir_to_scan_path,
87
- "pkg"
88
- + str(packages_list.index(package) + 1)
89
- + "_"
90
- + os.path.basename(package)
91
- + ".tar",
92
- )
93
- self.compress_and_mv(tar_path, package)
94
-
95
- if len(files_list):
96
- self.move_files(dir_to_scan_path, files_list)
97
-
98
- files = os.listdir(dir_to_scan_path)
99
- files = [
100
- file
101
- for file in files
102
- if os.path.isfile(os.path.join(dir_to_scan_path, file))
103
- ]
104
- file_to_scan = None
105
- if files:
106
- file_to_scan = os.path.join(dir_to_scan_path, "file_to_scan.tar")
107
- self.compress_and_mv(file_to_scan, dir_to_scan_path)
108
- files_string = ", ".join(files)
109
- logger.debug(f"Files to scan: {files_string}")
110
- print(f"Files to scan: {files_string}")
111
- else:
112
- logger.warning("No artifacts found")
113
-
114
- return file_to_scan
115
20
 
116
21
  def install_tool_linux(self, prefix, version):
117
22
  installed = subprocess.run(
@@ -241,8 +146,9 @@ class XrayScan(ToolGateway):
241
146
  ):
242
147
  token = secret_tool["token_xray"] if secret_tool else token_engine_dependencies
243
148
  if dict_args["xray_mode"] == "scan":
244
- pattern = self.excluded_files(remote_config, pipeline_name, exclusion)
245
- to_scan = self.find_artifacts(
149
+ get_artifacts = GetArtifacts()
150
+ pattern = get_artifacts.excluded_files(remote_config, pipeline_name, exclusion, "XRAY")
151
+ to_scan = get_artifacts.find_artifacts(
246
152
  to_scan, pattern, remote_config["XRAY"]["PACKAGES_TO_SCAN"]
247
153
  )
248
154
  cwd = os.getcwd()
@@ -0,0 +1,107 @@
1
+ import os
2
+ import re
3
+ import tarfile
4
+ import subprocess
5
+ import shutil
6
+
7
+ from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
8
+ from devsecops_engine_tools.engine_utilities import settings
9
+
10
+ logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
11
+
12
+ class GetArtifacts:
13
+
14
+ def excluded_files(self, remote_config, pipeline_name, exclusions, tool):
15
+ pattern = remote_config[tool]["REGEX_EXPRESSION_EXTENSIONS"]
16
+ if pipeline_name in exclusions:
17
+ for ex in exclusions[pipeline_name][tool]:
18
+ if ex.get("SKIP_FILES", 0):
19
+ exclusion = ex.get("SKIP_FILES")
20
+ if exclusion.get("files", 0):
21
+ excluded_file_types = exclusion["files"]
22
+ pattern2 = pattern
23
+ for ext in excluded_file_types:
24
+ pattern2 = (
25
+ pattern2.replace("|" + ext, "")
26
+ .replace(ext + "|", "")
27
+ .replace(ext, "")
28
+ )
29
+ pattern = pattern2
30
+
31
+ return pattern
32
+
33
+ def find_packages(self, pattern, packages, working_dir):
34
+ packages_list = []
35
+ files_list = []
36
+ extension_pattern = re.compile(pattern, re.IGNORECASE)
37
+ for root, dirs, files in os.walk(working_dir):
38
+ components = root.split(os.path.sep)
39
+ flag = 0
40
+ for package in packages:
41
+ if not (package in components):
42
+ flag = 1
43
+ if package in dirs:
44
+ packages_list.append(os.path.join(root, package))
45
+ if flag:
46
+ for file in files:
47
+ if extension_pattern.search(file):
48
+ files_list.append(os.path.join(root, file))
49
+ return packages_list, files_list
50
+
51
+ def compress_and_mv(self, tar_path, package):
52
+ try:
53
+ with tarfile.open(tar_path, "w") as tar:
54
+ tar.add(
55
+ package,
56
+ arcname=os.path.basename(package),
57
+ filter=lambda x: None if "/.bin/" in x.name else x,
58
+ )
59
+
60
+ except subprocess.CalledProcessError as e:
61
+ logger.error(f"Error during {package} compression: {e}")
62
+
63
+ def move_files(self, dir_to_scan_path, finded_files):
64
+ for file in finded_files:
65
+ target = os.path.join(dir_to_scan_path, os.path.basename(file))
66
+ shutil.copy2(file, target)
67
+ logger.debug(f"File to scan: {file}")
68
+
69
+ def find_artifacts(self, to_scan, pattern, packages):
70
+ dir_to_scan_path = os.path.join(to_scan, "dependencies_to_scan")
71
+ if os.path.exists(dir_to_scan_path):
72
+ shutil.rmtree(dir_to_scan_path)
73
+ os.makedirs(dir_to_scan_path)
74
+
75
+ packages_list, files_list = self.find_packages(pattern, packages, to_scan)
76
+
77
+ for package in packages_list:
78
+ tar_path = os.path.join(
79
+ dir_to_scan_path,
80
+ "pkg"
81
+ + str(packages_list.index(package) + 1)
82
+ + "_"
83
+ + os.path.basename(package)
84
+ + ".tar",
85
+ )
86
+ self.compress_and_mv(tar_path, package)
87
+
88
+ if len(files_list):
89
+ self.move_files(dir_to_scan_path, files_list)
90
+
91
+ files = os.listdir(dir_to_scan_path)
92
+ files = [
93
+ file
94
+ for file in files
95
+ if os.path.isfile(os.path.join(dir_to_scan_path, file))
96
+ ]
97
+ file_to_scan = None
98
+ if files:
99
+ file_to_scan = os.path.join(dir_to_scan_path, "file_to_scan.tar")
100
+ self.compress_and_mv(file_to_scan, dir_to_scan_path)
101
+ files_string = ", ".join(files)
102
+ logger.debug(f"Files to scan: {files_string}")
103
+ print(f"Files to scan: {files_string}")
104
+ else:
105
+ logger.warning("No artifacts found")
106
+
107
+ return file_to_scan
@@ -0,0 +1,8 @@
1
+ import zipfile
2
+
3
+
4
+ class Utils:
5
+
6
+ def unzip_file(self, zip_file_path, extract_path):
7
+ with zipfile.ZipFile(zip_file_path, "r") as zip_ref:
8
+ zip_ref.extractall(extract_path)
@@ -1 +1 @@
1
- version = '1.11.1'
1
+ version = '1.11.3'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: devsecops-engine-tools
3
- Version: 1.11.1
3
+ Version: 1.11.3
4
4
  Summary: Tool for DevSecOps strategy
5
5
  Home-page: https://github.com/bancolombia/devsecops-engine-tools
6
6
  Author: Bancolombia DevSecOps Team
@@ -144,10 +144,14 @@ devsecops-engine-tools --platform_devops ["local","azure","github"] --remote_con
144
144
  <td>Free</td>
145
145
  </tr>
146
146
  <tr>
147
- <td>ENGINE_DEPENDENCIES</td>
147
+ <td rowspan="2">ENGINE_DEPENDENCIES</td>
148
148
  <td><a href="https://jfrog.com/help/r/get-started-with-the-jfrog-platform/jfrog-xray">XRAY</a></td>
149
149
  <td>Paid</td>
150
150
  </tr>
151
+ <tr>
152
+ <td><a href="https://owasp.org/www-project-dependency-check/">DEPENDENCY CHECK</a></td>
153
+ <td>Free</td>
154
+ </tr>
151
155
  <tr>
152
156
  <td>ENGINE_CODE</td>
153
157
  <td><a href="https://docs.bearer.com/quickstart/">BEARER</a></td>
@@ -1,9 +1,9 @@
1
1
  devsecops_engine_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- devsecops_engine_tools/version.py,sha256=btqnS_uj6SwdE3vDHOWFU_jjL6pD7XcxwjTE_56MfvM,19
2
+ devsecops_engine_tools/version.py,sha256=CQyukqEY45E5SVb6nqvuhPs1-ZsVh_xiHbOu1JbPvIs,19
3
3
  devsecops_engine_tools/engine_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  devsecops_engine_tools/engine_core/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  devsecops_engine_tools/engine_core/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- devsecops_engine_tools/engine_core/src/applications/runner_engine_core.py,sha256=r4XhvElDN8DSkEEWSZ9nMi1V5j1hRDON0Y6rnRMT7-w,7179
6
+ devsecops_engine_tools/engine_core/src/applications/runner_engine_core.py,sha256=HIxw71J4LILlgHoDLT_snIVImTUSKSZ7kz4SfUxNDEw,7196
7
7
  devsecops_engine_tools/engine_core/src/deployment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  devsecops_engine_tools/engine_core/src/deployment/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  devsecops_engine_tools/engine_core/src/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -27,17 +27,17 @@ devsecops_engine_tools/engine_core/src/domain/model/gateway/vulnerability_manage
27
27
  devsecops_engine_tools/engine_core/src/domain/usecases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  devsecops_engine_tools/engine_core/src/domain/usecases/break_build.py,sha256=JP-i5SFaMN7Yi4uDCe_AE1kJ197g1IJGcwQdq-RYbk4,16198
29
29
  devsecops_engine_tools/engine_core/src/domain/usecases/handle_risk.py,sha256=Au_ZXqwDi3CbVpQWAd29oruDAcZ1RX4e7OABSa_aRyA,7093
30
- devsecops_engine_tools/engine_core/src/domain/usecases/handle_scan.py,sha256=T1NIik_mrV1sSF-2yc5QXFJxaiOkXXNsRciObfOcvP4,7012
30
+ devsecops_engine_tools/engine_core/src/domain/usecases/handle_scan.py,sha256=yrPQdNvFNDeS4g4UxdxFDj-yw17K_OZ3T-HDEiePknE,7041
31
31
  devsecops_engine_tools/engine_core/src/domain/usecases/metrics_manager.py,sha256=Xi0iNnPrFgqd2cBdAA5E_tgouhxs-BTo016aolnGgv8,2413
32
32
  devsecops_engine_tools/engine_core/src/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
34
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/aws/s3_manager.py,sha256=-9gFDcvOIiXDIv4TUXR9zP83GBgR3v-xgp3QgcoaCo4,1926
36
- devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/aws/secrets_manager.py,sha256=YW5n1SkeZFCNqFK8RCPmUxdy1NNEiOc-tHcYzSVAJOM,1658
36
+ devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/aws/secrets_manager.py,sha256=YcioUKsI_heIIcN8ITSoiebxMhUyo6G3cQ7BLOodV2U,1659
37
37
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/azure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/azure/azure_devops.py,sha256=blI4ZrquRE4y6DJ7N2YRx1nL0wrAXvdpx0fLSUf5qwA,4831
39
39
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
- devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py,sha256=BAk_rLQzZ9qV7fVTXQUMEw_7Sfn1iQ9ciIw2j9felxQ,16497
40
+ devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py,sha256=Ci4QY8zzdJR2RgZOCwoL2oPEcZ-NPesTVVQMR6epb2Y,16558
41
41
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
42
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/github/github_actions.py,sha256=pxlgjhX4-Dssn-XHKK8AdCOj6Ry6VcQtoDf5q8CxTks,3731
43
43
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/printer_pretty_table/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -126,10 +126,10 @@ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters
126
126
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/checkov/checkov_tool.py,sha256=B7M8NoGSfrWaQCjQIvc9zZ0GLWNWpK9mGqhsC5gepow,10822
127
127
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
128
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kics/kics_deserealizator.py,sha256=b1X5GWz2snJtsKZcGEsILNc178hv9p-lg-el0Jc-_Eo,2084
129
- devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kics/kics_tool.py,sha256=B-jjLEbpLnKlxvDhXPWXPwCKAqAjMy7uGqX8qkt-cNs,5317
129
+ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kics/kics_tool.py,sha256=8lda0A7huVSWgq2zMAN92vQv4ug0HiQMATGdXV5lgyA,5202
130
130
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kubescape/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
- devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kubescape/kubescape_deserealizator.py,sha256=i-hKFmR-OriwiiBg-3E3RKc7hjI1E8jv8Z7dQ8_Q0qE,2885
132
- devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kubescape/kubescape_tool.py,sha256=88c44Vg_kzyMiCH68rBC_Zrs7HzytCGhwBDIXLhA1Fw,4588
131
+ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kubescape/kubescape_deserealizator.py,sha256=bGOGmsIpJcQzTMxptJPwZCA9_2Woaua3pXmMs4kTnX8,2893
132
+ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kubescape/kubescape_tool.py,sha256=N17glvzoUkGQJ_1icqznpORXuKJRKEq8Ye1IleN5o1g,4544
133
133
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/entry_points/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
134
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/entry_points/entry_point_tool.py,sha256=60iaHYZZp5uTngD7a8vsQaQYsTfBzP_kp0xflfPNnk4,305
135
135
  devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -137,25 +137,25 @@ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/helpers/file_ge
137
137
  devsecops_engine_tools/engine_sast/engine_secret/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
138
138
  devsecops_engine_tools/engine_sast/engine_secret/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
139
  devsecops_engine_tools/engine_sast/engine_secret/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
- devsecops_engine_tools/engine_sast/engine_secret/src/applications/runner_secret_scan.py,sha256=yMzDoT6EpCVeuI-BLs0YfvAWcuWKWnSPoWSawdL_Cxk,1341
140
+ devsecops_engine_tools/engine_sast/engine_secret/src/applications/runner_secret_scan.py,sha256=Th6koLvl0fn5SUAXTZ4cy9PEPKMjYpbB9A2S5rSYWxU,1394
141
141
  devsecops_engine_tools/engine_sast/engine_secret/src/deployment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
142
  devsecops_engine_tools/engine_sast/engine_secret/src/deployment/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
143
143
  devsecops_engine_tools/engine_sast/engine_secret/src/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
144
- devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/DeserializeConfigTool.py,sha256=jSzaen30gGA1p3KPX70Zzx7P8yyZxtuNG9s1fBuzjwg,603
144
+ devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/DeserializeConfigTool.py,sha256=BSRubkd0WGZbhHleFl4PIPLScCTTUI8KnXO6B_xsyeo,828
145
145
  devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
146
  devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/gateway/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
147
  devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/gateway/gateway_deserealizator.py,sha256=4fYPengHW3K0uVP6wHgOiNu-gRb08m78E7QZayZ2LC4,441
148
- devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/gateway/tool_gateway.py,sha256=juharYjy__KyB0fFCbU30k_aLd_9cQgsoCMeodq9ebA,593
148
+ devsecops_engine_tools/engine_sast/engine_secret/src/domain/model/gateway/tool_gateway.py,sha256=KncnzIAmjmnt3qNWiRY0bnEvk_L68V16xQIILsWjhUg,778
149
149
  devsecops_engine_tools/engine_sast/engine_secret/src/domain/usecases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
150
- devsecops_engine_tools/engine_sast/engine_secret/src/domain/usecases/secret_scan.py,sha256=lxvqAtn3TD9xe-VYeVarlRbdG8eWpP5AtoMA0u8hqJI,3904
150
+ devsecops_engine_tools/engine_sast/engine_secret/src/domain/usecases/secret_scan.py,sha256=si5QB_2fB3XpigVlEZlSi1OICL0d8KFusYT3CxKFupM,3990
151
151
  devsecops_engine_tools/engine_sast/engine_secret/src/domain/usecases/set_input_core.py,sha256=k0LZd9PJpqEDns6DLYRGu9DzpRZeFsxAnowcjP5Rml4,2838
152
152
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
153
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
154
154
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
155
155
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/trufflehog_deserealizator.py,sha256=WpFFswOmP38cLvfZHCrPDiRtdwH86n1CqVNS3K4s6uA,1968
156
- devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/trufflehog_run.py,sha256=cvCSKTDN-4oL9H5EZF_-WrP5bNamFt0WfeCwaMO_Nfo,5345
156
+ devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/trufflehog_run.py,sha256=TgOoh-VvBjO6ZfiJxwskSJbXc_aBuQZ6JGOZ81X4DPw,7131
157
157
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/entry_points/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
158
- devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/entry_points/entry_point_tool.py,sha256=WJJVGqE0PJMoATi8ubTGsqyrx4KqEQluXCg9Hk-NiOw,982
158
+ devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/entry_points/entry_point_tool.py,sha256=TAEZ2HquyM_0ZWMh5_8-qE0OI5EMG0VfyOlypZswbLI,1019
159
159
  devsecops_engine_tools/engine_sca/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
160
  devsecops_engine_tools/engine_sca/engine_container/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
161
161
  devsecops_engine_tools/engine_sca/engine_container/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -189,7 +189,7 @@ devsecops_engine_tools/engine_sca/engine_container/src/infrastructure/helpers/__
189
189
  devsecops_engine_tools/engine_sca/engine_dependencies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
190
190
  devsecops_engine_tools/engine_sca/engine_dependencies/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
191
191
  devsecops_engine_tools/engine_sca/engine_dependencies/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
192
- devsecops_engine_tools/engine_sca/engine_dependencies/src/applications/runner_dependencies_scan.py,sha256=JO4ntGcCiBEgIbwwXK7pLhntmgBvY6707tcktfIrfJg,1126
192
+ devsecops_engine_tools/engine_sca/engine_dependencies/src/applications/runner_dependencies_scan.py,sha256=xOdEmGIwBZNbD-C7f1h-tPP1uaVJ59F6z2a-BB9KAgc,1871
193
193
  devsecops_engine_tools/engine_sca/engine_dependencies/src/deployment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
194
194
  devsecops_engine_tools/engine_sca/engine_dependencies/src/deployment/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
195
195
  devsecops_engine_tools/engine_sca/engine_dependencies/src/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -203,12 +203,16 @@ devsecops_engine_tools/engine_sca/engine_dependencies/src/domain/usecases/handle
203
203
  devsecops_engine_tools/engine_sca/engine_dependencies/src/domain/usecases/set_input_core.py,sha256=ZMr9l1h9-JdoT7QlLN8K9VTP2VP0B_5TZGMUQ6KyIYo,2525
204
204
  devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
205
205
  devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
206
+ devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/dependency_check/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
207
+ devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/dependency_check/dependency_check_deserialize.py,sha256=kFBTOYSQlXdUL05NyiDHVEpQbWxpwbr3El9Fn8tTpN0,2584
208
+ devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/dependency_check/dependency_check_tool.py,sha256=auTknpEMwGgmEmg-OmsOZf8-H6W0O56VQD8DZNiT9HM,4600
206
209
  devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/xray_tool/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
207
210
  devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/xray_tool/xray_deserialize_output.py,sha256=Vm0pj1i6a34xXouXUU95Y04hzR--9tcMQuycR7IMUnQ,2221
208
- devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/xray_tool/xray_manager_scan.py,sha256=Pe23tbr-h1DuTb7cOHElSWiMLSY9Y8O6WNllwfyEwcw,10653
211
+ devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/xray_tool/xray_manager_scan.py,sha256=F6XmJNowQQCbfe_aRxals7xzw9XK9QRMCWmqYkqXFxQ,7109
209
212
  devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/entry_points/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
210
213
  devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/entry_points/entry_point_tool.py,sha256=qau5EXjyvKuXkcDPxVdc5B4lhwqv6VhcSBsAjFjNlCM,2536
211
214
  devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
215
+ devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/helpers/get_artifacts.py,sha256=EdEVr7hDyl0TSrSOBtfUVwk3ugkGTpBR5rLpIZnkp8I,4016
212
216
  devsecops_engine_tools/engine_utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
213
217
  devsecops_engine_tools/engine_utilities/settings.py,sha256=CPnDndwVeRgQNml3HVzvytVruDd8dTd1ICHbkMDSgTM,2144
214
218
  devsecops_engine_tools/engine_utilities/azuredevops/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -281,8 +285,9 @@ devsecops_engine_tools/engine_utilities/utils/logger_info.py,sha256=4Mz8Bwlm9Mku
281
285
  devsecops_engine_tools/engine_utilities/utils/name_conversion.py,sha256=ADJrRGaxYSDe0ZRh6VHRf53H4sXPcb-vNP_i81PUn3I,307
282
286
  devsecops_engine_tools/engine_utilities/utils/printers.py,sha256=amYAr9YQfYgR6jK9a2l26z3oovFPQ3FAKmhq6BKhEBA,623
283
287
  devsecops_engine_tools/engine_utilities/utils/session_manager.py,sha256=yNtlT-8Legz1sHbGPH8LNYjL-LgDUE0zXG2rYjiab7U,290
284
- devsecops_engine_tools-1.11.1.dist-info/METADATA,sha256=M-MkZURcurFuRrIu-VWMfqzvZMoavpfxPGMoIOfeFD8,10717
285
- devsecops_engine_tools-1.11.1.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
286
- devsecops_engine_tools-1.11.1.dist-info/entry_points.txt,sha256=9IjXF_7Zpgowq_SY6OSmsA9vZze18a8_AeHwkQVrgKk,131
287
- devsecops_engine_tools-1.11.1.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
288
- devsecops_engine_tools-1.11.1.dist-info/RECORD,,
288
+ devsecops_engine_tools/engine_utilities/utils/utils.py,sha256=esLnDBxP9MQBvV8noVohTrdWSVuljTKRpZgrn2kaD_c,192
289
+ devsecops_engine_tools-1.11.3.dist-info/METADATA,sha256=VRkwEUbIInau_l_QoB8XRTWq-W7ifGIqV1HByRv6gD8,10854
290
+ devsecops_engine_tools-1.11.3.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
291
+ devsecops_engine_tools-1.11.3.dist-info/entry_points.txt,sha256=9IjXF_7Zpgowq_SY6OSmsA9vZze18a8_AeHwkQVrgKk,131
292
+ devsecops_engine_tools-1.11.3.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
293
+ devsecops_engine_tools-1.11.3.dist-info/RECORD,,