Skip to content

Commit 6d85a9f

Browse files
committed
Use the UUID for the DiscoveredDependency spdx_id #1651
Signed-off-by: tdruez <[email protected]>
1 parent b4f7066 commit 6d85a9f

File tree

4 files changed

+31
-14
lines changed

4 files changed

+31
-14
lines changed

scanpipe/models.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4042,7 +4042,10 @@ def populate_dependency_uuid(cls, dependency_data):
40424042

40434043
@property
40444044
def spdx_id(self):
4045-
return f"SPDXRef-scancodeio-{self._meta.model_name}-{self.dependency_uid}"
4045+
# We cannot rely on `dependency_uid` for the SPDX ID because it may contain
4046+
# PURL components that are not SPDX-compliant. According to the spec,
4047+
# "SPDXID is a unique string containing letters, numbers, ., and/or -"
4048+
return f"SPDXRef-scancodeio-{self._meta.model_name}-{self.uuid}"
40464049

40474050
def as_spdx(self):
40484051
"""Return this Dependency as an SPDX Package entry."""

scanpipe/tests/data/asgiref/asgiref-3.3.0.spdx.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
},
5353
{
5454
"name": "pytest",
55-
"SPDXID": "SPDXRef-scancodeio-discovereddependency-pkg:pypi/pytest?uuid=cfa26c80-95fc-4da3-a290-5e7403d0d9bc",
55+
"SPDXID": "SPDXRef-scancodeio-discovereddependency-13818fb7-6094-4868-97ca-384a8fc8d16d",
5656
"downloadLocation": "NOASSERTION",
5757
"licenseConcluded": "NOASSERTION",
5858
"copyrightText": "NOASSERTION",
@@ -68,7 +68,7 @@
6868
},
6969
{
7070
"name": "pytest",
71-
"SPDXID": "SPDXRef-scancodeio-discovereddependency-pkg:pypi/pytest?uuid=bfafc414-739f-4747-bfb0-1b3ad03d62c7",
71+
"SPDXID": "SPDXRef-scancodeio-discovereddependency-2f1d3742-0553-4c4f-8731-1ffbbc13827d",
7272
"downloadLocation": "NOASSERTION",
7373
"licenseConcluded": "NOASSERTION",
7474
"copyrightText": "NOASSERTION",
@@ -84,7 +84,7 @@
8484
},
8585
{
8686
"name": "pytest-asyncio",
87-
"SPDXID": "SPDXRef-scancodeio-discovereddependency-pkg:pypi/pytest-asyncio?uuid=68b8d3cb-eddb-4727-b6cb-707dde279301",
87+
"SPDXID": "SPDXRef-scancodeio-discovereddependency-fd5a81e5-0739-406e-9189-7b8a3644ef0d",
8888
"downloadLocation": "NOASSERTION",
8989
"licenseConcluded": "NOASSERTION",
9090
"copyrightText": "NOASSERTION",
@@ -100,7 +100,7 @@
100100
},
101101
{
102102
"name": "pytest-asyncio",
103-
"SPDXID": "SPDXRef-scancodeio-discovereddependency-pkg:pypi/pytest-asyncio?uuid=570878e1-aa7c-46bc-9216-122b73b34f9b",
103+
"SPDXID": "SPDXRef-scancodeio-discovereddependency-e175db55-d0f3-4224-b6d4-2b0ad553b865",
104104
"downloadLocation": "NOASSERTION",
105105
"licenseConcluded": "NOASSERTION",
106106
"copyrightText": "NOASSERTION",
@@ -118,30 +118,30 @@
118118
"documentDescribes": [
119119
"SPDXRef-scancodeio-discoveredpackage-101147dd-f8a7-4ea3-87a1-01b9b0af5d4f",
120120
"SPDXRef-scancodeio-discoveredpackage-b5035991-5b4b-40be-b68b-1c9c528078cd",
121-
"SPDXRef-scancodeio-discovereddependency-pkg:pypi/pytest?uuid=cfa26c80-95fc-4da3-a290-5e7403d0d9bc",
122-
"SPDXRef-scancodeio-discovereddependency-pkg:pypi/pytest?uuid=bfafc414-739f-4747-bfb0-1b3ad03d62c7",
123-
"SPDXRef-scancodeio-discovereddependency-pkg:pypi/pytest-asyncio?uuid=68b8d3cb-eddb-4727-b6cb-707dde279301",
124-
"SPDXRef-scancodeio-discovereddependency-pkg:pypi/pytest-asyncio?uuid=570878e1-aa7c-46bc-9216-122b73b34f9b"
121+
"SPDXRef-scancodeio-discovereddependency-13818fb7-6094-4868-97ca-384a8fc8d16d",
122+
"SPDXRef-scancodeio-discovereddependency-2f1d3742-0553-4c4f-8731-1ffbbc13827d",
123+
"SPDXRef-scancodeio-discovereddependency-fd5a81e5-0739-406e-9189-7b8a3644ef0d",
124+
"SPDXRef-scancodeio-discovereddependency-e175db55-d0f3-4224-b6d4-2b0ad553b865"
125125
],
126126
"files": [],
127127
"relationships": [
128128
{
129-
"spdxElementId": "SPDXRef-scancodeio-discovereddependency-pkg:pypi/pytest?uuid=cfa26c80-95fc-4da3-a290-5e7403d0d9bc",
129+
"spdxElementId": "SPDXRef-scancodeio-discovereddependency-13818fb7-6094-4868-97ca-384a8fc8d16d",
130130
"relatedSpdxElement": "SPDXRef-scancodeio-discoveredpackage-101147dd-f8a7-4ea3-87a1-01b9b0af5d4f",
131131
"relationshipType": "DEPENDENCY_OF"
132132
},
133133
{
134-
"spdxElementId": "SPDXRef-scancodeio-discovereddependency-pkg:pypi/pytest?uuid=bfafc414-739f-4747-bfb0-1b3ad03d62c7",
134+
"spdxElementId": "SPDXRef-scancodeio-discovereddependency-2f1d3742-0553-4c4f-8731-1ffbbc13827d",
135135
"relatedSpdxElement": "SPDXRef-scancodeio-discoveredpackage-b5035991-5b4b-40be-b68b-1c9c528078cd",
136136
"relationshipType": "DEPENDENCY_OF"
137137
},
138138
{
139-
"spdxElementId": "SPDXRef-scancodeio-discovereddependency-pkg:pypi/pytest-asyncio?uuid=68b8d3cb-eddb-4727-b6cb-707dde279301",
139+
"spdxElementId": "SPDXRef-scancodeio-discovereddependency-fd5a81e5-0739-406e-9189-7b8a3644ef0d",
140140
"relatedSpdxElement": "SPDXRef-scancodeio-discoveredpackage-101147dd-f8a7-4ea3-87a1-01b9b0af5d4f",
141141
"relationshipType": "DEPENDENCY_OF"
142142
},
143143
{
144-
"spdxElementId": "SPDXRef-scancodeio-discovereddependency-pkg:pypi/pytest-asyncio?uuid=570878e1-aa7c-46bc-9216-122b73b34f9b",
144+
"spdxElementId": "SPDXRef-scancodeio-discovereddependency-e175db55-d0f3-4224-b6d4-2b0ad553b865",
145145
"relatedSpdxElement": "SPDXRef-scancodeio-discoveredpackage-b5035991-5b4b-40be-b68b-1c9c528078cd",
146146
"relationshipType": "DEPENDENCY_OF"
147147
}

scanpipe/tests/data/asgiref/asgiref-3.3.0_fixtures.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1714,6 +1714,7 @@
17141714
"model": "scanpipe.discovereddependency",
17151715
"pk": 1,
17161716
"fields": {
1717+
"uuid": "13818fb7-6094-4868-97ca-384a8fc8d16d",
17171718
"type": "pypi",
17181719
"namespace": "",
17191720
"name": "pytest",
@@ -1739,6 +1740,7 @@
17391740
"model": "scanpipe.discovereddependency",
17401741
"pk": 2,
17411742
"fields": {
1743+
"uuid": "fd5a81e5-0739-406e-9189-7b8a3644ef0d",
17421744
"type": "pypi",
17431745
"namespace": "",
17441746
"name": "pytest-asyncio",
@@ -1764,6 +1766,7 @@
17641766
"model": "scanpipe.discovereddependency",
17651767
"pk": 3,
17661768
"fields": {
1769+
"uuid": "2f1d3742-0553-4c4f-8731-1ffbbc13827d",
17671770
"type": "pypi",
17681771
"namespace": "",
17691772
"name": "pytest",
@@ -1789,6 +1792,7 @@
17891792
"model": "scanpipe.discovereddependency",
17901793
"pk": 4,
17911794
"fields": {
1795+
"uuid": "e175db55-d0f3-4224-b6d4-2b0ad553b865",
17921796
"type": "pypi",
17931797
"namespace": "",
17941798
"name": "pytest-asyncio",

scanpipe/tests/test_models.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2429,6 +2429,11 @@ def test_scanpipe_discovered_package_model_compliance_alert(self):
24292429
# Reset the index value
24302430
scanpipe_app.license_policies_index = None
24312431

2432+
def test_scanpipe_discovered_package_model_spdx_id(self):
2433+
package1 = make_package(self.project1, "pkg:type/a")
2434+
expected = f"SPDXRef-scancodeio-discoveredpackage-{package1.uuid}"
2435+
self.assertEqual(expected, package1.spdx_id)
2436+
24322437
def test_scanpipe_model_create_user_creates_auth_token(self):
24332438
basic_user = User.objects.create_user(username="basic_user")
24342439
self.assertTrue(basic_user.auth_token.key)
@@ -2492,14 +2497,19 @@ def test_scanpipe_discovered_dependency_model_many_to_many(self):
24922497
self.assertEqual([], list(c.declared_dependencies.all()))
24932498
self.assertEqual([b_c], list(c.resolved_from_dependencies.all()))
24942499

2495-
def test_scanpipe_discovered_dependency_model_is_vulnerable_property(self):
2500+
def test_scanpipe_discovered_package_model_is_vulnerable_property(self):
24962501
package = DiscoveredPackage.create_from_data(self.project1, package_data1)
24972502
self.assertFalse(package.is_vulnerable)
24982503
package.update(
24992504
affected_by_vulnerabilities=[{"vulnerability_id": "VCID-cah8-awtr-aaad"}]
25002505
)
25012506
self.assertTrue(package.is_vulnerable)
25022507

2508+
def test_scanpipe_discovered_dependency_model_spdx_id(self):
2509+
dependency1 = make_dependency(self.project1)
2510+
expected = f"SPDXRef-scancodeio-discovereddependency-{dependency1.uuid}"
2511+
self.assertEqual(expected, dependency1.spdx_id)
2512+
25032513
def test_scanpipe_package_model_integrity_with_toolkit_package_model(self):
25042514
scanpipe_only_fields = [
25052515
"id",

0 commit comments

Comments
 (0)