Skip to content

Commit 14bdbcc

Browse files
author
Matthew Fisher
committed
ref(controller): refactor is_app_user to generic function
Some class views in views.py like ConfigHookViewSet retrieve and validate against the user in the request method itself. In order to standardize, I've split this out so it can be used in the views.
1 parent 25085ee commit 14bdbcc

2 files changed

Lines changed: 35 additions & 48 deletions

File tree

controller/api/permissions.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,18 @@
55
from api import models
66

77

8+
def is_app_user(request, obj):
9+
if request.user.is_superuser or \
10+
isinstance(obj, models.App) and obj.owner == request.user or \
11+
hasattr(obj, 'app') and obj.app.owner == request.user:
12+
return True
13+
elif request.user.has_perm('use_app', obj) or \
14+
hasattr(obj, 'app') and request.user.has_perm('use_app', obj.app):
15+
return request.method != 'DELETE'
16+
else:
17+
return False
18+
19+
820
class IsAnonymous(permissions.BasePermission):
921
"""
1022
View permission to allow anonymous users.
@@ -36,18 +48,7 @@ class IsAppUser(permissions.BasePermission):
3648
an app-related model.
3749
"""
3850
def has_object_permission(self, request, view, obj):
39-
if request.user.is_superuser:
40-
return True
41-
if isinstance(obj, models.App) and obj.owner == request.user:
42-
return True
43-
elif hasattr(obj, 'app') and obj.app.owner == request.user:
44-
return True
45-
elif request.user.has_perm('use_app', obj):
46-
return request.method != 'DELETE'
47-
elif hasattr(obj, 'app') and request.user.has_perm('use_app', obj.app):
48-
return request.method != 'DELETE'
49-
else:
50-
return False
51+
return is_app_user(request, obj)
5152

5253

5354
class IsAdmin(permissions.BasePermission):

controller/api/views.py

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -265,18 +265,13 @@ class PushHookViewSet(BaseHookViewSet):
265265

266266
def create(self, request, *args, **kwargs):
267267
app = get_object_or_404(models.App, id=request.data['receive_repo'])
268-
self.user = get_object_or_404(User, username=request.data['receive_user'])
268+
request.user = get_object_or_404(User, username=request.data['receive_user'])
269269
# check the user is authorized for this app
270-
if self.user == app.owner or \
271-
self.user in get_users_with_perms(app) or \
272-
self.user.is_superuser:
273-
request.data['app'] = app
274-
request.data['owner'] = self.user
275-
return super(PushHookViewSet, self).create(request, *args, **kwargs)
276-
raise PermissionDenied()
277-
278-
def perform_create(self, serializer, **kwargs):
279-
serializer.save(owner=self.user)
270+
if not permissions.is_app_user(request, app):
271+
raise PermissionDenied()
272+
request.data['app'] = app
273+
request.data['owner'] = request.user
274+
return super(PushHookViewSet, self).create(request, *args, **kwargs)
280275

281276

282277
class BuildHookViewSet(BaseHookViewSet):
@@ -286,24 +281,17 @@ class BuildHookViewSet(BaseHookViewSet):
286281

287282
def create(self, request, *args, **kwargs):
288283
app = get_object_or_404(models.App, id=request.data['receive_repo'])
289-
self.user = get_object_or_404(User, username=request.data['receive_user'])
284+
self.user = request.user = get_object_or_404(User, username=request.data['receive_user'])
290285
# check the user is authorized for this app
291-
if self.user == app.owner or \
292-
self.user in get_users_with_perms(app) or \
293-
self.user.is_superuser:
294-
request._data = request.data.copy()
295-
request.data['app'] = app
296-
request.data['owner'] = self.user
297-
super(BuildHookViewSet, self).create(request, *args, **kwargs)
298-
# return the application databag
299-
response = {'release': {'version': app.release_set.latest().version},
300-
'domains': ['.'.join([app.id, settings.DEIS_DOMAIN])]}
301-
return Response(response, status=status.HTTP_200_OK)
302-
raise PermissionDenied()
303-
304-
def perform_create(self, serializer, **kwargs):
305-
build = serializer.save(owner=self.user)
306-
self.post_save(build)
286+
if not permissions.is_app_user(request, app):
287+
raise PermissionDenied()
288+
request.data['app'] = app
289+
request.data['owner'] = self.user
290+
super(BuildHookViewSet, self).create(request, *args, **kwargs)
291+
# return the application databag
292+
response = {'release': {'version': app.release_set.latest().version},
293+
'domains': ['.'.join([app.id, settings.DEIS_DOMAIN])]}
294+
return Response(response, status=status.HTTP_200_OK)
307295

308296
def post_save(self, build):
309297
build.create(self.user)
@@ -316,15 +304,13 @@ class ConfigHookViewSet(BaseHookViewSet):
316304

317305
def create(self, request, *args, **kwargs):
318306
app = get_object_or_404(models.App, id=request.data['receive_repo'])
319-
user = get_object_or_404(User, username=request.data['receive_user'])
307+
request.user = get_object_or_404(User, username=request.data['receive_user'])
320308
# check the user is authorized for this app
321-
if user == app.owner or \
322-
user in get_users_with_perms(app) or \
323-
user.is_superuser:
324-
config = app.release_set.latest().config
325-
serializer = self.get_serializer(config)
326-
return Response(serializer.data, status=status.HTTP_200_OK)
327-
raise PermissionDenied()
309+
if not permissions.is_app_user(request, app):
310+
raise PermissionDenied()
311+
config = app.release_set.latest().config
312+
serializer = self.get_serializer(config)
313+
return Response(serializer.data, status=status.HTTP_200_OK)
328314

329315

330316
class AppPermsViewSet(BaseDeisViewSet):

0 commit comments

Comments
 (0)