Skip to content

Commit e20221d

Browse files
committed
Move fixed_packages to vulnerabilities in packages endpoint #809
Reference: #809 Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 6899c27 commit e20221d

File tree

2 files changed

+68
-46
lines changed

2 files changed

+68
-46
lines changed

vulnerabilities/api.py

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -52,41 +52,69 @@ class Meta:
5252
fields = ["url", "purl"]
5353

5454

55-
class VulnSerializerRefsAndSummary(serializers.HyperlinkedModelSerializer):
55+
class FilteredPackageListSerializer(serializers.ListSerializer):
56+
def to_representation(self, data):
57+
request = self.context["request"]
58+
value = request.query_params.get("purl")
59+
if value:
60+
purl = unquote(value)
61+
try:
62+
purl = PackageURL.from_string(purl)
63+
64+
except ValueError as ve:
65+
raise serializers.ValidationError(
66+
detail={"error": f'"{purl}" is not a valid Package URL: {ve}'},
67+
)
68+
69+
attrs = {k: v for k, v in purl.to_dict().items() if v}
70+
data = data.filter(**attrs)
71+
return data
72+
package_filter_data = {}
73+
query_params = request.query_params
74+
75+
for field_name in query_params:
76+
value = query_params.get(field_name)
77+
if value:
78+
package_filter_data[field_name] = value
79+
data = data.filter(**package_filter_data)
80+
return data
81+
82+
83+
class FilteredPackageSerializer(serializers.HyperlinkedModelSerializer):
5684
"""
57-
Used for nesting inside package focused APIs.
85+
Used for nesting inside vulnerability focused APIs.
5886
"""
5987

60-
references = VulnerabilityReferenceSerializer(many=True, source="vulnerabilityreference_set")
88+
purl = serializers.CharField(source="package_url")
6189

6290
class Meta:
63-
model = Vulnerability
64-
fields = ["url", "vulnerability_id", "summary", "references"]
91+
list_serializer_class = FilteredPackageListSerializer
92+
model = Package
93+
fields = ["url", "purl"]
6594

6695

67-
class MinimalVulnerabilitySerializer(serializers.HyperlinkedModelSerializer):
96+
class VulnSerializerRefsAndSummary(serializers.HyperlinkedModelSerializer):
6897
"""
6998
Used for nesting inside package focused APIs.
7099
"""
71100

101+
fixed_packages = MinimalPackageSerializer(many=True, source="resolved_to", read_only=True)
102+
103+
references = VulnerabilityReferenceSerializer(many=True, source="vulnerabilityreference_set")
104+
72105
class Meta:
73106
model = Vulnerability
74-
fields = ["url", "vulnerability_id"]
107+
fields = ["url", "vulnerability_id", "summary", "references", "fixed_packages"]
75108

76109

77-
class PackageSerializerFixedVulns(serializers.HyperlinkedModelSerializer):
110+
class MinimalVulnerabilitySerializer(serializers.HyperlinkedModelSerializer):
78111
"""
79-
Used for nesting inside vulnerability focused APIs.
112+
Used for nesting inside package focused APIs.
80113
"""
81114

82-
purl = serializers.CharField(source="package_url")
83-
fixing_vulnerabilities = MinimalVulnerabilitySerializer(
84-
many=True, source="resolved_to", read_only=True
85-
)
86-
87115
class Meta:
88-
model = Package
89-
fields = ["url", "purl", "fixing_vulnerabilities"]
116+
model = Vulnerability
117+
fields = ["url", "vulnerability_id"]
90118

91119

92120
class AliasSerializer(serializers.HyperlinkedModelSerializer):
@@ -135,7 +163,6 @@ def to_representation(self, instance):
135163
fixing_vulnerabilities = VulnSerializerRefsAndSummary(
136164
many=True, source="resolved_to", read_only=True
137165
)
138-
fixed_packages = PackageSerializerFixedVulns(many=True, read_only=True)
139166

