Spaces:
Running
Running
Protect workspace owner membership
Browse files
app/projects/services/collaboration_service.py
CHANGED
|
@@ -89,6 +89,8 @@ class CollaborationService:
|
|
| 89 |
target_membership = await self.repository.get_membership(workspace_id, target_user_id)
|
| 90 |
if not target_membership:
|
| 91 |
raise TeamMemberNotFoundError("Member not found.")
|
|
|
|
|
|
|
| 92 |
|
| 93 |
if target_membership.role == 'admin':
|
| 94 |
admin_count = await self.repository.count_workspace_admins(workspace_id)
|
|
@@ -108,15 +110,17 @@ class CollaborationService:
|
|
| 108 |
):
|
| 109 |
raise CollaborationUnauthorizedError("Unauthorized: Only active workspace owners or admins can update member roles.")
|
| 110 |
|
| 111 |
-
# Prevent self-
|
| 112 |
-
if actor_user_id == target_user_id
|
| 113 |
-
raise CollaborationUnauthorizedError("Cannot
|
| 114 |
|
| 115 |
if new_role not in {"admin", "member"}:
|
| 116 |
raise ValueError("Member role must be admin or member.")
|
| 117 |
target_membership = await self.repository.get_membership(workspace_id, target_user_id)
|
| 118 |
if target_membership is None:
|
| 119 |
raise TeamMemberNotFoundError("Member not found.")
|
|
|
|
|
|
|
| 120 |
if target_membership.role == "admin" and new_role != "admin":
|
| 121 |
admin_count = await self.repository.count_workspace_admins(workspace_id)
|
| 122 |
if admin_count <= 1:
|
|
|
|
| 89 |
target_membership = await self.repository.get_membership(workspace_id, target_user_id)
|
| 90 |
if not target_membership:
|
| 91 |
raise TeamMemberNotFoundError("Member not found.")
|
| 92 |
+
if target_membership.role == "owner":
|
| 93 |
+
raise CollaborationUnauthorizedError("Workspace owners cannot be removed.")
|
| 94 |
|
| 95 |
if target_membership.role == 'admin':
|
| 96 |
admin_count = await self.repository.count_workspace_admins(workspace_id)
|
|
|
|
| 110 |
):
|
| 111 |
raise CollaborationUnauthorizedError("Unauthorized: Only active workspace owners or admins can update member roles.")
|
| 112 |
|
| 113 |
+
# Prevent users from changing their own role, including self-demotion.
|
| 114 |
+
if actor_user_id == target_user_id:
|
| 115 |
+
raise CollaborationUnauthorizedError("Cannot change your own role.")
|
| 116 |
|
| 117 |
if new_role not in {"admin", "member"}:
|
| 118 |
raise ValueError("Member role must be admin or member.")
|
| 119 |
target_membership = await self.repository.get_membership(workspace_id, target_user_id)
|
| 120 |
if target_membership is None:
|
| 121 |
raise TeamMemberNotFoundError("Member not found.")
|
| 122 |
+
if target_membership.role == "owner":
|
| 123 |
+
raise CollaborationUnauthorizedError("Workspace owners cannot be demoted.")
|
| 124 |
if target_membership.role == "admin" and new_role != "admin":
|
| 125 |
admin_count = await self.repository.count_workspace_admins(workspace_id)
|
| 126 |
if admin_count <= 1:
|