Skip to content

Commit 3262640

Browse files
authored
Merge pull request #14626 from valentijnscholten/fix/parser-tags-performance
fix(parsers): use unsaved_tags instead of tags= in Finding constructor
2 parents fdcdc34 + be30d1f commit 3262640

9 files changed

Lines changed: 30 additions & 25 deletions

File tree

dojo/tools/anchore_grype/parser.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,16 +215,18 @@ def get_findings(self, file, test):
215215
component_name=artifact_name,
216216
component_version=artifact_version.replace("\x00", ""),
217217
vuln_id_from_tool=vuln_id,
218-
tags=finding_tags,
219218
static_finding=True,
220219
dynamic_finding=False,
221220
nb_occurences=1,
222221
file_path=file_path,
223222
fix_available=fix_available,
224223
fix_version=fix_version,
225224
)
225+
226226
if self.mode == "detailed":
227227
dupes[dupe_key].unique_id_from_tool = dupe_key
228+
229+
dupes[dupe_key].unsaved_tags = finding_tags
228230
dupes[dupe_key].unsaved_vulnerability_ids = vulnerability_ids
229231
if settings.V3_FEATURE_LOCATIONS and artifact_purl:
230232
dupes[dupe_key].unsaved_locations.append(

dojo/tools/cargo_audit/parser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,6 @@ def get_findings(self, filename, test):
130130
title=title,
131131
test=test,
132132
severity=severity,
133-
tags=tags,
134133
description=description,
135134
component_name=package_name,
136135
component_version=package_version,
@@ -140,6 +139,7 @@ def get_findings(self, filename, test):
140139
references=references,
141140
mitigation=mitigation,
142141
)
142+
finding.unsaved_tags = tags
143143
finding.unsaved_vulnerability_ids = vulnerability_ids
144144
if settings.V3_FEATURE_LOCATIONS and package_name:
145145
finding.unsaved_locations.append(

dojo/tools/dependency_check/parser.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,6 @@ def get_finding_from_vulnerability(
390390
mitigation=mitigation,
391391
mitigated=mitigated,
392392
is_mitigated=is_Mitigated,
393-
tags=tags,
394393
active=active,
395394
dynamic_finding=False,
396395
static_finding=True,
@@ -400,6 +399,8 @@ def get_finding_from_vulnerability(
400399
**self.get_severity_and_cvss_meta(vulnerability, namespace),
401400
)
402401

402+
finding.unsaved_tags = tags
403+
403404
if settings.V3_FEATURE_LOCATIONS and component_purl:
404405
finding.unsaved_locations.append(
405406
LocationData.dependency(purl=component_purl, file_path=dependency_filename),

dojo/tools/jfrog_xray_unified/parser.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,11 @@ def get_item(vulnerability, test):
146146
impact=severity,
147147
date=scan_time,
148148
unique_id_from_tool=vulnerability["issue_id"],
149-
tags=tags,
150149
fix_available=fix_available,
151150
)
152151

152+
finding.unsaved_tags = tags
153+
153154
cvss_data = parse_cvss_data(cvssv3)
154155
if cvss_data:
155156
finding.cvssv3 = cvss_data.get("cvssv3")

dojo/tools/threat_composer/parser.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,12 @@ def get_findings(self, file, test):
8484
unique_id_from_tool=unique_id_from_tool,
8585
mitigation=mitigation,
8686
impact=impact,
87-
tags=tags,
8887
static_finding=True,
8988
dynamic_finding=False,
9089
)
9190

91+
finding.unsaved_tags = tags
92+
9293
match threat.get("status", "threatIdentified"):
9394
case "threatResolved":
9495
finding.active = False

unittests/tools/test_anchore_grype_parser.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ def test_check_all_fields(self):
132132
self.assertEqual("libgssapi-krb5-2", finding.component_name)
133133
self.assertEqual("1.17-3+deb10u3", finding.component_version)
134134
self.assertEqual("CVE-2004-0971", finding.vuln_id_from_tool)
135-
self.assertEqual(["dpkg"], finding.tags)
135+
self.assertEqual(["dpkg"], finding.unsaved_tags)
136136
self.assertEqual(1, finding.nb_occurences)
137137

138138
finding = findings[1]
@@ -167,7 +167,7 @@ def test_check_all_fields(self):
167167
self.assertEqual("redis", finding.component_name)
168168
self.assertEqual("4.0.2", finding.component_version)
169169
self.assertEqual("CVE-2021-32626", finding.vuln_id_from_tool)
170-
self.assertEqual(["python", "python2"], finding.tags)
170+
self.assertEqual(["python", "python2"], finding.unsaved_tags)
171171
self.assertEqual(1, finding.nb_occurences)
172172

173173
finding = findings[2]
@@ -197,7 +197,7 @@ def test_check_all_fields(self):
197197
self.assertEqual("libc-bin", finding.component_name)
198198
self.assertEqual("2.28-10", finding.component_version)
199199
self.assertEqual("CVE-2021-33574", finding.vuln_id_from_tool)
200-
self.assertEqual(["dpkg"], finding.tags)
200+
self.assertEqual(["dpkg"], finding.unsaved_tags)
201201
self.assertEqual(1, finding.nb_occurences)
202202

203203
finding = findings[3]
@@ -227,7 +227,7 @@ def test_check_all_fields(self):
227227
self.assertEqual("libc6", finding.component_name)
228228
self.assertEqual("2.28-10", finding.component_version)
229229
self.assertEqual("CVE-2021-33574", finding.vuln_id_from_tool)
230-
self.assertEqual(["dpkg"], finding.tags)
230+
self.assertEqual(["dpkg"], finding.unsaved_tags)
231231
self.assertEqual(1, finding.nb_occurences)
232232

233233
finding = findings[4]
@@ -257,7 +257,7 @@ def test_check_all_fields(self):
257257
self.assertEqual("Django", finding.component_name)
258258
self.assertEqual("3.2.9", finding.component_version)
259259
self.assertEqual("GHSA-v6rh-hp5x-86rv", finding.vuln_id_from_tool)
260-
self.assertEqual(["python"], finding.tags)
260+
self.assertEqual(["python"], finding.unsaved_tags)
261261
self.assertEqual(2, finding.nb_occurences)
262262

263263
def test_grype_issue_9618(self):

unittests/tools/test_cargo_audit_parser.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def test_parse_many_findings(self):
2222
self.assertEqual("[arc-swap 0.4.7] Dangling reference in `access::Map` with Constant", finding.title)
2323
self.assertEqual("High", finding.severity)
2424
self.assertIsNotNone(finding.description)
25-
self.assertEqual(["dangling reference"], finding.tags)
25+
self.assertEqual(["dangling reference"], finding.unsaved_tags)
2626
self.assertEqual("arc-swap", finding.component_name)
2727
self.assertEqual("0.4.7", finding.component_version)
2828
self.assertEqual("RUSTSEC-2020-0091", finding.vuln_id_from_tool)
@@ -37,7 +37,7 @@ def test_parse_many_findings(self):
3737
self.assertEqual("[hyper 0.13.9] Multiple Transfer-Encoding headers misinterprets request payload", finding.title)
3838
self.assertEqual("High", finding.severity)
3939
self.assertIsNotNone(finding.description)
40-
self.assertEqual(["http", "request-smuggling"], finding.tags)
40+
self.assertEqual(["http", "request-smuggling"], finding.unsaved_tags)
4141
self.assertEqual("hyper", finding.component_name)
4242
self.assertEqual("0.13.9", finding.component_version)
4343
self.assertEqual("RUSTSEC-2021-0020", finding.vuln_id_from_tool)
@@ -52,7 +52,7 @@ def test_parse_many_findings(self):
5252
self.assertEqual("[smallvec 0.6.13] Buffer overflow in SmallVec::insert_many", finding.title)
5353
self.assertEqual("High", finding.severity)
5454
self.assertIsNotNone(finding.description)
55-
self.assertEqual(["buffer-overflow", "heap-overflow", "unsound"], finding.tags)
55+
self.assertEqual(["buffer-overflow", "heap-overflow", "unsound"], finding.unsaved_tags)
5656
self.assertEqual("smallvec", finding.component_name)
5757
self.assertEqual("0.6.13", finding.component_version)
5858
self.assertEqual("RUSTSEC-2021-0003", finding.vuln_id_from_tool)
@@ -67,7 +67,7 @@ def test_parse_many_findings(self):
6767
self.assertEqual("[smallvec 1.5.0] Buffer overflow in SmallVec::insert_many", finding.title)
6868
self.assertEqual("High", finding.severity)
6969
self.assertIsNotNone(finding.description)
70-
self.assertEqual(["buffer-overflow", "heap-overflow", "unsound"], finding.tags)
70+
self.assertEqual(["buffer-overflow", "heap-overflow", "unsound"], finding.unsaved_tags)
7171
self.assertEqual("smallvec", finding.component_name)
7272
self.assertEqual("1.5.0", finding.component_version)
7373
self.assertEqual("RUSTSEC-2021-0003", finding.vuln_id_from_tool)

unittests/tools/test_dependency_check_parser.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ def test_parse_file_with_multiple_vulnerabilities_has_multiple_findings(self):
108108
items[1].mitigation,
109109
"Update org.dom4j:dom4j:2.1.1.redhat-00001 to at least the version recommended in the description",
110110
)
111-
self.assertEqual(items[1].tags, "related")
111+
self.assertEqual(items[1].unsaved_tags, ["related"])
112112
self.assertEqual(1, len(items[1].unsaved_vulnerability_ids))
113113
self.assertEqual("CVE-0000-0001", items[1].unsaved_vulnerability_ids[0])
114114

@@ -258,7 +258,7 @@ def test_parse_file_with_multiple_vulnerabilities_has_multiple_findings(self):
258258
items[9].mitigation,
259259
"**This vulnerability is mitigated and/or suppressed:** Document on why we are suppressing this vulnerability is missing!\nUpdate jquery:3.1.1 to at least the version recommended in the description",
260260
)
261-
self.assertEqual(items[9].tags, ["suppressed", "no_suppression_document"])
261+
self.assertEqual(items[9].unsaved_tags, ["no_suppression_document", "suppressed"])
262262
self.assertEqual(items[9].severity, "Critical")
263263
self.assertEqual(items[9].cvssv3, "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H")
264264
self.assertEqual(items[9].cvssv3_score, 9.8)
@@ -270,7 +270,7 @@ def test_parse_file_with_multiple_vulnerabilities_has_multiple_findings(self):
270270
items[10].mitigation,
271271
"**This vulnerability is mitigated and/or suppressed:** This is our reason for not to upgrade it.\nUpdate jquery:3.1.1 to at least the version recommended in the description",
272272
)
273-
self.assertEqual(items[10].tags, "suppressed")
273+
self.assertEqual(items[10].unsaved_tags, ["suppressed"])
274274
self.assertEqual(items[10].severity, "Critical")
275275
self.assertEqual(items[10].cvssv3, "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H")
276276
self.assertEqual(items[10].cvssv3_score, 9.8)

unittests/tools/test_jfrog_xray_unified_parser.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def test_parse_file_with_one_vuln(self):
3333
self.assertIsNotNone(item.mitigation)
3434
self.assertGreater(len(item.mitigation), 0)
3535
self.assertEqual("Jinja2", item.component_name)
36-
self.assertEqual('"packagetype_pypi"', item.tags)
36+
self.assertEqual(["packagetype_pypi"], item.unsaved_tags)
3737
self.assertEqual("2.11.2", item.component_version)
3838
self.assertEqual("pypi-remote/30/9e/f663a2aa66a09d838042ae1a2c5659828bb9b41ea3a6efa20a20fd92b121/Jinja2-2.11.2-py2.py3-none-any.whl", item.file_path)
3939
self.assertIsNotNone(item.severity_justification)
@@ -186,7 +186,7 @@ def test_parse_file_with_very_many_vulns(self):
186186
self.assertEqual(" is too late.", item.description[-13:])
187187
self.assertIsNone(item.mitigation)
188188
self.assertEqual("3.12:sqlite-libs", item.component_name)
189-
self.assertEqual('"packagetype_alpine"', item.tags)
189+
self.assertEqual(["packagetype_alpine"], item.unsaved_tags)
190190
self.assertEqual("3.32.1-r0", item.component_version)
191191
self.assertEqual("dockerhub-remote/kiwigrid/k8s-sidecar/sha256__7cba93c3dde21c78fe07ee3f8ed8d82d05bf00415392606401df8a7d72057b5b/", item.file_path)
192192
self.assertIsNotNone(item.severity_justification)
@@ -209,7 +209,7 @@ def test_parse_file_with_very_many_vulns(self):
209209
self.assertEqual("(Affected 1.0.2-1.0.2w).", item.description[-24:])
210210
self.assertIsNone(item.mitigation)
211211
self.assertEqual("ubuntu:bionic:libssl1.1", item.component_name)
212-
self.assertEqual('"packagetype_debian"', item.tags)
212+
self.assertEqual(["packagetype_debian"], item.unsaved_tags)
213213
self.assertEqual("1.1.1-1ubuntu2.1~18.04.6", item.component_version)
214214
self.assertEqual("dockerhub-remote/library/mongo/sha256__31f6433f7cfcd2180483e40728cbf97142df1e85de36d80d75c93e5e7fe10405/", item.file_path)
215215
self.assertIsNotNone(item.severity_justification)
@@ -233,7 +233,7 @@ def test_parse_file_with_very_many_vulns(self):
233233
self.assertIsNotNone(item.mitigation)
234234
self.assertGreater(len(item.mitigation), 0)
235235
self.assertEqual("github.com/docker/docker", item.component_name)
236-
self.assertEqual('"packagetype_go"', item.tags)
236+
self.assertEqual(["packagetype_go"], item.unsaved_tags)
237237
self.assertEqual("1.4.2-0.20200203170920-46ec8731fbce", item.component_version)
238238
self.assertEqual("dockerhub-remote/fluxcd/helm-controller/sha256__27790f965d8965884e8dfc12cba0d1f609794a1abc69bc81a658bd76e463ffce/", item.file_path)
239239
self.assertIsNotNone(item.severity_justification)
@@ -255,7 +255,7 @@ def test_parse_file_with_very_many_vulns(self):
255255
self.assertEqual("sensitive information.", item.description[-22:])
256256
self.assertIsNone(item.mitigation)
257257
self.assertEqual("com.fasterxml.jackson.core:jackson-databind", item.component_name)
258-
self.assertEqual('"packagetype_maven"', item.tags)
258+
self.assertEqual(["packagetype_maven"], item.unsaved_tags)
259259
self.assertEqual("2.10.4", item.component_version)
260260
self.assertEqual("elastic-docker-remote/elasticsearch/elasticsearch/7.9.1-amd64/", item.file_path)
261261
self.assertIsNotNone(item.severity_justification)
@@ -279,7 +279,7 @@ def test_parse_file_with_very_many_vulns(self):
279279
self.assertIsNotNone(item.mitigation)
280280
self.assertGreater(len(item.mitigation), 0)
281281
self.assertEqual("jquery", item.component_name)
282-
self.assertEqual('"packagetype_npm"', item.tags)
282+
self.assertEqual(["packagetype_npm"], item.unsaved_tags)
283283
self.assertEqual("3.4.1", item.component_version)
284284
self.assertEqual("pypi-remote/cc/94/5f7079a0e00bd6863ef8f1da638721e9da21e5bacee597595b318f71d62e/Werkzeug-1.0.1-py2.py3-none-any.whl", item.file_path)
285285
self.assertIsNotNone(item.severity_justification)
@@ -303,7 +303,7 @@ def test_parse_file_with_very_many_vulns(self):
303303
self.assertIsNotNone(item.mitigation)
304304
self.assertGreater(len(item.mitigation), 0)
305305
self.assertEqual("pip", item.component_name)
306-
self.assertEqual('"packagetype_pypi"', item.tags)
306+
self.assertEqual(["packagetype_pypi"], item.unsaved_tags)
307307
self.assertEqual("20.2.3", item.component_version)
308308
self.assertEqual("dockerhub-remote/kiwigrid/k8s-sidecar/sha256__4b5a25c8dbac9637f8e680566959fdccd1a98d74ce2f2746f9b0f9ff6b57d03b/", item.file_path)
309309
self.assertIsNotNone(item.severity_justification)
@@ -326,7 +326,7 @@ def test_parse_file_with_very_many_vulns(self):
326326
self.assertEqual("TABLE statements.\n\nRed Hat Severity: Moderate", item.description[-45:])
327327
self.assertIsNone(item.mitigation)
328328
self.assertEqual("7:sqlite:0", item.component_name)
329-
self.assertIn("packagetype_rpm", item.tags)
329+
self.assertIn("packagetype_rpm", item.unsaved_tags)
330330
self.assertEqual("3.7.17-8.el7_7.1", item.component_version)
331331
self.assertEqual("elastic-docker-remote/elasticsearch/elasticsearch/7.9.1-amd64/", item.file_path)
332332
self.assertIsNotNone(item.severity_justification)

0 commit comments

Comments
 (0)