@@ -17,30 +17,29 @@ package policy
1717import (
1818 "context"
1919 "regexp"
20- "time"
2120
2221 "github.com/interlynk-io/sbomqs/pkg/logger"
2322 "github.com/interlynk-io/sbomqs/pkg/sbom"
2423)
2524
2625// EvaluatePolicyAgainstSBOMs evaluates a single policy against a SBOMs.
27- func EvaluatePolicyAgainstSBOMs (ctx context.Context , p Policy , doc sbom.Document , fieldExtractor * Extractor ) (Result , error ) {
26+ func EvaluatePolicyAgainstSBOMs (ctx context.Context , policy Policy , doc sbom.Document , fieldExtractor * Extractor ) (PolicyResult , error ) {
2827 log := logger .FromContext (ctx )
29- log .Debugf ("processing policy evaluation: %s" , p .Name , p .Type )
28+ log .Debugf ("processing policy evaluation: %s" , policy .Name , policy .Type )
3029
31- result := NewResult (p )
32- result .GeneratedAt = time .Now ().UTC ()
30+ policyResult := NewPolicyResult (policy )
3331
32+ totalChecks := 0
3433 components := doc .Components ()
35- result . TotalChecked = len (components )
34+ policyResult . TotalComponents = len (components )
3635
3736 // compile regex present in pattern rules
38- compiledRules , err := compilePatternRules (p )
37+ compiledRules , err := compilePatternRules (policy )
3938 if err != nil {
40- return Result {}, err
39+ return PolicyResult {}, err
4140 }
4241
43- policyResults := make ([]PolicyResult , 0 , len (components )* len (compiledRules ))
42+ policyResults := make ([]RuleResult , 0 , len (components )* len (compiledRules ))
4443
4544 // evaluate components against list of all rules in a single policy
4645 for _ , comp := range components {
@@ -54,6 +53,7 @@ func EvaluatePolicyAgainstSBOMs(ctx context.Context, p Policy, doc sbom.Document
5453
5554 // evaluate each component against list of all rules
5655 for _ , compileRule := range compiledRules {
56+ totalChecks ++
5757 // evaluate rule
5858
5959 declaredRule := compileRule .Rule
@@ -66,43 +66,43 @@ func EvaluatePolicyAgainstSBOMs(ctx context.Context, p Policy, doc sbom.Document
6666 actualValues := fieldExtractor .RetrieveValues (comp , declaredField )
6767
6868 // default outcome/pass reason
69- outcome := "pass"
69+ result := "pass"
7070 reason := "present"
7171
7272 // required rule: presence check
73- if RULE_TYPE (p .Type ) == REQUIRED {
73+ if RULE_TYPE (policy .Type ) == REQUIRED {
7474 ok := fieldExtractor .HasField (comp , declaredField )
7575 if ! ok {
76- outcome = "fail"
76+ result = "fail"
7777 reason = "missing field"
7878 }
7979
8080 } else {
8181 // for whitelist/blacklist do matching
8282 matched := anyMatch (actualValues , declaredValues , patterns )
8383
84- switch RULE_TYPE (p .Type ) {
84+ switch RULE_TYPE (policy .Type ) {
8585 case WHITELIST :
8686 if ! matched {
87- outcome = "fail"
87+ result = "fail"
8888 reason = "value not in whitelist"
8989 }
9090 case BLACKLIST :
9191 if matched {
92- outcome = "fail"
92+ result = "fail"
9393 reason = "value in blacklist"
9494 }
9595 default :
9696 // if unknown type, treat as pass (or change to fail depending on your policy)
9797 }
9898 }
9999
100- pr := PolicyResult {
100+ pr := RuleResult {
101101 ComponentID : compID ,
102102 ComponentName : compName ,
103- Field : declaredField ,
104- Actual : actualValues ,
105- Outcome : outcome ,
103+ DeclaredField : declaredField ,
104+ ActualValues : actualValues ,
105+ Result : result ,
106106 Reason : reason ,
107107 }
108108
@@ -112,32 +112,33 @@ func EvaluatePolicyAgainstSBOMs(ctx context.Context, p Policy, doc sbom.Document
112112 }
113113
114114 // assign results
115- result .PolicyResults = policyResults
115+ policyResult .RuleResults = policyResults
116+ policyResult .TotalChecks = totalChecks
116117
117118 // compute ViolationCnt (failed outcomes)
118119 violationCount := 0
119120 for _ , pr := range policyResults {
120- if pr .Outcome == "fail" {
121+ if pr .Result == "fail" {
121122 violationCount ++
122123 }
123124 }
124- result .ViolationCnt = violationCount
125+ policyResult .ViolationCnt = violationCount
125126
126127 // Decide outcome
127- if result .ViolationCnt == 0 {
128- result . Result = "pass"
128+ if policyResult .ViolationCnt == 0 {
129+ policyResult . OverallResult = "pass"
129130 } else {
130- switch p .Action {
131+ switch policy .Action {
131132 case "warn" :
132- result . Result = "warn"
133+ policyResult . OverallResult = "warn"
133134 case "pass" :
134- result . Result = "pass"
135+ policyResult . OverallResult = "pass"
135136 default :
136- result . Result = "fail"
137+ policyResult . OverallResult = "fail"
137138 }
138139 }
139140
140- return * result , nil
141+ return * policyResult , nil
141142}
142143
143144// anyMatch returns true if at least one of the actual values
0 commit comments