devsecops-engine-tools 1.40.1__py3-none-any.whl → 1.42.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.

@@ -26,6 +26,7 @@ class BreakBuild:
26
26
  report_list: "list[Report]",
27
27
  all_report: "list[Report]",
28
28
  threshold: any,
29
+ policy_excluded: int,
29
30
  ):
30
31
  self.devops_platform_gateway = devops_platform_gateway
31
32
  self.printer_table_gateway = printer_table_gateway
@@ -35,6 +36,7 @@ class BreakBuild:
35
36
  self.report_list = report_list
36
37
  self.all_report = all_report
37
38
  self.threshold = threshold
39
+ self.policy_excluded = policy_excluded
38
40
  self.break_build = False
39
41
  self.warning_build = False
40
42
  self.report_breaker = []
@@ -50,11 +52,9 @@ class BreakBuild:
50
52
  }
51
53
 
52
54
  def process(self):
53
- self._remediation_rate_control(self.all_report)
54
55
  new_report_list, applied_exclusions = self._apply_exclusions(self.report_list)
55
- if self.break_build:
56
- self.report_breaker.extend(copy.deepcopy(new_report_list))
57
56
  self._tag_blacklist_control(new_report_list)
57
+ self._remediation_rate_control(self.all_report, new_report_list)
58
58
  self._risk_score_control(new_report_list)
59
59
  all_exclusions = list(self.vm_exclusions) + list(applied_exclusions)
60
60
  self._print_exclusions(self._map_applied_exclusion(all_exclusions))
@@ -118,10 +118,19 @@ class BreakBuild:
118
118
  else:
119
119
  print(self.devops_platform_gateway.result_pipeline("succeeded"))
120
120
 
121
- def _remediation_rate_control(self, all_report: "list[Report]"):
121
+ def _remediation_rate_control(
122
+ self, all_report: "list[Report]", new_report_list: "list[Report]"
123
+ ):
122
124
  mitigated = sum(1 for report in all_report if report.mitigated)
123
- total = len(all_report)
124
- print(f"Mitigated count: {mitigated} Total count: {total}")
125
+ white_list = sum(
126
+ 1
127
+ for report in all_report
128
+ if "white_list" in report.tags and not report.mitigated
129
+ )
130
+ total = len(all_report) - self.policy_excluded - white_list
131
+ print(
132
+ f"Mitigated count: {mitigated} Total count: {len(all_report)} Policy excluded: {self.policy_excluded + white_list}"
133
+ )
125
134
  remediation_rate_value = self._get_percentage(mitigated / total)
126
135
 
127
136
  risk_threshold = self._get_remediation_rate_threshold(total)
@@ -150,10 +159,18 @@ class BreakBuild:
150
159
  )
151
160
  )
152
161
  self.break_build = True
162
+ [
163
+ setattr(report, "reason", "Remediation Rate")
164
+ for report in new_report_list
165
+ ]
166
+ self.report_breaker.extend(copy.deepcopy(new_report_list))
153
167
 
154
168
  def _get_remediation_rate_threshold(self, total):
155
169
  remediation_rate = self.threshold["REMEDIATION_RATE"]
156
- for key in sorted(remediation_rate.keys(), key=lambda x: int(x) if x.isdigit() else float('inf')):
170
+ for key in sorted(
171
+ remediation_rate.keys(),
172
+ key=lambda x: int(x) if x.isdigit() else float("inf"),
173
+ ):
157
174
  if key.isdigit() and total <= int(key):
158
175
  return remediation_rate[key]
159
176
  return remediation_rate["other"]
@@ -209,7 +226,6 @@ class BreakBuild:
209
226
  applied_exclusions.append(exclusion_copy)
210
227
  break
211
228
  if not exclude:
212
- report.reason = "Remediation Rate"
213
229
  filtered_reports.append(report)
214
230
 
215
231
  return filtered_reports, applied_exclusions
@@ -217,21 +233,22 @@ class BreakBuild:
217
233
  def _tag_blacklist_control(self, report_list: "list[Report]"):
218
234
  remote_config = self.remote_config
219
235
  if report_list:
220
- tag_blacklist = set(remote_config["TAG_BLACKLIST"])
221
- tag_age_threshold = self.threshold["TAG_MAX_AGE"]
236
+ tag_blacklist = set(remote_config["TAG_BLACKLIST_EXCLUSION_DAYS"].keys())
222
237
 
223
238
  filtered_reports_above_threshold = [
224
239
  (report, tag)
225
240
  for report in report_list
226
241
  for tag in report.tags
227
- if tag in tag_blacklist and report.age >= tag_age_threshold
242
+ if tag in tag_blacklist
243
+ and report.age >= remote_config["TAG_BLACKLIST_EXCLUSION_DAYS"][tag]
228
244
  ]
