devsecops-engine-tools 1.30.2__py3-none-any.whl → 1.32.0__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 (21) hide show
  1. devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py +87 -25
  2. devsecops_engine_tools/engine_sast/engine_secret/src/applications/runner_secret_scan.py +10 -0
  3. devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/gitleaks/__init__.py +0 -0
  4. devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/gitleaks/gitleaks_deserealizator.py +36 -0
  5. devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/gitleaks/gitleaks_tool.py +150 -0
  6. devsecops_engine_tools/engine_utilities/defect_dojo/__init__.py +2 -1
  7. devsecops_engine_tools/engine_utilities/defect_dojo/applications/component.py +0 -1
  8. devsecops_engine_tools/engine_utilities/defect_dojo/applications/finding.py +0 -3
  9. devsecops_engine_tools/engine_utilities/defect_dojo/applications/finding_exclusion.py +14 -0
  10. devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/finding_exclusion.py +20 -0
  11. devsecops_engine_tools/engine_utilities/defect_dojo/domain/serializers/finding.py +1 -1
  12. devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/finding_exclusion.py +9 -0
  13. devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/import_scan.py +6 -6
  14. devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/finding_exclusion.py +28 -0
  15. devsecops_engine_tools/engine_utilities/utils/utils.py +6 -1
  16. devsecops_engine_tools/version.py +1 -1
  17. {devsecops_engine_tools-1.30.2.dist-info → devsecops_engine_tools-1.32.0.dist-info}/METADATA +7 -2
  18. {devsecops_engine_tools-1.30.2.dist-info → devsecops_engine_tools-1.32.0.dist-info}/RECORD +21 -14
  19. {devsecops_engine_tools-1.30.2.dist-info → devsecops_engine_tools-1.32.0.dist-info}/WHEEL +0 -0
  20. {devsecops_engine_tools-1.30.2.dist-info → devsecops_engine_tools-1.32.0.dist-info}/entry_points.txt +0 -0
  21. {devsecops_engine_tools-1.30.2.dist-info → devsecops_engine_tools-1.32.0.dist-info}/top_level.txt +0 -0
@@ -13,6 +13,7 @@ from devsecops_engine_tools.engine_utilities.defect_dojo import (
13
13
  Engagement,
14
14
  Product,
15
15
  Component,
16
+ FindingExclusion
16
17
  )
17
18
  from devsecops_engine_tools.engine_core.src.domain.model.exclusions import Exclusions
18
19
  from devsecops_engine_tools.engine_core.src.domain.model.report import Report
@@ -42,9 +43,11 @@ logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
42
43
  @dataclass
43
44
  class DefectDojoPlatform(VulnerabilityManagementGateway):
44
45
 
46
+ RISK_ACCEPTED = "Risk Accepted"
45
47
  OUT_OF_SCOPE = "Out of Scope"
46
48
  FALSE_POSITIVE = "False Positive"
47
49
  TRANSFERRED_FINDING = "Transferred Finding"
50
+ ON_WHITELIST = "On Whitelist"
48
51
 
49
52
  def send_vulnerability_management(
50
53
  self, vulnerability_management: VulnerabilityManagement
@@ -79,6 +82,7 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
79
82
  "BEARER": "Bearer CLI",
80
83
  "DEPENDENCY_CHECK": "Dependency Check Scan",
81
84
  "SONARQUBE": "SonarQube API Import",
85
+ "GITLEAKS": "Gitleaks Scan"
82
86
  }
83
87
 
84
88
  if any(
@@ -203,6 +207,11 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
203
207
  "tags": tool,
204
208
  "limit": dd_limits_query,
205
209
  }
210
+ white_list_query_params = {
211
+ "risk_status": self.ON_WHITELIST,
212
+ "tags": tool,
213
+ "limit": dd_limits_query,
214
+ }
206
215
 
207
216
  exclusions_risk_accepted = self._get_findings_with_exclusions(
208
217
  session_manager,
@@ -211,7 +220,7 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
211
220
  risk_accepted_query_params,
212
221
  tool,
213
222
  self._format_date_to_dd_format,
214
- "Risk Accepted",
223
+ self.RISK_ACCEPTED,
215
224
  )
216
225
 
217
226
  exclusions_false_positive = self._get_findings_with_exclusions(
@@ -244,11 +253,29 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
244
253
  self.TRANSFERRED_FINDING,
245
254
  )
246
255
 
256
+ white_list = self._get_finding_exclusion(
257
+ session_manager, dd_max_retries, {
258
+ "type": "white_list",
259
+ }
260
+ )
261
+
262
+ exclusions_white_list = self._get_findings_with_exclusions(
263
+ session_manager,
264
+ service,
265
+ dd_max_retries,
266
+ white_list_query_params,
267
+ tool,
268
+ self._format_date_to_dd_format,
269
+ self.ON_WHITELIST,
270
+ white_list=white_list,
271
+ )
272
+
247
273
  return (
248
274
  list(exclusions_risk_accepted)
249
275
  + list(exclusions_false_positive)
250
276
  + list(exclusions_out_of_scope)
251
277
  + list(exclusions_transfer_finding)
278
+ + list(exclusions_white_list)
252
279
  )
253
280
  except Exception as ex:
254
281
  raise ExceptionFindingsExcepted(
@@ -272,8 +299,10 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
272
299
  "HOST_DEFECT_DOJO"
273
300
  ]
274
301
 
302
+ session_manager = self._get_session_manager(dict_args, secret_tool, config_tool)
303
+
275
304
  findings = self._get_findings(
276
- self._get_session_manager(dict_args, secret_tool, config_tool),
305
+ session_manager,
277
306
  service,
278
307
  max_retries,
279
308
  all_findings_query_params,
@@ -286,8 +315,14 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
286
315
  )
287
316
  )
288
317
 
