You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

374 lines
12 KiB

  1. # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. """Use blog post test to test user permissions logic"""
  5. import frappe
  6. import frappe.defaults
  7. import unittest
  8. import json
  9. import frappe.model.meta
  10. from frappe.permissions import (add_user_permission, remove_user_permission,
  11. clear_user_permissions_for_doctype, get_doc_permissions, add_permission,
  12. get_valid_perms)
  13. from frappe.core.page.permission_manager.permission_manager import update, reset
  14. from frappe.test_runner import make_test_records_for_doctype
  15. from six import string_types
  16. test_records = frappe.get_test_records('Blog Post')
  17. test_dependencies = ["User", "Contact", "Salutation"]
  18. class TestPermissions(unittest.TestCase):
  19. def setUp(self):
  20. frappe.clear_cache(doctype="Blog Post")
  21. frappe.clear_cache(doctype="Contact")
  22. user = frappe.get_doc("User", "test1@example.com")
  23. user.add_roles("Website Manager")
  24. user.add_roles("System Manager")
  25. user = frappe.get_doc("User", "test2@example.com")
  26. user.add_roles("Blogger")
  27. user = frappe.get_doc("User", "test3@example.com")
  28. user.add_roles("Sales User")
  29. reset('Blogger')
  30. reset('Blog Post')
  31. reset('Contact')
  32. reset('Salutation')
  33. frappe.db.sql('delete from `tabUser Permission`')
  34. self.set_ignore_user_permissions_if_missing(0)
  35. frappe.set_user("test1@example.com")
  36. def tearDown(self):
  37. frappe.set_user("Administrator")
  38. frappe.db.set_value("Blogger", "_Test Blogger 1", "user", None)
  39. clear_user_permissions_for_doctype("Blog Category")
  40. clear_user_permissions_for_doctype("Blog Post")
  41. clear_user_permissions_for_doctype("Blogger")
  42. clear_user_permissions_for_doctype("Contact")
  43. clear_user_permissions_for_doctype("Salutation")
  44. reset('Blogger')
  45. reset('Blog Post')
  46. reset('Contact')
  47. reset('Salutation')
  48. self.set_ignore_user_permissions_if_missing(0)
  49. @staticmethod
  50. def set_ignore_user_permissions_if_missing(ignore):
  51. ss = frappe.get_doc("System Settings")
  52. ss.ignore_user_permissions_if_missing = ignore
  53. ss.flags.ignore_mandatory = 1
  54. ss.save()
  55. @staticmethod
  56. def set_strict_user_permissions(ignore):
  57. ss = frappe.get_doc("System Settings")
  58. ss.apply_strict_user_permissions = ignore
  59. ss.flags.ignore_mandatory = 1
  60. ss.save()
  61. def test_basic_permission(self):
  62. post = frappe.get_doc("Blog Post", "-test-blog-post")
  63. self.assertTrue(post.has_permission("read"))
  64. def test_user_permissions_in_doc(self):
  65. self.set_user_permission_doctypes(["Blog Category"])
  66. add_user_permission("Blog Category", "_Test Blog Category 1",
  67. "test2@example.com")
  68. frappe.set_user("test2@example.com")
  69. post = frappe.get_doc("Blog Post", "-test-blog-post")
  70. self.assertFalse(post.has_permission("read"))
  71. self.assertFalse(get_doc_permissions(post).get("read"))
  72. post1 = frappe.get_doc("Blog Post", "-test-blog-post-1")
  73. self.assertTrue(post1.has_permission("read"))
  74. self.assertTrue(get_doc_permissions(post1).get("read"))
  75. def test_user_permissions_in_report(self):
  76. self.set_user_permission_doctypes(["Blog Category"])
  77. add_user_permission("Blog Category", "_Test Blog Category 1", "test2@example.com")
  78. frappe.set_user("test2@example.com")
  79. names = [d.name for d in frappe.get_list("Blog Post", fields=["name", "blog_category"])]
  80. self.assertTrue("-test-blog-post-1" in names)
  81. self.assertFalse("-test-blog-post" in names)
  82. def test_default_values(self):
  83. add_user_permission("Blog Category", "_Test Blog Category 1", "test2@example.com")
  84. frappe.set_user("test2@example.com")
  85. doc = frappe.new_doc("Blog Post")
  86. self.assertEquals(doc.get("blog_category"), "_Test Blog Category 1")
  87. def test_user_link_match_doc(self):
  88. self.set_user_permission_doctypes(["Blogger"])
  89. blogger = frappe.get_doc("Blogger", "_Test Blogger 1")
  90. blogger.user = "test2@example.com"
  91. blogger.save()
  92. frappe.set_user("test2@example.com")
  93. post = frappe.get_doc("Blog Post", "-test-blog-post-2")
  94. self.assertTrue(post.has_permission("read"))
  95. post1 = frappe.get_doc("Blog Post", "-test-blog-post-1")
  96. self.assertFalse(post1.has_permission("read"))
  97. def test_user_link_match_report(self):
  98. self.set_user_permission_doctypes(["Blogger"])
  99. blogger = frappe.get_doc("Blogger", "_Test Blogger 1")
  100. blogger.user = "test2@example.com"
  101. blogger.save()
  102. frappe.set_user("test2@example.com")
  103. names = [d.name for d in frappe.get_list("Blog Post", fields=["name", "owner"])]
  104. self.assertTrue("-test-blog-post-2" in names)
  105. self.assertFalse("-test-blog-post-1" in names)
  106. def test_set_user_permissions(self):
  107. frappe.set_user("test1@example.com")
  108. add_user_permission("Blog Post", "-test-blog-post", "test2@example.com")
  109. def test_not_allowed_to_set_user_permissions(self):
  110. frappe.set_user("test2@example.com")
  111. # this user can't add user permissions
  112. self.assertRaises(frappe.PermissionError, add_user_permission,
  113. "Blog Post", "-test-blog-post", "test2@example.com")
  114. def test_read_if_explicit_user_permissions_are_set(self):
  115. self.set_user_permission_doctypes(["Blog Post"])
  116. self.test_set_user_permissions()
  117. frappe.set_user("test2@example.com")
  118. # user can only access permitted blog post
  119. doc = frappe.get_doc("Blog Post", "-test-blog-post")
  120. self.assertTrue(doc.has_permission("read"))
  121. # and not this one
  122. doc = frappe.get_doc("Blog Post", "-test-blog-post-1")
  123. self.assertFalse(doc.has_permission("read"))
  124. def test_not_allowed_to_remove_user_permissions(self):
  125. self.test_set_user_permissions()
  126. frappe.set_user("test2@example.com")
  127. # user cannot remove their own user permissions
  128. self.assertRaises(frappe.PermissionError, remove_user_permission,
  129. "Blog Post", "-test-blog-post", "test2@example.com")
  130. def test_user_permissions_based_on_blogger(self):
  131. frappe.set_user("test2@example.com")
  132. doc = frappe.get_doc("Blog Post", "-test-blog-post-1")
  133. self.assertTrue(doc.has_permission("read"))
  134. self.set_user_permission_doctypes(["Blog Post"])
  135. frappe.set_user("test1@example.com")
  136. add_user_permission("Blog Post", "-test-blog-post", "test2@example.com")
  137. frappe.set_user("test2@example.com")
  138. doc = frappe.get_doc("Blog Post", "-test-blog-post-1")
  139. self.assertFalse(doc.has_permission("read"))
  140. doc = frappe.get_doc("Blog Post", "-test-blog-post")
  141. self.assertTrue(doc.has_permission("read"))
  142. def test_set_only_once(self):
  143. blog_post = frappe.get_meta("Blog Post")
  144. blog_post.get_field("title").set_only_once = 1
  145. doc = frappe.get_doc("Blog Post", "-test-blog-post-1")
  146. doc.title = "New"
  147. self.assertRaises(frappe.CannotChangeConstantError, doc.save)
  148. blog_post.get_field("title").set_only_once = 0
  149. def test_user_permission_doctypes(self):
  150. add_user_permission("Blog Category", "_Test Blog Category 1",
  151. "test2@example.com")
  152. add_user_permission("Blogger", "_Test Blogger 1",
  153. "test2@example.com")
  154. frappe.set_user("test2@example.com")
  155. self.set_user_permission_doctypes(["Blogger"])
  156. frappe.model.meta.clear_cache("Blog Post")
  157. doc = frappe.get_doc("Blog Post", "-test-blog-post")
  158. self.assertFalse(doc.has_permission("read"))
  159. doc = frappe.get_doc("Blog Post", "-test-blog-post-2")
  160. self.assertTrue(doc.has_permission("read"))
  161. frappe.model.meta.clear_cache("Blog Post")
  162. def if_owner_setup(self):
  163. update('Blog Post', 'Blogger', 0, 'if_owner', 1)
  164. add_user_permission("Blog Category", "_Test Blog Category 1",
  165. "test2@example.com")
  166. add_user_permission("Blogger", "_Test Blogger 1",
  167. "test2@example.com")
  168. update('Blog Post', 'Blogger', 0, 'user_permission_doctypes', json.dumps(["Blog Category"]))
  169. frappe.model.meta.clear_cache("Blog Post")
  170. def set_user_permission_doctypes(self, user_permission_doctypes):
  171. set_user_permission_doctypes(["Blog Post"], role="Blogger",
  172. apply_user_permissions=1, user_permission_doctypes=user_permission_doctypes)
  173. def test_insert_if_owner_with_user_permissions(self):
  174. """If `If Owner` is checked for a Role, check if that document is allowed to be read, updated, submitted, etc. except be created, even if the document is restricted based on User Permissions."""
  175. frappe.delete_doc('Blog Post', '-test-blog-post-title')
  176. self.set_user_permission_doctypes(["Blog Category"])
  177. self.if_owner_setup()
  178. frappe.set_user("test2@example.com")
  179. doc = frappe.get_doc({
  180. "doctype": "Blog Post",
  181. "blog_category": "_Test Blog Category",
  182. "blogger": "_Test Blogger 1",
  183. "title": "_Test Blog Post Title",
  184. "content": "_Test Blog Post Content"
  185. })
  186. self.assertRaises(frappe.PermissionError, doc.insert)
  187. frappe.set_user("Administrator")
  188. add_user_permission("Blog Category", "_Test Blog Category",
  189. "test2@example.com")
  190. frappe.set_user("test2@example.com")
  191. doc.insert()
  192. frappe.set_user("Administrator")
  193. frappe.permissions.remove_user_permission("Blog Category", "_Test Blog Category",
  194. "test2@example.com")
  195. frappe.set_user("test2@example.com")
  196. doc = frappe.get_doc(doc.doctype, doc.name)
  197. self.assertTrue(doc.has_permission("read"))
  198. self.assertTrue(doc.has_permission("write"))
  199. self.assertFalse(doc.has_permission("create"))
  200. def test_ignore_user_permissions_if_missing(self):
  201. """If `Ignore User Permissions If Missing` is checked in System Settings, show records even if User Permissions are missing for a linked doctype"""
  202. self.set_user_permission_doctypes(['Blog Category', 'Blog Post', 'Blogger'])
  203. frappe.set_user("Administrator")
  204. # add_user_permission("Blog Category", "_Test Blog Category",
  205. # "test2@example.com")
  206. frappe.set_user("test2@example.com")
  207. doc = frappe.get_doc({
  208. "doctype": "Blog Post",
  209. "blog_category": "_Test Blog Category",
  210. "blogger": "_Test Blogger 1",
  211. "title": "_Test Blog Post Title",
  212. "content": "_Test Blog Post Content"
  213. })
  214. self.assertFalse(doc.has_permission("write"))
  215. frappe.set_user("Administrator")
  216. self.set_ignore_user_permissions_if_missing(1)
  217. frappe.set_user("test2@example.com")
  218. self.assertTrue(doc.has_permission("write"))
  219. def test_strict_user_permissions(self):
  220. """If `Strict User Permissions` is checked in System Settings,
  221. show records even if User Permissions are missing for a linked
  222. doctype"""
  223. frappe.set_user("Administrator")
  224. frappe.db.sql('delete from tabContact')
  225. make_test_records_for_doctype('Contact', force=True)
  226. set_user_permission_doctypes("Contact", role="Sales User",
  227. apply_user_permissions=1, user_permission_doctypes=['Salutation'])
  228. set_user_permission_doctypes("Salutation", role="All",
  229. apply_user_permissions=1, user_permission_doctypes=['Salutation'])
  230. add_user_permission("Salutation", "Mr", "test3@example.com")
  231. self.set_strict_user_permissions(0)
  232. frappe.set_user("test3@example.com")
  233. self.assertEquals(len(frappe.get_list("Contact")), 2)
  234. frappe.set_user("Administrator")
  235. self.set_strict_user_permissions(1)
  236. frappe.set_user("test3@example.com")
  237. self.assertTrue(len(frappe.get_list("Contact")), 1)
  238. frappe.set_user("Administrator")
  239. self.set_strict_user_permissions(0)
  240. def test_automatic_apply_user_permissions(self):
  241. '''Test user permissions are automatically applied when a user permission
  242. is created'''
  243. # create a user
  244. frappe.get_doc(dict(doctype='User', email='test_user_perm@example.com',
  245. first_name='tester')).insert(ignore_if_duplicate=True)
  246. frappe.get_doc(dict(doctype='Role', role_name='Test Role User Perm')
  247. ).insert(ignore_if_duplicate=True)
  248. # add a permission for event
  249. add_permission('DocType', 'Test Role User Perm')
  250. frappe.get_doc('User', 'test_user_perm@example.com').add_roles('Test Role User Perm')
  251. # add user permission
  252. add_user_permission('Module Def', 'Core', 'test_user_perm@example.com', True)
  253. # check if user permission is applied in the new role
  254. _perm = None
  255. for perm in get_valid_perms('DocType', 'test_user_perm@example.com'):
  256. if perm.role == 'Test Role User Perm':
  257. _perm = perm
  258. self.assertEqual(_perm.apply_user_permissions, 1)
  259. # restrict by module
  260. self.assertTrue('Module Def' in json.loads(_perm.user_permission_doctypes))
  261. def set_user_permission_doctypes(doctypes, role, apply_user_permissions,
  262. user_permission_doctypes):
  263. user_permission_doctypes = None if not user_permission_doctypes else json.dumps(user_permission_doctypes)
  264. if isinstance(doctypes, string_types):
  265. doctypes = [doctypes]
  266. for doctype in doctypes:
  267. update(doctype, role, 0, 'apply_user_permissions', 1)
  268. update(doctype, role, 0, 'user_permission_doctypes',
  269. user_permission_doctypes)
  270. frappe.clear_cache(doctype=doctype)