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.
- devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py +87 -25
- devsecops_engine_tools/engine_sast/engine_secret/src/applications/runner_secret_scan.py +10 -0
- devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/gitleaks/__init__.py +0 -0
- devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/gitleaks/gitleaks_deserealizator.py +36 -0
- devsecops_engine_tools/engine_sast/engine_secret/src/infrastructure/driven_adapters/gitleaks/gitleaks_tool.py +150 -0
- devsecops_engine_tools/engine_utilities/defect_dojo/__init__.py +2 -1
- devsecops_engine_tools/engine_utilities/defect_dojo/applications/component.py +0 -1
- devsecops_engine_tools/engine_utilities/defect_dojo/applications/finding.py +0 -3
- devsecops_engine_tools/engine_utilities/defect_dojo/applications/finding_exclusion.py +14 -0
- devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/finding_exclusion.py +20 -0
- devsecops_engine_tools/engine_utilities/defect_dojo/domain/serializers/finding.py +1 -1
- devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/finding_exclusion.py +9 -0
- devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/import_scan.py +6 -6
- devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/finding_exclusion.py +28 -0
- devsecops_engine_tools/engine_utilities/utils/utils.py +6 -1
- devsecops_engine_tools/version.py +1 -1
- {devsecops_engine_tools-1.30.2.dist-info → devsecops_engine_tools-1.32.0.dist-info}/METADATA +7 -2
- {devsecops_engine_tools-1.30.2.dist-info → devsecops_engine_tools-1.32.0.dist-info}/RECORD +21 -14
- {devsecops_engine_tools-1.30.2.dist-info → devsecops_engine_tools-1.32.0.dist-info}/WHEEL +0 -0
- {devsecops_engine_tools-1.30.2.dist-info → devsecops_engine_tools-1.32.0.dist-info}/entry_points.txt +0 -0
- {devsecops_engine_tools-1.30.2.dist-info → devsecops_engine_tools-1.32.0.dist-info}/top_level.txt +0 -0
devsecops_engine_tools/engine_core/src/infrastructure/driven_adapters/defect_dojo/defect_dojo.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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",
|
|
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
|
-
|
|
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
|
-
|
|
544
|
-
create_date, expired_date
|
|
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,
|
|
File without changes
|
|
@@ -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
|
|
@@ -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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
|
111
|
+
agent_work_folder
|
|
107
112
|
)
|
|
108
113
|
|
|
109
114
|
except Exception as ex:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
version = '1.
|
|
1
|
+
version = '1.32.0'
|
{devsecops_engine_tools-1.30.2.dist-info → devsecops_engine_tools-1.32.0.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: devsecops-engine-tools
|
|
3
|
-
Version: 1.
|
|
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
|
[](https://sonarcloud.io/summary/new_code?id=bancolombia_devsecops-engine-tools)
|
|
37
37
|
[](https://sonarcloud.io/summary/new_code?id=bancolombia_devsecops-engine-tools)
|
|
38
38
|
[](#)
|
|
39
|
+
[](https://pypi.org/project/devsecops-engine-tools/)
|
|
39
40
|
[](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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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/
|
|
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=
|
|
320
|
-
devsecops_engine_tools-1.
|
|
321
|
-
devsecops_engine_tools-1.
|
|
322
|
-
devsecops_engine_tools-1.
|
|
323
|
-
devsecops_engine_tools-1.
|
|
324
|
-
devsecops_engine_tools-1.
|
|
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,,
|
|
File without changes
|
{devsecops_engine_tools-1.30.2.dist-info → devsecops_engine_tools-1.32.0.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{devsecops_engine_tools-1.30.2.dist-info → devsecops_engine_tools-1.32.0.dist-info}/top_level.txt
RENAMED
|
File without changes
|