318
+ white_list = self._get_finding_exclusion(
319
+ session_manager, max_retries, {
320
+ "type": "white_list",
321
+ }
322
+ )
323
+
289
324
  all_exclusions = self._get_report_exclusions(
290
- all_findings, self._format_date_to_dd_format, host_dd=host_dd
325
+ all_findings, self._format_date_to_dd_format, host_dd=host_dd, white_list=white_list
291
326
  )
292
327
 
293
328
  return all_findings, all_exclusions
@@ -461,25 +496,25 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
461
496
  config_tool["VULNERABILITY_MANAGER"]["DEFECT_DOJO"]["HOST_DEFECT_DOJO"],
462
497
  )
463
498
 
464
- def _get_report_exclusions(self, total_findings, date_fn, host_dd):
499
+ def _get_report_exclusions(self, total_findings, date_fn, host_dd, **kwargs):
465
500
  exclusions = []
466
501
  for finding in total_findings:
467
502
  if finding.risk_accepted:
468
503
  exclusions.append(
469
504
  self._create_report_exclusion(
470
- finding, date_fn, "engine_risk", "Risk Accepted", host_dd
505
+ finding, date_fn, "engine_risk", self.RISK_ACCEPTED, host_dd, **kwargs
471
506
  )
472
507
  )
473
508
  elif finding.false_p:
474
509
  exclusions.append(
475
510
  self._create_report_exclusion(
476
- finding, date_fn, "engine_risk", self.FALSE_POSITIVE, host_dd
511
+ finding, date_fn, "engine_risk", self.FALSE_POSITIVE, host_dd, **kwargs
477
512
  )
478
513
  )
479
514
  elif finding.out_of_scope:
480
515
  exclusions.append(
481
516
  self._create_report_exclusion(
482
- finding, date_fn, "engine_risk", self.OUT_OF_SCOPE, host_dd
517
+ finding, date_fn, "engine_risk", self.OUT_OF_SCOPE, host_dd, **kwargs
483
518
  )
484
519
  )
485
520
  elif finding.risk_status == "Transfer Accepted":
@@ -490,18 +525,26 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
490
525
  "engine_risk",
491
526
  self.TRANSFERRED_FINDING,
492
527
  host_dd,
528
+ **kwargs
529
+ )
530
+ )
531
+ elif finding.risk_status == self.ON_WHITELIST:
532
+ exclusions.append(
533
+ self._create_report_exclusion(
534
+ finding, date_fn, "engine_risk", self.ON_WHITELIST, host_dd, **kwargs
493
535
  )
494
536
  )
495
537
  return exclusions
496
538
 
497
539
  def _get_findings_with_exclusions(
498
- self, session_manager, service, max_retries, query_params, tool, date_fn, reason
540
+ self, session_manager, service, max_retries, query_params, tool, date_fn, reason, **kwargs
499
541
  ):
500
542
  findings = self._get_findings(
501
543
  session_manager, service, max_retries, query_params
502
544
  )
545
+
503
546
  return map(
504
- partial(self._create_exclusion, date_fn=date_fn, tool=tool, reason=reason),
547
+ partial(self._create_exclusion, date_fn=date_fn, tool=tool, reason=reason, **kwargs),
505
548
  findings,
506
549
  )
507
550
 
@@ -512,6 +555,14 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
512
555
  ).results
513
556
 
514
557
  return self._retries_requests(request_func, max_retries, retry_delay=5)
558
+
559
+ def _get_finding_exclusion(self, session_manager, max_retries, query_params):
560
+ def request_func():
561
+ return FindingExclusion.get_finding_exclusion(
562
+ session=session_manager, **query_params
563
+ ).results
564
+
565
+ return self._retries_requests(request_func, max_retries, retry_delay=5)
515
566
 
516
567
  def _retries_requests(self, request_func, max_retries, retry_delay):
517
568
  for attempt in range(max_retries):
@@ -526,23 +577,34 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
526
577
  logger.error("Maximum number of retries reached, aborting.")
527
578
  raise e
528
579
 
529
- def _date_reason_based(self, finding, date_fn, reason):
530
- if reason in [self.FALSE_POSITIVE, self.OUT_OF_SCOPE]:
531
- create_date = date_fn(finding.last_status_update)
532
- expired_date = date_fn(None)
533
- elif reason == self.TRANSFERRED_FINDING:
534
- create_date = date_fn(finding.transfer_finding.date)
535
- expired_date = date_fn(finding.transfer_finding.expiration_date)
536
- else:
537
- last_accepted_risk = finding.accepted_risks[-1]
538
- create_date = date_fn(last_accepted_risk["created"])
539
- expired_date = date_fn(last_accepted_risk["expiration_date"])
540
580
 
541
- return create_date, expired_date
581
+ def _date_reason_based(self, finding, date_fn, reason, tool, **kwargs):
582
+ def get_vuln_id(finding, tool):
583
+ if tool == "engine_risk":
584
+ return finding.id[0]["vulnerability_id"] if finding.id else finding.vuln_id_from_tool
585
+ else:
586
+ return finding.vulnerability_ids[0]["vulnerability_id"] if finding.vulnerability_ids else finding.vuln_id_from_tool
587
+
588
+ def get_dates_from_whitelist(vuln_id, white_list):
589
+ matching_finding = next(filter(lambda x: x.unique_id_from_tool == vuln_id, white_list), None)
590
+ if matching_finding:
591
+ return date_fn(matching_finding.create_date), date_fn(matching_finding.expiration_date)
592
+ return date_fn(None), date_fn(None)
593
+
594
+ reason_to_dates = {
595
+ self.FALSE_POSITIVE: lambda: (date_fn(finding.last_status_update), date_fn(None)),
596
+ self.OUT_OF_SCOPE: lambda: (date_fn(finding.last_status_update), date_fn(None)),
597
+ self.TRANSFERRED_FINDING: lambda: (date_fn(finding.transfer_finding.date), date_fn(finding.transfer_finding.expiration_date)),
598
+ self.RISK_ACCEPTED: lambda: (date_fn(finding.accepted_risks[-1]["created"]), date_fn(finding.accepted_risks[-1]["expiration_date"])),
599
+ self.ON_WHITELIST: lambda: get_dates_from_whitelist(get_vuln_id(finding, tool), kwargs.get("white_list", [])),
600
+ }
542
601
 
