github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/compliance/spec/mapper.go (about)

     1  package spec
     2  
     3  import (
     4  	"golang.org/x/exp/slices"
     5  
     6  	"github.com/devseccon/trivy/pkg/types"
     7  )
     8  
     9  // MapSpecCheckIDToFilteredResults map spec check id to filtered scan results
    10  func MapSpecCheckIDToFilteredResults(result types.Result, checkIDs map[types.Scanner][]string) map[string]types.Results {
    11  	mapCheckByID := make(map[string]types.Results)
    12  	for _, vuln := range result.Vulnerabilities {
    13  		// Skip irrelevant check IDs
    14  		if !slices.Contains(checkIDs[types.VulnerabilityScanner], vuln.GetID()) {
    15  			continue
    16  		}
    17  		mapCheckByID[vuln.GetID()] = append(mapCheckByID[vuln.GetID()], types.Result{
    18  			Target:          result.Target,
    19  			Class:           result.Class,
    20  			Type:            result.Type,
    21  			Vulnerabilities: []types.DetectedVulnerability{vuln},
    22  		})
    23  	}
    24  	for _, m := range result.Misconfigurations {
    25  		// Skip irrelevant check IDs
    26  		if !slices.Contains(checkIDs[types.MisconfigScanner], m.GetID()) {
    27  			continue
    28  		}
    29  
    30  		mapCheckByID[m.GetID()] = append(mapCheckByID[m.GetID()], types.Result{
    31  			Target:            result.Target,
    32  			Class:             result.Class,
    33  			Type:              result.Type,
    34  			MisconfSummary:    misconfigSummary(m),
    35  			Misconfigurations: []types.DetectedMisconfiguration{m},
    36  		})
    37  	}
    38  
    39  	// Evaluate custom IDs
    40  	mapCustomIDsToFilteredResults(result, checkIDs, mapCheckByID)
    41  
    42  	return mapCheckByID
    43  }
    44  
    45  func misconfigSummary(misconfig types.DetectedMisconfiguration) *types.MisconfSummary {
    46  	rms := types.MisconfSummary{}
    47  	switch misconfig.Status {
    48  	case types.StatusPassed:
    49  		rms.Successes = 1
    50  	case types.StatusFailure:
    51  		rms.Failures = 1
    52  	case types.StatusException:
    53  		rms.Exceptions = 1
    54  	}
    55  	return &rms
    56  }
    57  
    58  // AggregateAllChecksBySpecID aggregates all scan results and map it to spec ids
    59  func AggregateAllChecksBySpecID(multiResults []types.Results, cs ComplianceSpec) map[string]types.Results {
    60  	checkIDs := cs.CheckIDs()
    61  	complianceArr := make(map[string]types.Results, 0)
    62  	for _, resResult := range multiResults {
    63  		for _, result := range resResult {
    64  			m := MapSpecCheckIDToFilteredResults(result, checkIDs)
    65  			for id, checks := range m {
    66  				complianceArr[id] = append(complianceArr[id], checks...)
    67  			}
    68  		}
    69  	}
    70  	return complianceArr
    71  }