mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-07-23 20:42:02 +00:00
fix(api): remove MANAGE_ACCOUNT permission requirement for listing or create a tenant (#10468)
This commit is contained in:
@@ -14,6 +14,7 @@ All notable changes to the **Prowler API** are documented in this file.
|
||||
- Populate compliance data inside `check_metadata` for findings, which was always returned as `null` [(#10449)](https://github.com/prowler-cloud/prowler/pull/10449)
|
||||
- 403 error for admin users listing tenants due to roles query not using the admin database connection [(#10460)](https://github.com/prowler-cloud/prowler/pull/10460)
|
||||
- Filter transient Neo4j defunct connection logs in Sentry `before_send` to suppress false-positive alerts handled by `RetryableSession` retries [(#10452)](https://github.com/prowler-cloud/prowler/pull/10452)
|
||||
- `MANAGE_ACCOUNT` permission no longer required for listing and creating tenants [(#10468)](https://github.com/prowler-cloud/prowler/pull/10468)
|
||||
|
||||
## [1.23.0] (Prowler v5.22.0)
|
||||
|
||||
|
||||
@@ -807,6 +807,63 @@ class TestTenantViewSet:
|
||||
)
|
||||
assert response.status_code == status.HTTP_404_NOT_FOUND
|
||||
|
||||
def test_tenants_list_no_permissions(
|
||||
self, authenticated_client_no_permissions_rbac, tenants_fixture
|
||||
):
|
||||
response = authenticated_client_no_permissions_rbac.get(reverse("tenant-list"))
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
|
||||
def test_tenants_retrieve_no_permissions(
|
||||
self, authenticated_client_no_permissions_rbac, tenants_fixture
|
||||
):
|
||||
tenant1, *_ = tenants_fixture
|
||||
response = authenticated_client_no_permissions_rbac.get(
|
||||
reverse("tenant-detail", kwargs={"pk": tenant1.id})
|
||||
)
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
|
||||
def test_tenants_create_no_permissions(
|
||||
self, authenticated_client_no_permissions_rbac, valid_tenant_payload
|
||||
):
|
||||
response = authenticated_client_no_permissions_rbac.post(
|
||||
reverse("tenant-list"),
|
||||
data=valid_tenant_payload,
|
||||
format="json",
|
||||
)
|
||||
assert response.status_code == status.HTTP_201_CREATED
|
||||
|
||||
def test_tenants_partial_update_no_permissions(
|
||||
self, authenticated_client_no_permissions_rbac, tenants_fixture
|
||||
):
|
||||
tenant1, *_ = tenants_fixture
|
||||
payload = {
|
||||
"data": {
|
||||
"type": "tenants",
|
||||
"id": str(tenant1.id),
|
||||
"attributes": {"name": "Unauthorized update"},
|
||||
},
|
||||
}
|
||||
response = authenticated_client_no_permissions_rbac.patch(
|
||||
reverse("tenant-detail", kwargs={"pk": tenant1.id}),
|
||||
data=payload,
|
||||
content_type=API_JSON_CONTENT_TYPE,
|
||||
)
|
||||
assert response.status_code == status.HTTP_403_FORBIDDEN
|
||||
|
||||
@patch("api.v1.views.delete_tenant_task.apply_async")
|
||||
def test_tenants_delete_no_permissions(
|
||||
self,
|
||||
delete_tenant_mock,
|
||||
authenticated_client_no_permissions_rbac,
|
||||
tenants_fixture,
|
||||
):
|
||||
tenant1, *_ = tenants_fixture
|
||||
response = authenticated_client_no_permissions_rbac.delete(
|
||||
reverse("tenant-detail", kwargs={"pk": tenant1.id})
|
||||
)
|
||||
assert response.status_code == status.HTTP_403_FORBIDDEN
|
||||
delete_tenant_mock.assert_not_called()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
class TestMembershipViewSet:
|
||||
|
||||
@@ -1210,6 +1210,17 @@ class TenantViewSet(BaseTenantViewset):
|
||||
# RBAC required permissions
|
||||
required_permissions = [Permissions.MANAGE_ACCOUNT]
|
||||
|
||||
def set_required_permissions(self):
|
||||
"""
|
||||
Returns the required permissions based on the request method.
|
||||
"""
|
||||
if self.action in ("list", "retrieve", "create"):
|
||||
# No permissions required for listing, retrieving or creating tenants
|
||||
self.required_permissions = []
|
||||
else:
|
||||
# Require MANAGE_ACCOUNT for update and delete
|
||||
self.required_permissions = [Permissions.MANAGE_ACCOUNT]
|
||||
|
||||
def get_queryset(self):
|
||||
queryset = Tenant.objects.filter(membership__user=self.request.user)
|
||||
return queryset.prefetch_related("memberships")
|
||||
|
||||
Reference in New Issue
Block a user