Skip to content

Commit 659d763

Browse files
committed
fix: converted database id's to VCIDs and purls
1 parent fabe035 commit 659d763

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

vulnerabilities/api.py

+17
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
from cvss.exceptions import CVSS3MalformedError
1414
from cvss.exceptions import CVSS4MalformedError
1515
from django.db.models import Prefetch
16+
from django.db.models import Exists
17+
from django.db.models import OuterRef
18+
from django.http import Http404
19+
from django.shortcuts import get_object_or_404
1620
from django_filters import rest_framework as filters
1721
from drf_spectacular.utils import extend_schema
1822
from packageurl import PackageURL
@@ -22,6 +26,7 @@
2226
from rest_framework import viewsets
2327
from rest_framework.decorators import action
2428
from rest_framework.response import Response
29+
from rest_framework.reverse import reverse
2530
from rest_framework.throttling import AnonRateThrottle
2631

2732
from vulnerabilities.models import Alias
@@ -236,6 +241,10 @@ class VulnerabilitySerializer(BaseResourceSerializer):
236241
exploits = ExploitSerializer(many=True, read_only=True)
237242
weaknesses = WeaknessSerializer(many=True)
238243
severity_range_score = serializers.SerializerMethodField()
244+
url = serializers.HyperlinkedIdentityField(
245+
view_name="vulnerability-detail",
246+
lookup_field="vulnerability_id"
247+
)
239248

240249
def to_representation(self, instance):
241250
data = super().to_representation(instance)
@@ -308,6 +317,8 @@ class PackageSerializer(BaseResourceSerializer):
308317
next_non_vulnerable_version = serializers.CharField(read_only=True)
309318
latest_non_vulnerable_version = serializers.CharField(read_only=True)
310319

320+
url = serializers.SerializerMethodField()
321+
311322
purl = serializers.CharField(source="package_url")
312323

313324
affected_by_vulnerabilities = serializers.SerializerMethodField("get_affected_vulnerabilities")
@@ -318,6 +329,10 @@ class PackageSerializer(BaseResourceSerializer):
318329

319330
is_vulnerable = serializers.BooleanField()
320331

332+
def get_url(self, package):
333+
request = self.context.get("request")
334+
return reverse("package_details", kwargs={'purl': package.purl}, request=request)
335+
321336
def get_qualifiers(self, package):
322337
return normalize_qualifiers(package.qualifiers, encode=False)
323338

@@ -469,6 +484,7 @@ class PackageViewSet(viewsets.ReadOnlyModelViewSet):
469484

470485
queryset = Package.objects.all()
471486
serializer_class = PackageSerializer
487+
lookup_field = "package_url"
472488
filter_backends = (filters.DjangoFilterBackend,)
473489
filterset_class = PackageFilterSet
474490
throttle_classes = [StaffUserRateThrottle, AnonRateThrottle]
@@ -689,6 +705,7 @@ def get_queryset(self):
689705
filter_backends = (filters.DjangoFilterBackend,)
690706
filterset_class = VulnerabilityFilterSet
691707
throttle_classes = [StaffUserRateThrottle, AnonRateThrottle]
708+
lookup_field = "vulnerability_id"
692709

693710

694711
class CPEFilterSet(filters.FilterSet):

vulnerablecode/urls.py

+8
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,14 @@ def __init__(self, *args, **kwargs):
6969
PackageSearch.as_view(),
7070
name="package_search",
7171
),
72+
re_path(
73+
r'^api/packages/(?P<package_url>pkg:.+?)/?$',
74+
PackageViewSet.as_view({"get": "retrieve"}),
75+
),
76+
re_path(r"^api/vulnerabilities/(?P<vulnerability_id>VCID-[\w-]+)/$",
77+
VulnerabilityViewSet.as_view({"get": "retrieve"}),
78+
name="vulnerability-detail"),
79+
7280
re_path(
7381
r"^packages/(?P<purl>pkg:.+)$",
7482
PackageDetails.as_view(),

0 commit comments

Comments
 (0)