Skip to content

Commit 64d9dd7

Browse files
committed
Add filter for fixed packages in vulnerabilities endpoint
Signed-off-by: Tushar Goel <[email protected]>
1 parent e538976 commit 64d9dd7

File tree

2 files changed

+65
-16
lines changed

2 files changed

+65
-16
lines changed

vulnerabilities/api.py

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,34 @@ class Meta:
5050
fields = ["url", "purl"]
5151

5252

53-
class MinimalVulnerabilitySerializer(serializers.HyperlinkedModelSerializer):
53+
class FilteredPackageListSerializer(serializers.ListSerializer):
54+
def to_representation(self, data):
55+
params = self.context["request"].query_params
56+
name = params.get("name")
57+
if name:
58+
data = data.filter(name=name)
59+
namespace = params.get("namespace")
60+
if namespace:
61+
data = data.filter(namespace=namespace)
62+
type = params.get("type")
63+
if type:
64+
data = data.filter(type=type)
65+
return super(FilteredPackageListSerializer, self).to_representation(data)
66+
67+
68+
class FixedPackageSerializer(serializers.ModelSerializer):
69+
70+
purl = serializers.CharField(source="package_url")
71+
72+
class Meta:
73+
list_serializer_class = FilteredPackageListSerializer
74+
model = Package
75+
fields = ["url", "purl"]
76+
77+
78+
class MinimalVulnerabilitySerializerWithReferencesAndSummary(
79+
serializers.HyperlinkedModelSerializer
80+
):
5481
"""
5582
Used for nesting inside package focused APIs.
5683
"""
@@ -62,6 +89,31 @@ class Meta:
6289
fields = ["url", "vulnerability_id", "summary", "references"]
6390

6491

92+
class MinimalVulnerabilitySerializer(serializers.HyperlinkedModelSerializer):
93+
"""
94+
Used for nesting inside package focused APIs.
95+
"""
96+
97+
class Meta:
98+
model = Vulnerability
99+
fields = ["url", "vulnerability_id"]
100+
101+
102+
class MinimalPackageSerializerWithFixedVulnerabilities(serializers.HyperlinkedModelSerializer):
103+
"""
104+
Used for nesting inside vulnerability focused APIs.
105+
"""
106+
107+
purl = serializers.CharField(source="package_url")
108+
fixing_vulnerabilities = MinimalVulnerabilitySerializer(
109+
many=True, source="resolved_to", read_only=True
110+
)
111+
112+
class Meta:
113+
model = Package
114+
fields = ["url", "purl", "fixing_vulnerabilities"]
115+
116+
65117
class AliasSerializer(serializers.HyperlinkedModelSerializer):
66118
"""
67119
Used for nesting inside package focused APIs.
@@ -74,7 +126,7 @@ class Meta:
74126

75127
class VulnerabilitySerializer(serializers.HyperlinkedModelSerializer):
76128

77-
fixed_packages = MinimalPackageSerializer(many=True, source="resolved_to", read_only=True)
129+
fixed_packages = FixedPackageSerializer(many=True, source="resolved_to", read_only=True)
78130
affected_packages = MinimalPackageSerializer(many=True, source="vulnerable_to", read_only=True)
79131

80132
references = VulnerabilityReferenceSerializer(many=True, source="vulnerabilityreference_set")
@@ -100,13 +152,13 @@ def to_representation(self, instance):
100152
return data
101153

102154
purl = serializers.CharField(source="package_url")
103-
affected_by_vulnerabilities = MinimalVulnerabilitySerializer(
155+
affected_by_vulnerabilities = MinimalVulnerabilitySerializerWithReferencesAndSummary(
104156
many=True, source="vulnerable_to", read_only=True
105157
)
106-
fixing_vulnerabilities = MinimalVulnerabilitySerializer(
158+
fixing_vulnerabilities = MinimalVulnerabilitySerializerWithReferencesAndSummary(
107159
many=True, source="resolved_to", read_only=True
108160
)
109-
fixed_packages = MinimalPackageSerializer(many=True, read_only=True)
161+
fixed_packages = MinimalPackageSerializerWithFixedVulnerabilities(many=True, read_only=True)
110162

111163
class Meta:
112164
model = Package

vulnerabilities/models.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -198,17 +198,14 @@ def fixed_packages(self):
198198
"""
199199
Returns vulnerabilities which are affecting this package.
200200
"""
201-
return (
202-
Package.objects.filter(
203-
name=self.name,
204-
namespace=self.namespace,
205-
type=self.type,
206-
qualifiers=self.qualifiers,
207-
subpath=self.subpath,
208-
)
209-
.filter(packagerelatedvulnerability__fix=True)
210-
.distinct()
211-
)
201+
return Package.objects.filter(
202+
name=self.name,
203+
namespace=self.namespace,
204+
type=self.type,
205+
qualifiers=self.qualifiers,
206+
subpath=self.subpath,
207+
packagerelatedvulnerability__fix=True,
208+
).distinct()
212209

213210
def set_package_url(self, package_url):
214211
"""

0 commit comments

Comments
 (0)