devsecops-engine-tools 1.30.1__py3-none-any.whl → 1.31.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 +128 -44
- 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/version.py +1 -1
- {devsecops_engine_tools-1.30.1.dist-info → devsecops_engine_tools-1.31.0.dist-info}/METADATA +2 -1
- {devsecops_engine_tools-1.30.1.dist-info → devsecops_engine_tools-1.31.0.dist-info}/RECORD +16 -12
- {devsecops_engine_tools-1.30.1.dist-info → devsecops_engine_tools-1.31.0.dist-info}/WHEEL +0 -0
- {devsecops_engine_tools-1.30.1.dist-info → devsecops_engine_tools-1.31.0.dist-info}/entry_points.txt +0 -0
- {devsecops_engine_tools-1.30.1.dist-info → devsecops_engine_tools-1.31.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
|
|
@@ -30,7 +31,9 @@ from functools import partial
|
|
|
30
31
|
|
|
31
32
|
from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
|
|
32
33
|
from devsecops_engine_tools.engine_utilities import settings
|
|
33
|
-
from devsecops_engine_tools.engine_utilities.defect_dojo.domain.serializers.import_scan import
|
|
34
|
+
from devsecops_engine_tools.engine_utilities.defect_dojo.domain.serializers.import_scan import (
|
|
35
|
+
ImportScanSerializer,
|
|
36
|
+
)
|
|
34
37
|
import time
|
|
35
38
|
import concurrent.futures
|
|
36
39
|
|
|
@@ -40,9 +43,11 @@ logger = MyLogger.__call__(**settings.SETTING_LOGGER).get_logger()
|
|
|
40
43
|
@dataclass
|
|
41
44
|
class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
42
45
|
|
|
46
|
+
RISK_ACCEPTED = "Risk Accepted"
|
|
43
47
|
OUT_OF_SCOPE = "Out of Scope"
|
|
44
48
|
FALSE_POSITIVE = "False Positive"
|
|
45
49
|
TRANSFERRED_FINDING = "Transferred Finding"
|
|
50
|
+
ON_WHITELIST = "On Whitelist"
|
|
46
51
|
|
|
47
52
|
def send_vulnerability_management(
|
|
48
53
|
self, vulnerability_management: VulnerabilityManagement
|
|
@@ -89,7 +94,9 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
89
94
|
if vulnerability_management.dict_args["tool"] == "engine_iac":
|
|
90
95
|
tags = f"{vulnerability_management.dict_args['tool']}_{'_'.join(vulnerability_management.dict_args['platform'])}"
|
|
91
96
|
|
|
92
|
-
use_cmdb = vulnerability_management.config_tool[
|
|
97
|
+
use_cmdb = vulnerability_management.config_tool[
|
|
98
|
+
"VULNERABILITY_MANAGER"
|
|
99
|
+
]["DEFECT_DOJO"]["CMDB"]["USE_CMDB"]
|
|
93
100
|
|
|
94
101
|
request = self._build_request_importscan(
|
|
95
102
|
vulnerability_management,
|
|
@@ -98,7 +105,7 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
98
105
|
scan_type_mapping,
|
|
99
106
|
enviroment_mapping,
|
|
100
107
|
tags,
|
|
101
|
-
use_cmdb
|
|
108
|
+
use_cmdb,
|
|
102
109
|
)
|
|
103
110
|
|
|
104
111
|
def request_func():
|
|
@@ -199,6 +206,11 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
199
206
|
"tags": tool,
|
|
200
207
|
"limit": dd_limits_query,
|
|
201
208
|
}
|
|
209
|
+
white_list_query_params = {
|
|
210
|
+
"risk_status": self.ON_WHITELIST,
|
|
211
|
+
"tags": tool,
|
|
212
|
+
"limit": dd_limits_query,
|
|
213
|
+
}
|
|
202
214
|
|
|
203
215
|
exclusions_risk_accepted = self._get_findings_with_exclusions(
|
|
204
216
|
session_manager,
|
|
@@ -207,7 +219,7 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
207
219
|
risk_accepted_query_params,
|
|
208
220
|
tool,
|
|
209
221
|
self._format_date_to_dd_format,
|
|
210
|
-
|
|
222
|
+
self.RISK_ACCEPTED,
|
|
211
223
|
)
|
|
212
224
|
|
|
213
225
|
exclusions_false_positive = self._get_findings_with_exclusions(
|
|
@@ -240,11 +252,29 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
240
252
|
self.TRANSFERRED_FINDING,
|
|
241
253
|
)
|
|
242
254
|
|
|
255
|
+
white_list = self._get_finding_exclusion(
|
|
256
|
+
session_manager, dd_max_retries, {
|
|
257
|
+
"type": "white_list",
|
|
258
|
+
}
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
exclusions_white_list = self._get_findings_with_exclusions(
|
|
262
|
+
session_manager,
|
|
263
|
+
service,
|
|
264
|
+
dd_max_retries,
|
|
265
|
+
white_list_query_params,
|
|
266
|
+
tool,
|
|
267
|
+
self._format_date_to_dd_format,
|
|
268
|
+
self.ON_WHITELIST,
|
|
269
|
+
white_list=white_list,
|
|
270
|
+
)
|
|
271
|
+
|
|
243
272
|
return (
|
|
244
273
|
list(exclusions_risk_accepted)
|
|
245
274
|
+ list(exclusions_false_positive)
|
|
246
275
|
+ list(exclusions_out_of_scope)
|
|
247
276
|
+ list(exclusions_transfer_finding)
|
|
277
|
+
+ list(exclusions_white_list)
|
|
248
278
|
)
|
|
249
279
|
except Exception as ex:
|
|
250
280
|
raise ExceptionFindingsExcepted(
|
|
@@ -268,8 +298,10 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
268
298
|
"HOST_DEFECT_DOJO"
|
|
269
299
|
]
|
|
270
300
|
|
|
301
|
+
session_manager = self._get_session_manager(dict_args, secret_tool, config_tool)
|
|
302
|
+
|
|
271
303
|
findings = self._get_findings(
|
|
272
|
-
|
|
304
|
+
session_manager,
|
|
273
305
|
service,
|
|
274
306
|
max_retries,
|
|
275
307
|
all_findings_query_params,
|
|
@@ -282,8 +314,14 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
282
314
|
)
|
|
283
315
|
)
|
|
284
316
|
|
|
317
|
+
white_list = self._get_finding_exclusion(
|
|
318
|
+
session_manager, max_retries, {
|
|
319
|
+
"type": "white_list",
|
|
320
|
+
}
|
|
321
|
+
)
|
|
322
|
+
|
|
285
323
|
all_exclusions = self._get_report_exclusions(
|
|
286
|
-
all_findings, self._format_date_to_dd_format, host_dd=host_dd
|
|
324
|
+
all_findings, self._format_date_to_dd_format, host_dd=host_dd, white_list=white_list
|
|
287
325
|
)
|
|
288
326
|
|
|
289
327
|
return all_findings, all_exclusions
|
|
@@ -361,7 +399,7 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
361
399
|
ex
|
|
362
400
|
)
|
|
363
401
|
)
|
|
364
|
-
|
|
402
|
+
|
|
365
403
|
def _build_request_importscan(
|
|
366
404
|
self,
|
|
367
405
|
vulnerability_management: VulnerabilityManagement,
|
|
@@ -370,7 +408,7 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
370
408
|
scan_type_mapping,
|
|
371
409
|
enviroment_mapping,
|
|
372
410
|
tags,
|
|
373
|
-
use_cmdb: bool
|
|
411
|
+
use_cmdb: bool,
|
|
374
412
|
):
|
|
375
413
|
common_fields = {
|
|
376
414
|
"scan_type": scan_type_mapping[vulnerability_management.scan_type],
|
|
@@ -386,21 +424,22 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
386
424
|
"environment": (
|
|
387
425
|
enviroment_mapping[vulnerability_management.environment.lower()]
|
|
388
426
|
if vulnerability_management.environment is not None
|
|
389
|
-
and vulnerability_management.environment.lower()
|
|
390
|
-
in enviroment_mapping
|
|
427
|
+
and vulnerability_management.environment.lower() in enviroment_mapping
|
|
391
428
|
else enviroment_mapping["default"]
|
|
392
429
|
),
|
|
393
430
|
"token_defect_dojo": token_dd,
|
|
394
431
|
"host_defect_dojo": vulnerability_management.config_tool[
|
|
395
432
|
"VULNERABILITY_MANAGER"
|
|
396
433
|
]["DEFECT_DOJO"]["HOST_DEFECT_DOJO"],
|
|
397
|
-
"expression": vulnerability_management.config_tool[
|
|
398
|
-
"
|
|
399
|
-
]["
|
|
434
|
+
"expression": vulnerability_management.config_tool["VULNERABILITY_MANAGER"][
|
|
435
|
+
"DEFECT_DOJO"
|
|
436
|
+
]["CMDB"]["REGEX_EXPRESSION_CMDB"],
|
|
400
437
|
}
|
|
401
438
|
|
|
402
439
|
if use_cmdb:
|
|
403
|
-
cmdb_mapping = vulnerability_management.config_tool[
|
|
440
|
+
cmdb_mapping = vulnerability_management.config_tool[
|
|
441
|
+
"VULNERABILITY_MANAGER"
|
|
442
|
+
]["DEFECT_DOJO"]["CMDB"]["CMDB_MAPPING"]
|
|
404
443
|
return Connect.cmdb(
|
|
405
444
|
cmdb_mapping={
|
|
406
445
|
"product_type_name": cmdb_mapping["PRODUCT_TYPE_NAME"],
|
|
@@ -412,19 +451,21 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
412
451
|
compact_remote_config_url=f'{vulnerability_management.base_compact_remote_config_url}{vulnerability_management.config_tool["VULNERABILITY_MANAGER"]["DEFECT_DOJO"]["CMDB"]["CMDB_MAPPING_PATH"]}',
|
|
413
452
|
personal_access_token=vulnerability_management.access_token,
|
|
414
453
|
token_cmdb=token_cmdb,
|
|
415
|
-
host_cmdb=vulnerability_management.config_tool[
|
|
454
|
+
host_cmdb=vulnerability_management.config_tool["VULNERABILITY_MANAGER"][
|
|
455
|
+
"DEFECT_DOJO"
|
|
456
|
+
]["CMDB"]["HOST_CMDB"],
|
|
457
|
+
cmdb_request_response=vulnerability_management.config_tool[
|
|
416
458
|
"VULNERABILITY_MANAGER"
|
|
417
|
-
]["DEFECT_DOJO"]["CMDB"]["
|
|
418
|
-
cmdb_request_response=vulnerability_management.config_tool["VULNERABILITY_MANAGER"]["DEFECT_DOJO"]["CMDB"]["CMDB_REQUEST_RESPONSE"],
|
|
459
|
+
]["DEFECT_DOJO"]["CMDB"]["CMDB_REQUEST_RESPONSE"],
|
|
419
460
|
**common_fields,
|
|
420
461
|
)
|
|
421
462
|
else:
|
|
422
463
|
request: ImportScanRequest = ImportScanSerializer().load(
|
|
423
464
|
{
|
|
424
|
-
"product_type_name":vulnerability_management.vm_product_type_name,
|
|
465
|
+
"product_type_name": vulnerability_management.vm_product_type_name,
|
|
425
466
|
"product_name": vulnerability_management.vm_product_name,
|
|
426
|
-
"product_description":vulnerability_management.vm_product_description,
|
|
427
|
-
"code_app":vulnerability_management.vm_product_name,
|
|
467
|
+
"product_description": vulnerability_management.vm_product_description,
|
|
468
|
+
"code_app": vulnerability_management.vm_product_name,
|
|
428
469
|
**common_fields,
|
|
429
470
|
}
|
|
430
471
|
)
|
|
@@ -454,25 +495,25 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
454
495
|
config_tool["VULNERABILITY_MANAGER"]["DEFECT_DOJO"]["HOST_DEFECT_DOJO"],
|
|
455
496
|
)
|
|
456
497
|
|
|
457
|
-
def _get_report_exclusions(self, total_findings, date_fn, host_dd):
|
|
498
|
+
def _get_report_exclusions(self, total_findings, date_fn, host_dd, **kwargs):
|
|
458
499
|
exclusions = []
|
|
459
500
|
for finding in total_findings:
|
|
460
501
|
if finding.risk_accepted:
|
|
461
502
|
exclusions.append(
|
|
462
503
|
self._create_report_exclusion(
|
|
463
|
-
finding, date_fn, "engine_risk",
|
|
504
|
+
finding, date_fn, "engine_risk", self.RISK_ACCEPTED, host_dd, **kwargs
|
|
464
505
|
)
|
|
465
506
|
)
|
|
466
507
|
elif finding.false_p:
|
|
467
508
|
exclusions.append(
|
|
468
509
|
self._create_report_exclusion(
|
|
469
|
-
finding, date_fn, "engine_risk", self.FALSE_POSITIVE, host_dd
|
|
510
|
+
finding, date_fn, "engine_risk", self.FALSE_POSITIVE, host_dd, **kwargs
|
|
470
511
|
)
|
|
471
512
|
)
|
|
472
513
|
elif finding.out_of_scope:
|
|
473
514
|
exclusions.append(
|
|
474
515
|
self._create_report_exclusion(
|
|
475
|
-
finding, date_fn, "engine_risk", self.OUT_OF_SCOPE, host_dd
|
|
516
|
+
finding, date_fn, "engine_risk", self.OUT_OF_SCOPE, host_dd, **kwargs
|
|
476
517
|
)
|
|
477
518
|
)
|
|
478
519
|
elif finding.risk_status == "Transfer Accepted":
|
|
@@ -483,18 +524,26 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
483
524
|
"engine_risk",
|
|
484
525
|
self.TRANSFERRED_FINDING,
|
|
485
526
|
host_dd,
|
|
527
|
+
**kwargs
|
|
528
|
+
)
|
|
529
|
+
)
|
|
530
|
+
elif finding.risk_status == self.ON_WHITELIST:
|
|
531
|
+
exclusions.append(
|
|
532
|
+
self._create_report_exclusion(
|
|
533
|
+
finding, date_fn, "engine_risk", self.ON_WHITELIST, host_dd, **kwargs
|
|
486
534
|
)
|
|
487
535
|
)
|
|
488
536
|
return exclusions
|
|
489
537
|
|
|
490
538
|
def _get_findings_with_exclusions(
|
|
491
|
-
self, session_manager, service, max_retries, query_params, tool, date_fn, reason
|
|
539
|
+
self, session_manager, service, max_retries, query_params, tool, date_fn, reason, **kwargs
|
|
492
540
|
):
|
|
493
541
|
findings = self._get_findings(
|
|
494
542
|
session_manager, service, max_retries, query_params
|
|
495
543
|
)
|
|
544
|
+
|
|
496
545
|
return map(
|
|
497
|
-
partial(self._create_exclusion, date_fn=date_fn, tool=tool, reason=reason),
|
|
546
|
+
partial(self._create_exclusion, date_fn=date_fn, tool=tool, reason=reason, **kwargs),
|
|
498
547
|
findings,
|
|
499
548
|
)
|
|
500
549
|
|
|
@@ -505,6 +554,14 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
505
554
|
).results
|
|
506
555
|
|
|
507
556
|
return self._retries_requests(request_func, max_retries, retry_delay=5)
|
|
557
|
+
|
|
558
|
+
def _get_finding_exclusion(self, session_manager, max_retries, query_params):
|
|
559
|
+
def request_func():
|
|
560
|
+
return FindingExclusion.get_finding_exclusion(
|
|
561
|
+
session=session_manager, **query_params
|
|
562
|
+
).results
|
|
563
|
+
|
|
564
|
+
return self._retries_requests(request_func, max_retries, retry_delay=5)
|
|
508
565
|
|
|
509
566
|
def _retries_requests(self, request_func, max_retries, retry_delay):
|
|
510
567
|
for attempt in range(max_retries):
|
|
@@ -519,25 +576,44 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
519
576
|
logger.error("Maximum number of retries reached, aborting.")
|
|
520
577
|
raise e
|
|
521
578
|
|
|
522
|
-
def _date_reason_based(self, finding, date_fn, reason):
|
|
523
|
-
if reason in [self.FALSE_POSITIVE, self.OUT_OF_SCOPE]:
|
|
524
|
-
create_date = date_fn(finding.last_status_update)
|
|
525
|
-
expired_date = date_fn(None)
|
|
526
|
-
elif reason == self.TRANSFERRED_FINDING:
|
|
527
|
-
create_date = date_fn(finding.transfer_finding.date)
|
|
528
|
-
expired_date = date_fn(finding.transfer_finding.expiration_date)
|
|
529
|
-
else:
|
|
530
|
-
last_accepted_risk = finding.accepted_risks[-1]
|
|
531
|
-
create_date = date_fn(last_accepted_risk["created"])
|
|
532
|
-
expired_date = date_fn(last_accepted_risk["expiration_date"])
|
|
533
579
|
|
|
580
|
+
def _date_reason_based(self, finding, date_fn, reason, tool, **kwargs):
|
|
581
|
+
def get_vuln_id(finding, tool):
|
|
582
|
+
if tool == "engine_risk":
|
|
583
|
+
return finding.id[0]["vulnerability_id"] if finding.id else finding.vuln_id_from_tool
|
|
584
|
+
else:
|
|
585
|
+
return finding.vulnerability_ids[0]["vulnerability_id"] if finding.vulnerability_ids else finding.vuln_id_from_tool
|
|
586
|
+
|
|
587
|
+
def get_dates_from_whitelist(vuln_id, white_list):
|
|
588
|
+
matching_finding = next(filter(lambda x: x.unique_id_from_tool == vuln_id, white_list), None)
|
|
589
|
+
if matching_finding:
|
|
590
|
+
return date_fn(matching_finding.create_date), date_fn(matching_finding.expiration_date)
|
|
591
|
+
return date_fn(None), date_fn(None)
|
|
592
|
+
|
|
593
|
+
reason_to_dates = {
|
|
594
|
+
self.FALSE_POSITIVE: lambda: (date_fn(finding.last_status_update), date_fn(None)),
|
|
595
|
+
self.OUT_OF_SCOPE: lambda: (date_fn(finding.last_status_update), date_fn(None)),
|
|
596
|
+
self.TRANSFERRED_FINDING: lambda: (date_fn(finding.transfer_finding.date), date_fn(finding.transfer_finding.expiration_date)),
|
|
597
|
+
self.RISK_ACCEPTED: lambda: (date_fn(finding.accepted_risks[-1]["created"]), date_fn(finding.accepted_risks[-1]["expiration_date"])),
|
|
598
|
+
self.ON_WHITELIST: lambda: get_dates_from_whitelist(get_vuln_id(finding, tool), kwargs.get("white_list", [])),
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
create_date, expired_date = reason_to_dates.get(reason, lambda: (date_fn(None), date_fn(None)))()
|
|
534
602
|
return create_date, expired_date
|
|
535
603
|
|
|
536
|
-
def _create_exclusion(self, finding, date_fn, tool, reason):
|
|
537
|
-
create_date, expired_date = self._date_reason_based(finding, date_fn, reason)
|
|
604
|
+
def _create_exclusion(self, finding, date_fn, tool, reason, **kwargs):
|
|
605
|
+
create_date, expired_date = self._date_reason_based(finding, date_fn, reason, tool, **kwargs)
|
|
538
606
|
|
|
539
607
|
return Exclusions(
|
|
540
|
-
id=
|
|
608
|
+
id=(
|
|
609
|
+
finding.vuln_id_from_tool
|
|
610
|
+
if finding.vuln_id_from_tool
|
|
611
|
+
else (
|
|
612
|
+
finding.vulnerability_ids[0]["vulnerability_id"]
|
|
613
|
+
if finding.vulnerability_ids
|
|
614
|
+
else ""
|
|
615
|
+
)
|
|
616
|
+
),
|
|
541
617
|
where=self._get_where(finding, tool),
|
|
542
618
|
create_date=create_date,
|
|
543
619
|
expired_date=expired_date,
|
|
@@ -545,11 +621,15 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
545
621
|
reason=reason,
|
|
546
622
|
)
|
|
547
623
|
|
|
548
|
-
def _create_report_exclusion(self, finding, date_fn, tool, reason, host_dd):
|
|
549
|
-
create_date, expired_date = self._date_reason_based(finding, date_fn, reason)
|
|
624
|
+
def _create_report_exclusion(self, finding, date_fn, tool, reason, host_dd, **kwargs):
|
|
625
|
+
create_date, expired_date = self._date_reason_based(finding, date_fn, reason, tool, **kwargs)
|
|
550
626
|
|
|
551
627
|
return Exclusions(
|
|
552
|
-
id=
|
|
628
|
+
id=(
|
|
629
|
+
finding.vuln_id_from_tool
|
|
630
|
+
if finding.vuln_id_from_tool
|
|
631
|
+
else finding.id[0]["vulnerability_id"] if finding.id else ""
|
|
632
|
+
),
|
|
553
633
|
where=self._get_where(finding, tool),
|
|
554
634
|
create_date=create_date,
|
|
555
635
|
expired_date=expired_date,
|
|
@@ -604,7 +684,11 @@ class DefectDojoPlatform(VulnerabilityManagementGateway):
|
|
|
604
684
|
|
|
605
685
|
def _get_where(self, finding, tool):
|
|
606
686
|
if tool == "engine_dependencies":
|
|
607
|
-
return
|
|
687
|
+
return (
|
|
688
|
+
finding.component_name.replace("_", ":")
|
|
689
|
+
+ ":"
|
|
690
|
+
+ finding.component_version
|
|
691
|
+
)
|
|
608
692
|
elif tool == "engine_container":
|
|
609
693
|
return finding.component_name + ":" + finding.component_version
|
|
610
694
|
elif tool == "engine_dast":
|
|
@@ -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 +1 @@
|
|
|
1
|
-
version = '1.
|
|
1
|
+
version = '1.31.0'
|
{devsecops_engine_tools-1.30.1.dist-info → devsecops_engine_tools-1.31.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.31.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
|
|
|
@@ -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=dORcM9p3Gq4eeQIYB7RelGt7lAEzbOinMO8jaEM2CLo,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=kUGFYhCm4-gZajqZCdhsyDecILWQtFj3dmcIT07pNXU,27745
|
|
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
|
|
@@ -226,14 +226,15 @@ devsecops_engine_tools/engine_utilities/azuredevops/infrastructure/azure_devops_
|
|
|
226
226
|
devsecops_engine_tools/engine_utilities/azuredevops/models/AzureMessageLoggingPipeline.py,sha256=pCwlPDDl-hgvZ9gvceuC8GsKbsMhRm3ykhFFVByVqcI,664
|
|
227
227
|
devsecops_engine_tools/engine_utilities/azuredevops/models/AzurePredefinedVariables.py,sha256=z9AGtc64o-BNTngiowRJFBlXmo_JmWqenL8YxdLs0aE,2561
|
|
228
228
|
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=
|
|
229
|
+
devsecops_engine_tools/engine_utilities/defect_dojo/__init__.py,sha256=P-HiaN1sgDUekalZPCzSTF-zuqyXpNG2uVEsMDaC0ro,462
|
|
230
230
|
devsecops_engine_tools/engine_utilities/defect_dojo/hello_world.py,sha256=WDvgS22lIJJNoIM4b6mrxT8Bu_6hADmrCOZgvf5yGVY,45
|
|
231
231
|
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=
|
|
232
|
+
devsecops_engine_tools/engine_utilities/defect_dojo/applications/component.py,sha256=Y6vA1nRfMCoqJEceRBDQ_QLpIKASqB-t8V1yqao-eUQ,1175
|
|
233
233
|
devsecops_engine_tools/engine_utilities/defect_dojo/applications/connect.py,sha256=tRvNN-zVKBJbHMvfW97SCsZoyjGaKttcQhLOKrbjK9E,2079
|
|
234
234
|
devsecops_engine_tools/engine_utilities/defect_dojo/applications/defect_dojo.py,sha256=gJMBVtE--Kvdc908fQa2T35mYyBXAWNTxM0DKsZ7e-w,2615
|
|
235
235
|
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=
|
|
236
|
+
devsecops_engine_tools/engine_utilities/defect_dojo/applications/finding.py,sha256=Cw5_TElo0D0Ec8X0lu-La2H9Pp1rsrmw-2Wv-0w_9oI,1451
|
|
237
|
+
devsecops_engine_tools/engine_utilities/defect_dojo/applications/finding_exclusion.py,sha256=StnDFV3vGhBffBEs-jfV9nMprzRucm5VJqtZFWKF3Fo,689
|
|
237
238
|
devsecops_engine_tools/engine_utilities/defect_dojo/applications/product.py,sha256=ogJM1AqfW-f_bJP4JWeHHM82PqN7G-jKKTbO8FM2x_Q,598
|
|
238
239
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
239
240
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -241,6 +242,7 @@ devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/cmdb.py,sha256
|
|
|
241
242
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/component.py,sha256=KYyWMUQcPsraqRaw0KY9eBaZPfajfBiskgOuwTI8mnA,483
|
|
242
243
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/engagement.py,sha256=MXb7c526tz0zSDS8xGPC5IjTMF9g9qtzcEKLyfcY89c,1393
|
|
243
244
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/finding.py,sha256=0Xj7BOlC30LCdBjIkviB2QmmdSj0GlDvT1-TbnaT8nE,3201
|
|
245
|
+
devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/finding_exclusion.py,sha256=mz6RDW3Xk3VHNQcUHm9cCMAyX6Ultcb-IZy9N59qPI4,530
|
|
244
246
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/product.py,sha256=KL5ue6icA8HH1xKkmAJzElAat3OOYU3_lt3xuNfo7Mc,1272
|
|
245
247
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/product_list.py,sha256=yFo8eYOGJiJMkU5pGpW0r1o5uVaNP5iA80-5w_MyWxU,664
|
|
246
248
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/product_type.py,sha256=2KVfRB0qgPO7osY4PBEQSOBOqRnZs0UzUZkS1guisBQ,524
|
|
@@ -250,14 +252,15 @@ devsecops_engine_tools/engine_utilities/defect_dojo/domain/request_objects/__ini
|
|
|
250
252
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/request_objects/finding.py,sha256=RinG3ISc-u_3VXVqntwdcQvZoQdmHPCvDHWSvnkCkcU,2619
|
|
251
253
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/request_objects/import_scan.py,sha256=UfvICLF-Wjii3iqvsRq0Tpc-quK4t3oS8U79tozzjfA,5014
|
|
252
254
|
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=
|
|
255
|
+
devsecops_engine_tools/engine_utilities/defect_dojo/domain/serializers/finding.py,sha256=4IQLjqgyImVdn8AxoU3UKgXnvU-F-x7Tm2bJdp6nHm4,5265
|
|
254
256
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/serializers/import_scan.py,sha256=AYYPtuAOKagT5qmFvdwuGQ_GupZfQNdMCyMaKzCkTDE,7290
|
|
255
257
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
256
258
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/cmdb.py,sha256=BUOdvP39bEMQ6Unr2hB28eljVGU2Uv8dDEkzRyEJgyQ,2650
|
|
257
259
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/component.py,sha256=_icc-ZAqw-aVgE5J4VH8Q7fSqpCgEGcfmurgRIN9NqM,448
|
|
258
260
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/engagement.py,sha256=SVX-weFRPT3DK7w6IBrLuWS4L6vboMuZtwXAQmIHfEE,406
|
|
259
261
|
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/
|
|
262
|
+
devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/finding_exclusion.py,sha256=VqdwBiQGc9XFpatvbXGL837LtTxkWlfhWH46W1cTbCg,455
|
|
263
|
+
devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/import_scan.py,sha256=eT1f1dtrLMLa41Mv_wnjg1L7bCBGKGjSpxD4hIDMx4Y,6927
|
|
261
264
|
devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/product.py,sha256=6f6eABdC79zOopMe_Rif3XoGG-yFfq9x_EOkevTuGDY,368
|
|
262
265
|
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
263
266
|
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -265,6 +268,7 @@ devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapt
|
|
|
265
268
|
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/component.py,sha256=-J0Sv7z709Hctb-tgM0wmp5ofE4WKEIA_uJwzvMnStE,2132
|
|
266
269
|
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/engagement.py,sha256=39qqmTxECRY5IoFvK_B_R0vfwfJwLbdhGt_pcdvdVIE,3571
|
|
267
270
|
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/finding.py,sha256=k-z2tg_NPKMni7rZgXMZa2-t8_8F35r8YtF1EcjMyDs,2355
|
|
271
|
+
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/finding_exclusion.py,sha256=BL4xf1FE5tMsBri0LetxBRUgOgLogdoHX97rQkHh10g,1524
|
|
268
272
|
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/import_scan.py,sha256=68Qd8o0oSxFG-3cRlX97BkX9muS6k64DGslGtX9sx6M,5897
|
|
269
273
|
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/product.py,sha256=DhiLPv8KyRhHBRhvF0ULhchhGAT8SQyn1ftiuou_aKw,2576
|
|
270
274
|
devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/product_type.py,sha256=9Lzsh9HCs4rbJ2b6X11renvYU3g6s-1q2NUDwbYX0qY,3051
|
|
@@ -317,8 +321,8 @@ devsecops_engine_tools/engine_utilities/utils/name_conversion.py,sha256=ADJrRGax
|
|
|
317
321
|
devsecops_engine_tools/engine_utilities/utils/printers.py,sha256=amYAr9YQfYgR6jK9a2l26z3oovFPQ3FAKmhq6BKhEBA,623
|
|
318
322
|
devsecops_engine_tools/engine_utilities/utils/session_manager.py,sha256=Z0fdhB3r-dxU0nGSD9zW_B4r2Qol1rUnUCkhFR0U-HQ,487
|
|
319
323
|
devsecops_engine_tools/engine_utilities/utils/utils.py,sha256=_yaXWHN1pi2xFFKg0yKbb4fsK_ZRv7Dk_9N1FtPS72k,5964
|
|
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.
|
|
324
|
+
devsecops_engine_tools-1.31.0.dist-info/METADATA,sha256=pvTlUKMErHnqovHTD6U9B8lHN9TSbSXj_H8B9D00HeI,11276
|
|
325
|
+
devsecops_engine_tools-1.31.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
|
|
326
|
+
devsecops_engine_tools-1.31.0.dist-info/entry_points.txt,sha256=MHCTFFs9bdNKo6YcWCcBW2_8X6yTisgLOlmVx-V8Rxc,276
|
|
327
|
+
devsecops_engine_tools-1.31.0.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
|
|
328
|
+
devsecops_engine_tools-1.31.0.dist-info/RECORD,,
|
|
File without changes
|
{devsecops_engine_tools-1.30.1.dist-info → devsecops_engine_tools-1.31.0.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{devsecops_engine_tools-1.30.1.dist-info → devsecops_engine_tools-1.31.0.dist-info}/top_level.txt
RENAMED
|
File without changes
|