@@ -204,10 +204,13 @@ func RenderVulnerabilities(image *Image) string {
204204}
205205
206206func FormatCve (sb * Sbom , c * Cve ) {
207+ sourceId := c .SourceId
208+ if c .Cve != nil {
209+ sourceId = c .Cve .SourceId
210+ }
207211 fmt .Println ("" )
208- fmt .Println (fmt .Sprintf ("More information https://dso.docker.com/cve/%s" , c .SourceId ))
209- fmt .Println ("" )
210- fmt .Println (defaultColors .underline .Sprintf (fmt .Sprintf ("Detected %s in" , c .SourceId )))
212+ fmt .Println (defaultColors .underline .Sprintf (fmt .Sprintf ("Detected %s %s" , sourceId , ColorizeSeverity (ToSeverity (* c )))))
213+ fmt .Println (fmt .Sprintf ("https://dso.docker.com/cve/%s" , sourceId ))
211214 fmt .Println ("" )
212215 purl := c .Purl
213216 for _ , p := range sb .Artifacts {
@@ -263,3 +266,80 @@ RUN apt-get update && apt-get install -y \\
263266 }
264267 return ""
265268}
269+
270+ func ColorizeStringBySeverity (value string , severity string ) string {
271+ switch severity {
272+ case "CRITICAL" :
273+ return defaultColors .critical .Sprintf (value )
274+ case "HIGH" :
275+ return defaultColors .high .Sprintf (value )
276+ case "MEDIUM" :
277+ return defaultColors .medium .Sprintf (value )
278+ case "LOW" :
279+ return defaultColors .low .Sprintf (value )
280+ default :
281+ return value
282+ }
283+ }
284+
285+ func ColorizeSeverity (severity string ) string {
286+ label := fmt .Sprintf (" %s " , strings .TrimSpace (severity ))
287+ switch severity {
288+ case "CRITICAL" :
289+ return defaultColors .critical .Sprintf (label )
290+ case "HIGH" :
291+ return defaultColors .high .Sprintf (label )
292+ case "MEDIUM" :
293+ return defaultColors .medium .Sprintf (label )
294+ case "LOW" :
295+ return defaultColors .low .Sprintf (label )
296+ default :
297+ return severity
298+ }
299+ }
300+
301+ func ToSeverity (cve Cve ) string {
302+ findSeverity := func (adv * Advisory ) (string , bool ) {
303+ if adv == nil {
304+ return "" , false
305+ }
306+ for _ , r := range (* adv ).References {
307+ if r .Source == "atomist" {
308+ for _ , s := range r .Scores {
309+ if s .Type == "atm_severity" {
310+ v := s .Value
311+ if v != "SEVERITY_UNSPECIFIED" {
312+ return v , true
313+ }
314+ }
315+ }
316+ }
317+ }
318+ return "" , false
319+ }
320+
321+ if severity , ok := findSeverity (cve .Cve ); ok {
322+ return severity
323+ }
324+ if severity , ok := findSeverity (cve .Advisory ); ok {
325+ return severity
326+ }
327+
328+ return "IN TRIAGE"
329+ }
330+
331+ func ToSeverityInt (cve Cve ) int {
332+ severity := ToSeverity (cve )
333+ switch severity {
334+ case "CRITICAL" :
335+ return 4
336+ case "HIGH" :
337+ return 3
338+ case "MEDIUM" :
339+ return 2
340+ case "LOW" :
341+ return 1
342+ default :
343+ return 0
344+ }
345+ }
0 commit comments