Skip to content

Commit 8e73ef7

Browse files
committed
Extraxt vulnerabilities from CPE
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 249c562 commit 8e73ef7

3 files changed

Lines changed: 49 additions & 0 deletions

File tree

vulnerabilities/api.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,20 @@ class Meta:
8888
fields = "__all__"
8989

9090

91+
class VulnerabilitySerializer(serializers.HyperlinkedModelSerializer):
92+
93+
resolved_packages = MinimalPackageSerializer(many=True, source="resolved_to", read_only=True)
94+
unresolved_packages = MinimalPackageSerializer(
95+
many=True, source="vulnerable_to", read_only=True
96+
)
97+
98+
references = VulnerabilityReferenceSerializer(many=True, source="vulnerabilityreference_set")
99+
100+
class Meta:
101+
model = Vulnerability
102+
fields = "__all__"
103+
104+
91105
class PackageSerializer(serializers.HyperlinkedModelSerializer):
92106

93107
unresolved_vulnerabilities = MinimalVulnerabilitySerializer(
@@ -103,6 +117,17 @@ class Meta:
103117
exclude = ["vulnerabilities"]
104118

105119

120+
class CPESerializer(serializers.HyperlinkedModelSerializer):
121+
122+
vulnerabilities = MinimalVulnerabilitySerializer(
123+
many=True, source="get_vulnerabilities_from_cpe", read_only=True
124+
)
125+
126+
class Meta:
127+
model = VulnerabilityReference
128+
fields = ["vulnerabilities"]
129+
130+
106131
class PackageFilterSet(filters.FilterSet):
107132
purl = filters.CharFilter(method="filter_purl")
108133

@@ -177,3 +202,16 @@ class VulnerabilityViewSet(viewsets.ReadOnlyModelViewSet):
177202
paginate_by = 50
178203
filter_backends = (filters.DjangoFilterBackend,)
179204
filterset_class = VulnerabilityFilterSet
205+
206+
207+
class VulnerabilityReferenceFilterSet(filters.FilterSet):
208+
class Meta:
209+
model = VulnerabilityReference
210+
fields = ["reference_id"]
211+
212+
213+
class CPEViewSet(viewsets.ReadOnlyModelViewSet):
214+
queryset = VulnerabilityReference.objects.all()
215+
serializer_class = CPESerializer
216+
filter_backends = (filters.DjangoFilterBackend,)
217+
filterset_class = VulnerabilityReferenceFilterSet

vulnerabilities/models.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ def resolved_to(self):
8989
def __str__(self):
9090
return self.vulcoid
9191

92+
def get_vulnerabilities_from_cpe(self, cpe):
93+
return Vulnerability.objects.filter(vulnerabilityreference__reference_id__startswith=cpe)
94+
9295
class Meta:
9396
verbose_name_plural = "Vulnerabilities"
9497

@@ -117,6 +120,12 @@ class VulnerabilityReference(models.Model):
117120
def severities(self):
118121
return VulnerabilitySeverity.objects.filter(reference=self.id)
119122

123+
@property
124+
def get_vulnerabilities_from_cpe(self):
125+
return Vulnerability.objects.filter(
126+
vulnerabilityreference__reference_id__startswith=self.reference_id
127+
)
128+
120129
class Meta:
121130
unique_together = (
122131
"vulnerability",

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)