Skip to content

Commit d1aee19

Browse files
authored
Merge pull request #2461 from aboutcode-org/2458-api-datasource
Include `datasource_id` in advisory API response
2 parents da7dcf2 + 312348c commit d1aee19

2 files changed

Lines changed: 60 additions & 1 deletion

File tree

‎vulnerabilities/api_v3.py‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ class Meta:
171171
fields = [
172172
"advisory_id",
173173
"advisory_uid",
174+
"datasource_id",
174175
"url",
175176
"aliases",
176177
"summary",
@@ -392,6 +393,7 @@ class Meta:
392393
fields = [
393394
"advisory_id",
394395
"advisory_uid",
396+
"datasource_id",
395397
"url",
396398
"aliases",
397399
"summary",
@@ -713,6 +715,7 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit
713715
"primary_advisory__avid",
714716
"primary_advisory__summary",
715717
"primary_advisory__advisory_id",
718+
"primary_advisory__datasource_id",
716719
"primary_advisory__is_curation",
717720
)
718721
)
@@ -842,6 +845,7 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit
842845
{
843846
"advisory_id": identifier,
844847
"advisory_uid": primary.avid,
848+
"datasource_id": primary.datasource_id,
845849
"aliases": aliases,
846850
"summary": primary.summary,
847851
"weighted_severity": weighted_severity,
@@ -974,6 +978,7 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit
974978
{
975979
"advisory_id": identifier,
976980
"advisory_uid": advisory.avid,
981+
"datasource_id": advisory.datasource_id,
977982
"aliases": aliases,
978983
"summary": advisory.summary,
979984
"weighted_severity": advisory.weighted_severity,
@@ -1026,6 +1031,7 @@ def get_fixing_advisories_bulk(packages, max_advisories, base_url):
10261031
"id",
10271032
"package_id",
10281033
"primary_advisory__advisory_id",
1034+
"primary_advisory__datasource_id",
10291035
)
10301036
)
10311037

@@ -1051,6 +1057,7 @@ def get_fixing_advisories_bulk(packages, max_advisories, base_url):
10511057
"advisory_id": advisory.advisory_id.split("/")[-1],
10521058
"resource_url": resource_url,
10531059
"advisory_uid": advisory.avid,
1060+
"datasource_id": advisory.datasource_id,
10541061
}
10551062
)
10561063

@@ -1114,6 +1121,7 @@ def get_fixing_advisories_bulk(packages, max_advisories, base_url):
11141121
"advisory_id": advisory.advisory_id.split("/")[-1],
11151122
"resource_url": resource_url,
11161123
"advisory_uid": advisory.avid,
1124+
"datasource_id": advisory.datasource_id,
11171125
}
11181126
)
11191127
result[package.id] = package_result

‎vulnerabilities/tests/test_api_v3.py‎

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,13 @@ def setUp(self):
5252
self.advisory.save()
5353

5454
self.package = PackageV2.objects.from_purl(purl="pkg:pypi/sample@1.0.0")
55+
self.package2 = PackageV2.objects.from_purl(purl="pkg:pypi/sample@2.0.0")
5556
self.impact = ImpactedPackage.objects.create(
5657
advisory=self.advisory,
5758
base_purl="pkg:pypi/sample",
5859
)
5960
self.impact.affecting_packages.add(self.package)
61+
self.impact.fixed_by_packages.add(self.package2)
6062

6163
self.client = APIClient(enforce_csrf_checks=True)
6264

@@ -113,6 +115,31 @@ def test_packages_post_with_details(self):
113115
pkg = response.data["results"][0]
114116
self.assertEqual(pkg["purl"], "pkg:pypi/sample@1.0.0")
115117

