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.
 
 
 
 
 
 

327 rivejä
11 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.core.page.user_permissions.user_permissions import add, remove, get_permissions
  11. from frappe.permissions import clear_user_permissions_for_doctype, get_doc_permissions
  12. from frappe.core.page.permission_manager.permission_manager import update, reset
  13. test_records = frappe.get_test_records('Blog Post')
  14. test_dependencies = ["User", "Contact", "Salutation"]
  15. class TestPermissions(unittest.TestCase):
  16. def setUp(self):
  17. frappe.clear_cache(doctype="Blog Post")
  18. frappe.clear_cache(doctype="Contact")
  19. user = frappe.get_doc("User", "test1@example.com")
  20. user.add_roles("Website Manager")
  21. user = frappe.get_doc("User", "test2@example.com")
  22. user.add_roles("Blogger")
  23. user = frappe.get_doc("User", "test3@example.com")
  24. user.add_roles("Sales User")
  25. reset('Blogger')
  26. reset('Blog Post')
  27. reset('Contact')
  28. reset('Salutation')
  29. self.set_ignore_user_permissions_if_missing(0)
  30. frappe.set_user("test1@example.com")
  31. def tearDown(self):
  32. frappe.set_user("Administrator")
  33. frappe.db.set_value("Blogger", "_Test Blogger 1", "user", None)
  34. clear_user_permissions_for_doctype("Blog Category")
  35. clear_user_permissions_for_doctype("Blog Post")
  36. clear_user_permissions_for_doctype("Blogger")
  37. clear_user_permissions_for_doctype("Contact")
  38. clear_user_permissions_for_doctype("Salutation")
  39. reset('Blogger')
  40. reset('Blog Post')
  41. reset('Contact')
  42. reset('Salutation')
  43. self.set_ignore_user_permissions_if_missing(0)
  44. @staticmethod
  45. def set_ignore_user_permissions_if_missing(ignore):
  46. ss = frappe.get_doc("System Settings")
  47. ss.ignore_user_permissions_if_missing = ignore
  48. ss.flags.ignore_mandatory = 1
  49. ss.save()
  50. @staticmethod
  51. def set_strict_user_permissions(ignore):
  52. ss = frappe.get_doc("System Settings")
  53. ss.apply_strict_user_permissions = ignore
  54. ss.flags.ignore_mandatory = 1
  55. ss.save()
  56. def test_basic_permission(self):
  57. post = frappe.get_doc("Blog Post", "-test-blog-post")
  58. self.assertTrue(post.has_permission("read"))
  59. def test_user_permissions_in_doc(self):
  60. self.set_user_permission_doctypes(["Blog Category"])
  61. frappe.permissions.add_user_permission("Blog Category", "_Test Blog Category 1",
  62. "test2@example.com")
  63. frappe.set_user("test2@example.com")
  64. post = frappe.get_doc("Blog Post", "-test-blog-post")
  65. self.assertFalse(post.has_permission("read"))
  66. self.assertFalse(get_doc_permissions(post).get("read"))
  67. post1 = frappe.get_doc("Blog Post", "-test-blog-post-1")
  68. self.assertTrue(post1.has_permission("read"))
  69. self.assertTrue(get_doc_permissions(post1).get("read"))
  70. def test_user_permissions_in_report(self):
  71. self.set_user_permission_doctypes(["Blog Category"])
  72. frappe.permissions.add_user_permission("Blog Category", "_Test Blog Category 1", "test2@example.com")
  73. frappe.set_user("test2@example.com")
  74. names = [d.name for d in frappe.get_list("Blog Post", fields=["name", "blog_category"])]
  75. self.assertTrue("-test-blog-post-1" in names)
  76. self.assertFalse("-test-blog-post" in names)
  77. def test_default_values(self):
  78. frappe.permissions.add_user_permission("Blog Category", "_Test Blog Category 1", "test2@example.com")
  79. frappe.set_user("test2@example.com")
  80. doc = frappe.new_doc("Blog Post")
  81. self.assertEquals(doc.get("blog_category"), "_Test Blog Category 1")
  82. def test_user_link_match_doc(self):
  83. self.set_user_permission_doctypes(["Blogger"])
  84. blogger = frappe.get_doc("Blogger", "_Test Blogger 1")
  85. blogger.user = "test2@example.com"
  86. blogger.save()
  87. frappe.set_user("test2@example.com")
  88. post = frappe.get_doc("Blog Post", "-test-blog-post-2")
  89. self.assertTrue(post.has_permission("read"))
  90. post1 = frappe.get_doc("Blog Post", "-test-blog-post-1")
  91. self.assertFalse(post1.has_permission("read"))
  92. def test_user_link_match_report(self):
  93. self.set_user_permission_doctypes(["Blogger"])
  94. blogger = frappe.get_doc("Blogger", "_Test Blogger 1")
  95. blogger.user = "test2@example.com"
  96. blogger.save()
  97. frappe.set_user("test2@example.com")
  98. names = [d.name for d in frappe.get_list("Blog Post", fields=["name", "owner"])]
  99. self.assertTrue("-test-blog-post-2" in names)
  100. self.assertFalse("-test-blog-post-1" in names)
  101. def test_set_user_permissions(self):
  102. frappe.set_user("test1@example.com")
  103. add("test2@example.com", "Blog Post", "-test-blog-post")
  104. def test_not_allowed_to_set_user_permissions(self):
  105. frappe.set_user("test2@example.com")
  106. # this user can't add user permissions
  107. self.assertRaises(frappe.PermissionError, add,
  108. "test2@example.com", "Blog Post", "-test-blog-post")
  109. def test_read_if_explicit_user_permissions_are_set(self):
  110. self.set_user_permission_doctypes(["Blog Post"])
  111. self.test_set_user_permissions()
  112. frappe.set_user("test2@example.com")
  113. # user can only access permitted blog post
  114. doc = frappe.get_doc("Blog Post", "-test-blog-post")
  115. self.assertTrue(doc.has_permission("read"))
  116. # and not this one
  117. doc = frappe.get_doc("Blog Post", "-test-blog-post-1")
  118. self.assertFalse(doc.has_permission("read"))
  119. def test_not_allowed_to_remove_user_permissions(self):
  120. self.test_set_user_permissions()
  121. defname = get_permissions("test2@example.com", "Blog Post", "-test-blog-post")[0].name
  122. frappe.set_user("test2@example.com")
  123. # user cannot remove their own user permissions
  124. self.assertRaises(frappe.PermissionError, remove,
  125. "test2@example.com", defname, "Blog Post", "-test-blog-post")
  126. def test_user_permissions_based_on_blogger(self):
  127. frappe.set_user("test2@example.com")
  128. doc = frappe.get_doc("Blog Post", "-test-blog-post-1")
  129. self.assertTrue(doc.has_permission("read"))
  130. self.set_user_permission_doctypes(["Blog Post"])
  131. frappe.set_user("test1@example.com")
  132. add("test2@example.com", "Blog Post", "-test-blog-post")
  133. frappe.set_user("test2@example.com")
  134. doc = frappe.get_doc("Blog Post", "-test-blog-post-1")
  135. self.assertFalse(doc.has_permission("read"))
  136. doc = frappe.get_doc("Blog Post", "-test-blog-post")
  137. self.assertTrue(doc.has_permission("read"))
  138. def test_set_only_once(self):
  139. blog_post = frappe.get_meta("Blog Post")
  140. blog_post.get_field("title").set_only_once = 1
  141. doc = frappe.get_doc("Blog Post", "-test-blog-post-1")
  142. doc.title = "New"
  143. self.assertRaises(frappe.CannotChangeConstantError, doc.save)
  144. blog_post.get_field("title").set_only_once = 0
  145. def test_user_permission_doctypes(self):
  146. frappe.permissions.add_user_permission("Blog Category", "_Test Blog Category 1",
  147. "test2@example.com")
  148. frappe.permissions.add_user_permission("Blogger", "_Test Blogger 1",
  149. "test2@example.com")
  150. frappe.set_user("test2@example.com")
  151. self.set_user_permission_doctypes(["Blogger"])
  152. frappe.model.meta.clear_cache("Blog Post")
  153. doc = frappe.get_doc("Blog Post", "-test-blog-post")
  154. self.assertFalse(doc.has_permission("read"))
  155. doc = frappe.get_doc("Blog Post", "-test-blog-post-2")
  156. self.assertTrue(doc.has_permission("read"))
  157. frappe.model.meta.clear_cache("Blog Post")
  158. def if_owner_setup(self):
  159. update('Blog Post', 'Blogger', 0, 'if_owner', 1)
  160. frappe.permissions.add_user_permission("Blog Category", "_Test Blog Category 1",
  161. "test2@example.com")
  162. frappe.permissions.add_user_permission("Blogger", "_Test Blogger 1",
  163. "test2@example.com")
  164. update('Blog Post', 'Blogger', 0, 'user_permission_doctypes', json.dumps(["Blog Category"]))
  165. frappe.model.meta.clear_cache("Blog Post")
  166. def set_user_permission_doctypes(self, user_permission_doctypes):
  167. set_user_permission_doctypes(doctype="Blog Post", role="Blogger",
  168. apply_user_permissions=1, user_permission_doctypes=user_permission_doctypes)
  169. def test_insert_if_owner_with_user_permissions(self):
  170. """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."""
  171. self.set_user_permission_doctypes(["Blog Category"])
  172. self.if_owner_setup()
  173. frappe.set_user("test2@example.com")
  174. doc = frappe.get_doc({
  175. "doctype": "Blog Post",
  176. "blog_category": "_Test Blog Category",
  177. "blogger": "_Test Blogger 1",
  178. "title": "_Test Blog Post Title",
  179. "content": "_Test Blog Post Content"
  180. })
  181. self.assertRaises(frappe.PermissionError, doc.insert)
  182. frappe.set_user("Administrator")
  183. frappe.permissions.add_user_permission("Blog Category", "_Test Blog Category",
  184. "test2@example.com")
  185. frappe.set_user("test2@example.com")
  186. doc.insert()
  187. frappe.set_user("Administrator")
  188. frappe.permissions.remove_user_permission("Blog Category", "_Test Blog Category",
  189. "test2@example.com")
  190. frappe.set_user("test2@example.com")
  191. doc = frappe.get_doc(doc.doctype, doc.name)
  192. self.assertTrue(doc.has_permission("read"))
  193. self.assertTrue(doc.has_permission("write"))
  194. self.assertFalse(doc.has_permission("create"))
  195. def test_ignore_user_permissions_if_missing(self):
  196. """If `Ignore User Permissions If Missing` is checked in System Settings, show records even if User Permissions are missing for a linked doctype"""
  197. self.set_user_permission_doctypes(['Blog Category', 'Blog Post', 'Blogger'])
  198. frappe.set_user("Administrator")
  199. frappe.permissions.add_user_permission("Blog Category", "_Test Blog Category",
  200. "test2@example.com")
  201. frappe.set_user("test2@example.com")
  202. doc = frappe.get_doc({
  203. "doctype": "Blog Post",
  204. "blog_category": "_Test Blog Category",
  205. "blogger": "_Test Blogger 1",
  206. "title": "_Test Blog Post Title",
  207. "content": "_Test Blog Post Content"
  208. })
  209. self.assertFalse(doc.has_permission("write"))
  210. frappe.set_user("Administrator")
  211. self.set_ignore_user_permissions_if_missing(1)
  212. frappe.set_user("test2@example.com")
  213. self.assertTrue(doc.has_permission("write"))
  214. def test_strict_user_permissions(self):
  215. """If `Strict User Permissions` is checked in System Settings, show records even if User Permissions are missing for a linked doctype"""
  216. set_user_permission_doctypes(doctype="Contact", role="Sales User",
  217. apply_user_permissions=1, user_permission_doctypes=['Salutation'])
  218. set_user_permission_doctypes(doctype="Salutation", role="All",
  219. apply_user_permissions=1, user_permission_doctypes=['Salutation'])
  220. frappe.set_user("Administrator")
  221. frappe.permissions.add_user_permission("Salutation", "Mr", "test3@example.com")
  222. self.set_strict_user_permissions(0)
  223. frappe.set_user("test3@example.com")
  224. self.assertEquals(len(frappe.get_list("Contact")),2)
  225. frappe.set_user("Administrator")
  226. self.set_strict_user_permissions(1)
  227. frappe.set_user("test3@example.com")
  228. self.assertTrue(len(frappe.get_list("Contact")),1)
  229. frappe.set_user("Administrator")
  230. self.set_strict_user_permissions(0)
  231. def set_user_permission_doctypes(doctype, role, apply_user_permissions, user_permission_doctypes):
  232. user_permission_doctypes = None if not user_permission_doctypes else json.dumps(user_permission_doctypes)
  233. update(doctype, role, 0, 'apply_user_permissions', 1)
  234. update(doctype, role, 0, 'user_permission_doctypes', user_permission_doctypes)
  235. frappe.clear_cache(doctype=doctype)