Skip to content

Commit 323a8ad

Browse files
dcramermattrobenolt
authored andcommitted
Merge pull request #3874 from getsentry/fix/role-downgrade
Fix role downgrade permissions
1 parent 2d366e9 commit 323a8ad

File tree

2 files changed

+40
-5
lines changed

2 files changed

+40
-5
lines changed

src/sentry/web/frontend/organization_member_settings.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,14 @@ def handle(self, request, organization, member_id):
7272
user=request.user,
7373
organization=organization,
7474
)
75-
allowed_roles = [
76-
r for r in roles.get_all()
77-
if r.priority <= roles.get(acting_member.role).priority
78-
]
79-
can_admin = bool(allowed_roles)
75+
if roles.get(acting_member.role).priority < roles.get(member.role).priority:
76+
can_admin = False
77+
else:
78+
allowed_roles = [
79+
r for r in roles.get_all()
80+
if r.priority <= roles.get(acting_member.role).priority
81+
]
82+
can_admin = bool(allowed_roles)
8083
elif request.is_superuser():
8184
allowed_roles = roles.get_all()
8285

tests/sentry/web/frontend/test_organization_member_settings.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,3 +264,35 @@ def test_manager_cant_assign_owner(self):
264264
member = OrganizationMember.objects.get(id=member_om.id)
265265

266266
assert member.role == 'member'
267+
268+
def test_manager_cant_downgrade_owner(self):
269+
organization = self.create_organization(name='foo', owner=self.user)
270+
271+
manager = self.create_user('[email protected]')
272+
OrganizationMember.objects.create(
273+
organization=organization,
274+
user=manager,
275+
role='manager',
276+
)
277+
278+
member = self.create_user('[email protected]')
279+
member_om = OrganizationMember.objects.create(
280+
organization=organization,
281+
user=member,
282+
role='owner',
283+
)
284+
285+
path = reverse('sentry-organization-member-settings',
286+
args=[organization.slug, member_om.id])
287+
288+
self.login_as(manager)
289+
290+
resp = self.client.post(path, {
291+
'role': 'manager',
292+
})
293+
294+
assert resp.status_code == 200
295+
296+
member = OrganizationMember.objects.get(id=member_om.id)
297+
298+
assert member.role == 'owner'

0 commit comments

Comments
 (0)