229
245
 
230
246
  filtered_reports_below_threshold = [
231
247
  (report, tag)
232
248
  for report in report_list
233
249
  for tag in report.tags
234
- if tag in tag_blacklist and report.age < tag_age_threshold
250
+ if tag in tag_blacklist
251
+ and report.age < remote_config["TAG_BLACKLIST_EXCLUSION_DAYS"][tag]
235
252
  ]
236
253
 
237
254
  for report, tag in filtered_reports_above_threshold:
@@ -239,7 +256,7 @@ class BreakBuild:
239
256
  print(
240
257
  self.devops_platform_gateway.message(
241
258
  "error",
242
- f"Report {report.vm_id} with tag {tag} is blacklisted and age {report.age} is above threshold {tag_age_threshold}",
259
+ f"Report {report.vm_id} with tag '{tag}' is blacklisted and age {report.age} is above threshold {remote_config['TAG_BLACKLIST_EXCLUSION_DAYS'][tag]}",
243
260
  )
244
261
  )
245
262
 
@@ -247,9 +264,10 @@ class BreakBuild:
247
264
  print(
248
265
  self.devops_platform_gateway.message(
249
266
  "warning",
250
- f"Report {report.vm_id} with tag {tag} is blacklisted but age {report.age} is below threshold {tag_age_threshold}",
267
+ f"Report {report.vm_id} with tag '{tag}' is blacklisted but age {report.age} is below threshold {remote_config['TAG_BLACKLIST_EXCLUSION_DAYS'][tag]}",
251
268
  )
252
269
  )
270
+ self.policy_excluded += 1
253
271
 
254
272
  if filtered_reports_above_threshold:
255
273
  self.break_build = True
@@ -1,6 +1,7 @@
1
1
  from devsecops_engine_tools.engine_core.src.domain.model.exclusions import (
2
2
  Exclusions,
3
3
  )
4
+ from datetime import datetime, timedelta
4
5
 
5
6
 
6
7
  class GetExclusions:
@@ -12,6 +13,7 @@ class GetExclusions:
12
13
  risk_config,
13
14
  risk_exclusions,
14
15
  services,
16
+ active_findings,
15
17
  ):
16
18
  self.devops_platform_gateway = devops_platform_gateway
17
19
  self.dict_args = dict_args
@@ -19,10 +21,13 @@ class GetExclusions:
19
21
  self.risk_config = risk_config
20
22
  self.risk_exclusions = risk_exclusions
21
23
  self.services = services
24
+ self.active_findings = active_findings
22
25
 
23
26
  def process(self):
24
27
  core_config = self.devops_platform_gateway.get_remote_config(
25
- self.dict_args["remote_config_repo"], "engine_core/ConfigTool.json", self.dict_args["remote_config_branch"]
28
+ self.dict_args["remote_config_repo"],
29
+ "engine_core/ConfigTool.json",
30
+ self.dict_args["remote_config_branch"],
26
31
  )
27
32
  unique_tags = self._get_unique_tags()
28
33
  exclusions = []
@@ -35,14 +40,19 @@ class GetExclusions:
35
40
  )
36
41
  )
37
42
 
38
- return exclusions
43
+ new_vuln_exclusions, len_new_vuln_exclusions = self._get_exclusions_new_vuln()
44
+ exclusions.extend(new_vuln_exclusions)
45
+
46
+ return exclusions, len_new_vuln_exclusions
39
47
 
40
48
  def _get_risk_exclusions(self):
41
49
  return self._get_exclusions(self.risk_exclusions, "RISK")
42
50
 
43
51
  def _get_exclusions_by_practice(self, core_config, practice, path):
44
52
  exclusions_config = self.devops_platform_gateway.get_remote_config(
45
- self.dict_args["remote_config_repo"], path, self.dict_args["remote_config_branch"]
53
+ self.dict_args["remote_config_repo"],
54
+ path,
55
+ self.dict_args["remote_config_branch"],
46
56
  )
47
57
  tool = core_config[practice.upper()]["TOOL"]
48
58
  return self._get_exclusions(exclusions_config, tool)
@@ -69,3 +79,26 @@ class GetExclusions:
69
79
  tags = finding.tags
70
80
  unique_tags.update(tags)
71
81
  return list(unique_tags)
