From 87dea150ee206a6039dcec6f726ed58074df42fe Mon Sep 17 00:00:00 2001 From: Dominik Richter Date: Mon, 18 Mar 2024 01:54:57 -0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=B9=20AdjustScore=20builds=20risk=20fa?= =?UTF-8?q?ctor=20results=20into=20score=20(#1183)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Dominik Richter --- policy/risk_factor.go | 34 +++++---- policy/risk_factor_test.go | 140 +++++++++++++++---------------------- 2 files changed, 77 insertions(+), 97 deletions(-) diff --git a/policy/risk_factor.go b/policy/risk_factor.go index d60ea9fb..330d66c6 100644 --- a/policy/risk_factor.go +++ b/policy/risk_factor.go @@ -3,7 +3,7 @@ package policy -func (r *RiskFactor) AdjustScore(score *Score, isDetected bool) *ScoredRiskFactor { +func (r *RiskFactor) AdjustScore(score *Score, isDetected bool) { // Absolute risk factors only play a role when they are detected. if r.IsAbsolute { if isDetected { @@ -16,38 +16,46 @@ func (r *RiskFactor) AdjustScore(score *Score, isDetected bool) *ScoredRiskFacto score.Value = uint32(nu) } - return &ScoredRiskFactor{ + score.RiskFactors = append(score.RiskFactors, &ScoredRiskFactor{ Id: r.Uid, Risk: r.Magnitude, IsAbsolute: true, - } - } else { - return nil + }) + return } + // We don't adjust anything in case an absolute risk factor is not detected + return } if r.Magnitude < 0 { if isDetected { score.Value = uint32(100 - float32(100-score.Value)*(1+r.Magnitude)) - return &ScoredRiskFactor{ + score.RiskFactors = append(score.RiskFactors, &ScoredRiskFactor{ Id: r.Uid, Risk: r.Magnitude, - } - } else { - return nil + }) + return } + // Relative risk factors that only decrease risk don't get flagged in + // case they are not detected + return } + // For relative risk factors we have to adjust both the detected and + // not detected score. The non-detected score needs to be decreased, + // since it's a relative risk factors. The detected score just needs + // the flag to indicate its risk was "increased" (relative to non-detected) if isDetected { - return &ScoredRiskFactor{ + score.RiskFactors = append(score.RiskFactors, &ScoredRiskFactor{ Id: r.Uid, Risk: r.Magnitude, - } + }) + return } score.Value = uint32(100 - float32(100-score.Value)*(1-r.Magnitude)) - return &ScoredRiskFactor{ + score.RiskFactors = append(score.RiskFactors, &ScoredRiskFactor{ Id: r.Uid, Risk: -r.Magnitude, - } + }) } diff --git a/policy/risk_factor_test.go b/policy/risk_factor_test.go index e3496857..8dcc7a1d 100644 --- a/policy/risk_factor_test.go +++ b/policy/risk_factor_test.go @@ -12,112 +12,86 @@ import ( func TestRiskFactor_AdjustScore(t *testing.T) { tests := []struct { - risk RiskFactor - score Score - onDetect *ScoredRiskFactor - onDetectScore Score - onFail *ScoredRiskFactor - onFailScore Score + risk RiskFactor + score Score + onDetect Score + onFail Score }{ // Relative, increase risk { - risk: RiskFactor{Magnitude: 0.4}, - score: Score{Value: 40}, - onDetect: &ScoredRiskFactor{Risk: 0.4}, - onDetectScore: Score{Value: 40}, - onFail: &ScoredRiskFactor{Risk: -0.4}, - onFailScore: Score{Value: 64}, + risk: RiskFactor{Magnitude: 0.4}, + score: Score{Value: 40}, + onDetect: Score{Value: 40, RiskFactors: []*ScoredRiskFactor{{Risk: 0.4}}}, + onFail: Score{Value: 64, RiskFactors: []*ScoredRiskFactor{{Risk: -0.4}}}, }, { - risk: RiskFactor{Magnitude: 0.4}, - score: Score{Value: 10}, - onDetect: &ScoredRiskFactor{Risk: 0.4}, - onDetectScore: Score{Value: 10}, - onFail: &ScoredRiskFactor{Risk: -0.4}, - onFailScore: Score{Value: 45}, + risk: RiskFactor{Magnitude: 0.4}, + score: Score{Value: 10}, + onDetect: Score{Value: 10, RiskFactors: []*ScoredRiskFactor{{Risk: 0.4}}}, + onFail: Score{Value: 45, RiskFactors: []*ScoredRiskFactor{{Risk: -0.4}}}, }, { - risk: RiskFactor{Magnitude: 0.4}, - score: Score{Value: 90}, - onDetect: &ScoredRiskFactor{Risk: 0.4}, - onDetectScore: Score{Value: 90}, - onFail: &ScoredRiskFactor{Risk: -0.4}, - onFailScore: Score{Value: 94}, + risk: RiskFactor{Magnitude: 0.4}, + score: Score{Value: 90}, + onDetect: Score{Value: 90, RiskFactors: []*ScoredRiskFactor{{Risk: 0.4}}}, + onFail: Score{Value: 94, RiskFactors: []*ScoredRiskFactor{{Risk: -0.4}}}, }, // Absolute, decrease risk { - risk: RiskFactor{Magnitude: -0.4}, - score: Score{Value: 40}, - onDetect: &ScoredRiskFactor{Risk: -0.4}, - onDetectScore: Score{Value: 64}, - onFail: nil, - onFailScore: Score{Value: 40}, + risk: RiskFactor{Magnitude: -0.4}, + score: Score{Value: 40}, + onDetect: Score{Value: 64, RiskFactors: []*ScoredRiskFactor{{Risk: -0.4}}}, + onFail: Score{Value: 40}, }, { - risk: RiskFactor{Magnitude: -0.4}, - score: Score{Value: 10}, - onDetect: &ScoredRiskFactor{Risk: -0.4}, - onDetectScore: Score{Value: 45}, - onFail: nil, - onFailScore: Score{Value: 10}, + risk: RiskFactor{Magnitude: -0.4}, + score: Score{Value: 10}, + onDetect: Score{Value: 45, RiskFactors: []*ScoredRiskFactor{{Risk: -0.4}}}, + onFail: Score{Value: 10}, }, { - risk: RiskFactor{Magnitude: -0.4}, - score: Score{Value: 90}, - onDetect: &ScoredRiskFactor{Risk: -0.4}, - onDetectScore: Score{Value: 94}, - onFail: nil, - onFailScore: Score{Value: 90}, + risk: RiskFactor{Magnitude: -0.4}, + score: Score{Value: 90}, + onDetect: Score{Value: 94, RiskFactors: []*ScoredRiskFactor{{Risk: -0.4}}}, + onFail: Score{Value: 90}, }, // Absolute, increase risk { - risk: RiskFactor{Magnitude: 0.2, IsAbsolute: true}, - score: Score{Value: 40}, - onDetect: &ScoredRiskFactor{Risk: 0.2, IsAbsolute: true}, - onDetectScore: Score{Value: 20}, - onFail: nil, - onFailScore: Score{Value: 40}, + risk: RiskFactor{Magnitude: 0.2, IsAbsolute: true}, + score: Score{Value: 40}, + onDetect: Score{Value: 20, RiskFactors: []*ScoredRiskFactor{{Risk: 0.2, IsAbsolute: true}}}, + onFail: Score{Value: 40}, }, { - risk: RiskFactor{Magnitude: 0.2, IsAbsolute: true}, - score: Score{Value: 10}, - onDetect: &ScoredRiskFactor{Risk: 0.2, IsAbsolute: true}, - onDetectScore: Score{Value: 0}, - onFail: nil, - onFailScore: Score{Value: 10}, + risk: RiskFactor{Magnitude: 0.2, IsAbsolute: true}, + score: Score{Value: 10}, + onDetect: Score{Value: 0, RiskFactors: []*ScoredRiskFactor{{Risk: 0.2, IsAbsolute: true}}}, + onFail: Score{Value: 10}, }, { - risk: RiskFactor{Magnitude: 0.2, IsAbsolute: true}, - score: Score{Value: 90}, - onDetect: &ScoredRiskFactor{Risk: 0.2, IsAbsolute: true}, - onDetectScore: Score{Value: 70}, - onFail: nil, - onFailScore: Score{Value: 90}, + risk: RiskFactor{Magnitude: 0.2, IsAbsolute: true}, + score: Score{Value: 90}, + onDetect: Score{Value: 70, RiskFactors: []*ScoredRiskFactor{{Risk: 0.2, IsAbsolute: true}}}, + onFail: Score{Value: 90}, }, // Absolute, decrease risk { - risk: RiskFactor{Magnitude: -0.2, IsAbsolute: true}, - score: Score{Value: 40}, - onDetect: &ScoredRiskFactor{Risk: -0.2, IsAbsolute: true}, - onDetectScore: Score{Value: 60}, - onFail: nil, - onFailScore: Score{Value: 40}, + risk: RiskFactor{Magnitude: -0.2, IsAbsolute: true}, + score: Score{Value: 40}, + onDetect: Score{Value: 60, RiskFactors: []*ScoredRiskFactor{{Risk: -0.2, IsAbsolute: true}}}, + onFail: Score{Value: 40}, }, { - risk: RiskFactor{Magnitude: -0.2, IsAbsolute: true}, - score: Score{Value: 10}, - onDetect: &ScoredRiskFactor{Risk: -0.2, IsAbsolute: true}, - onDetectScore: Score{Value: 30}, - onFail: nil, - onFailScore: Score{Value: 10}, + risk: RiskFactor{Magnitude: -0.2, IsAbsolute: true}, + score: Score{Value: 10}, + onDetect: Score{Value: 30, RiskFactors: []*ScoredRiskFactor{{Risk: -0.2, IsAbsolute: true}}}, + onFail: Score{Value: 10}, }, { - risk: RiskFactor{Magnitude: -0.2, IsAbsolute: true}, - score: Score{Value: 90}, - onDetect: &ScoredRiskFactor{Risk: -0.2, IsAbsolute: true}, - onDetectScore: Score{Value: 100}, - onFail: nil, - onFailScore: Score{Value: 90}, + risk: RiskFactor{Magnitude: -0.2, IsAbsolute: true}, + score: Score{Value: 90}, + onDetect: Score{Value: 100, RiskFactors: []*ScoredRiskFactor{{Risk: -0.2, IsAbsolute: true}}}, + onFail: Score{Value: 90}, }, } @@ -126,14 +100,12 @@ func TestRiskFactor_AdjustScore(t *testing.T) { cur := tests[i] okScore := cur.score - okRF := cur.risk.AdjustScore(&okScore, true) - assert.Equal(t, cur.onDetect, okRF, "ok risk factors match") - assert.Equal(t, cur.onDetectScore, okScore, "ok scores match") + cur.risk.AdjustScore(&okScore, true) + assert.Equal(t, cur.onDetect, okScore, "ok scores match") nokScore := cur.score - nokRF := cur.risk.AdjustScore(&nokScore, false) - assert.Equal(t, cur.onFail, nokRF, "fail risk factors match") - assert.Equal(t, cur.onFailScore, nokScore, "fail scores match") + cur.risk.AdjustScore(&nokScore, false) + assert.Equal(t, cur.onFail, nokScore, "fail scores match") }) } }