Skip to content

Commit b5caea3

Browse files
authored
Merge pull request #766 from TG1999/alias_api
Add search in API via alias
2 parents a4ccd37 + 88f4f4b commit b5caea3

3 files changed

Lines changed: 36 additions & 4 deletions

File tree

vulnerabilities/api.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ def filter_purl(self, queryset, name, value):
157157
class PackageViewSet(viewsets.ReadOnlyModelViewSet):
158158
queryset = Package.objects.all()
159159
serializer_class = PackageSerializer
160+
paginate_by = 50
160161
filter_backends = (filters.DjangoFilterBackend,)
161162
filterset_class = PackageFilterSet
162163

@@ -212,10 +213,6 @@ class VulnerabilityViewSet(viewsets.ReadOnlyModelViewSet):
212213
class CPEFilterSet(filters.FilterSet):
213214
cpe = filters.CharFilter(method="filter_cpe")
214215

215-
class Meta:
216-
model = Vulnerability
217-
fields = ["vulnerabilityreference__reference_id"]
218-
219216
def filter_cpe(self, queryset, name, value):
220217
cpe = unquote(value)
221218
return self.queryset.filter(vulnerabilityreference__reference_id__startswith=cpe).distinct()
@@ -229,3 +226,19 @@ class CPEViewSet(viewsets.ReadOnlyModelViewSet):
229226
paginate_by = 50
230227
filter_backends = (filters.DjangoFilterBackend,)
231228
filterset_class = CPEFilterSet
229+
230+
231+
class AliasFilterSet(filters.FilterSet):
232+
alias = filters.CharFilter(method="filter_alias")
233+
234+
def filter_alias(self, queryset, name, value):
235+
alias = unquote(value)
236+
return self.queryset.filter(aliases__alias__icontains=alias)
237+
238+
239+
class AliasViewSet(viewsets.ReadOnlyModelViewSet):
240+
queryset = Vulnerability.objects.all()
241+
serializer_class = VulnerabilitySerializer
242+
paginate_by = 50
243+
filter_backends = (filters.DjangoFilterBackend,)
244+
filterset_class = AliasFilterSet

vulnerabilities/tests/test_fix_api.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from django.utils.http import int_to_base36
2525
from rest_framework import status
2626

27+
from vulnerabilities.models import Alias
2728
from vulnerabilities.models import Package
2829
from vulnerabilities.models import Vulnerability
2930
from vulnerabilities.models import VulnerabilityReference
@@ -125,3 +126,18 @@ def test_api_status(self):
125126
def test_api_response(self):
126127
response = self.client.get("/api/cpes/?cpe=cpe:/a:nginx:9", format="json").data
127128
self.assertEqual(response["count"], 1)
129+
130+
131+
class AliasApi(TestCase):
132+
def setUp(self):
133+
self.vulnerability = Vulnerability.objects.create(summary="test")
134+
for i in range(0, 10):
135+
Alias.objects.create(alias=f"CVE-{i}", vulnerability=self.vulnerability)
136+
137+
def test_api_status(self):
138+
response = self.client.get("/api/alias/", format="json")
139+
self.assertEqual(status.HTTP_200_OK, response.status_code)
140+
141+
def test_api_response(self):
142+
response = self.client.get("/api/alias?alias=CVE-9", format="json").data
143+
self.assertEqual(response["count"], 1)

vulnerablecode/urls.py

Lines changed: 3 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 AliasViewSet
2930
from vulnerabilities.api import CPEViewSet
3031
from vulnerabilities.api import PackageViewSet
3132
from vulnerabilities.api import VulnerabilityViewSet
@@ -49,6 +50,8 @@ def __init__(self, *args, **kwargs):
4950
# `DefaultRouter` requires `basename` when registering viewsets that don't define a queryset.
5051
api_router.register(r"vulnerabilities", VulnerabilityViewSet, basename="vulnerability")
5152
api_router.register(r"cpes", CPEViewSet, basename="cpe")
53+
api_router.register(r"alias", AliasViewSet, basename="alias")
54+
5255

5356
urlpatterns = [
5457
path("admin/", admin.site.urls),

0 commit comments

Comments
 (0)