Skip to content
This repository has been archived by the owner on Jul 21, 2021. It is now read-only.

Commit

Permalink
Fix PERMISSION_CHECK_PERMISSION_PRESENCE bug
Browse files Browse the repository at this point in the history
  • Loading branch information
lambdalisue committed Apr 16, 2014
1 parent ddd3c48 commit 644a17d
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 37 deletions.
19 changes: 19 additions & 0 deletions src/permission/backends.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
__all__ = ('PermissionBackend',)
from permission.conf import settings
from permission.utils.handlers import registry
from permission.utils.permissions import perm_to_permission


class PermissionBackend(object):
Expand All @@ -25,6 +27,11 @@ def has_perm(self, user_obj, perm, obj=None):
"""
Check if user have permission (of object) based on registered handlers.
It will raise ``ObjectDoesNotExist`` exception when the specified
string permission does not exist and
``PERMISSION_CHECK_PERMISSION_PRESENCE`` is ``True`` in ``settings``
module.
Parameters
----------
user_obj : django user model instance
Expand All @@ -39,7 +46,19 @@ def has_perm(self, user_obj, perm, obj=None):
boolean
Wheter the specified user have specified permission (of specified
object).
Raises
------
django.core.exceptions.ObjectDoesNotExist
If the specified string permission does not exist and
``PERMISSION_CHECK_PERMISSION_PRESENCE`` is ``True`` in ``settings``
module.
"""
if settings.PERMISSION_CHECK_PERMISSION_PRESENCE:
# get permission instance from string permission (perm)
# it raise ObjectDoesNotExists when the permission is not exists
perm_to_permission(perm)

# get permission handlers fot this perm
cache_name = '_%s_cache' % perm
if hasattr(self, cache_name):
Expand Down
18 changes: 0 additions & 18 deletions src/permission/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
from permission.conf import settings
from permission.utils.permissions import get_app_perms
from permission.utils.permissions import get_model_perms
from permission.utils.permissions import perm_to_permission
import collections


Expand Down Expand Up @@ -179,11 +178,6 @@ def has_perm(self, user_obj, perm, obj=None):
Check if user have permission (of object) based on
specified models's ``_permission_logics`` attribute.
It will raise ``ObjectDoesNotExist`` exception when the specified
string permission does not exist and
``PERMISSION_CHECK_PERMISSION_PRESENCE`` is ``True`` in ``settings``
module.
Parameters
----------
user_obj : django user model instance
Expand All @@ -198,19 +192,7 @@ def has_perm(self, user_obj, perm, obj=None):
boolean
Wheter the specified user have specified permission (of specified
object).
Raises
------
django.core.exceptions.ObjectDoesNotExist
If the specified string permission does not exist and
``PERMISSION_CHECK_PERMISSION_PRESENCE`` is ``True`` in ``settings``
module.
"""
if settings.PERMISSION_CHECK_PERMISSION_PRESENCE:
# get permission instance from string permission (perm)
# it raise ObjectDoesNotExists when the permission is not exists
perm_to_permission(perm)

if perm not in self.get_permissions(user_obj, perm, obj=obj):
return False
for permission_logic in getattr(self.model, '_permission_logics', []):
Expand Down
62 changes: 62 additions & 0 deletions src/permission/tests/test_backends.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
from django.test import TestCase
from django.core.exceptions import ObjectDoesNotExist
from permission.tests.utils import create_user
from permission.tests.utils import create_article
from permission.tests.models import Article
Expand Down Expand Up @@ -92,3 +93,64 @@ def test_has_perm_with_obj(self):
self.assertTrue(registry.get_handlers()[0].has_perm.called)
self.assertTrue(registry.get_handlers()[1].has_perm.called)

@override_settings(
PERMISSION_CHECK_PERMISSION_PRESENCE=False,
)
def test_has_perm_with_nil_permission(self):
perms = [
'permission.add_article',
'permission.change_article',
'permission.delete_article',
]
registry.get_handlers = MagicMock(return_value=[
MagicMock(get_permissions=MagicMock(return_value=perms),
has_perm=MagicMock(return_value=False)),
MagicMock(get_permissions=MagicMock(return_value=perms),
has_perm=MagicMock(return_value=True)),
])

backend = PermissionBackend()
self.assertFalse(backend.has_perm(None, 'permissions.nil_permission'))

@override_settings(
PERMISSION_CHECK_PERMISSION_PRESENCE=True,
)
def test_has_perm_with_nil_permission_raise(self):
perms = [
'permission.add_article',
'permission.change_article',
'permission.delete_article',
]
registry.get_handlers = MagicMock(return_value=[
MagicMock(get_permissions=MagicMock(return_value=perms),
has_perm=MagicMock(return_value=False)),
MagicMock(get_permissions=MagicMock(return_value=perms),
has_perm=MagicMock(return_value=True)),
])

backend = PermissionBackend()
self.assertRaises(ObjectDoesNotExist,
backend.has_perm,
None, 'permissions.nil_permission')

@override_settings(
PERMISSION_CHECK_PERMISSION_PRESENCE=False,
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'permission.backends.PermissionBackend',
),
)
def test_has_perm_with_nil_permission_with_user(self):
self.assertFalse(self.user.has_perm('permissions.nil_permission'))

@override_settings(
PERMISSION_CHECK_PERMISSION_PRESENCE=True,
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'permission.backends.PermissionBackend',
),
)
def test_has_perm_with_nil_permission_raise_with_user(self):
self.assertRaises(ObjectDoesNotExist,
self.user.has_perm,
'permissions.nil_permission')
19 changes: 0 additions & 19 deletions src/permission/tests/test_handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,22 +209,3 @@ def test_has_perm_permission_logics_called(self):
self.assertFalse(instance.has_perm(self.user, 'permission.add_article'))
self.assertTrue(self.mock_logic1.has_perm.called)
self.assertTrue(self.mock_logic2.has_perm.called)

@override_settings(
PERMISSION_CHECK_PERMISSION_PRESENCE=False,
)
def test_has_perm_with_nil_permission(self):
instance = self.handler(Article)
# it just return False
instance.has_perm(None, 'permissions.nil_permission')

@override_settings(
PERMISSION_CHECK_PERMISSION_PRESENCE=True,
)
def test_has_perm_with_nil_permission_raise(self):
from django.core.exceptions import ObjectDoesNotExist
instance = self.handler(Article)
# it just return False
self.assertRaises(ObjectDoesNotExist,
instance.has_perm,
None, 'permissions.nil_permission')

0 comments on commit 644a17d

Please sign in to comment.