Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Add fixed by package in V2 API
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
  • Loading branch information
TG1999 committed Jan 2, 2025
commit 5fddbb0ffc04653b89f8d8fdc5ea9ae582d1ba63
16 changes: 15 additions & 1 deletion vulnerabilities/api_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,21 @@ class Meta:
]

def get_affected_by_vulnerabilities(self, obj):
return [vuln.vulnerability_id for vuln in obj.affected_by_vulnerabilities.all()]
"""
Return a dictionary with vulnerabilities as keys and their details, including fixed_by_packages.
"""
vulnerabilities = obj.affected_by_vulnerabilities.prefetch_related("fixed_by_packages")
Comment thread
TG1999 marked this conversation as resolved.
Outdated
result = {}
for vuln in vulnerabilities:
fixed_by_package = vuln.fixed_by_packages.first()
purl = None
if fixed_by_package:
purl = fixed_by_package.package_url
result[vuln.vulnerability_id] = {
"vulnerability_id": vuln.vulnerability_id,
"fixed_by_packages": purl,
}
return result

def get_fixing_vulnerabilities(self, obj):
# Ghost package should not fix any vulnerability.
Expand Down
15 changes: 12 additions & 3 deletions vulnerabilities/tests/test_api_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,10 @@ def test_package_serializer_fields(self):
self.assertIn("next_non_vulnerable_version", data)
self.assertIn("latest_non_vulnerable_version", data)
self.assertEqual(data["purl"], "pkg:pypi/django@3.2")
self.assertEqual(data["affected_by_vulnerabilities"], ["VCID-1234"])
self.assertEqual(
data["affected_by_vulnerabilities"],
{"VCID-1234": {"vulnerability_id": "VCID-1234", "fixed_by_packages": None}},
)
self.assertEqual(data["fixing_vulnerabilities"], [])

def test_list_packages_pagination(self):
Expand Down Expand Up @@ -321,7 +324,10 @@ def test_get_affected_by_vulnerabilities(self):
package = Package.objects.get(package_url="pkg:pypi/django@3.2")
serializer = PackageV2Serializer()
vulnerabilities = serializer.get_affected_by_vulnerabilities(package)
self.assertEqual(vulnerabilities, ["VCID-1234"])
self.assertEqual(
vulnerabilities,
{"VCID-1234": {"vulnerability_id": "VCID-1234", "fixed_by_packages": None}},
)

def test_get_fixing_vulnerabilities(self):
"""
Expand Down Expand Up @@ -523,7 +529,10 @@ def test_lookup_with_valid_purl(self):
self.assertIn("next_non_vulnerable_version", response.data[0])
self.assertIn("latest_non_vulnerable_version", response.data[0])
self.assertEqual(response.data[0]["purl"], "pkg:pypi/django@3.2")
self.assertEqual(response.data[0]["affected_by_vulnerabilities"], ["VCID-1234"])
self.assertEqual(
response.data[0]["affected_by_vulnerabilities"],
{"VCID-1234": {"vulnerability_id": "VCID-1234", "fixed_by_packages": None}},
)
self.assertEqual(response.data[0]["fixing_vulnerabilities"], [])

def test_lookup_with_invalid_purl(self):
Expand Down