82
+
83
+ def _get_exclusions_new_vuln(self):
84
+ cutoff_date = datetime.now() - timedelta(days=5)
85
+ exclusions = []
86
+ for finding in self.active_findings:
87
+ if finding.publish_date:
88
+ try:
89
+ finding_publish_date = datetime.strptime(
90
+ finding.publish_date, "%Y-%m-%d"
91
+ )
92
+ except ValueError:
93
+ continue
94
+ if finding_publish_date >= cutoff_date and hasattr(finding, "id"):
95
+ exclusion_data = finding.__dict__.copy()
96
+ exclusion_data["create_date"] = finding_publish_date.strftime(
97
+ "%d%m%Y"
98
+ )
99
+ exclusion_data["expired_date"] = (
100
+ finding_publish_date + timedelta(days=5)
101
+ ).strftime("%d%m%Y")
102
+ exclusion_data["reason"] = "New vulnerability in the industry"
103
+ exclusions.append(Exclusions(**exclusion_data))
104
+ return exclusions, len(exclusions)
@@ -49,11 +49,13 @@ class HandleFilters:
49
49
  def filter_tags_days(self, devops_platform_gateway, remote_config, findings):
50
50
  tag_exclusion_days = remote_config["TAG_EXCLUSION_DAYS"]
51
51
  filtered_findings = []
52
+ filtered = 0
52
53
 
53
54
  for finding in findings:
54
55
  exclude = False
55
56
  for tag in finding.tags:
56
57
  if tag in tag_exclusion_days and finding.age < tag_exclusion_days[tag]:
58
+ filtered += 1
57
59
  exclude = True
