Skip to content

Commit

Permalink
hotfix #2 for permissions. added util function for user and group per…
Browse files Browse the repository at this point in the history
…mission checks.
  • Loading branch information
kssalanio committed Oct 24, 2016
1 parent 9a39a4b commit 37dc27e
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 32 deletions.
58 changes: 29 additions & 29 deletions geonode/security/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,35 +45,35 @@
'change_layer_style'
]

#
# def get_users_with_perms(obj):
# """
# Override of the Guardian get_users_with_perms
# """
# ctype = ContentType.objects.get_for_model(obj)
# permissions = {}
# PERMISSIONS_TO_FETCH = ADMIN_PERMISSIONS + LAYER_ADMIN_PERMISSIONS
#
# for perm in Permission.objects.filter(codename__in=PERMISSIONS_TO_FETCH, content_type_id=ctype.id):
# permissions[perm.id] = perm.codename
#
# user_model = get_user_obj_perms_model(obj)
# users_with_perms = user_model.objects.filter(object_pk=obj.pk,
# content_type_id=ctype.id,
# permission_id__in=permissions).values('user_id', 'permission_id')
#
# users = {}
# for item in users_with_perms:
# if item['user_id'] in users:
# users[item['user_id']].append(permissions[item['permission_id']])
# else:
# users[item['user_id']] = [permissions[item['permission_id']], ]
#
# profiles = {}
# for profile in get_user_model().objects.filter(id__in=users.keys()):
# profiles[profile] = users[profile.id]
#
# return profiles

def get_users_with_perms(obj):
"""
Override of the Guardian get_users_with_perms
"""
ctype = ContentType.objects.get_for_model(obj)
permissions = {}
PERMISSIONS_TO_FETCH = ADMIN_PERMISSIONS + LAYER_ADMIN_PERMISSIONS

for perm in Permission.objects.filter(codename__in=PERMISSIONS_TO_FETCH, content_type_id=ctype.id):
permissions[perm.id] = perm.codename

user_model = get_user_obj_perms_model(obj)
users_with_perms = user_model.objects.filter(object_pk=obj.pk,
content_type_id=ctype.id,
permission_id__in=permissions).values('user_id', 'permission_id')

users = {}
for item in users_with_perms:
if item['user_id'] in users:
users[item['user_id']].append(permissions[item['permission_id']])
else:
users[item['user_id']] = [permissions[item['permission_id']], ]

profiles = {}
for profile in get_user_model().objects.filter(id__in=users.keys()):
profiles[profile] = users[profile.id]

return profiles


class PermissionLevelError(Exception):
Expand Down
12 changes: 12 additions & 0 deletions geonode/security/perm_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from django.contrib.contenttypes.models import ContentType
import bisect
from django.db.models.query_utils import Q
from guardian.core import ObjectPermissionChecker


def get_users_with_perms(obj, attach_perms=True, with_superusers=True,
Expand Down Expand Up @@ -60,3 +61,14 @@ def get_groups_with_perms(obj, attach_perms=True):
all_group_perms[p.group] = [p.permission.codename]

return all_group_perms

def has_direct_or_group_perm(user_profile, permission, obj_to_check):
checker = ObjectPermissionChecker(user_profile)
allowed = checker.has_perm(permission, obj_to_check)
if not allowed:
for usr_grp in user_profile.group_list_all():
checker = ObjectPermissionChecker(usr_grp.group)
allowed = checker.has_perm(permission, obj_to_check)
if allowed:
break
return allowed
9 changes: 6 additions & 3 deletions geonode/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
from django.http import Http404

from pprint import pprint
from geonode.security.perm_utils import has_direct_or_group_perm

DEFAULT_TITLE = ""
DEFAULT_ABSTRACT = ""
Expand Down Expand Up @@ -491,9 +492,11 @@ def resolve_object(request, model, query, permission='base.view_resourcebase',
obj_to_check = obj
if permission:
if permission_required or request.method != 'GET':
allowed = request.user.has_perm(
permission,
obj_to_check)
#NOTE:replace to check for both user or group perms
#allowed = request.user.has_perm(
# permission,
# obj_to_check)
allowed = has_direct_or_group_perm(request.user, permission, obj_to_check)
if not allowed:
mesg = permission_msg or _('Permission Denied')
raise PermissionDenied(mesg)
Expand Down

0 comments on commit 37dc27e

Please sign in to comment.