|
6 | 6 | # See https://aboutcode.org for more information about AboutCode FOSS projects. |
7 | 7 | # |
8 | 8 |
|
| 9 | + |
9 | 10 | from django.apps import apps |
10 | 11 |
|
| 12 | +# VulnerabilityAnalysis states that indicate a vulnerability has been triaged and addressed. |
| 13 | +TERMINAL_VULNERABILITY_STATES = ["resolved", "resolved_with_pedigree", "not_affected"] |
| 14 | + |
11 | 15 |
|
12 | 16 | class BaseRule: |
13 | 17 | """Base class for policy rule handlers.""" |
@@ -100,10 +104,39 @@ class LicenseCoverageGapRule(PackageBaseRule): |
100 | 104 | package_filter = {"license_expression": ""} |
101 | 105 |
|
102 | 106 |
|
| 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 | + |
103 | 135 | RULE_REGISTRY = { |
104 | 136 | UsagePolicyErrorRule.rule_type: UsagePolicyErrorRule(), |
105 | 137 | UsagePolicyWarningRule.rule_type: UsagePolicyWarningRule(), |
106 | 138 | LicensePolicyErrorRule.rule_type: LicensePolicyErrorRule(), |
107 | 139 | LicensePolicyWarningRule.rule_type: LicensePolicyWarningRule(), |
108 | 140 | LicenseCoverageGapRule.rule_type: LicenseCoverageGapRule(), |
| 141 | + VulnerabilityDetectedRule.rule_type: VulnerabilityDetectedRule(), |
109 | 142 | } |
0 commit comments