Skip to content

Commit 5ee2cea

Browse files
committed
add new VulnerabilityDetectedRule
Signed-off-by: tdruez <tdruez@aboutcode.org>
1 parent c7ecab9 commit 5ee2cea

1 file changed

Lines changed: 33 additions & 0 deletions

File tree

policy/rules.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@
66
# See https://aboutcode.org for more information about AboutCode FOSS projects.
77
#
88

9+
910
from django.apps import apps
1011

12+
# VulnerabilityAnalysis states that indicate a vulnerability has been triaged and addressed.
13+
TERMINAL_VULNERABILITY_STATES = ["resolved", "resolved_with_pedigree", "not_affected"]
14+
1115

1216
class BaseRule:
1317
"""Base class for policy rule handlers."""
@@ -100,10 +104,39 @@ class LicenseCoverageGapRule(PackageBaseRule):
100104
package_filter = {"license_expression": ""}
101105

102106

107+
class VulnerabilityDetectedRule(BaseRule):
108+
rule_type = "vulnerability_detected"
109+
label = "Vulnerability Detected"
110+
severity = "error"
111+
description = "Detects packages with at least one known vulnerability (non-null risk score)."
112+
parameters_schema = {
113+
"min_risk_score": "Minimum risk score (0.0-10.0). Default: any vulnerability.",
114+
}
115+
116+
def get_package_filter(self):
117+
return {"package__risk_score__isnull": False}
118+
119+
def count_violations(self, product, threshold, parameters):
120+
Package = apps.get_model("component_catalog", "package")
121+
122+
packages = Package.objects.filter(
123+
productpackages__product=product,
124+
risk_score__isnull=False,
125+
)
126+
127+
min_risk_score = parameters.get("min_risk_score")
128+
if min_risk_score is not None:
129+
packages = packages.filter(risk_score__gte=min_risk_score)
130+
131+
count = packages.count()
132+
return count if count > threshold else 0
133+
134+
103135
RULE_REGISTRY = {
104136
UsagePolicyErrorRule.rule_type: UsagePolicyErrorRule(),
105137
UsagePolicyWarningRule.rule_type: UsagePolicyWarningRule(),
106138
LicensePolicyErrorRule.rule_type: LicensePolicyErrorRule(),
107139
LicensePolicyWarningRule.rule_type: LicensePolicyWarningRule(),
108140
LicenseCoverageGapRule.rule_type: LicenseCoverageGapRule(),
141+
VulnerabilityDetectedRule.rule_type: VulnerabilityDetectedRule(),
109142
}

0 commit comments

Comments
 (0)