devsecops-engine-tools 1.11.1__py3-none-any.whl → 1.11.2__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 (17) hide show
  1. devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py +2 -1
  2. devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kics/kics_tool.py +13 -14
  3. devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kubescape/kubescape_deserealizator.py +1 -1
  4. devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/driven_adapters/kubescape/kubescape_tool.py +6 -7
  5. devsecops_engine_tools/engine_sca/engine_dependencies/src/applications/runner_dependencies_scan.py +21 -3
  6. devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/dependency_check/__init__.py +0 -0
  7. devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/dependency_check/dependency_check_deserialize.py +62 -0
  8. devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/dependency_check/dependency_check_tool.py +120 -0
  9. devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/driven_adapters/xray_tool/xray_manager_scan.py +4 -98
  10. devsecops_engine_tools/engine_sca/engine_dependencies/src/infrastructure/helpers/get_artifacts.py +107 -0
  11. devsecops_engine_tools/engine_utilities/utils/utils.py +8 -0
  12. devsecops_engine_tools/version.py +1 -1
  13. {devsecops_engine_tools-1.11.1.dist-info → devsecops_engine_tools-1.11.2.dist-info}/METADATA +6 -2
  14. {devsecops_engine_tools-1.11.1.dist-info → devsecops_engine_tools-1.11.2.dist-info}/RECORD +17 -12
  15. {devsecops_engine_tools-1.11.1.dist-info → devsecops_engine_tools-1.11.2.dist-info}/WHEEL +0 -0
  16. {devsecops_engine_tools-1.11.1.dist-info → devsecops_engine_tools-1.11.2.dist-info}/entry_points.txt +0 -0
  17. {devsecops_engine_tools-1.11.1.dist-info → devsecops_engine_tools-1.11.2.dist-info}/top_level.txt +0 -0
@@ -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)
@@ -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.2'
@@ -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.2
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,5 +1,5 @@
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=oIWp2mvq7bBicZcvI_RJq4wlMsQh7x2xN_TUFBR4Kzk,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
@@ -37,7 +37,7 @@ devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/aws/secret
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
@@ -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.2.dist-info/METADATA,sha256=uRLLQfYRs_IosP3kHVzWoHJq8Oc7XEEua1uVkUpLU5g,10854
290
+ devsecops_engine_tools-1.11.2.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
291
+ devsecops_engine_tools-1.11.2.dist-info/entry_points.txt,sha256=9IjXF_7Zpgowq_SY6OSmsA9vZze18a8_AeHwkQVrgKk,131
292
+ devsecops_engine_tools-1.11.2.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
293
+ devsecops_engine_tools-1.11.2.dist-info/RECORD,,