543
- def _create_exclusion(self, finding, date_fn, tool, reason):
544
- create_date, expired_date = self._date_reason_based(finding, date_fn, reason)
602
+ create_date, expired_date = reason_to_dates.get(reason, lambda: (date_fn(None), date_fn(None)))()
603
+ return create_date, expired_date
545
604
 
605
+ def _create_exclusion(self, finding, date_fn, tool, reason, **kwargs):
606
+ create_date, expired_date = self._date_reason_based(finding, date_fn, reason, tool, **kwargs)
607
+
546
608
  return Exclusions(
547
609
  id=(
548
610
  finding.vuln_id_from_tool
@@ -560,8 +622,8 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
560
622
  reason=reason,
561
623
  )
562
624
 
563
- def _create_report_exclusion(self, finding, date_fn, tool, reason, host_dd):
564
- create_date, expired_date = self._date_reason_based(finding, date_fn, reason)
625
+ def _create_report_exclusion(self, finding, date_fn, tool, reason, host_dd, **kwargs):
626
+ create_date, expired_date = self._date_reason_based(finding, date_fn, reason, tool, **kwargs)
565
627
 
566
628
  return Exclusions(
567
629
  id=(
@@ -7,6 +7,12 @@ from devsecops_engine_tools.engine_sast.engine_secret.src.infrastructure.driven_
7
7
  from devsecops_engine_tools.engine_sast.engine_secret.src.infrastructure.driven_adapters.trufflehog.trufflehog_deserealizator import (
8
8
  SecretScanDeserealizator
9
9
  )
10
+ from devsecops_engine_tools.engine_sast.engine_secret.src.infrastructure.driven_adapters.gitleaks.gitleaks_tool import (
11
+ GitleaksTool
12
+ )
13
+ from devsecops_engine_tools.engine_sast.engine_secret.src.infrastructure.driven_adapters.gitleaks.gitleaks_deserealizator import (
14
+ GitleaksDeserealizator
15
+ )
10
16
  from devsecops_engine_tools.engine_utilities.git_cli.infrastructure.git_run import (
11
17
  GitRun
12
18
  )
@@ -19,6 +25,10 @@ def runner_secret_scan(dict_args, tool, devops_platform_gateway, secret_tool):
19
25
  if (tool == "TRUFFLEHOG"):
20
26
  tool_gateway = TrufflehogRun()
21
27
  tool_deserealizator = SecretScanDeserealizator()
28
+ elif (tool == "GITLEAKS"):
29
+ tool_gateway = GitleaksTool()
30
+ tool_deserealizator = GitleaksDeserealizator()
31
+
22
32
  return engine_secret_scan(
23
33
  devops_platform_gateway = devops_platform_gateway,
24
34
  tool_gateway = tool_gateway,
@@ -0,0 +1,36 @@
1
+ from datetime import datetime
2
+ from dataclasses import dataclass
3
+ from typing import List
4
+ from devsecops_engine_tools.engine_core.src.domain.model.finding import Finding, Category
5
+ from devsecops_engine_tools.engine_sast.engine_secret.src.domain.model.gateway.gateway_deserealizator import (
6
+ DeseralizatorGateway
7
+ )
8
+
9
+ @dataclass
10
+ class GitleaksDeserealizator(DeseralizatorGateway):
11
+
12
+ def get_list_vulnerability(self, results_scan_list: List[dict], path_directory: str, os: str) -> List[Finding]:
13
+ list_open_vulnerabilities = []
14
+ current_date=datetime.now().strftime("%d%m%Y")
15
+
16
+ for result in results_scan_list:
17
+ vulnerability_open = Finding(
18
+ id=result.get("RuleID", "SECRET_SCANNING"),
19
+ cvss=None,
20
+ where=self.get_where_correctly(result, path_directory),
21
+ description=result.get("Description", "No description available"),
22
+ severity="critical",
23
+ identification_date=current_date,
24
+ published_date_cve=None,
25
+ module="engine_secret",
26
+ category=Category.VULNERABILITY,
27
+ requirements="",
28
+ tool="Gitleaks",
29
+ )
30
+ list_open_vulnerabilities.append(vulnerability_open)
31
+ return list_open_vulnerabilities
32
+
33
+ def get_where_correctly(self, result: dict, path_directory=""):
34
+ path = result.get("File", "").replace(path_directory, "")
35
+ hidden_secret = str(result.get("Secret"))[:3] + '*' * 9 + str(result.get("Secret"))[-3:]
36
+ return f"{path}, Secret: {hidden_secret}"
@@ -0,0 +1,150 @@
1
+ import json
2
+ import os
3
+ import re
4
+ import subprocess
5
+ import requests
6
+ from concurrent.futures import ThreadPoolExecutor, as_completed
7
+ from devsecops_engine_tools.engine_utilities.utils.utils import Utils
8
+ from devsecops_engine_tools.engine_sast.engine_secret.src.domain.model.gateway.tool_gateway import (
9
+ ToolGateway,
10
+ )
11
+ from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
12
+ from devsecops_engine_tools.engine_utilities import settings
13
+ from devsecops_engine_tools.engine_utilities.utils.utils import Utils
14
+
15
+ logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
16
+
17
+ class GitleaksTool(ToolGateway):
18
+ _COMMAND = None
19
+
20
+ def install_tool(self, agent_os, agent_temp_dir, tool_version) -> any:
21
+ is_windows_os = re.search(r"Windows", agent_os)
22
+ is_linux_os = re.search(r"Linux", agent_os)
23
+
24
+ if is_windows_os:
25
+ file_extension = "windows_x64.zip"
26
+ elif is_linux_os:
27
+ file_extension = "linux_x64.tar.gz"
28
+ else:
29
+ file_extension = "darwin_x64.tar.gz"
30
+
31
+ command = f"{agent_temp_dir}{os.sep}gitleaks"
32
+ command = f"{command}.exe" if is_windows_os else command
33
+
34
+ self._COMMAND = command
35
+ result = subprocess.run(f"{command} --version", capture_output=True, shell=True, text=True)
36
+ is_tool_installed = re.search(fr"{tool_version}", result.stdout.strip())
37
+
38
+ if is_tool_installed: return
39
+
40
+ try:
41
+ url = f"https://github.com/gitleaks/gitleaks/releases/download/v{tool_version}/gitleaks_{tool_version}_{file_extension}"
42
+ response = requests.get(url, allow_redirects=True)
43
+ compressed_name = os.path.join(
44
+ agent_temp_dir, f"gitleaks_{tool_version}_{file_extension}"
45
+ )
46
+ with open(compressed_name, "wb") as f:
47
+ f.write(response.content)
48
+
49
+ if is_windows_os:
50
+ Utils().unzip_file(compressed_name, agent_temp_dir)
51
+ else:
52
+ Utils().extract_targz_file(compressed_name, agent_temp_dir)
53
+
54
+ except Exception as ex:
55
+ logger.error(f"An error ocurred downloading Gitleaks: {ex}")
56
+
57
+ def _extract_json_data(self, file_path):
58
+ if os.path.exists(file_path):
59
+ with open(file_path, 'r', encoding='utf-8') as f:
60
+ return json.load(f)
61
+ else:
62
+ print(f"File {file_path} does not exist")
63
+ return []
64
+
65
+ def _create_report(self, output_file, combined_data):
66
+ with open(output_file, 'w', encoding='utf-8') as f:
67
+ json.dump(combined_data, f, ensure_ascii=False, indent=4)
68
+
69
+ def _check_path(self, path, excluded_paths):
70
+ parts = path.split(os.sep)
71
+ for part in parts:
72
+ if part in excluded_paths: return True
73
+ return False
74
+
75
+ def _add_flags(self, config_tool, tool, agent_work_folder):
76
+ flags = []
77
+ if not config_tool[tool]["ALLOW_IGNORE_LEAKS"]:
78
+ flags.append("--ignore-gitleaks-allow")
79
+
80
+ if config_tool[tool]["ENABLE_CUSTOM_RULES"]:
81
+ flags.extend(["--config", f"{agent_work_folder}{os.sep}rules{os.sep}gitleaks{os.sep}gitleaks.toml"])
82
+
83
+ return flags
84
+
85
+ def run_tool_secret_scan(
86
+ self,
87
+ files,
88
+ agent_os,
89
+ agent_work_folder,
90
+ repository_name,
91
+ config_tool,
92
+ secret_tool, # For external checks
93
+ secret_external_checks, # For external checks
94
+ agent_temp_dir,
95
+ tool
96
+ ):
97
+ command = [self._COMMAND, "dir"]
98
+ finding_path = os.path.join(agent_work_folder, "gitleaks_report.json")
99
+ excluded_paths = config_tool[tool]["EXCLUDE_PATH"]
100
+
101
+ if config_tool[tool]["ENABLE_CUSTOM_RULES"]:
102
+ Utils().configurate_external_checks(tool, config_tool, secret_tool, secret_external_checks, agent_work_folder)
103
+
104
+ try:
105
+ findings = []
106
+ flags = self._add_flags(config_tool, tool, agent_work_folder)
107
+ if len(files) > 1:
108
+ with ThreadPoolExecutor(max_workers=config_tool[tool]["NUMBER_THREADS"]) as executor:
109
+ futures = []
110
+
111
+ for pull_file in files:
112
+ if self._check_path(pull_file, excluded_paths): continue
113
+
114
+ aux_finding_path = os.path.join(
115
+ agent_work_folder, f"gitleaks_aux_report_{pull_file.replace(os.sep, '_')}.json"
116
+ )
117
+
118
+ command_aux = command.copy()
119
+ command_aux.extend([
120
+ os.path.join(agent_work_folder, repository_name, pull_file),
121
+ "--report-path", aux_finding_path
122
+ ])
123
+ command_aux.extend(flags)
124
+
125
+ futures.append(executor.submit(self._run_subprocess_command, command_aux, aux_finding_path))
126
+
127
+ for future in as_completed(futures):
128
+ result = future.result()
129
+ findings.extend(result)
130
+
131
+ self._create_report(finding_path, findings)
132
+ else:
133
+ command.extend([files[0], "--report-path", finding_path])
134
+ command.extend(flags)
135
+
136
+ subprocess.run(command, capture_output=True, text=True)
137
+ findings = self._extract_json_data(finding_path)
138
+
139
+ return findings, finding_path
140
+
141
+ except Exception as e:
142
+ logger.error(f"Error executing gitleaks scan: {e}")
143
+
144
+ def _run_subprocess_command(self, command_aux, aux_finding_path):
145
+ try:
146
+ subprocess.run(command_aux, capture_output=True, text=True)
147
+ return self._extract_json_data(aux_finding_path)
148
+ except Exception as e:
149
+ logger.error(f"Error executing gitleaks on {command_aux}: {e}")
150
+ return []
@@ -5,4 +5,5 @@ from .applications.finding import Finding
5
5
  from .applications.connect import Connect
6
6
  from .applications.engagement import Engagement
7
7
  from .applications.product import Product
8
- from .applications.component import Component
8
+ from .applications.component import Component
9
+ from .applications.finding_exclusion import FindingExclusion
@@ -25,5 +25,4 @@ class Component:
25
25
  uc = ComponentUserCase(rest_component)
26
26
  return uc.post(request)
27
27
  except ApiError as e:
28
- logger.error(f"Error during create component: {e}")
29
28
  raise e
@@ -1,9 +1,6 @@
1
- from devsecops_engine_tools.engine_utilities.defect_dojo.domain.request_objects.finding import FindingRequest
2
1
  from devsecops_engine_tools.engine_utilities.defect_dojo.domain.serializers.finding import FindingSerializer
3
2
  from devsecops_engine_tools.engine_utilities.defect_dojo.infraestructure.driver_adapters.finding import FindingRestConsumer
4
3
  from devsecops_engine_tools.engine_utilities.defect_dojo.domain.user_case.finding import FindingUserCase, FindingGetUserCase
5
- from devsecops_engine_tools.engine_utilities.utils.session_manager import SessionManager
6
- from devsecops_engine_tools.engine_utilities.utils.api_error import ApiError
7
4
  from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
8
5
  from devsecops_engine_tools.engine_utilities import settings
9
6
 
@@ -0,0 +1,14 @@
1
+ from devsecops_engine_tools.engine_utilities.utils.api_error import ApiError
2
+ from devsecops_engine_tools.engine_utilities.defect_dojo.domain.user_case.finding_exclusion import FindingExclusionUserCase
3
+ from devsecops_engine_tools.engine_utilities.defect_dojo.infraestructure.driver_adapters.finding_exclusion import FindingExclusionRestConsumer
4
+
5
+ class FindingExclusion:
6
+ @staticmethod
7
+ def get_finding_exclusion(session, **request):
8
+ try:
9
+ rest_finding_exclusion = FindingExclusionRestConsumer(session=session)
10
+
11
+ uc = FindingExclusionUserCase(rest_finding_exclusion)
12
+ return uc.execute(request)
13
+ except ApiError as e:
14
+ raise e
@@ -0,0 +1,20 @@
1
+ import dataclasses
2
+ from typing import List
3
+ from devsecops_engine_tools.engine_utilities.utils.dataclass_classmethod import FromDictMixin
4
+
5
+
6
+ @dataclasses.dataclass
7
+ class FindingExclusion(FromDictMixin):
8
+ uuid: str = ""
9
+ unique_id_from_tool: str = ""
10
+ type: str = ""
11
+ create_date: str = ""
12
+ expiration_date: str = ""
13
+
14
+
15
+ @dataclasses.dataclass
16
+ class FindingExclusionList(FromDictMixin):
17
+ count: int = 0
18
+ next = None
19
+ previous = None
20
+ results: List[FindingExclusion] = dataclasses.field(default_factory=list)
@@ -63,7 +63,7 @@ class FindingSerializer(Schema):
63
63
  reviewers = fields.List(fields.Int, requerided=False)
64
64
  risk_accetance = fields.Int(requerided=False)
65
65
  risk_status = fields.Str(
66
- required=False, validate=validate.OneOf(["Risk Pending", "Risk Rejected", "Risk Expired", "Risk Accepted", "Risk Active", "Transfer Pending", "Transfer Rejected", "Transfer Expired", "Transfer Accepted"])
66
+ required=False, validate=validate.OneOf(["Risk Pending", "Risk Rejected", "Risk Expired", "Risk Accepted", "Risk Active", "Transfer Pending", "Transfer Rejected", "Transfer Expired", "Transfer Accepted", "On Whitelist", "On Blacklist"])
67
67
  )
68
68
  risk_accepted = fields.Bool(requerided=False)
69
69
  sast_sink_object = fields.Str(requeride=False)
@@ -0,0 +1,9 @@
1
+ from devsecops_engine_tools.engine_utilities.defect_dojo.infraestructure.driver_adapters.finding_exclusion import FindingExclusionRestConsumer
2
+
3
+ class FindingExclusionUserCase:
4
+ def __init__(self, rest_finding_exclusion: FindingExclusionRestConsumer):
5
+ self.__rest_finding_exclusion = rest_finding_exclusion
6
+
7
+ def execute(self, request):
8
+ response = self.__rest_finding_exclusion.get_finding_exclusions(request)
9
+ return response
@@ -66,12 +66,12 @@ class ImportScanUserCase:
66
66
  with id {product_type_id}"
67
67
  )
68
68
 
69
- product = self.__rest_product.post_product(request, product_type_id)
70
- product_id = product.id
71
- logger.info(
72
- f"product created: {product.name}\
73
- found with id: {product.id}"
74
- )
69
+ product = self.__rest_product.post_product(request, product_type_id)
70
+ product_id = product.id
71
+ logger.info(
72
+ f"product created: {product.name}\
73
+ found with id: {product.id}"
74
+ )
75
75
 
76
76
  api_scan_bool = re.search(" API ", request.scan_type)
77
77
  if api_scan_bool:
@@ -0,0 +1,28 @@
1
+ from devsecops_engine_tools.engine_utilities.utils.api_error import ApiError
2
+ from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
3
+ from devsecops_engine_tools.engine_utilities.defect_dojo.domain.models.finding_exclusion import FindingExclusionList
4
+ from devsecops_engine_tools.engine_utilities.defect_dojo.infraestructure.driver_adapters.settings.settings import VERIFY_CERTIFICATE
5
+ from devsecops_engine_tools.engine_utilities.utils.session_manager import SessionManager
6
+ from devsecops_engine_tools.engine_utilities.settings import SETTING_LOGGER
7
+
8
+ logger = MyLogger.__call__(**SETTING_LOGGER).get_logger()
9
+
10
+ class FindingExclusionRestConsumer:
11
+ def __init__(self, session: SessionManager):
12
+ self.__token = session._token
13
+ self.__host = session._host
14
+ self.__session = session._instance
15
+
16
+
17
+ def get_finding_exclusions(self, request) -> FindingExclusionList:
18
+ url = f"{self.__host}/api/v2/finding_exclusions/"
19
+ headers = {"Authorization": f"Token {self.__token}", "Content-Type": "application/json"}
20
+ try:
21
+ response = self.__session.get(url, headers=headers, params=request, verify=VERIFY_CERTIFICATE)
22
+ if response.status_code != 200:
23
+ raise ApiError(response.json())
24
+ finding_exclusions_object = FindingExclusionList.from_dict(response.json())
25
+ except Exception as e:
26
+ logger.error(f"from dict FindingExclusion: {e}")
27
+ raise ApiError(e)
28
+ return finding_exclusions_object
@@ -1,4 +1,5 @@
1
1
  import zipfile
2
+ import tarfile
2
3
  import platform
3
4
  from devsecops_engine_tools.engine_utilities.github.infrastructure.github_api import (
4
5
  GithubApi,
@@ -29,6 +30,10 @@ class Utils:
29
30
  def unzip_file(self, zip_file_path, extract_path):
30
31
  with zipfile.ZipFile(zip_file_path, "r") as zip_ref:
31
32
  zip_ref.extractall(extract_path)
33
+
34
+ def extract_targz_file(self, tar_file_path, extract_path):
35
+ with tarfile.open(tar_file_path, "r:gz") as tar_ref:
36
+ tar_ref.extractall(path=extract_path)
32
37
 
33
38
  def configurate_external_checks(self, tool, config_tool, secret_tool, secret_external_checks, agent_work_folder="/tmp"):
34
39
  try:
@@ -103,7 +108,7 @@ class Utils:
103
108
  config_tool[tool]["EXTERNAL_DIR_OWNER"],
104
109
  config_tool[tool]["EXTERNAL_DIR_REPOSITORY"],
105
110
  github_token,
106
- agent_work_folder if platform.system() in "Windows" else "/tmp"
111
+ agent_work_folder
107
112
  )
108
113
 
109
114
  except Exception as ex:
@@ -1 +1 @@
1
- version = '1.30.2'
1
+ version = '1.32.0'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: devsecops-engine-tools
3
- Version: 1.30.2
3
+ Version: 1.32.0
4
4
  Summary: Tool for DevSecOps strategy
5
5
  Home-page: https://github.com/bancolombia/devsecops-engine-tools
6
6
  Author: Bancolombia DevSecOps Team
@@ -36,6 +36,7 @@ Requires-Dist: packageurl-python==0.15.6
36
36
  [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=bancolombia_devsecops-engine-tools&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=bancolombia_devsecops-engine-tools)
37
37
  [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=bancolombia_devsecops-engine-tools&metric=coverage)](https://sonarcloud.io/summary/new_code?id=bancolombia_devsecops-engine-tools)
38
38
  [![Python Version](https://img.shields.io/badge/python%20-%203.8%20%7C%203.9%20%7C%203.10%20%7C%203.11%20%7C%203.12%20-blue)](#)
39
+ [![PyPI](https://img.shields.io/pypi/v/devsecops-engine-tools)](https://pypi.org/project/devsecops-engine-tools/)
39
40
  [![Docker Pulls](https://img.shields.io/docker/pulls/bancolombia/devsecops-engine-tools
40
41
  )](https://hub.docker.com/r/bancolombia/devsecops-engine-tools)
41
42
 
@@ -133,10 +134,14 @@ For more information visit [here](https://github.com/bancolombia/devsecops-engin
133
134
  <td>Free</td>
134
135
  </tr>
135
136
  <tr>
136
- <td>ENGINE_SECRET</td>
137
+ <td rowspan="2">ENGINE_SECRET</td>
137
138
  <td><a href="https://trufflesecurity.com/trufflehog">TRUFFLEHOG</a></td>
138
139
  <td>Free</td>
139
140
  </tr>
141
+ <tr>
142
+ <td><a href="https://gitleaks.io/">GITLEAKS</a></td>
143
+ <td>Free</td>
144
+ </tr>
140
145
  <tr>
141
146
  <td rowspan="2">ENGINE_CONTAINER</td>
142
147
  <td><a href="https://www.paloaltonetworks.com/prisma/cloud">PRISMA</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=QZYYG97jDk2EtK7v0CNUVwwZqOg9qP-xrf5aus8iFlY,19
2
+ devsecops_engine_tools/version.py,sha256=qh7fu1xeNri8o7YY1UAeXzATcZjiVeXYKv8u5NDpHlM,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
@@ -38,7 +38,7 @@ devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/aws/secret
38
38
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/azure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
39
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/azure/azure_devops.py,sha256=buCBJ6kAg-5b_7P-gWzem6NEMbk5lK9Hx0Zuf-BQfXQ,5090
40
40
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py,sha256=35J9vfiGYJV_JMUum4ji7nj-DLRcnZhf9DKY2FkcmKY,24998
41
+ devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py,sha256=zBfd4zI_5fAHsIX3ZKt-WJmESkHkfUeIzAZO3O6adHo,27789
42
42
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/github/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
43
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/github/github_actions.py,sha256=KCg6tTDncasrRZbB20QiLZNE6TKYkfgQ9zP0wPd3xe0,3925
44
44
  devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/printer_pretty_table/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -143,7 +143,7 @@ devsecops_engine_tools/engine_sast/engine_iac/src/infrastructure/helpers/file_ge
143
143
  devsecops_engine_tools/engine_sast/engine_secret/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
144
144
  devsecops_engine_tools/engine_sast/engine_secret/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
145
  devsecops_engine_tools/engine_sast/engine_secret/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
- devsecops_engine_tools/engine_sast/engine_secret/src/applications/runner_secret_scan.py,sha256=Th6koLvl0fn5SUAXTZ4cy9PEPKMjYpbB9A2S5rSYWxU,1394
146
+ devsecops_engine_tools/engine_sast/engine_secret/src/applications/runner_secret_scan.py,sha256=Su73AZxnbKX1JhJf7u6ZhQJWdhR9t3pNpi6aBmr6Ipo,1849
147
147
  devsecops_engine_tools/engine_sast/engine_secret/src/deployment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
148
148
  devsecops_engine_tools/engine_sast/engine_secret/src/deployment/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
149
149
  devsecops_engine_tools/engine_sast/engine_secret/src/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -156,6 +156,9 @@ devsecops_engine_tools/engine_sast/engine_secret/src/domain/usecases/secret_scan
156
156
  devsecops_engine_tools/engine_sast/engine_secret/src/domain/usecases/set_input_core.py,sha256=VbpiXDHIGeFAGHWb6FBR1axRvh5R2vCOzeYsDkQoHAE,3189
157
157
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
158
158
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
159
+ devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/gitleaks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
+ devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/gitleaks/gitleaks_deserealizator.py,sha256=IERIxeHhtQj0npBoL4_qb2mRlNgEUjg603DqGA49RQ4,1617
161
+ devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/gitleaks/gitleaks_tool.py,sha256=FTkxlZu9PSX53wri7I0zN6iNdbXEioEvjmLm_ZqxUiM,5978
159
162
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
163
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/trufflehog_deserealizator.py,sha256=mrSqPrkMiikxQ_uY-rF2I8QvicsOMdMBzTC8CTV3Wk8,2392
161
164
  devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/trufflehog/trufflehog_run.py,sha256=EEwKXvn8H4fTLZCuJC8CCJPvclqqrT0s3XDCU5xFd5o,7901
@@ -226,14 +229,15 @@ devsecops_engine_tools/engine_utilities/azuredevops/infrastructure/azure_devops_
226
229
  devsecops_engine_tools/engine_utilities/azuredevops/models/AzureMessageLoggingPipeline.py,sha256=pCwlPDDl-hgvZ9gvceuC8GsKbsMhRm3ykhFFVByVqcI,664
227
230
  devsecops_engine_tools/engine_utilities/azuredevops/models/AzurePredefinedVariables.py,sha256=z9AGtc64o-BNTngiowRJFBlXmo_JmWqenL8YxdLs0aE,2561
228
231
  devsecops_engine_tools/engine_utilities/azuredevops/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
229
- devsecops_engine_tools/engine_utilities/defect_dojo/__init__.py,sha256=pVSjIx2caIhX0E67TbXtual0Jz3Ha28aNFnSJKeRsts,400
232
+ devsecops_engine_tools/engine_utilities/defect_dojo/__init__.py,sha256=P-HiaN1sgDUekalZPCzSTF-zuqyXpNG2uVEsMDaC0ro,462
230
233
  devsecops_engine_tools/engine_utilities/defect_dojo/hello_world.py,sha256=WDvgS22lIJJNoIM4b6mrxT8Bu_6hADmrCOZgvf5yGVY,45
231
234
  devsecops_engine_tools/engine_utilities/defect_dojo/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
232
- devsecops_engine_tools/engine_utilities/defect_dojo/applications/component.py,sha256=fIP08EHkqbNii_qJQ4ULa-ELk_9Ggd3SV1M6biepYb8,1239
235
+ devsecops_engine_tools/engine_utilities/defect_dojo/applications/component.py,sha256=Y6vA1nRfMCoqJEceRBDQ_QLpIKASqB-t8V1yqao-eUQ,1175
233
236
  devsecops_engine_tools/engine_utilities/defect_dojo/applications/connect.py,sha256=tRvNN-zVKBJbHMvfW97SCsZoyjGaKttcQhLOKrbjK9E,2079
234
237
  devsecops_engine_tools/engine_utilities/defect_dojo/applications/defect_dojo.py,sha256=gJMBVtE--Kvdc908fQa2T35mYyBXAWNTxM0DKsZ7e-w,2615
235
238
  devsecops_engine_tools/engine_utilities/defect_dojo/applications/engagement.py,sha256=sPTeQs6QHg07QNthqhY3caVbG54vDkd_E_KJpBvgTk4,878
236
- devsecops_engine_tools/engine_utilities/defect_dojo/applications/finding.py,sha256=SBbFawywfvfpqFjFdnK-LaoC05bqJe2-ee6gYntMLUk,1727
239
+ devsecops_engine_tools/engine_utilities/defect_dojo/applications/finding.py,sha256=Cw5_TElo0D0Ec8X0lu-La2H9Pp1rsrmw-2Wv-0w_9oI,1451
240
+ devsecops_engine_tools/engine_utilities/defect_dojo/applications/finding_exclusion.py,sha256=StnDFV3vGhBffBEs-jfV9nMprzRucm5VJqtZFWKF3Fo,689
237
241
  devsecops_engine_tools/engine_utilities/defect_dojo/applications/product.py,sha256=ogJM1AqfW-f_bJP4JWeHHM82PqN7G-jKKTbO8FM2x_Q,598
238
242
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
239
243
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -241,6 +245,7 @@ devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/cmdb.py,sha256
241
245
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/component.py,sha256=KYyWMUQcPsraqRaw0KY9eBaZPfajfBiskgOuwTI8mnA,483
242
246
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/engagement.py,sha256=MXb7c526tz0zSDS8xGPC5IjTMF9g9qtzcEKLyfcY89c,1393
243
247
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/finding.py,sha256=0Xj7BOlC30LCdBjIkviB2QmmdSj0GlDvT1-TbnaT8nE,3201
248
+ devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/finding_exclusion.py,sha256=mz6RDW3Xk3VHNQcUHm9cCMAyX6Ultcb-IZy9N59qPI4,530
244
249
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/product.py,sha256=KL5ue6icA8HH1xKkmAJzElAat3OOYU3_lt3xuNfo7Mc,1272
245
250
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/product_list.py,sha256=yFo8eYOGJiJMkU5pGpW0r1o5uVaNP5iA80-5w_MyWxU,664
246
251
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/product_type.py,sha256=2KVfRB0qgPO7osY4PBEQSOBOqRnZs0UzUZkS1guisBQ,524
@@ -250,14 +255,15 @@ devsecops_engine_tools/engine_utilities/defect_dojo/domain/request_objects/__ini
250
255
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/request_objects/finding.py,sha256=RinG3ISc-u_3VXVqntwdcQvZoQdmHPCvDHWSvnkCkcU,2619
251
256
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/request_objects/import_scan.py,sha256=UfvICLF-Wjii3iqvsRq0Tpc-quK4t3oS8U79tozzjfA,5014
252
257
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/serializers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
253
- devsecops_engine_tools/engine_utilities/defect_dojo/domain/serializers/finding.py,sha256=HNkA_sHSMfQKAcZht-rRPdwm0eHYK2wxM6u61_bl2uE,5233
258
+ devsecops_engine_tools/engine_utilities/defect_dojo/domain/serializers/finding.py,sha256=4IQLjqgyImVdn8AxoU3UKgXnvU-F-x7Tm2bJdp6nHm4,5265
254
259
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/serializers/import_scan.py,sha256=AYYPtuAOKagT5qmFvdwuGQ_GupZfQNdMCyMaKzCkTDE,7290
255
260
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
256
261
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/cmdb.py,sha256=BUOdvP39bEMQ6Unr2hB28eljVGU2Uv8dDEkzRyEJgyQ,2650
257
262
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/component.py,sha256=_icc-ZAqw-aVgE5J4VH8Q7fSqpCgEGcfmurgRIN9NqM,448
258
263
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/engagement.py,sha256=SVX-weFRPT3DK7w6IBrLuWS4L6vboMuZtwXAQmIHfEE,406
259
264
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/finding.py,sha256=TjfpdJtaBwQvT8XNJKBf6tuOASOAw7ZiOxJbqsKadaA,1689
260
- devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/import_scan.py,sha256=ldgiAo8nDt4-Crdgh7LX_8VRm6P_cR5T6_O06tSups0,6951
265
+ devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/finding_exclusion.py,sha256=VqdwBiQGc9XFpatvbXGL837LtTxkWlfhWH46W1cTbCg,455
266
+ devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/import_scan.py,sha256=eT1f1dtrLMLa41Mv_wnjg1L7bCBGKGjSpxD4hIDMx4Y,6927
261
267
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/product.py,sha256=6f6eABdC79zOopMe_Rif3XoGG-yFfq9x_EOkevTuGDY,368
262
268
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
263
269
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -265,6 +271,7 @@ devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapt
265
271
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/component.py,sha256=-J0Sv7z709Hctb-tgM0wmp5ofE4WKEIA_uJwzvMnStE,2132
266
272
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/engagement.py,sha256=39qqmTxECRY5IoFvK_B_R0vfwfJwLbdhGt_pcdvdVIE,3571
267
273
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/finding.py,sha256=k-z2tg_NPKMni7rZgXMZa2-t8_8F35r8YtF1EcjMyDs,2355
274
+ devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/finding_exclusion.py,sha256=BL4xf1FE5tMsBri0LetxBRUgOgLogdoHX97rQkHh10g,1524
268
275
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/import_scan.py,sha256=68Qd8o0oSxFG-3cRlX97BkX9muS6k64DGslGtX9sx6M,5897
269
276
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/product.py,sha256=DhiLPv8KyRhHBRhvF0ULhchhGAT8SQyn1ftiuou_aKw,2576
270
277
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/product_type.py,sha256=9Lzsh9HCs4rbJ2b6X11renvYU3g6s-1q2NUDwbYX0qY,3051
@@ -316,9 +323,9 @@ devsecops_engine_tools/engine_utilities/utils/logger_info.py,sha256=4Mz8Bwlm9Mku
316
323
  devsecops_engine_tools/engine_utilities/utils/name_conversion.py,sha256=ADJrRGaxYSDe0ZRh6VHRf53H4sXPcb-vNP_i81PUn3I,307
317
324
  devsecops_engine_tools/engine_utilities/utils/printers.py,sha256=amYAr9YQfYgR6jK9a2l26z3oovFPQ3FAKmhq6BKhEBA,623
318
325
  devsecops_engine_tools/engine_utilities/utils/session_manager.py,sha256=Z0fdhB3r-dxU0nGSD9zW_B4r2Qol1rUnUCkhFR0U-HQ,487
319
- devsecops_engine_tools/engine_utilities/utils/utils.py,sha256=_yaXWHN1pi2xFFKg0yKbb4fsK_ZRv7Dk_9N1FtPS72k,5964
320
- devsecops_engine_tools-1.30.2.dist-info/METADATA,sha256=1JGcYhIWKK_8Nt2XcaRp_5U1HhWKrx3yOVKfxKb8ULo,11162
321
- devsecops_engine_tools-1.30.2.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
322
- devsecops_engine_tools-1.30.2.dist-info/entry_points.txt,sha256=MHCTFFs9bdNKo6YcWCcBW2_8X6yTisgLOlmVx-V8Rxc,276
323
- devsecops_engine_tools-1.30.2.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
324
- devsecops_engine_tools-1.30.2.dist-info/RECORD,,
326
+ devsecops_engine_tools/engine_utilities/utils/utils.py,sha256=dAklY11OGNDODjZyt9dO68Xiwu9pLJmqLOslqQ7rXa8,6112
327
+ devsecops_engine_tools-1.32.0.dist-info/METADATA,sha256=y8wf8DXMNfi4wI6IVKw2AuXAq5A0C1aeMWwkz6ISD-c,11378
328
+ devsecops_engine_tools-1.32.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
329
+ devsecops_engine_tools-1.32.0.dist-info/entry_points.txt,sha256=MHCTFFs9bdNKo6YcWCcBW2_8X6yTisgLOlmVx-V8Rxc,276
330
+ devsecops_engine_tools-1.32.0.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
331
+ devsecops_engine_tools-1.32.0.dist-info/RECORD,,