118+
def test_packages_post_with_details_fixing_vulnerabilities(self):
119+
url = reverse("package-v3-list")
120+
GroupAdvisoriesForPackages().execute()
121+
122+
with self.assertNumQueries(12):
123+
response = self.client.post(
124+
url,
125+
data={
126+
"purls": ["pkg:pypi/sample@2.0.0"],
127+
"details": True,
128+
},
129+
format="json",
130+
HTTP_USER_AGENT="VCIO_API_AGENT",
131+
)
132+
133+
self.assertEqual(response.status_code, status.HTTP_200_OK)
134+
135+
pkg = response.data["results"][0]
136+
fixing_vulnerability = pkg["fixing_vulnerabilities"][0]
137+
138+
self.assertEqual(fixing_vulnerability["advisory_id"], "GHSA-1234")
139+
self.assertEqual(fixing_vulnerability["advisory_uid"], "ghsa/GHSA-1234")
140+
self.assertEqual(fixing_vulnerability["datasource_id"], "ghsa")
141+
self.assertEqual(pkg["next_non_vulnerable_version"], "2.0.0")
142+
116143
def test_advisories_post(self):
117144
url = reverse("advisory-v3-list")
118145

@@ -129,6 +156,7 @@ def test_advisories_post(self):
129156
advisory = response.data["results"][0]
130157
self.assertEqual(advisory["advisory_id"], "GHSA-1234")
131158
self.assertEqual(advisory["advisory_uid"], "ghsa/GHSA-1234")
159+
self.assertEqual(advisory["datasource_id"], "ghsa")
132160

133161
def test_affected_by_advisories_list(self):
134162
url = reverse("affected-by-advisories-list")
@@ -143,6 +171,7 @@ def test_affected_by_advisories_list(self):
143171
results = response.data["results"]
144172
self.assertEqual(len(results), 1)
145173
self.assertEqual(results[0]["advisory_id"], "GHSA-1234")
174+
self.assertEqual(results[0]["datasource_id"], "ghsa")
146175

147176
def test_fixing_advisories_list_empty(self):
148177
url = reverse("fixing-advisories-list")
@@ -155,6 +184,21 @@ def test_fixing_advisories_list_empty(self):
155184
self.assertEqual(response.status_code, status.HTTP_200_OK)
156185
self.assertEqual(len(response.data["results"]), 0)
157186

187+
def test_fixing_advisories_list(self):
188+
url = reverse("fixing-advisories-list")
189+
190+
with self.assertNumQueries(11):
191+
response = self.client.get(
192+
url, {"purl": "pkg:pypi/sample@2.0.0"}, HTTP_USER_AGENT="VCIO_API_AGENT"
193+
)
194+
195+
self.assertEqual(response.status_code, status.HTTP_200_OK)
196+
197+
results = response.data["results"]
198+
self.assertEqual(len(results), 1)
199+
self.assertEqual(results[0]["advisory_id"], "GHSA-1234")
200+
self.assertEqual(results[0]["datasource_id"], "ghsa")
201+
158202
def test_packages_pagination(self):
159203
url = reverse("package-v3-list")
160204

@@ -314,6 +358,7 @@ def test_get_all_vulnerable_purls(self):
314358

315359
class PackageCommitPatchTests(APITestCase):
316360
def setUp(self):
361+
self.logger = TestLogger()
317362
self.advisory = AdvisoryDataV2(
318363
advisory_id="AVID-123",
319364
aliases=[],
@@ -352,7 +397,12 @@ def setUp(self):
352397
self.anon_patcher.start()
353398
self.addCleanup(self.anon_patcher.stop)
354399

355-
self.advisory = insert_advisory_v2(self.advisory, "importer_1", print, 100)
400+
self.advisory = insert_advisory_v2(
401+
advisory=self.advisory,
402+
pipeline_id="importer_1",
403+
logger=self.logger.write,
404+
datasource_id="test_source",
405+
)
356406
self.advisory.is_latest = True
357407
self.advisory._all_impacts_unfurled_at = timezone.now()
358408
self.advisory.save()
@@ -393,6 +443,7 @@ def test_packages_commit_patch(self):
393443
advisory_data = vulns[0]
394444

395445
assert advisory_data["advisory_id"] == "AVID-123"
446+
assert advisory_data["datasource_id"] == "test_source"
396447
assert advisory_data["introduced_in_patches"] == [
397448
{
398449
"commit_hash": "06580c7f99c6fde7bcf18e30bdcc61f081430957",

0 commit comments

Comments
 (0)