diff --git a/api/CHANGELOG.md b/api/CHANGELOG.md index 020860ed03..f780945529 100644 --- a/api/CHANGELOG.md +++ b/api/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to the **Prowler API** are documented in this file. ### Fixed - Fix typo in PDF reporting [(#9322)](https://github.com/prowler-cloud/prowler/pull/9322) +- Fix IaC provider initialization failure when mutelist processor is configured [(#9331)](https://github.com/prowler-cloud/prowler/pull/9331) --- diff --git a/api/src/backend/api/tests/test_utils.py b/api/src/backend/api/tests/test_utils.py index d67df93ff5..2229a2f98e 100644 --- a/api/src/backend/api/tests/test_utils.py +++ b/api/src/backend/api/tests/test_utils.py @@ -21,6 +21,7 @@ from prowler.providers.aws.lib.security_hub.security_hub import SecurityHubConne from prowler.providers.azure.azure_provider import AzureProvider from prowler.providers.gcp.gcp_provider import GcpProvider from prowler.providers.github.github_provider import GithubProvider +from prowler.providers.iac.iac_provider import IacProvider from prowler.providers.kubernetes.kubernetes_provider import KubernetesProvider from prowler.providers.m365.m365_provider import M365Provider from prowler.providers.mongodbatlas.mongodbatlas_provider import MongodbatlasProvider @@ -114,6 +115,7 @@ class TestReturnProwlerProvider: (Provider.ProviderChoices.GITHUB.value, GithubProvider), (Provider.ProviderChoices.MONGODBATLAS.value, MongodbatlasProvider), (Provider.ProviderChoices.ORACLECLOUD.value, OraclecloudProvider), + (Provider.ProviderChoices.IAC.value, IacProvider), ], ) def test_return_prowler_provider(self, provider_type, expected_provider): @@ -254,6 +256,72 @@ class TestGetProwlerProviderKwargs: expected_result = {**secret_dict, "mutelist_content": {"key": "value"}} assert result == expected_result + def test_get_prowler_provider_kwargs_iac_provider(self): + """Test that IaC provider gets correct kwargs with repository URL.""" + provider_uid = "https://github.com/org/repo" + secret_dict = {"access_token": "test_token"} + secret_mock = MagicMock() + secret_mock.secret = secret_dict + + provider = MagicMock() + provider.provider = Provider.ProviderChoices.IAC.value + provider.secret = secret_mock + provider.uid = provider_uid + + result = get_prowler_provider_kwargs(provider) + + expected_result = { + "scan_repository_url": provider_uid, + "oauth_app_token": "test_token", + } + assert result == expected_result + + def test_get_prowler_provider_kwargs_iac_provider_without_token(self): + """Test that IaC provider works without access token for public repos.""" + provider_uid = "https://github.com/org/public-repo" + secret_dict = {} + secret_mock = MagicMock() + secret_mock.secret = secret_dict + + provider = MagicMock() + provider.provider = Provider.ProviderChoices.IAC.value + provider.secret = secret_mock + provider.uid = provider_uid + + result = get_prowler_provider_kwargs(provider) + + expected_result = {"scan_repository_url": provider_uid} + assert result == expected_result + + def test_get_prowler_provider_kwargs_iac_provider_ignores_mutelist(self): + """Test that IaC provider does NOT receive mutelist_content. + + IaC provider uses Trivy's built-in mutelist logic, so it should not + receive mutelist_content even when a mutelist processor is configured. + """ + provider_uid = "https://github.com/org/repo" + secret_dict = {"access_token": "test_token"} + secret_mock = MagicMock() + secret_mock.secret = secret_dict + + mutelist_processor = MagicMock() + mutelist_processor.configuration = {"Mutelist": {"key": "value"}} + + provider = MagicMock() + provider.provider = Provider.ProviderChoices.IAC.value + provider.secret = secret_mock + provider.uid = provider_uid + + result = get_prowler_provider_kwargs(provider, mutelist_processor) + + # IaC provider should NOT have mutelist_content + assert "mutelist_content" not in result + expected_result = { + "scan_repository_url": provider_uid, + "oauth_app_token": "test_token", + } + assert result == expected_result + def test_get_prowler_provider_kwargs_unsupported_provider(self): # Setup provider_uid = "provider_uid" diff --git a/api/src/backend/api/utils.py b/api/src/backend/api/utils.py index 958f24b3f0..866088f64a 100644 --- a/api/src/backend/api/utils.py +++ b/api/src/backend/api/utils.py @@ -158,7 +158,8 @@ def get_prowler_provider_kwargs( if mutelist_processor: mutelist_content = mutelist_processor.configuration.get("Mutelist", {}) - if mutelist_content: + # IaC provider doesn't support mutelist (uses Trivy's built-in logic) + if mutelist_content and provider.provider != Provider.ProviderChoices.IAC.value: prowler_provider_kwargs["mutelist_content"] = mutelist_content return prowler_provider_kwargs