140167
class Meta:
141168
model = Package
@@ -149,7 +176,6 @@ class Meta:
149176
"qualifiers",
150177
"subpath",
151178
"affected_by_vulnerabilities",
152-
"fixed_packages",
153179
"fixing_vulnerabilities",
154180
]
155181

vulnerabilities/tests/test_fix_api.py

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
# See https://aboutcode.org for more information about nexB OSS projects.
88
#
99

10+
from collections import OrderedDict
11+
1012
from django.test import TestCase
1113
from django.utils.http import int_to_base36
1214
from rest_framework import status
@@ -138,30 +140,24 @@ def test_api_with_single_vulnerability_and_fixed_package(self):
138140
"namespace": "nginx",
139141
"name": "test",
140142
"version": "11",
141-
"unresolved_vulnerabilities": [],
142143
"qualifiers": {},
143144
"subpath": "",
144-
"fixed_packages": [
145-
{
146-
"url": f"http://testserver/api/packages/{self.package.id}",
147-
"purl": "pkg:generic/nginx/test@11",
148-
"fixing_vulnerabilities": [
149-
{
150-
"url": f"http://testserver/api/vulnerabilities/{self.vuln.id}",
151-
"vulnerability_id": f"VULCOID-{int_to_base36(self.vuln.id).upper()}",
152-
}
153-
],
154-
}
155-
],
156145
"affected_by_vulnerabilities": [],
157146
"fixing_vulnerabilities": [
158147
{
159148
"url": f"http://testserver/api/vulnerabilities/{self.vuln.id}",
160149
"vulnerability_id": f"VULCOID-{int_to_base36(self.vuln.id).upper()}",
161150
"summary": "test-vuln",
162151
"references": [],
163-
}
152+
"fixed_packages": [
153+
{
154+
"url": f"http://testserver/api/packages/{self.package.id}",
155+
"purl": "pkg:generic/nginx/test@11",
156+
}
157+
],
158+
},
164159
],
160+
"unresolved_vulnerabilities": [],
165161
}
166162

167163
def test_api_with_single_vulnerability_and_vulnerable_package(self):
@@ -173,37 +169,37 @@ def test_api_with_single_vulnerability_and_vulnerable_package(self):
173169
"namespace": "nginx",
174170
"name": "test",
175171
"version": "9",
176-
"unresolved_vulnerabilities": [
172+
"qualifiers": {},
173+
"subpath": "",
174+
"affected_by_vulnerabilities": [
177175
{
178176
"url": f"http://testserver/api/vulnerabilities/{self.vuln.id}",
179177
"vulnerability_id": f"VULCOID-{int_to_base36(self.vuln.id).upper()}",
180178
"summary": "test-vuln",
181179
"references": [],
182-
}
183-
],
184-
"qualifiers": {},
185-
"subpath": "",
186-
"fixed_packages": [
187-
{
188-
"url": f"http://testserver/api/packages/{self.package.id}",
189-
"purl": "pkg:generic/nginx/test@11",
190-
"fixing_vulnerabilities": [
180+
"fixed_packages": [
191181
{
192-
"url": f"http://testserver/api/vulnerabilities/{self.vuln.id}",
193-
"vulnerability_id": f"VULCOID-{int_to_base36(self.vuln.id).upper()}",
182+
"url": f"http://testserver/api/packages/{self.package.id}",
183+
"purl": "pkg:generic/nginx/test@11",
194184
}
195185
],
196186
}
197187
],
198-
"affected_by_vulnerabilities": [
188+
"fixing_vulnerabilities": [],
189+
"unresolved_vulnerabilities": [
199190
{
200191
"url": f"http://testserver/api/vulnerabilities/{self.vuln.id}",
201192
"vulnerability_id": f"VULCOID-{int_to_base36(self.vuln.id).upper()}",
202193
"summary": "test-vuln",
203194
"references": [],
195+
"fixed_packages": [
196+
{
197+
"url": f"http://testserver/api/packages/{self.package.id}",
198+
"purl": "pkg:generic/nginx/test@11",
199+
}
200+
],
204201
}
205202
],
206-
"fixing_vulnerabilities": [],
207203
}
208204

209205

0 commit comments

Comments
 (0)