11use crate :: {
22 Error ,
33 advisory:: model:: AdvisoryHead ,
4- common:: { LicenseInfo , LicenseRefMapping , license_filtering} ,
4+ common:: { LicenseInfo , LicenseRefMapping , license_filtering, model :: Score } ,
55 purl:: model:: {
66 BasePurlHead , PurlHead , VersionedPurlHead , details:: version_range:: VersionRange ,
77 } ,
@@ -22,7 +22,7 @@ use trustify_common::{
2222 memo:: Memo ,
2323 purl:: Purl ,
2424} ;
25- use trustify_cvss:: cvss3:: { Cvss3Base , score:: Score , severity:: Severity } ;
25+ use trustify_cvss:: cvss3:: { Cvss3Base , score:: Score as Cvss3Score , severity:: Severity } ;
2626use trustify_entity:: {
2727 advisory, base_purl, cpe, cvss3, license, organization, product, product_status,
2828 product_version, product_version_range, purl_status, qualified_purl, sbom, sbom_package,
@@ -312,7 +312,11 @@ impl PurlAdvisory {
312312pub struct PurlStatus {
313313 pub vulnerability : VulnerabilityHead ,
314314 pub advisory : AdvisoryHead ,
315+ /// All CVSS scores associated with the vulnerability
316+ pub scores : Vec < Score > ,
317+ #[ deprecated( since = "0.5.0" , note = "Please use `scores` instead" ) ]
315318 pub average_severity : Severity ,
319+ #[ deprecated( since = "0.5.0" , note = "Please use `scores` instead" ) ]
316320 pub average_score : f64 ,
317321 pub status : String ,
318322 #[ schema( required) ]
@@ -336,9 +340,14 @@ impl PurlStatus {
336340 cpe : Option < String > ,
337341 tx : & C ,
338342 ) -> Result < Self , Error > {
339- let cvss3 = vuln. find_related ( cvss3:: Entity ) . all ( tx) . await ?;
340- let average_score = Score :: from_iter ( cvss3. iter ( ) . map ( Cvss3Base :: from) ) ;
341343 let issuer = Memo :: Provided ( advisory. find_related ( organization:: Entity ) . one ( tx) . await ?) ;
344+ let cvss3 = vuln. find_related ( cvss3:: Entity ) . all ( tx) . await ?;
345+ let average_score = Cvss3Score :: from_iter ( cvss3. iter ( ) . map ( Cvss3Base :: from) ) ;
346+ let all_scores = cvss3
347+ . iter ( )
348+ . cloned ( )
349+ . filter_map ( |cvss3| Score :: try_from ( cvss3) . ok ( ) )
350+ . collect ( ) ;
342351
343352 Ok ( Self {
344353 vulnerability : VulnerabilityHead :: from_vulnerability_entity (
@@ -348,8 +357,11 @@ impl PurlStatus {
348357 )
349358 . await ?,
350359 advisory : AdvisoryHead :: from_advisory ( advisory, issuer, tx) . await ?,
360+ #[ allow( deprecated) ]
351361 average_severity : average_score. severity ( ) ,
362+ #[ allow( deprecated) ]
352363 average_score : average_score. value ( ) ,
364+ scores : all_scores,
353365 status,
354366 context : cpe. map ( StatusContext :: Cpe ) ,
355367 version_range,
@@ -362,13 +374,23 @@ impl PurlStatus {
362374 status : String ,
363375 version_range : Option < VersionRange > ,
364376 cpe : Option < String > ,
365- score : Score ,
377+ scores : & [ cvss3 :: Model ] ,
366378 ) -> Result < Self , Error > {
379+ let average_score = Cvss3Score :: from_iter ( scores. iter ( ) . map ( Cvss3Base :: from) ) ;
380+ let all_scores = scores
381+ . iter ( )
382+ . cloned ( )
383+ . filter_map ( |cvss3| Score :: try_from ( cvss3) . ok ( ) )
384+ . collect ( ) ;
385+
367386 Ok ( Self {
368387 vulnerability : vuln_head,
369388 advisory : advisory_head,
370- average_severity : score. severity ( ) ,
371- average_score : score. value ( ) ,
389+ #[ allow( deprecated) ]
390+ average_severity : average_score. severity ( ) ,
391+ #[ allow( deprecated) ]
392+ average_score : average_score. value ( ) ,
393+ scores : all_scores,
372394 status,
373395 context : cpe. map ( StatusContext :: Cpe ) ,
374396 version_range,
0 commit comments