PageRenderTime 49ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/pyramid/tests/test_authorization.py

https://gitlab.com/goolic/pyramid
Python | 259 lines | 231 code | 24 blank | 4 comment | 0 complexity | 344053ea311aa8c290d5456651e0d214 MD5 | raw file
  1. import unittest
  2. from pyramid.testing import cleanUp
  3. class TestACLAuthorizationPolicy(unittest.TestCase):
  4. def setUp(self):
  5. cleanUp()
  6. def tearDown(self):
  7. cleanUp()
  8. def _getTargetClass(self):
  9. from pyramid.authorization import ACLAuthorizationPolicy
  10. return ACLAuthorizationPolicy
  11. def _makeOne(self):
  12. return self._getTargetClass()()
  13. def test_class_implements_IAuthorizationPolicy(self):
  14. from zope.interface.verify import verifyClass
  15. from pyramid.interfaces import IAuthorizationPolicy
  16. verifyClass(IAuthorizationPolicy, self._getTargetClass())
  17. def test_instance_implements_IAuthorizationPolicy(self):
  18. from zope.interface.verify import verifyObject
  19. from pyramid.interfaces import IAuthorizationPolicy
  20. verifyObject(IAuthorizationPolicy, self._makeOne())
  21. def test_permits_no_acl(self):
  22. context = DummyContext()
  23. policy = self._makeOne()
  24. self.assertEqual(policy.permits(context, [], 'view'), False)
  25. def test_permits(self):
  26. from pyramid.security import Deny
  27. from pyramid.security import Allow
  28. from pyramid.security import Everyone
  29. from pyramid.security import Authenticated
  30. from pyramid.security import ALL_PERMISSIONS
  31. from pyramid.security import DENY_ALL
  32. root = DummyContext()
  33. community = DummyContext(__name__='community', __parent__=root)
  34. blog = DummyContext(__name__='blog', __parent__=community)
  35. root.__acl__ = [
  36. (Allow, Authenticated, VIEW),
  37. ]
  38. community.__acl__ = [
  39. (Allow, 'fred', ALL_PERMISSIONS),
  40. (Allow, 'wilma', VIEW),
  41. DENY_ALL,
  42. ]
  43. blog.__acl__ = [
  44. (Allow, 'barney', MEMBER_PERMS),
  45. (Allow, 'wilma', VIEW),
  46. ]
  47. policy = self._makeOne()
  48. result = policy.permits(blog, [Everyone, Authenticated, 'wilma'],
  49. 'view')
  50. self.assertEqual(result, True)
  51. self.assertEqual(result.context, blog)
  52. self.assertEqual(result.ace, (Allow, 'wilma', VIEW))
  53. self.assertEqual(result.acl, blog.__acl__)
  54. result = policy.permits(blog, [Everyone, Authenticated, 'wilma'],
  55. 'delete')
  56. self.assertEqual(result, False)
  57. self.assertEqual(result.context, community)
  58. self.assertEqual(result.ace, (Deny, Everyone, ALL_PERMISSIONS))
  59. self.assertEqual(result.acl, community.__acl__)
  60. result = policy.permits(blog, [Everyone, Authenticated, 'fred'], 'view')
  61. self.assertEqual(result, True)
  62. self.assertEqual(result.context, community)
  63. self.assertEqual(result.ace, (Allow, 'fred', ALL_PERMISSIONS))
  64. result = policy.permits(blog, [Everyone, Authenticated, 'fred'],
  65. 'doesntevenexistyet')
  66. self.assertEqual(result, True)
  67. self.assertEqual(result.context, community)
  68. self.assertEqual(result.ace, (Allow, 'fred', ALL_PERMISSIONS))
  69. self.assertEqual(result.acl, community.__acl__)
  70. result = policy.permits(blog, [Everyone, Authenticated, 'barney'],
  71. 'view')
  72. self.assertEqual(result, True)
  73. self.assertEqual(result.context, blog)
  74. self.assertEqual(result.ace, (Allow, 'barney', MEMBER_PERMS))
  75. result = policy.permits(blog, [Everyone, Authenticated, 'barney'],
  76. 'administer')
  77. self.assertEqual(result, False)
  78. self.assertEqual(result.context, community)
  79. self.assertEqual(result.ace, (Deny, Everyone, ALL_PERMISSIONS))
  80. self.assertEqual(result.acl, community.__acl__)
  81. result = policy.permits(root, [Everyone, Authenticated, 'someguy'],
  82. 'view')
  83. self.assertEqual(result, True)
  84. self.assertEqual(result.context, root)
  85. self.assertEqual(result.ace, (Allow, Authenticated, VIEW))
  86. result = policy.permits(blog,
  87. [Everyone, Authenticated, 'someguy'], 'view')
  88. self.assertEqual(result, False)
  89. self.assertEqual(result.context, community)
  90. self.assertEqual(result.ace, (Deny, Everyone, ALL_PERMISSIONS))
  91. self.assertEqual(result.acl, community.__acl__)
  92. result = policy.permits(root, [Everyone], 'view')
  93. self.assertEqual(result, False)
  94. self.assertEqual(result.context, root)
  95. self.assertEqual(result.ace, '<default deny>')
  96. self.assertEqual(result.acl, root.__acl__)
  97. context = DummyContext()
  98. result = policy.permits(context, [Everyone], 'view')
  99. self.assertEqual(result, False)
  100. self.assertEqual(result.ace, '<default deny>')
  101. self.assertEqual(
  102. result.acl,
  103. '<No ACL found on any object in resource lineage>')
  104. def test_permits_string_permissions_in_acl(self):
  105. from pyramid.security import Allow
  106. root = DummyContext()
  107. root.__acl__ = [
  108. (Allow, 'wilma', 'view_stuff'),
  109. ]
  110. policy = self._makeOne()
  111. result = policy.permits(root, ['wilma'], 'view')
  112. # would be True if matching against 'view_stuff' instead of against
  113. # ['view_stuff']
  114. self.assertEqual(result, False)
  115. def test_principals_allowed_by_permission_direct(self):
  116. from pyramid.security import Allow
  117. from pyramid.security import DENY_ALL
  118. context = DummyContext()
  119. acl = [ (Allow, 'chrism', ('read', 'write')),
  120. DENY_ALL,
  121. (Allow, 'other', 'read') ]
  122. context.__acl__ = acl
  123. policy = self._makeOne()
  124. result = sorted(
  125. policy.principals_allowed_by_permission(context, 'read'))
  126. self.assertEqual(result, ['chrism'])
  127. def test_principals_allowed_by_permission_callable_acl(self):
  128. from pyramid.security import Allow
  129. from pyramid.security import DENY_ALL
  130. context = DummyContext()
  131. acl = lambda: [ (Allow, 'chrism', ('read', 'write')),
  132. DENY_ALL,
  133. (Allow, 'other', 'read') ]
  134. context.__acl__ = acl
  135. policy = self._makeOne()
  136. result = sorted(
  137. policy.principals_allowed_by_permission(context, 'read'))
  138. self.assertEqual(result, ['chrism'])
  139. def test_principals_allowed_by_permission_string_permission(self):
  140. from pyramid.security import Allow
  141. context = DummyContext()
  142. acl = [ (Allow, 'chrism', 'read_it')]
  143. context.__acl__ = acl
  144. policy = self._makeOne()
  145. result = policy.principals_allowed_by_permission(context, 'read')
  146. # would be ['chrism'] if 'read' were compared against 'read_it' instead
  147. # of against ['read_it']
  148. self.assertEqual(list(result), [])
  149. def test_principals_allowed_by_permission(self):
  150. from pyramid.security import Allow
  151. from pyramid.security import Deny
  152. from pyramid.security import DENY_ALL
  153. from pyramid.security import ALL_PERMISSIONS
  154. root = DummyContext(__name__='', __parent__=None)
  155. community = DummyContext(__name__='community', __parent__=root)
  156. blog = DummyContext(__name__='blog', __parent__=community)
  157. root.__acl__ = [ (Allow, 'chrism', ('read', 'write')),
  158. (Allow, 'other', ('read',)),
  159. (Allow, 'jim', ALL_PERMISSIONS)]
  160. community.__acl__ = [ (Deny, 'flooz', 'read'),
  161. (Allow, 'flooz', 'read'),
  162. (Allow, 'mork', 'read'),
  163. (Deny, 'jim', 'read'),
  164. (Allow, 'someguy', 'manage')]
  165. blog.__acl__ = [ (Allow, 'fred', 'read'),
  166. DENY_ALL]
  167. policy = self._makeOne()
  168. result = sorted(policy.principals_allowed_by_permission(blog, 'read'))
  169. self.assertEqual(result, ['fred'])
  170. result = sorted(policy.principals_allowed_by_permission(community,
  171. 'read'))
  172. self.assertEqual(result, ['chrism', 'mork', 'other'])
  173. result = sorted(policy.principals_allowed_by_permission(community,
  174. 'read'))
  175. result = sorted(policy.principals_allowed_by_permission(root, 'read'))
  176. self.assertEqual(result, ['chrism', 'jim', 'other'])
  177. def test_principals_allowed_by_permission_no_acls(self):
  178. context = DummyContext()
  179. policy = self._makeOne()
  180. result = sorted(policy.principals_allowed_by_permission(context,'read'))
  181. self.assertEqual(result, [])
  182. def test_principals_allowed_by_permission_deny_not_permission_in_acl(self):
  183. from pyramid.security import Deny
  184. from pyramid.security import Everyone
  185. context = DummyContext()
  186. acl = [ (Deny, Everyone, 'write') ]
  187. context.__acl__ = acl
  188. policy = self._makeOne()
  189. result = sorted(
  190. policy.principals_allowed_by_permission(context, 'read'))
  191. self.assertEqual(result, [])
  192. def test_principals_allowed_by_permission_deny_permission_in_acl(self):
  193. from pyramid.security import Deny
  194. from pyramid.security import Everyone
  195. context = DummyContext()
  196. acl = [ (Deny, Everyone, 'read') ]
  197. context.__acl__ = acl
  198. policy = self._makeOne()
  199. result = sorted(
  200. policy.principals_allowed_by_permission(context, 'read'))
  201. self.assertEqual(result, [])
  202. def test_callable_acl(self):
  203. from pyramid.security import Allow
  204. context = DummyContext()
  205. fn = lambda self: [(Allow, 'bob', 'read')]
  206. context.__acl__ = fn.__get__(context, context.__class__)
  207. policy = self._makeOne()
  208. result = policy.permits(context, ['bob'], 'read')
  209. self.assertTrue(result)
  210. class DummyContext:
  211. def __init__(self, *arg, **kw):
  212. self.__dict__.update(kw)
  213. VIEW = 'view'
  214. EDIT = 'edit'
  215. CREATE = 'create'
  216. DELETE = 'delete'
  217. MODERATE = 'moderate'
  218. ADMINISTER = 'administer'
  219. COMMENT = 'comment'
  220. GUEST_PERMS = (VIEW, COMMENT)
  221. MEMBER_PERMS = GUEST_PERMS + (EDIT, CREATE, DELETE)
  222. MODERATOR_PERMS = MEMBER_PERMS + (MODERATE,)
  223. ADMINISTRATOR_PERMS = MODERATOR_PERMS + (ADMINISTER,)