373 lines
12 KiB
Python
373 lines
12 KiB
Python
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
|
# MIT License. See license.txt
|
|
from __future__ import unicode_literals
|
|
|
|
"""Use blog post test to test user permissions logic"""
|
|
|
|
import frappe
|
|
import frappe.defaults
|
|
import unittest
|
|
import json
|
|
import frappe.model.meta
|
|
from frappe.permissions import (add_user_permission, remove_user_permission,
|
|
clear_user_permissions_for_doctype, get_doc_permissions, add_permission,
|
|
get_valid_perms)
|
|
from frappe.core.page.permission_manager.permission_manager import update, reset
|
|
from frappe.test_runner import make_test_records_for_doctype
|
|
from six import string_types
|
|
|
|
test_records = frappe.get_test_records('Blog Post')
|
|
|
|
test_dependencies = ["User", "Contact", "Salutation"]
|
|
|
|
class TestPermissions(unittest.TestCase):
|
|
def setUp(self):
|
|
frappe.clear_cache(doctype="Blog Post")
|
|
frappe.clear_cache(doctype="Contact")
|
|
|
|
user = frappe.get_doc("User", "test1@example.com")
|
|
user.add_roles("Website Manager")
|
|
user.add_roles("System Manager")
|
|
|
|
user = frappe.get_doc("User", "test2@example.com")
|
|
user.add_roles("Blogger")
|
|
|
|
user = frappe.get_doc("User", "test3@example.com")
|
|
user.add_roles("Sales User")
|
|
|
|
reset('Blogger')
|
|
reset('Blog Post')
|
|
reset('Contact')
|
|
reset('Salutation')
|
|
|
|
frappe.db.sql('delete from `tabUser Permission`')
|
|
|
|
self.set_ignore_user_permissions_if_missing(0)
|
|
|
|
frappe.set_user("test1@example.com")
|
|
|
|
def tearDown(self):
|
|
frappe.set_user("Administrator")
|
|
frappe.db.set_value("Blogger", "_Test Blogger 1", "user", None)
|
|
|
|
clear_user_permissions_for_doctype("Blog Category")
|
|
clear_user_permissions_for_doctype("Blog Post")
|
|
clear_user_permissions_for_doctype("Blogger")
|
|
clear_user_permissions_for_doctype("Contact")
|
|
clear_user_permissions_for_doctype("Salutation")
|
|
|
|
reset('Blogger')
|
|
reset('Blog Post')
|
|
reset('Contact')
|
|
reset('Salutation')
|
|
|
|
self.set_ignore_user_permissions_if_missing(0)
|
|
|
|
@staticmethod
|
|
def set_ignore_user_permissions_if_missing(ignore):
|
|
ss = frappe.get_doc("System Settings")
|
|
ss.ignore_user_permissions_if_missing = ignore
|
|
ss.flags.ignore_mandatory = 1
|
|
ss.save()
|
|
|
|
@staticmethod
|
|
def set_strict_user_permissions(ignore):
|
|
ss = frappe.get_doc("System Settings")
|
|
ss.apply_strict_user_permissions = ignore
|
|
ss.flags.ignore_mandatory = 1
|
|
ss.save()
|
|
|
|
def test_basic_permission(self):
|
|
post = frappe.get_doc("Blog Post", "-test-blog-post")
|
|
self.assertTrue(post.has_permission("read"))
|
|
|
|
def test_user_permissions_in_doc(self):
|
|
self.set_user_permission_doctypes(["Blog Category"])
|
|
|
|
add_user_permission("Blog Category", "_Test Blog Category 1",
|
|
"test2@example.com")
|
|
|
|
frappe.set_user("test2@example.com")
|
|
|
|
post = frappe.get_doc("Blog Post", "-test-blog-post")
|
|
self.assertFalse(post.has_permission("read"))
|
|
self.assertFalse(get_doc_permissions(post).get("read"))
|
|
|
|
post1 = frappe.get_doc("Blog Post", "-test-blog-post-1")
|
|
self.assertTrue(post1.has_permission("read"))
|
|
self.assertTrue(get_doc_permissions(post1).get("read"))
|
|
|
|
def test_user_permissions_in_report(self):
|
|
self.set_user_permission_doctypes(["Blog Category"])
|
|
|
|
add_user_permission("Blog Category", "_Test Blog Category 1", "test2@example.com")
|
|
|
|
frappe.set_user("test2@example.com")
|
|
names = [d.name for d in frappe.get_list("Blog Post", fields=["name", "blog_category"])]
|
|
|
|
self.assertTrue("-test-blog-post-1" in names)
|
|
self.assertFalse("-test-blog-post" in names)
|
|
|
|
def test_default_values(self):
|
|
add_user_permission("Blog Category", "_Test Blog Category 1", "test2@example.com")
|
|
|
|
frappe.set_user("test2@example.com")
|
|
doc = frappe.new_doc("Blog Post")
|
|
self.assertEquals(doc.get("blog_category"), "_Test Blog Category 1")
|
|
|
|
def test_user_link_match_doc(self):
|
|
self.set_user_permission_doctypes(["Blogger"])
|
|
|
|
blogger = frappe.get_doc("Blogger", "_Test Blogger 1")
|
|
blogger.user = "test2@example.com"
|
|
blogger.save()
|
|
|
|
frappe.set_user("test2@example.com")
|
|
|
|
post = frappe.get_doc("Blog Post", "-test-blog-post-2")
|
|
self.assertTrue(post.has_permission("read"))
|
|
|
|
post1 = frappe.get_doc("Blog Post", "-test-blog-post-1")
|
|
self.assertFalse(post1.has_permission("read"))
|
|
|
|
def test_user_link_match_report(self):
|
|
self.set_user_permission_doctypes(["Blogger"])
|
|
|
|
blogger = frappe.get_doc("Blogger", "_Test Blogger 1")
|
|
blogger.user = "test2@example.com"
|
|
blogger.save()
|
|
|
|
frappe.set_user("test2@example.com")
|
|
|
|
names = [d.name for d in frappe.get_list("Blog Post", fields=["name", "owner"])]
|
|
self.assertTrue("-test-blog-post-2" in names)
|
|
self.assertFalse("-test-blog-post-1" in names)
|
|
|
|
def test_set_user_permissions(self):
|
|
frappe.set_user("test1@example.com")
|
|
add_user_permission("Blog Post", "-test-blog-post", "test2@example.com")
|
|
|
|
def test_not_allowed_to_set_user_permissions(self):
|
|
frappe.set_user("test2@example.com")
|
|
|
|
# this user can't add user permissions
|
|
self.assertRaises(frappe.PermissionError, add_user_permission,
|
|
"Blog Post", "-test-blog-post", "test2@example.com")
|
|
|
|
def test_read_if_explicit_user_permissions_are_set(self):
|
|
self.set_user_permission_doctypes(["Blog Post"])
|
|
|
|
self.test_set_user_permissions()
|
|
|
|
frappe.set_user("test2@example.com")
|
|
|
|
# user can only access permitted blog post
|
|
doc = frappe.get_doc("Blog Post", "-test-blog-post")
|
|
self.assertTrue(doc.has_permission("read"))
|
|
|
|
# and not this one
|
|
doc = frappe.get_doc("Blog Post", "-test-blog-post-1")
|
|
self.assertFalse(doc.has_permission("read"))
|
|
|
|
def test_not_allowed_to_remove_user_permissions(self):
|
|
self.test_set_user_permissions()
|
|
|
|
frappe.set_user("test2@example.com")
|
|
|
|
# user cannot remove their own user permissions
|
|
self.assertRaises(frappe.PermissionError, remove_user_permission,
|
|
"Blog Post", "-test-blog-post", "test2@example.com")
|
|
|
|
def test_user_permissions_based_on_blogger(self):
|
|
frappe.set_user("test2@example.com")
|
|
doc = frappe.get_doc("Blog Post", "-test-blog-post-1")
|
|
self.assertTrue(doc.has_permission("read"))
|
|
|
|
self.set_user_permission_doctypes(["Blog Post"])
|
|
|
|
frappe.set_user("test1@example.com")
|
|
add_user_permission("Blog Post", "-test-blog-post", "test2@example.com")
|
|
|
|
frappe.set_user("test2@example.com")
|
|
doc = frappe.get_doc("Blog Post", "-test-blog-post-1")
|
|
self.assertFalse(doc.has_permission("read"))
|
|
|
|
doc = frappe.get_doc("Blog Post", "-test-blog-post")
|
|
self.assertTrue(doc.has_permission("read"))
|
|
|
|
def test_set_only_once(self):
|
|
blog_post = frappe.get_meta("Blog Post")
|
|
blog_post.get_field("title").set_only_once = 1
|
|
doc = frappe.get_doc("Blog Post", "-test-blog-post-1")
|
|
doc.title = "New"
|
|
self.assertRaises(frappe.CannotChangeConstantError, doc.save)
|
|
blog_post.get_field("title").set_only_once = 0
|
|
|
|
def test_user_permission_doctypes(self):
|
|
add_user_permission("Blog Category", "_Test Blog Category 1",
|
|
"test2@example.com")
|
|
add_user_permission("Blogger", "_Test Blogger 1",
|
|
"test2@example.com")
|
|
|
|
frappe.set_user("test2@example.com")
|
|
|
|
self.set_user_permission_doctypes(["Blogger"])
|
|
|
|
frappe.model.meta.clear_cache("Blog Post")
|
|
|
|
doc = frappe.get_doc("Blog Post", "-test-blog-post")
|
|
self.assertFalse(doc.has_permission("read"))
|
|
|
|
doc = frappe.get_doc("Blog Post", "-test-blog-post-2")
|
|
self.assertTrue(doc.has_permission("read"))
|
|
|
|
frappe.model.meta.clear_cache("Blog Post")
|
|
|
|
def if_owner_setup(self):
|
|
update('Blog Post', 'Blogger', 0, 'if_owner', 1)
|
|
|
|
add_user_permission("Blog Category", "_Test Blog Category 1",
|
|
"test2@example.com")
|
|
add_user_permission("Blogger", "_Test Blogger 1",
|
|
"test2@example.com")
|
|
|
|
update('Blog Post', 'Blogger', 0, 'user_permission_doctypes', json.dumps(["Blog Category"]))
|
|
|
|
frappe.model.meta.clear_cache("Blog Post")
|
|
|
|
def set_user_permission_doctypes(self, user_permission_doctypes):
|
|
set_user_permission_doctypes(["Blog Post"], role="Blogger",
|
|
apply_user_permissions=1, user_permission_doctypes=user_permission_doctypes)
|
|
|
|
def test_insert_if_owner_with_user_permissions(self):
|
|
"""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."""
|
|
frappe.delete_doc('Blog Post', '-test-blog-post-title')
|
|
|
|
self.set_user_permission_doctypes(["Blog Category"])
|
|
self.if_owner_setup()
|
|
|
|
frappe.set_user("test2@example.com")
|
|
|
|
doc = frappe.get_doc({
|
|
"doctype": "Blog Post",
|
|
"blog_category": "_Test Blog Category",
|
|
"blogger": "_Test Blogger 1",
|
|
"title": "_Test Blog Post Title",
|
|
"content": "_Test Blog Post Content"
|
|
})
|
|
|
|
self.assertRaises(frappe.PermissionError, doc.insert)
|
|
|
|
frappe.set_user("Administrator")
|
|
add_user_permission("Blog Category", "_Test Blog Category",
|
|
"test2@example.com")
|
|
|
|
frappe.set_user("test2@example.com")
|
|
doc.insert()
|
|
|
|
frappe.set_user("Administrator")
|
|
frappe.permissions.remove_user_permission("Blog Category", "_Test Blog Category",
|
|
"test2@example.com")
|
|
|
|
frappe.set_user("test2@example.com")
|
|
doc = frappe.get_doc(doc.doctype, doc.name)
|
|
self.assertTrue(doc.has_permission("read"))
|
|
self.assertTrue(doc.has_permission("write"))
|
|
self.assertFalse(doc.has_permission("create"))
|
|
|
|
def test_ignore_user_permissions_if_missing(self):
|
|
"""If `Ignore User Permissions If Missing` is checked in System Settings, show records even if User Permissions are missing for a linked doctype"""
|
|
self.set_user_permission_doctypes(['Blog Category', 'Blog Post', 'Blogger'])
|
|
|
|
frappe.set_user("Administrator")
|
|
# add_user_permission("Blog Category", "_Test Blog Category",
|
|
# "test2@example.com")
|
|
frappe.set_user("test2@example.com")
|
|
|
|
doc = frappe.get_doc({
|
|
"doctype": "Blog Post",
|
|
"blog_category": "_Test Blog Category",
|
|
"blogger": "_Test Blogger 1",
|
|
"title": "_Test Blog Post Title",
|
|
"content": "_Test Blog Post Content"
|
|
})
|
|
|
|
self.assertFalse(doc.has_permission("write"))
|
|
|
|
frappe.set_user("Administrator")
|
|
self.set_ignore_user_permissions_if_missing(1)
|
|
|
|
frappe.set_user("test2@example.com")
|
|
self.assertTrue(doc.has_permission("write"))
|
|
|
|
def test_strict_user_permissions(self):
|
|
"""If `Strict User Permissions` is checked in System Settings,
|
|
show records even if User Permissions are missing for a linked
|
|
doctype"""
|
|
|
|
frappe.set_user("Administrator")
|
|
frappe.db.sql('delete from tabContact')
|
|
make_test_records_for_doctype('Contact', force=True)
|
|
|
|
set_user_permission_doctypes("Contact", role="Sales User",
|
|
apply_user_permissions=1, user_permission_doctypes=['Salutation'])
|
|
set_user_permission_doctypes("Salutation", role="All",
|
|
apply_user_permissions=1, user_permission_doctypes=['Salutation'])
|
|
|
|
add_user_permission("Salutation", "Mr", "test3@example.com")
|
|
self.set_strict_user_permissions(0)
|
|
|
|
frappe.set_user("test3@example.com")
|
|
self.assertEquals(len(frappe.get_list("Contact")), 2)
|
|
|
|
frappe.set_user("Administrator")
|
|
self.set_strict_user_permissions(1)
|
|
|
|
frappe.set_user("test3@example.com")
|
|
self.assertTrue(len(frappe.get_list("Contact")), 1)
|
|
|
|
frappe.set_user("Administrator")
|
|
self.set_strict_user_permissions(0)
|
|
|
|
def test_automatic_apply_user_permissions(self):
|
|
'''Test user permissions are automatically applied when a user permission
|
|
is created'''
|
|
# create a user
|
|
frappe.get_doc(dict(doctype='User', email='test_user_perm@example.com',
|
|
first_name='tester')).insert(ignore_if_duplicate=True)
|
|
frappe.get_doc(dict(doctype='Role', role_name='Test Role User Perm')
|
|
).insert(ignore_if_duplicate=True)
|
|
|
|
# add a permission for event
|
|
add_permission('DocType', 'Test Role User Perm')
|
|
frappe.get_doc('User', 'test_user_perm@example.com').add_roles('Test Role User Perm')
|
|
|
|
|
|
# add user permission
|
|
add_user_permission('Module Def', 'Core', 'test_user_perm@example.com', True)
|
|
|
|
# check if user permission is applied in the new role
|
|
_perm = None
|
|
for perm in get_valid_perms('DocType', 'test_user_perm@example.com'):
|
|
if perm.role == 'Test Role User Perm':
|
|
_perm = perm
|
|
|
|
self.assertEqual(_perm.apply_user_permissions, 1)
|
|
|
|
# restrict by module
|
|
self.assertTrue('Module Def' in json.loads(_perm.user_permission_doctypes))
|
|
|
|
|
|
def set_user_permission_doctypes(doctypes, role, apply_user_permissions,
|
|
user_permission_doctypes):
|
|
user_permission_doctypes = None if not user_permission_doctypes else json.dumps(user_permission_doctypes)
|
|
|
|
if isinstance(doctypes, string_types):
|
|
doctypes = [doctypes]
|
|
|
|
for doctype in doctypes:
|
|
update(doctype, role, 0, 'apply_user_permissions', 1)
|
|
update(doctype, role, 0, 'user_permission_doctypes',
|
|
user_permission_doctypes)
|
|
|
|
frappe.clear_cache(doctype=doctype)
|