Skip to content

Commit b8058d8

Browse files
author
Matthew Fisher
committed
Merge pull request #2853 from bacongobbler/2845-unauthorized-api-usage
fix(controller): disallow unauthorized users from deleting apps
2 parents eca08d8 + 7fa8358 commit b8058d8

4 files changed

Lines changed: 19 additions & 6 deletions

File tree

controller/api/permissions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ class IsAppUser(permissions.BasePermission):
3636
an app-related model.
3737
"""
3838
def has_object_permission(self, request, view, obj):
39+
if request.user.is_superuser:
40+
return True
3941
if isinstance(obj, models.App) and obj.owner == request.user:
4042
return True
4143
elif hasattr(obj, 'app') and obj.app.owner == request.user:

controller/api/tests/test_app.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,10 @@ def test_unauthorized_user_cannot_see_app(self):
275275
url = '{}/{}/logs'.format(base_url, app_id)
276276
response = self.client.get(url, HTTP_AUTHORIZATION='token {}'.format(unauthorized_token))
277277
self.assertEqual(response.status_code, 404)
278+
url = '{}/{}'.format(base_url, app_id)
279+
response = self.client.delete(url,
280+
HTTP_AUTHORIZATION='token {}'.format(unauthorized_token))
281+
self.assertEqual(response.status_code, 404)
278282

279283
def test_app_info_not_showing_wrong_app(self):
280284
app_id = 'autotest'

controller/api/tests/test_release.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -254,19 +254,25 @@ def test_unauthorized_user_cannot_modify_release(self):
254254
requests should return a 404.
255255
"""
256256
app_id = 'autotest'
257-
url = '/v1/apps'
257+
base_url = '/v1/apps'
258258
body = {'id': app_id}
259-
response = self.client.post(url, json.dumps(body), content_type='application/json',
259+
response = self.client.post(base_url, json.dumps(body), content_type='application/json',
260260
HTTP_AUTHORIZATION='token {}'.format(self.token))
261+
# push a new build
262+
url = '{base_url}/{app_id}/builds'.format(**locals())
263+
body = {'image': 'test'}
264+
response = self.client.post(
265+
url, json.dumps(body), content_type='application/json',
266+
HTTP_AUTHORIZATION='token {}'.format(self.token))
261267
# update config to roll a new release
262-
url = '/v1/apps/{app_id}/config'.format(**locals())
268+
url = '{base_url}/{app_id}/config'.format(**locals())
263269
body = {'values': json.dumps({'NEW_URL1': 'http://localhost:8080/'})}
264270
response = self.client.post(
265271
url, json.dumps(body), content_type='application/json',
266272
HTTP_AUTHORIZATION='token {}'.format(self.token))
267273
unauthorized_user = User.objects.get(username='autotest2')
268274
unauthorized_token = Token.objects.get(user=unauthorized_user).key
269275
# try to rollback
270-
url = '{}/{}/releases/rollback'.format(url, app_id)
276+
url = '{base_url}/{app_id}/releases/rollback/'.format(**locals())
271277
response = self.client.post(url, HTTP_AUTHORIZATION='token {}'.format(unauthorized_token))
272-
self.assertEqual(response.status_code, 404)
278+
self.assertEqual(response.status_code, 403)

controller/api/views.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ def run(self, request, **kwargs):
231231
content_type='text/plain')
232232

233233
def destroy(self, request, **kwargs):
234-
obj = get_object_or_404(self.model, id=kwargs['id'])
234+
obj = self.get_object()
235235
obj.delete()
236236
return Response(status=status.HTTP_204_NO_CONTENT)
237237

@@ -368,6 +368,7 @@ def rollback(self, request, *args, **kwargs):
368368
"""
369369
try:
370370
app = get_object_or_404(models.App, id=self.kwargs['id'])
371+
self.check_object_permissions(self.request, app)
371372
release = app.release_set.latest()
372373
version_to_rollback_to = release.version - 1
373374
if request.DATA.get('version'):

0 commit comments

Comments
 (0)