mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-10-31 07:44:21 +00:00
fix(sdk): match compliance provider segment exactly in get_bulk
- Compare the module's last dotted segment instead of substring - Prevent a provider name from capturing overlapping built-ins - Add parametrized regression test (cloud, git, work, open cases) - Update get_bulk test mock to the real dotted module name
This commit is contained in:
1 parent
64e82682bd
commit
9c7afd64c5
3 files changed
+63
-2
No files matched your search
@@ -540,7 +540,9 @@ class TestCompliance:
|
||||
):
|
||||
object = mock.Mock()
|
||||
object.path = "/path/to/compliance"
|
||||
object.name = "framework1_aws"
|
||||
# list_compliance_modules yields dotted module names; get_bulk matches
|
||||
# the last segment exactly against the provider.
|
||||
object.name = "prowler.compliance.aws"
|
||||
mock_list_modules.return_value = [object]
|
||||
|
||||
mock_listdir.return_value = ["framework1_aws.json"]
|
||||
|
||||
@@ -1355,6 +1355,63 @@ class TestCompliance:
|
||||
|
||||
assert "dup_framework" in bulk
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"provider, framework_segments",
|
||||
[
|
||||
# `cloud` is a substring of THREE built-in modules at once.
|
||||
("cloud", ["alibabacloud", "cloudflare", "oraclecloud"]),
|
||||
("git", ["github"]),
|
||||
("work", ["googleworkspace"]),
|
||||
("open", ["openstack"]),
|
||||
],
|
||||
)
|
||||
@patch("prowler.lib.check.compliance_models.importlib.metadata.entry_points")
|
||||
@patch("prowler.lib.check.compliance_models.list_compliance_modules")
|
||||
def test_compliance_get_bulk_matches_provider_segment_exactly(
|
||||
self, mock_list_modules, mock_ep, provider, framework_segments
|
||||
):
|
||||
"""Regression: a provider whose name is a substring of one or more
|
||||
framework modules must NOT load them. The old `provider in name`
|
||||
check captured overlapping built-ins (e.g. `cloud` matched
|
||||
alibabacloud, cloudflare and oraclecloud). See PR #10700 review
|
||||
(Alan-TheGentleman).
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
import tempfile
|
||||
|
||||
from prowler.lib.check.compliance_models import Compliance
|
||||
|
||||
mock_ep.return_value = []
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
# The substring path the old code would have read from.
|
||||
os.mkdir(os.path.join(tmpdir, provider))
|
||||
json_data = {
|
||||
"Framework": "Custom",
|
||||
"Name": f"Should not load for '{provider}'",
|
||||
"Version": "1.0",
|
||||
"Provider": provider,
|
||||
"Description": "Test",
|
||||
"Requirements": [],
|
||||
}
|
||||
with open(os.path.join(tmpdir, provider, "wrong.json"), "w") as f:
|
||||
json.dump(json_data, f)
|
||||
|
||||
modules = []
|
||||
for segment in framework_segments:
|
||||
module = MagicMock()
|
||||
module.name = f"prowler.compliance.{segment}"
|
||||
module.module_finder.path = tmpdir
|
||||
modules.append(module)
|
||||
mock_list_modules.return_value = modules
|
||||
|
||||
bulk = Compliance.get_bulk(provider)
|
||||
|
||||
# Exact-segment match: the provider is not any of these modules.
|
||||
assert "wrong" not in bulk
|
||||
assert bulk == {}
|
||||
|
||||
|
||||
# ===========================================================================
|
||||
# 7. Parser
|
||||
|
||||
Reference in new issue
Block a user