58
60
  print(
59
61
  devops_platform_gateway.message(
@@ -65,7 +67,7 @@ class HandleFilters:
65
67
  if not exclude:
66
68
  filtered_findings.append(finding)
67
69
 
68
- return filtered_findings
70
+ return filtered_findings, filtered
69
71
 
70
72
  def _get_active_findings(self, findings):
71
73
  return list(
@@ -31,10 +31,14 @@ def init_engine_risk(
31
31
  vm_exclusions,
32
32
  ):
33
33
  remote_config = devops_platform_gateway.get_remote_config(
34
- dict_args["remote_config_repo"], "engine_risk/ConfigTool.json", dict_args["remote_config_branch"]
34
+ dict_args["remote_config_repo"],
35
+ "engine_risk/ConfigTool.json",
36
+ dict_args["remote_config_branch"],
35
37
  )
36
38
  risk_exclusions = devops_platform_gateway.get_remote_config(
37
- dict_args["remote_config_repo"], "engine_risk/Exclusions.json", dict_args["remote_config_branch"]
39
+ dict_args["remote_config_repo"],
40
+ "engine_risk/Exclusions.json",
41
+ dict_args["remote_config_branch"],
38
42
  )
39
43
  pipeline_name = devops_platform_gateway.get_variable("pipeline_name")
40
44
 
@@ -49,7 +53,7 @@ def init_engine_risk(
49
53
 
50
54
  unique_findings = handle_filters.filter_duplicated(active_findings)
51
55
 
52
- filtered_findings = handle_filters.filter_tags_days(
56
+ filtered_findings, len_tag_filtered = handle_filters.filter_tags_days(
53
57
  devops_platform_gateway, remote_config, unique_findings
54
58
  )
55
59
 
@@ -62,8 +66,11 @@ def init_engine_risk(
62
66
  remote_config,
63
67
  risk_exclusions,
64
68
  services,
69
+ active_findings,
65
70
  )
66
- exclusions = get_exclusions.process()
71
+ exclusions, len_new_vuln = get_exclusions.process()
72
+
73
+ policy_excluded = len_tag_filtered + len_new_vuln
67
74
 
68
75
  threshold = CheckThreshold(
69
76
  pipeline_name, remote_config["THRESHOLD"], risk_exclusions
@@ -78,6 +85,7 @@ def init_engine_risk(
78
85
  data_added,
79
86
  findings,
80
87
  threshold,
88
+ policy_excluded,
81
89
  )
82
90
 
83
91
  return break_build.process()
@@ -3,9 +3,6 @@ from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
3
3
  from devsecops_engine_tools.engine_utilities.defect_dojo.infraestructure.driver_adapters.import_scan import (
4
4
  ImportScanRestConsumer,
5
5
  )
6
- from devsecops_engine_tools.engine_utilities.defect_dojo.infraestructure.driver_adapters.reimport_scan import (
7
- ReimportScanRestConsumer,
8
- )
9
6
  from devsecops_engine_tools.engine_utilities.defect_dojo.infraestructure.driver_adapters.product_type import (
10
7
  ProductTypeRestConsumer,
11
8
  )
@@ -51,16 +48,12 @@ class DefectDojo:
51
48
  rest_scan_configuration = ScanConfigrationRestConsumer(
52
49
  request, session=SessionManager()
53
50
  )
54
- rest_reimport_scan = ReimportScanRestConsumer(
55
- request, session=SessionManager()
56
- )
57
51
  uc = ImportScanUserCase(
58
52
  rest_import_scan,
59
53
  rest_product_type,
60
54
  rest_product,
61
55
  rest_scan_configuration,
62
56
  rest_engagement=rest_engagement,
63
- rest_reimport_scan=rest_reimport_scan
64
57
  )
65
58
  return uc.execute(request)
66
59
  except ApiError as e:
@@ -77,7 +77,7 @@ class Finding(FromDictMixin):
77
77
  sast_source_line = None
78
78
  sast_source_file_path = None
79
79
  nb_occurences = None
80
- publish_date = None
80
+ publish_date: str = ""
81
81
  planned_remediation_date = None
82
82
  planned_remediation_version = None
83
83
  effort_for_fixing = None
@@ -5,7 +5,6 @@ from devsecops_engine_tools.engine_utilities.settings import SETTING_LOGGER
5
5
  from devsecops_engine_tools.engine_utilities.utils.api_error import ApiError
6
6
  from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
7
7
  from devsecops_engine_tools.engine_utilities.defect_dojo.infraestructure.driver_adapters.import_scan import ImportScanRestConsumer
8
- from devsecops_engine_tools.engine_utilities.defect_dojo.infraestructure.driver_adapters.reimport_scan import ReimportScanRestConsumer
9
8
  from devsecops_engine_tools.engine_utilities.defect_dojo.infraestructure.driver_adapters.product_type import ProductTypeRestConsumer
10
9
  from devsecops_engine_tools.engine_utilities.defect_dojo.infraestructure.driver_adapters.product import ProductRestConsumer
11
10
  from devsecops_engine_tools.engine_utilities.defect_dojo.infraestructure.driver_adapters.scan_configurations import (
@@ -26,14 +25,12 @@ class ImportScanUserCase:
26
25
  rest_product: ProductRestConsumer,
27
26
  rest_scan_configuration: ScanConfigrationRestConsumer,
28
27
  rest_engagement: EngagementRestConsumer,
29
- rest_reimport_scan: ReimportScanRestConsumer,
30
28
  ):
31
29
  self.__rest_import_scan = rest_import_scan
32
30
  self.__rest_product_type = rest_product_type
33
31
  self.__rest_product = rest_product
34
32
  self.__rest_scan_configurations = rest_scan_configuration
35
33
  self.__rest_engagement = rest_engagement
36
- self.__rest_reimport_scan = rest_reimport_scan
37
34
 
38
35
 
39
36
  def get_file_type(self, path_file):
@@ -49,7 +46,6 @@ class ImportScanUserCase:
49
46
 
50
47
  def import_scan(self, request, api_scan_bool):
51
48
  response = None
52
-
53
49
  if api_scan_bool:
54
50
  response = self.__rest_import_scan.import_scan_api(request)
55
51
  logger.info(f"End process Succesfull!!!: {response}")
@@ -70,31 +66,6 @@ class ImportScanUserCase:
70
66
  response.url = f"{request.host_defect_dojo}/engagement/{str(response.engagement_id)}/finding/open"
71
67
  return response
72
68
 
73
- def reimport_scan(self, request, api_scan_bool):
74
- response = None
75
-
76
- if api_scan_bool:
77
- logger.debug(f"reimport scan :{self.__rest_reimport_scan}")
78
- response = self.__rest_reimport_scan.reimport_scan(request)
79
- logger.info(f"End process Succesfull!!!: {response}")
80
- else:
81
- try:
82
- logger.debug(f"reimport scan file :{self.__rest_reimport_scan}")
83
- file_type = self.get_file_type(request.file)
84
- if file_type is None:
85
- raise ApiError("File format not allowed")
86
-
87
- with open(request.file, "rb") as file:
88
- logger.info(f"read {file_type} file successful !!!")
89
- files = [("file", (request.file, file, file_type))]
90
- response = self.__rest_reimport_scan.reimport_scan(request, files)
91
-
92
- except Exception as e:
93
- raise ApiError(e)
94
-
95
- response.url = f"{request.host_defect_dojo}/engagement/{str(response.engagement_id)}/finding/open"
96
- return response
97
-
98
69
  def execute(self, request: ImportScanRequest) -> ImportScanRequest:
99
70
  product_id = None
100
71
 
@@ -162,8 +133,4 @@ class ImportScanUserCase:
162
133
  engagement = self.__rest_engagement.post_engagement(request.engagement_name, product_id)
163
134
  logger.debug(f"Egagement created: {engagement.name} whit product id {engagement.product}")
164
135
 
165
- if request.reimport_scan is True:
166
- logger.debug("reimport scan flow")
167
- return self.reimport_scan(request, api_scan_bool)
168
- else:
169
- return self.import_scan(request, api_scan_bool)
136
+ return self.import_scan(request, api_scan_bool)
@@ -16,7 +16,6 @@ class ImportScanRestConsumer:
16
16
  self.__session = session._instance
17
17
 
18
18
  def import_scan_api(self, request: ImportScanRequest) -> ImportScanRequest:
19
- url = f"{self.__host}/api/v2/import-scan/"
20
19
  data = {
21
20
  "scan_date": request.scan_date,
22
21
  "minimum_severity": request.minimum_severity,
@@ -24,14 +23,12 @@ class ImportScanRestConsumer:
24
23
  "verified": request.verified,
25
24
  "scan_type": request.scan_type,
26
25
  "endpoint_to_add": request.endpoint_to_add,
27
- # "file": request.file,
28
26
  "product_type_name": request.product_type_name,
29
27
  "product_name": request.product_name,
30
28
  "engagement_name": request.engagement_name,
31
29
  "engagement_end_date": request.engagement_end_date,
32
30
  "source_code_management_uri": request.source_code_management_uri,
33
31
  "engagement": str(request.engagement) if request.engagement != 0 else "",
34
- "auto_create_context": "false",
35
32
  "deduplication_on_engagement": request.deduplication_on_engagement,
36
33
  "lead": request.lead,
37
34
  "tags": ",".join(request.tags) if request.tags else "",
@@ -49,6 +46,15 @@ class ImportScanRestConsumer:
49
46
  "service": request.service,
50
47
  "group_by": request.group_by,
51
48
  }
49
+
50
+ if request.reimport_scan:
51
+ url = f"{self.__host}/api/v2/reimport-scan/"
52
+ data["auto_create_context"] = "true"
53
+
54
+ else:
55
+ url = f"{self.__host}/api/v2/import-scan/"
56
+ data["auto_create_context"] = "false"
57
+
52
58
  multipart_data = MultipartEncoder(fields=data)
53
59
 
54
60
  headers = {"Authorization": f"Token {self.__token}", "Content-Type": multipart_data.content_type}
@@ -65,8 +71,7 @@ class ImportScanRestConsumer:
65
71
  return response
66
72
 
67
73
  def import_scan(self, request: ImportScanRequest, files) -> ImportScanRequest:
68
- url = f"{self.__host}/api/v2/import-scan/"
69
- payload = {
74
+ data = {
70
75
  "scan_date": request.scan_date,
71
76
  "minimum_severity": request.minimum_severity,
72
77
  "active": request.active,
@@ -80,7 +85,6 @@ class ImportScanRestConsumer:
80
85
  "engagement_end_date": request.engagement_end_date,
81
86
  "source_code_management_uri": request.source_code_management_uri,
82
87
  "engagement": request.engagement if request.engagement != 0 else "",
83
- "auto_create_context": "false",
84
88
  "deduplication_on_engagement": request.deduplication_on_engagement,
85
89
  "lead": request.lead,
86
90
  "tags": request.tags,
@@ -98,12 +102,23 @@ class ImportScanRestConsumer:
98
102
  "service": request.service,
99
103
  "group_by": request.group_by,
100
104
  }
105
+ if request.reimport_scan is True:
106
+ url = f"{self.__host}/api/v2/reimport-scan/"
107
+ data["auto_create_context"] = "true"
108
+ data["test_title"] = request.test_title
109
+ else:
110
+ url = f"{self.__host}/api/v2/import-scan/"
111
+ data["auto_create_context"] = "false"
101
112
 
102
113
  headers = {"Authorization": f"Token {self.__token}"}
103
114
  try:
104
- response = self.__session.post(url, headers=headers, data=payload, files=files, verify=VERIFY_CERTIFICATE)
115
+ response = self.__session.post(url,
116
+ headers=headers,
117
+ data=data,
118
+ files=files,
119
+ verify=VERIFY_CERTIFICATE)
105
120
  if response.status_code != 201:
106
- logger.error(payload)
121
+ logger.error(data)
107
122
  logger.error(response.json())
108
123
  logger.error(response)
109
124
  raise ApiError(response.json())
@@ -1 +1 @@
1
- version = '1.40.1'
1
+ version = '1.42.0'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: devsecops-engine-tools
3
- Version: 1.40.1
3
+ Version: 1.42.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
@@ -1,5 +1,5 @@
1
1
  devsecops_engine_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- devsecops_engine_tools/version.py,sha256=CzOchPN3BP6JxBIpFBs1_bjOHUmWZIroALSUWXop0r4,19
2
+ devsecops_engine_tools/version.py,sha256=lImSWY-_RWXVBAAKLg7CiJoHxDRvObxtgqXGqYqoSeg,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
@@ -101,16 +101,16 @@ devsecops_engine_tools/engine_risk/src/domain/model/gateways/__init__.py,sha256=
101
101
  devsecops_engine_tools/engine_risk/src/domain/model/gateways/add_epss_gateway.py,sha256=cTm4QSxiaUt7ETCdXWZxKEus8pmEDA3e9k5b39SLDDE,178
102
102
  devsecops_engine_tools/engine_risk/src/domain/usecases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
103
  devsecops_engine_tools/engine_risk/src/domain/usecases/add_data.py,sha256=4wqDj-q7hJfJscvrbMDcy7tONqxdxl-CSl_TWTRUGKA,402
104
- devsecops_engine_tools/engine_risk/src/domain/usecases/break_build.py,sha256=qE9giBOR19rI7W084uE0OoPHpYGwKq0yRm4Tz6R10vw,12536
104
+ devsecops_engine_tools/engine_risk/src/domain/usecases/break_build.py,sha256=k24X9gipSiFQNp4V8guW4hCWUtCzxyKq-eo2FwGW2b8,13216
105
105
  devsecops_engine_tools/engine_risk/src/domain/usecases/check_threshold.py,sha256=VYdmcbAuNNvdHCegRfvza7YJ8FHbFNyDosrKJrMW93I,765
106
- devsecops_engine_tools/engine_risk/src/domain/usecases/get_exclusions.py,sha256=1ekBmLK36R3ddkQ40s8teAYvaldG8hnVsacXnWdkKrg,2460
107
- devsecops_engine_tools/engine_risk/src/domain/usecases/handle_filters.py,sha256=JmeBtO6CMufjYSRpGQU1kPZoW3PnXwVXnl33LSIU3n8,3543
106
+ devsecops_engine_tools/engine_risk/src/domain/usecases/get_exclusions.py,sha256=O6LoALXzQq0kB4TUuDdF1g5JUO0vtCeXF8txEkHYb6I,3850
107
+ devsecops_engine_tools/engine_risk/src/domain/usecases/handle_filters.py,sha256=R53fnuIQYfr7YbpMz1BGPJ1d5z9jY_Hnm7EmPt99wlE,3608
108
108
  devsecops_engine_tools/engine_risk/src/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
109
  devsecops_engine_tools/engine_risk/src/infrastructure/driven_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
110
  devsecops_engine_tools/engine_risk/src/infrastructure/driven_adapters/first_csv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
111
  devsecops_engine_tools/engine_risk/src/infrastructure/driven_adapters/first_csv/first_epss_csv.py,sha256=pWaRmIwVyiB5mlmWySHIx-DUgN9vtKQc-MqyRNVlTJo,2150
112
112
  devsecops_engine_tools/engine_risk/src/infrastructure/entry_points/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
- devsecops_engine_tools/engine_risk/src/infrastructure/entry_points/entry_point_risk.py,sha256=tiXRqWcehAoFn-HrvteOKTYemwlfTJHCqIGYDGAk28Q,2459
113
+ devsecops_engine_tools/engine_risk/src/infrastructure/entry_points/entry_point_risk.py,sha256=3SIhdvy0_fEuN-w2_KNvwklo5mL3rCr5Zb2SV6HY77k,2630
114
114
  devsecops_engine_tools/engine_risk/src/infrastructure/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
115
  devsecops_engine_tools/engine_sast/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
116
116
  devsecops_engine_tools/engine_sast/engine_code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -257,7 +257,7 @@ devsecops_engine_tools/engine_utilities/defect_dojo/hello_world.py,sha256=WDvgS2
257
257
  devsecops_engine_tools/engine_utilities/defect_dojo/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
258
258
  devsecops_engine_tools/engine_utilities/defect_dojo/applications/component.py,sha256=Y6vA1nRfMCoqJEceRBDQ_QLpIKASqB-t8V1yqao-eUQ,1175
259
259
  devsecops_engine_tools/engine_utilities/defect_dojo/applications/connect.py,sha256=tRvNN-zVKBJbHMvfW97SCsZoyjGaKttcQhLOKrbjK9E,2079
260
- devsecops_engine_tools/engine_utilities/defect_dojo/applications/defect_dojo.py,sha256=WKx_nBZV9bZj-Y9UAg-C4SeCapbRhQb7475lcuzlGVg,2943
260
+ devsecops_engine_tools/engine_utilities/defect_dojo/applications/defect_dojo.py,sha256=gJMBVtE--Kvdc908fQa2T35mYyBXAWNTxM0DKsZ7e-w,2615
261
261
  devsecops_engine_tools/engine_utilities/defect_dojo/applications/engagement.py,sha256=sPTeQs6QHg07QNthqhY3caVbG54vDkd_E_KJpBvgTk4,878
262
262
  devsecops_engine_tools/engine_utilities/defect_dojo/applications/finding.py,sha256=Cw5_TElo0D0Ec8X0lu-La2H9Pp1rsrmw-2Wv-0w_9oI,1451
263
263
  devsecops_engine_tools/engine_utilities/defect_dojo/applications/finding_exclusion.py,sha256=StnDFV3vGhBffBEs-jfV9nMprzRucm5VJqtZFWKF3Fo,689
@@ -267,7 +267,7 @@ devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/__init__.py,sh
267
267
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/cmdb.py,sha256=7EAzKzBJaDqP4Q57cyu_nCpl9WqcTZFjXydkYCh8h-k,320
268
268
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/component.py,sha256=KYyWMUQcPsraqRaw0KY9eBaZPfajfBiskgOuwTI8mnA,483
269
269
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/engagement.py,sha256=MXb7c526tz0zSDS8xGPC5IjTMF9g9qtzcEKLyfcY89c,1393
270
- devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/finding.py,sha256=0Xj7BOlC30LCdBjIkviB2QmmdSj0GlDvT1-TbnaT8nE,3201
270
+ devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/finding.py,sha256=fOlKeGPf9gMjz6RyRVWRyEZWxwm7XFE6eEQ5bIBmTBs,3204
271
271
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/finding_exclusion.py,sha256=mz6RDW3Xk3VHNQcUHm9cCMAyX6Ultcb-IZy9N59qPI4,530
272
272
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/product.py,sha256=KL5ue6icA8HH1xKkmAJzElAat3OOYU3_lt3xuNfo7Mc,1272
273
273
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/models/product_list.py,sha256=yFo8eYOGJiJMkU5pGpW0r1o5uVaNP5iA80-5w_MyWxU,664
@@ -286,7 +286,7 @@ devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/component.p
286
286
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/engagement.py,sha256=SVX-weFRPT3DK7w6IBrLuWS4L6vboMuZtwXAQmIHfEE,406
287
287
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/finding.py,sha256=TjfpdJtaBwQvT8XNJKBf6tuOASOAw7ZiOxJbqsKadaA,1689
288
288
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/finding_exclusion.py,sha256=VqdwBiQGc9XFpatvbXGL837LtTxkWlfhWH46W1cTbCg,455
289
- devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/import_scan.py,sha256=N31WBga-wu0inWOuikasSUP9ASemDJtrcHg31whCALM,8573
289
+ devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/import_scan.py,sha256=iXfvv_MDQODC6jU-OSVIMj3_MAOzCZCY6Hay56es0Gg,7047
290
290
  devsecops_engine_tools/engine_utilities/defect_dojo/domain/user_case/product.py,sha256=6f6eABdC79zOopMe_Rif3XoGG-yFfq9x_EOkevTuGDY,368
291
291
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
292
292
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -295,10 +295,9 @@ devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapt
295
295
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/engagement.py,sha256=39qqmTxECRY5IoFvK_B_R0vfwfJwLbdhGt_pcdvdVIE,3571
296
296
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/finding.py,sha256=k-z2tg_NPKMni7rZgXMZa2-t8_8F35r8YtF1EcjMyDs,2355
297
297
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/finding_exclusion.py,sha256=BL4xf1FE5tMsBri0LetxBRUgOgLogdoHX97rQkHh10g,1524
298
- devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/import_scan.py,sha256=SwkW-2Znzs_RiCPPsIgZKSG_VSO2afoQH5DTTg-dKPQ,5929
298
+ devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/import_scan.py,sha256=1oTQs7ML8DM29qPdgxSHhX4J5tLc9bsTaaAF1iKE0fI,6462
299
299
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/product.py,sha256=DhiLPv8KyRhHBRhvF0ULhchhGAT8SQyn1ftiuou_aKw,2576
300
300
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/product_type.py,sha256=x-Gh2BEP6IZccS2m_DLB8xI6aEkS19J0ZUpP2mjY88o,3078
301
- devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/reimport_scan.py,sha256=6Wtg88p9WFdWjEAfNT2qjUcRGRg6wmruvuKcmajG3A8,3469
302
301
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/scan_configurations.py,sha256=YVIHiXPkJ8m1nOW7lG8LGbST16eMZoJwFQcrRRU7R6k,3089
303
302
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
304
303
  devsecops_engine_tools/engine_utilities/defect_dojo/infraestructure/driver_adapters/settings/settings.py,sha256=5ni59GuAHT-avpWNc4FSedVpoFRTGRNzjQJkAXpWv6c,28
@@ -348,8 +347,8 @@ devsecops_engine_tools/engine_utilities/utils/name_conversion.py,sha256=ADJrRGax
348
347
  devsecops_engine_tools/engine_utilities/utils/printers.py,sha256=amYAr9YQfYgR6jK9a2l26z3oovFPQ3FAKmhq6BKhEBA,623
349
348
  devsecops_engine_tools/engine_utilities/utils/session_manager.py,sha256=Z0fdhB3r-dxU0nGSD9zW_B4r2Qol1rUnUCkhFR0U-HQ,487
350
349
  devsecops_engine_tools/engine_utilities/utils/utils.py,sha256=XFap4yOK7ItLWsqbwDhvLd7NpDhs7i-UGJAMD6jjd7w,6687
351
- devsecops_engine_tools-1.40.1.dist-info/METADATA,sha256=tW-9wImZKsHAxUSScW2dAyqQAzhc7bUS65oohhY1-6Y,11750
352
- devsecops_engine_tools-1.40.1.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
353
- devsecops_engine_tools-1.40.1.dist-info/entry_points.txt,sha256=MHCTFFs9bdNKo6YcWCcBW2_8X6yTisgLOlmVx-V8Rxc,276
354
- devsecops_engine_tools-1.40.1.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
355
- devsecops_engine_tools-1.40.1.dist-info/RECORD,,
350
+ devsecops_engine_tools-1.42.0.dist-info/METADATA,sha256=x3BvCitJpws34kkpjw2AatvJGQr_WE-e_bI2AqMTcLc,11750
351
+ devsecops_engine_tools-1.42.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
352
+ devsecops_engine_tools-1.42.0.dist-info/entry_points.txt,sha256=MHCTFFs9bdNKo6YcWCcBW2_8X6yTisgLOlmVx-V8Rxc,276
353
+ devsecops_engine_tools-1.42.0.dist-info/top_level.txt,sha256=ge6y0X_xBAU1aG3EMWFtl9djbVyg5BxuSp2r2Lg6EQU,23
354
+ devsecops_engine_tools-1.42.0.dist-info/RECORD,,
@@ -1,74 +0,0 @@
1
- from devsecops_engine_tools.engine_utilities.utils.api_error import ApiError
2
- from devsecops_engine_tools.engine_utilities.defect_dojo.domain.request_objects.import_scan import ImportScanRequest
3
- from devsecops_engine_tools.engine_utilities.utils.logger_info import MyLogger
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
-
11
- class ReimportScanRestConsumer:
12
-
13
- def __init__(self, request: ImportScanRequest, session: SessionManager):
14
- self.__token = request.token_defect_dojo
15
- self.__host = request.host_defect_dojo
16
- self.__session = session._instance
17
-
18
- def reimport_scan(self, request: ImportScanRequest, files) -> ImportScanRequest:
19
- url = f"{self.__host}/api/v2/reimport-scan/"
20
- logger.debug(f"URL: {url}")
21
- payload = {
22
- "scan_date": request.scan_date,
23
- "minimum_severity": request.minimum_severity,
24
- "active": request.active,
25
- "verified": request.verified,
26
- "scan_type": request.scan_type,
27
- "endpoint_to_add": request.endpoint_to_add,
28
- "file": files,
29
- "product_type_name": request.product_type_name,
30
- "product_name": request.product_name,
31
- "engagement_name": request.engagement_name,
32
- "engagement_end_date": request.engagement_end_date,
33
- "source_code_management_uri": request.source_code_management_uri,
34
- "auto_create_context": "true",
35
- "deduplication_on_engagement": request.deduplication_on_engagement,
36
- "lead": request.lead,
37
- "push_to_jira": request.push_to_jira,
38
- "environment": request.environment,
39
- "build_id": request.build_id,
40
- "branch_tag": request.branch_tag,
41
- "commit_hash": request.commit_hash,
42
- "api_scan_configuration": str(request.api_scan_configuration)
43
- if request.api_scan_configuration != 0
44
- else "",
45
- "service": request.service,
46
- "group_by": request.group_by,
47
- "create_finding_groups_for_all_findings": request.create_finding_groups_for_all_findings,
48
- "do_not_reactive"
49
- "scan_type": request.scan_type,
50
- "close_old_findings": request.close_old_findings,
51
- "close_old_findings_product_scope": request.close_old_findings_product_scope,
52
- "version": request.version,
53
- "tags": request.tags,
54
- "test_title": request.test_title,
55
- }
56
-
57
- headers = {"Authorization": f"Token {self.__token}"}
58
- try:
59
- response = self.__session.post(
60
- url,
61
- headers=headers,
62
- data=payload,
63
- files=files,
64
- verify=VERIFY_CERTIFICATE
65
- )
66
- if response.status_code != 201:
67
- logger.error(response.json())
68
- raise ApiError(response.json())
69
- logger.info(f"Sucessfull {response}")
70
- response = ImportScanRequest.from_dict(response.json())
71
- except Exception as e:
72
- logger.error(f"from dict import Scan: {response.json()}")
73
- raise ApiError(e)
74
- return response