Skip to content

Commit 19ff442

Browse files
committed
Get vulnerabilities from CPE
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 6bebd6b commit 19ff442

2 files changed

Lines changed: 37 additions & 0 deletions

File tree

vulnerabilities/api.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,3 +177,38 @@ class VulnerabilityViewSet(viewsets.ReadOnlyModelViewSet):
177177
paginate_by = 50
178178
filter_backends = (filters.DjangoFilterBackend,)
179179
filterset_class = VulnerabilityFilterSet
180+
181+
182+
class VulnerabilityReferenceFilterSet(filters.FilterSet):
183+
class Meta:
184+
model = VulnerabilityReference
185+
fields = ["reference_id"]
186+
187+
188+
class CPEFilterSet(filters.FilterSet):
189+
cpe = filters.CharFilter(method="filter_cpe")
190+
191+
class Meta:
192+
model = VulnerabilityReference
193+
fields = ["reference_id"]
194+
195+
def filter_cpe(self, queryset, name, value):
196+
cpe = unquote(value)
197+
return self.queryset.filter(reference_id=cpe)
198+
199+
200+
class CPESerializer(serializers.HyperlinkedModelSerializer):
201+
202+
vulnerability = MinimalVulnerabilitySerializer(read_only=True)
203+
204+
class Meta:
205+
model = VulnerabilityReference
206+
fields = ["vulnerability"]
207+
208+
209+
class CPEViewSet(viewsets.ReadOnlyModelViewSet):
210+
queryset = VulnerabilityReference.objects.filter(reference_id__startswith="cpe")
211+
serializer_class = CPESerializer
212+
paginate_by = 50
213+
filter_backends = (filters.DjangoFilterBackend,)
214+
filterset_class = CPEFilterSet

vulnerablecode/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from django.urls import path
2727
from rest_framework.routers import DefaultRouter
2828

29+
from vulnerabilities.api import CPEViewSet
2930
from vulnerabilities.api import PackageViewSet
3031
from vulnerabilities.api import VulnerabilityViewSet
3132
from vulnerabilities.views import HomePage
@@ -47,6 +48,7 @@ def __init__(self, *args, **kwargs):
4748
api_router.register(r"packages", PackageViewSet)
4849
# `DefaultRouter` requires `basename` when registering viewsets that don't define a queryset.
4950
api_router.register(r"vulnerabilities", VulnerabilityViewSet, basename="vulnerability")
51+
api_router.register(r"cpes", CPEViewSet, basename="cpe")
5052

5153
urlpatterns = [
5254
path("admin/", admin.site.urls),

0 commit comments

Comments
 (0)