Skip to content

Commit 7c4a8f0

Browse files
authored
Merge branch 'main' into add-tests-for-queries
2 parents 9702c60 + 76428da commit 7c4a8f0

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

vulnerabilities/api.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99

1010
from urllib.parse import unquote
1111

12+
from cvss.exceptions import CVSS2MalformedError
13+
from cvss.exceptions import CVSS3MalformedError
14+
from cvss.exceptions import CVSS4MalformedError
1215
from django.db.models import Prefetch
1316
from django_filters import rest_framework as filters
1417
from drf_spectacular.utils import extend_schema
15-
from drf_spectacular.utils import inline_serializer
1618
from packageurl import PackageURL
1719
from packageurl import normalize_qualifiers
1820
from rest_framework import serializers
@@ -32,7 +34,10 @@
3234
from vulnerabilities.models import VulnerabilitySeverity
3335
from vulnerabilities.models import Weakness
3436
from vulnerabilities.models import get_purl_query_lookups
37+
from vulnerabilities.severity_systems import EPSS
38+
from vulnerabilities.severity_systems import SCORING_SYSTEMS
3539
from vulnerabilities.throttling import StaffUserRateThrottle
40+
from vulnerabilities.utils import get_severity_range
3641

3742

3843
class VulnerabilitySeveritySerializer(serializers.ModelSerializer):
@@ -186,6 +191,7 @@ class VulnerabilitySerializer(BaseResourceSerializer):
186191
aliases = AliasSerializer(many=True, source="alias")
187192
kev = KEVSerializer(read_only=True)
188193
weaknesses = WeaknessSerializer(many=True)
194+
severity_range_score = serializers.SerializerMethodField()
189195

190196
def to_representation(self, instance):
191197
data = super().to_representation(instance)
@@ -199,6 +205,30 @@ def to_representation(self, instance):
199205

200206
return data
201207

208+
def get_severity_range_score(self, instance):
209+
severity_vectors = []
210+
severity_values = set()
211+
for s in instance.severities:
212+
if s.scoring_system == EPSS.identifier:
213+
continue
214+
215+
if s.scoring_elements and s.scoring_system in SCORING_SYSTEMS:
216+
try:
217+
vector_values = SCORING_SYSTEMS[s.scoring_system].get(s.scoring_elements)
218+
severity_vectors.append(vector_values)
219+
except (
220+
CVSS2MalformedError,
221+
CVSS3MalformedError,
222+
CVSS4MalformedError,
223+
NotImplementedError,
224+
):
225+
pass
226+
227+
if s.value:
228+
severity_values.add(s.value)
229+
severity_range = get_severity_range(severity_values)
230+
return severity_range
231+
202232
class Meta:
203233
model = Vulnerability
204234
fields = [
@@ -211,6 +241,7 @@ class Meta:
211241
"references",
212242
"weaknesses",
213243
"kev",
244+
"severity_range_score",
214245
]
215246

216247

vulnerabilities/tests/test_api.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ def test_api_with_single_vulnerability(self):
256256
"url": f"http://testserver/api/vulnerabilities/{self.vulnerability.id}",
257257
"vulnerability_id": self.vulnerability.vulnerability_id,
258258
"summary": "test",
259+
"severity_range_score": None,
259260
"aliases": [],
260261
"resource_url": f"http://testserver/vulnerabilities/{self.vulnerability.vulnerability_id}",
261262
"fixed_packages": [
@@ -307,6 +308,7 @@ def test_api_with_single_vulnerability_with_filters(self):
307308
"url": f"http://testserver/api/vulnerabilities/{self.vulnerability.id}",
308309
"vulnerability_id": self.vulnerability.vulnerability_id,
309310
"summary": "test",
311+
"severity_range_score": None,
310312
"aliases": [],
311313
"resource_url": f"http://testserver/vulnerabilities/{self.vulnerability.vulnerability_id}",
312314
"fixed_packages": [

0 commit comments

Comments
 (0)