99
1010from urllib .parse import unquote
1111
12+ from cvss .exceptions import CVSS2MalformedError
13+ from cvss .exceptions import CVSS3MalformedError
14+ from cvss .exceptions import CVSS4MalformedError
1215from django .db .models import Prefetch
1316from django_filters import rest_framework as filters
1417from drf_spectacular .utils import extend_schema
15- from drf_spectacular .utils import inline_serializer
1618from packageurl import PackageURL
1719from packageurl import normalize_qualifiers
1820from rest_framework import serializers
3234from vulnerabilities .models import VulnerabilitySeverity
3335from vulnerabilities .models import Weakness
3436from vulnerabilities .models import get_purl_query_lookups
37+ from vulnerabilities .severity_systems import EPSS
38+ from vulnerabilities .severity_systems import SCORING_SYSTEMS
3539from vulnerabilities .throttling import StaffUserRateThrottle
40+ from vulnerabilities .utils import get_severity_range
3641
3742
3843class 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
0 commit comments