Skip to content

Commit 6862af2

Browse files
committed
Extraxt vulnerabilities from CPE
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent a59b5e4 commit 6862af2

3 files changed

Lines changed: 50 additions & 1 deletion

File tree

vulnerabilities/api.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class Meta:
4343

4444

4545
class VulnerabilityReferenceSerializer(serializers.ModelSerializer):
46-
scores = VulnerabilitySeveritySerializer(many=True)
46+
scores = VulnerabilitySeveritySerializer(many=True, source="severities")
4747

4848
class Meta:
4949
model = VulnerabilityReference
@@ -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

@@ -114,6 +117,12 @@ class VulnerabilityReference(models.Model):
114117
def severities(self):
115118
return VulnerabilitySeverity.objects.filter(reference=self.id)
116119

120+
@property
121+
def get_vulnerabilities_from_cpe(self):
122+
return Vulnerability.objects.filter(
123+
vulnerabilityreference__reference_id__startswith=self.reference_id
124+
)
125+
117126
class Meta:
118127
unique_together = (
119128
"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
@@ -54,6 +55,7 @@ def __init__(self, *args, **kwargs):
5455
# `DefaultRouter` requires `basename` when registering viewsets which don't
5556
# define a queryset.
5657
api_router.register(r"vulnerabilities", VulnerabilityViewSet, basename="vulnerability")
58+
api_router.register(r"cpes", CPEViewSet, basename="cpe")
5759

5860
curation_views = [
5961
path("vulnerabilities/create", VulnerabilityCreate.as_view(), name="vulnerability_create"),

0 commit comments

Comments
 (0)