@@ -104,15 +104,15 @@ def list(self, request, **kwargs):
104104 if request .user != app .owner and \
105105 not request .user .has_perm (perm_name , app ) and \
106106 not request .user .is_superuser :
107- return Response (status = status .HTTP_403_FORBIDDEN )
107+ return Response (status = status .HTTP_404_NOT_FOUND )
108108 usernames = [u .username for u in get_users_with_perms (app )
109109 if u .has_perm (perm_name , app )]
110110 return Response ({'users' : usernames })
111111
112112 def create (self , request , ** kwargs ):
113113 app = get_object_or_404 (self .model , id = kwargs ['id' ])
114114 if request .user != app .owner and not request .user .is_superuser :
115- return Response (status = status .HTTP_403_FORBIDDEN )
115+ return Response (status = status .HTTP_404_NOT_FOUND )
116116 user = get_object_or_404 (User , username = request .DATA ['username' ])
117117 assign_perm (self .perm , user , app )
118118 models .log_event (app , "User {} was granted access to {}" .format (user , app ))
@@ -121,7 +121,7 @@ def create(self, request, **kwargs):
121121 def destroy (self , request , ** kwargs ):
122122 app = get_object_or_404 (self .model , id = kwargs ['id' ])
123123 if request .user != app .owner and not request .user .is_superuser :
124- return Response (status = status .HTTP_403_FORBIDDEN )
124+ return Response (status = status .HTTP_404_NOT_FOUND )
125125 user = get_object_or_404 (User , username = kwargs ['username' ])
126126 if user .has_perm (self .perm , app ):
127127 remove_perm (self .perm , user , app )
@@ -138,7 +138,22 @@ class AdminPermsViewSet(viewsets.ModelViewSet):
138138 serializer_class = serializers .AdminUserSerializer
139139 permission_classes = (IsAdmin ,)
140140
141+ def check_obj_permissions (self , obj ):
142+ """
143+ Small wrapper around check_object_permissions().
144+
145+ If the user is denied permission to the object, then
146+ it should return a 404 so the user is not aware of the
147+ application resource.
148+ """
149+ try :
150+ self .check_object_permissions (self .request , obj )
151+ except PermissionDenied :
152+ raise Http404 ("No {} matches the given query." .format (
153+ self .model ._meta .object_name ))
154+
141155 def get_queryset (self , ** kwargs ):
156+ self .check_obj_permissions (self .request .user )
142157 return self .model .objects .filter (is_active = True , is_superuser = True )
143158
144159 def create (self , request , ** kwargs ):
@@ -225,21 +240,31 @@ class BaseAppViewSet(viewsets.ModelViewSet):
225240
226241 permission_classes = (permissions .IsAuthenticated , IsAppUser )
227242
228- def pre_save (self , obj ):
229- obj .owner = self .request .user
243+ def check_obj_permissions (self , obj ):
244+ """
245+ Small wrapper around check_object_permissions().
230246
231- def get_queryset (self , ** kwargs ):
232- app = get_object_or_404 (models .App , id = self .kwargs ['id' ])
247+ If the user is denied permission to the object, then
248+ it should return a 404 so the user is not aware of the
249+ application resource.
250+ """
233251 try :
234- self .check_object_permissions (self .request , app )
252+ self .check_object_permissions (self .request , obj )
235253 except PermissionDenied :
236254 raise Http404 ("No {} matches the given query." .format (
237255 self .model ._meta .object_name ))
256+
257+ def pre_save (self , obj ):
258+ obj .owner = self .request .user
259+
260+ def get_queryset (self , ** kwargs ):
261+ app = get_object_or_404 (models .App , id = self .kwargs ['id' ])
262+ self .check_obj_permissions (app )
238263 return self .model .objects .filter (app = app )
239264
240265 def get_object (self , * args , ** kwargs ):
241266 obj = self .get_queryset ().latest ('created' )
242- self .check_object_permissions ( self . request , obj )
267+ self .check_obj_permissions ( obj )
243268 return obj
244269
245270
@@ -260,7 +285,7 @@ def get_success_headers(self, data):
260285
261286 def create (self , request , * args , ** kwargs ):
262287 app = get_object_or_404 (models .App , id = self .kwargs ['id' ])
263- self .check_object_permissions ( self . request , app )
288+ self .check_obj_permissions ( app )
264289 request ._data = request .DATA .copy ()
265290 request .DATA ['app' ] = app
266291 try :
@@ -278,12 +303,8 @@ class AppConfigViewSet(BaseAppViewSet):
278303 def get_object (self , * args , ** kwargs ):
279304 """Return the Config associated with the App's latest Release."""
280305 app = get_object_or_404 (models .App , id = self .kwargs ['id' ])
281- try :
282- self .check_object_permissions (self .request , app )
283- return app .release_set .latest ().config
284- except (PermissionDenied , models .Release .DoesNotExist ):
285- raise Http404 ("No {} matches the given query." .format (
286- self .model ._meta .object_name ))
306+ self .check_obj_permissions (app )
307+ return app .release_set .latest ().config
287308
288309 def pre_save (self , config ):
289310 """merge the old config with the new"""
@@ -396,20 +417,35 @@ class DomainViewSet(OwnerViewSet):
396417 model = models .Domain
397418 serializer_class = serializers .DomainSerializer
398419
420+ def check_obj_permissions (self , obj ):
421+ """
422+ Small wrapper around check_object_permissions().
423+
424+ If the user is denied permission to the object, then
425+ it should return a 404 so the user is not aware of the
426+ application resource.
427+ """
428+ try :
429+ self .check_object_permissions (self .request , obj )
430+ except PermissionDenied :
431+ raise Http404 ("No {} matches the given query." .format (
432+ self .model ._meta .object_name ))
433+
399434 def create (self , request , * args , ** kwargs ):
400435 app = get_object_or_404 (models .App , id = self .kwargs ['id' ])
436+ self .check_obj_permissions (app )
401437 request ._data = request .DATA .copy ()
402438 request .DATA ['app' ] = app
403439 return super (DomainViewSet , self ).create (request , * args , ** kwargs )
404440
405441 def get_queryset (self , ** kwargs ):
406442 app = get_object_or_404 (models .App , id = self .kwargs ['id' ])
407- qs = self .model . objects . filter ( app = app )
408- return qs
443+ self .check_obj_permissions ( app )
444+ return self . model . objects . filter ( app = app )
409445
410446 def get_object (self , * args , ** kwargs ):
411- qs = self .get_queryset (** kwargs )
412- obj = qs . get ( domain = self .kwargs [ 'domain' ] )
447+ obj = self .get_queryset (). get ( domain = self . kwargs [ 'domain' ] )
448+ self .check_obj_permissions ( obj )
413449 return obj
414450
415451
0 commit comments