mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-10-29 14:54:30 +00:00
408 lines
14 KiB
Python
408 lines
14 KiB
Python
from unittest import mock
|
|
from unittest.mock import patch
|
|
|
|
from prowler.providers.m365.models import M365IdentityInfo
|
|
from prowler.providers.m365.services.exchange.exchange_service import (
|
|
Exchange,
|
|
ExternalMailConfig,
|
|
MailboxAuditConfig,
|
|
MailboxAuditProperties,
|
|
MailboxPolicy,
|
|
Organization,
|
|
RoleAssignmentPolicy,
|
|
TransportConfig,
|
|
TransportRule,
|
|
)
|
|
from tests.providers.m365.m365_fixtures import DOMAIN, set_mocked_m365_provider
|
|
|
|
|
|
def mock_exchange_get_organization_config(_):
|
|
return Organization(
|
|
audit_disabled=True,
|
|
name="test",
|
|
guid="test",
|
|
oauth_enabled=True,
|
|
mailtips_enabled=True,
|
|
mailtips_external_recipient_enabled=False,
|
|
mailtips_group_metrics_enabled=True,
|
|
mailtips_large_audience_threshold=25,
|
|
)
|
|
|
|
|
|
def mock_exchange_get_mailbox_audit_config(_):
|
|
return [
|
|
MailboxAuditConfig(name="test", id="test", audit_bypass_enabled=False),
|
|
MailboxAuditConfig(name="test2", id="test2", audit_bypass_enabled=True),
|
|
]
|
|
|
|
|
|
def mock_exchange_get_external_mail_config(_):
|
|
return [
|
|
ExternalMailConfig(
|
|
identity="test",
|
|
external_mail_tag_enabled=True,
|
|
),
|
|
ExternalMailConfig(
|
|
identity="test2",
|
|
external_mail_tag_enabled=False,
|
|
),
|
|
]
|
|
|
|
|
|
def mock_exchange_get_transport_rules(_):
|
|
return [
|
|
TransportRule(
|
|
name="test",
|
|
scl=-1,
|
|
sender_domain_is=["example.com"],
|
|
redirect_message_to=None,
|
|
),
|
|
TransportRule(
|
|
name="test2",
|
|
scl=0,
|
|
sender_domain_is=["example.com"],
|
|
redirect_message_to=["test@example.com"],
|
|
),
|
|
]
|
|
|
|
|
|
def mock_exchange_get_transport_config(_):
|
|
return TransportConfig(
|
|
smtp_auth_disabled=True,
|
|
)
|
|
|
|
|
|
def mock_exchange_get_mailbox_policy(_):
|
|
return MailboxPolicy(
|
|
id="test",
|
|
additional_storage_enabled=True,
|
|
)
|
|
|
|
|
|
def mock_exchange_get_role_assignment_policies(_):
|
|
return [
|
|
RoleAssignmentPolicy(
|
|
name="Default Role Assignment Policy",
|
|
id="12345678-1234-1234-1234",
|
|
assigned_roles=[
|
|
"MyProfileInformation",
|
|
"MyDistributionGroupMembership",
|
|
"MyRetentionPolicies",
|
|
"MyDistributionGroups",
|
|
"MyVoiceMail",
|
|
],
|
|
),
|
|
RoleAssignmentPolicy(
|
|
name="Test Policy",
|
|
id="12345678-1234-1234",
|
|
assigned_roles=[],
|
|
),
|
|
]
|
|
|
|
|
|
def mock_exchange_get_mailbox_audit_properties(_):
|
|
return [
|
|
MailboxAuditProperties(
|
|
name="User1",
|
|
audit_enabled=False,
|
|
audit_admin=[
|
|
"Update",
|
|
"MoveToDeletedItems",
|
|
"SoftDelete",
|
|
"HardDelete",
|
|
"SendAs",
|
|
"SendOnBehalf",
|
|
"Create",
|
|
"UpdateFolderPermissions",
|
|
"UpdateInboxRules",
|
|
"UpdateCalendarDelegation",
|
|
"ApplyRecord",
|
|
"MailItemsAccessed",
|
|
"Send",
|
|
],
|
|
audit_delegate=[
|
|
"Update",
|
|
"MoveToDeletedItems",
|
|
"SoftDelete",
|
|
"HardDelete",
|
|
"SendAs",
|
|
"SendOnBehalf",
|
|
"Create",
|
|
"UpdateFolderPermissions",
|
|
"UpdateInboxRules",
|
|
"ApplyRecord",
|
|
"MailItemsAccessed",
|
|
],
|
|
audit_owner=[
|
|
"Update",
|
|
"MoveToDeletedItems",
|
|
"SoftDelete",
|
|
"HardDelete",
|
|
"UpdateFolderPermissions",
|
|
"UpdateInboxRules",
|
|
"UpdateCalendarDelegation",
|
|
"ApplyRecord",
|
|
"MailItemsAccessed",
|
|
"Send",
|
|
],
|
|
audit_log_age=90,
|
|
identity="test",
|
|
)
|
|
]
|
|
|
|
|
|
class Test_Exchange_Service:
|
|
def test_get_client(self):
|
|
with (
|
|
mock.patch(
|
|
"prowler.providers.m365.lib.powershell.m365_powershell.M365PowerShell.connect_exchange_online"
|
|
),
|
|
):
|
|
exchange_client = Exchange(
|
|
set_mocked_m365_provider(
|
|
identity=M365IdentityInfo(tenant_domain=DOMAIN)
|
|
)
|
|
)
|
|
assert exchange_client.client.__class__.__name__ == "GraphServiceClient"
|
|
assert exchange_client.powershell.__class__.__name__ == "M365PowerShell"
|
|
exchange_client.powershell.close()
|
|
|
|
@patch(
|
|
"prowler.providers.m365.services.exchange.exchange_service.Exchange._get_organization_config",
|
|
new=mock_exchange_get_organization_config,
|
|
)
|
|
def test_get_organization_config(self):
|
|
with (
|
|
mock.patch(
|
|
"prowler.providers.m365.lib.powershell.m365_powershell.M365PowerShell.connect_exchange_online"
|
|
),
|
|
):
|
|
exchange_client = Exchange(
|
|
set_mocked_m365_provider(
|
|
identity=M365IdentityInfo(tenant_domain=DOMAIN)
|
|
)
|
|
)
|
|
organization_config = exchange_client.organization_config
|
|
assert organization_config.name == "test"
|
|
assert organization_config.guid == "test"
|
|
assert organization_config.audit_disabled is True
|
|
assert organization_config.oauth_enabled is True
|
|
assert organization_config.mailtips_enabled is True
|
|
assert organization_config.mailtips_external_recipient_enabled is False
|
|
assert organization_config.mailtips_group_metrics_enabled is True
|
|
assert organization_config.mailtips_large_audience_threshold == 25
|
|
|
|
exchange_client.powershell.close()
|
|
|
|
@patch(
|
|
"prowler.providers.m365.services.exchange.exchange_service.Exchange._get_mailbox_audit_config",
|
|
new=mock_exchange_get_mailbox_audit_config,
|
|
)
|
|
def test_get_mailbox_audit_config(self):
|
|
with (
|
|
mock.patch(
|
|
"prowler.providers.m365.lib.powershell.m365_powershell.M365PowerShell.connect_exchange_online"
|
|
),
|
|
):
|
|
exchange_client = Exchange(
|
|
set_mocked_m365_provider(
|
|
identity=M365IdentityInfo(tenant_domain=DOMAIN)
|
|
)
|
|
)
|
|
mailbox_audit_config = exchange_client.mailboxes_config
|
|
assert len(mailbox_audit_config) == 2
|
|
assert mailbox_audit_config[0].name == "test"
|
|
assert mailbox_audit_config[0].id == "test"
|
|
assert mailbox_audit_config[0].audit_bypass_enabled is False
|
|
assert mailbox_audit_config[1].name == "test2"
|
|
assert mailbox_audit_config[1].id == "test2"
|
|
assert mailbox_audit_config[1].audit_bypass_enabled is True
|
|
|
|
exchange_client.powershell.close()
|
|
|
|
@patch(
|
|
"prowler.providers.m365.services.exchange.exchange_service.Exchange._get_external_mail_config",
|
|
new=mock_exchange_get_external_mail_config,
|
|
)
|
|
def test_get_external_mail_config(self):
|
|
with (
|
|
mock.patch(
|
|
"prowler.providers.m365.lib.powershell.m365_powershell.M365PowerShell.connect_exchange_online"
|
|
),
|
|
):
|
|
exchange_client = Exchange(
|
|
set_mocked_m365_provider(
|
|
identity=M365IdentityInfo(tenant_domain=DOMAIN)
|
|
)
|
|
)
|
|
external_mail_config = exchange_client.external_mail_config
|
|
assert len(external_mail_config) == 2
|
|
assert external_mail_config[0].identity == "test"
|
|
assert external_mail_config[0].external_mail_tag_enabled is True
|
|
assert external_mail_config[1].identity == "test2"
|
|
assert external_mail_config[1].external_mail_tag_enabled is False
|
|
exchange_client.powershell.close()
|
|
|
|
@patch(
|
|
"prowler.providers.m365.services.exchange.exchange_service.Exchange._get_transport_rules",
|
|
new=mock_exchange_get_transport_rules,
|
|
)
|
|
def test_get_transport_rules(self):
|
|
with (
|
|
mock.patch(
|
|
"prowler.providers.m365.lib.powershell.m365_powershell.M365PowerShell.connect_exchange_online"
|
|
),
|
|
):
|
|
exchange_client = Exchange(
|
|
set_mocked_m365_provider(
|
|
identity=M365IdentityInfo(tenant_domain=DOMAIN)
|
|
)
|
|
)
|
|
transport_rules = exchange_client.transport_rules
|
|
assert len(transport_rules) == 2
|
|
assert transport_rules[0].name == "test"
|
|
assert transport_rules[0].scl == -1
|
|
assert transport_rules[0].sender_domain_is == ["example.com"]
|
|
assert transport_rules[0].redirect_message_to is None
|
|
assert transport_rules[1].name == "test2"
|
|
assert transport_rules[1].scl == 0
|
|
assert transport_rules[1].sender_domain_is == ["example.com"]
|
|
assert transport_rules[1].redirect_message_to == ["test@example.com"]
|
|
|
|
exchange_client.powershell.close()
|
|
|
|
@patch(
|
|
"prowler.providers.m365.services.exchange.exchange_service.Exchange._get_mailbox_policy",
|
|
new=mock_exchange_get_mailbox_policy,
|
|
)
|
|
def test_get_mailbox_policy(self):
|
|
with (
|
|
mock.patch(
|
|
"prowler.providers.m365.lib.powershell.m365_powershell.M365PowerShell.connect_exchange_online"
|
|
),
|
|
):
|
|
exchange_client = Exchange(
|
|
set_mocked_m365_provider(
|
|
identity=M365IdentityInfo(tenant_domain=DOMAIN)
|
|
)
|
|
)
|
|
mailbox_policy = exchange_client.mailbox_policy
|
|
assert mailbox_policy.id == "test"
|
|
assert mailbox_policy.additional_storage_enabled is True
|
|
exchange_client.powershell.close()
|
|
|
|
@patch(
|
|
"prowler.providers.m365.services.exchange.exchange_service.Exchange._get_transport_config",
|
|
new=mock_exchange_get_transport_config,
|
|
)
|
|
def test_get_transport_config(self):
|
|
with (
|
|
mock.patch(
|
|
"prowler.providers.m365.lib.powershell.m365_powershell.M365PowerShell.connect_exchange_online"
|
|
),
|
|
):
|
|
exchange_client = Exchange(
|
|
set_mocked_m365_provider(
|
|
identity=M365IdentityInfo(tenant_domain=DOMAIN)
|
|
)
|
|
)
|
|
transport_config = exchange_client.transport_config
|
|
assert transport_config.smtp_auth_disabled is True
|
|
|
|
exchange_client.powershell.close()
|
|
|
|
@patch(
|
|
"prowler.providers.m365.services.exchange.exchange_service.Exchange._get_mailbox_audit_properties",
|
|
new=mock_exchange_get_mailbox_audit_properties,
|
|
)
|
|
def test_get_mailbox_audit_properties(self):
|
|
with (
|
|
mock.patch(
|
|
"prowler.providers.m365.lib.powershell.m365_powershell.M365PowerShell.connect_exchange_online"
|
|
),
|
|
):
|
|
exchange_client = Exchange(
|
|
set_mocked_m365_provider(
|
|
identity=M365IdentityInfo(tenant_domain=DOMAIN)
|
|
)
|
|
)
|
|
mailbox_audit_properties = exchange_client.mailbox_audit_properties
|
|
assert len(mailbox_audit_properties) == 1
|
|
assert mailbox_audit_properties[0].name == "User1"
|
|
assert mailbox_audit_properties[0].audit_enabled is False
|
|
assert mailbox_audit_properties[0].audit_admin == [
|
|
"Update",
|
|
"MoveToDeletedItems",
|
|
"SoftDelete",
|
|
"HardDelete",
|
|
"SendAs",
|
|
"SendOnBehalf",
|
|
"Create",
|
|
"UpdateFolderPermissions",
|
|
"UpdateInboxRules",
|
|
"UpdateCalendarDelegation",
|
|
"ApplyRecord",
|
|
"MailItemsAccessed",
|
|
"Send",
|
|
]
|
|
assert mailbox_audit_properties[0].audit_delegate == [
|
|
"Update",
|
|
"MoveToDeletedItems",
|
|
"SoftDelete",
|
|
"HardDelete",
|
|
"SendAs",
|
|
"SendOnBehalf",
|
|
"Create",
|
|
"UpdateFolderPermissions",
|
|
"UpdateInboxRules",
|
|
"ApplyRecord",
|
|
"MailItemsAccessed",
|
|
]
|
|
assert mailbox_audit_properties[0].audit_owner == [
|
|
"Update",
|
|
"MoveToDeletedItems",
|
|
"SoftDelete",
|
|
"HardDelete",
|
|
"UpdateFolderPermissions",
|
|
"UpdateInboxRules",
|
|
"UpdateCalendarDelegation",
|
|
"ApplyRecord",
|
|
"MailItemsAccessed",
|
|
"Send",
|
|
]
|
|
assert mailbox_audit_properties[0].audit_log_age == 90
|
|
assert mailbox_audit_properties[0].identity == "test"
|
|
exchange_client.powershell.close()
|
|
|
|
@patch(
|
|
"prowler.providers.m365.services.exchange.exchange_service.Exchange._get_role_assignment_policies",
|
|
new=mock_exchange_get_role_assignment_policies,
|
|
)
|
|
def test_get_role_assignment_policies(self):
|
|
with (
|
|
mock.patch(
|
|
"prowler.providers.m365.lib.powershell.m365_powershell.M365PowerShell.connect_exchange_online"
|
|
),
|
|
):
|
|
exchange_client = Exchange(
|
|
set_mocked_m365_provider(
|
|
identity=M365IdentityInfo(tenant_domain=DOMAIN)
|
|
)
|
|
)
|
|
role_assignment_policies = exchange_client.role_assignment_policies
|
|
assert len(role_assignment_policies) == 2
|
|
assert role_assignment_policies[0].name == "Default Role Assignment Policy"
|
|
assert role_assignment_policies[0].id == "12345678-1234-1234-1234"
|
|
assert role_assignment_policies[0].assigned_roles == [
|
|
"MyProfileInformation",
|
|
"MyDistributionGroupMembership",
|
|
"MyRetentionPolicies",
|
|
"MyDistributionGroups",
|
|
"MyVoiceMail",
|
|
]
|
|
assert role_assignment_policies[1].name == "Test Policy"
|
|
assert role_assignment_policies[1].id == "12345678-1234-1234"
|
|
assert role_assignment_policies[1].assigned_roles == []
|
|
|
|
exchange_client.powershell.close()
|