basyx commited on
Commit
d2a282a
·
verified ·
1 Parent(s): d8081ff

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-elevation
112
- if actor_user_id == target_user_id and new_role == 'admin':
113
- raise CollaborationUnauthorizedError("Cannot elevate your own privileges.")
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: