feat: extend perm debugging to popular controllers

- [x] File
- [x] Communication
This commit is contained in:
Ankush Menat 2024-01-10 14:53:32 +05:30
parent 3a8fc90961
commit 914406d31b
6 changed files with 13 additions and 10 deletions

View file

@ -975,6 +975,7 @@ def has_permission(
throw=False,
*,
parent_doctype=None,
debug=False,
):
"""
Return True if the user has permission `ptype` for given `doctype` or `doc`.
@ -999,6 +1000,7 @@ def has_permission(
user=user,
raise_exception=throw,
parent_doctype=parent_doctype,
debug=debug,
)
if throw and not out:

View file

@ -501,14 +501,15 @@ def on_doctype_update():
frappe.db.add_index("Communication", ["message_id(140)"])
def has_permission(doc, ptype, user):
def has_permission(doc, ptype, user=None, debug=False):
if ptype == "read":
if doc.reference_doctype == "Communication" and doc.reference_name == doc.name:
return
if doc.reference_doctype and doc.reference_name:
if frappe.has_permission(doc.reference_doctype, ptype="read", doc=doc.reference_name):
return True
return frappe.has_permission(
doc.reference_doctype, ptype="read", doc=doc.reference_name, user=user, debug=debug
)
def get_permission_query_conditions_for_communication(user):

View file

@ -778,11 +778,11 @@ def on_doctype_update():
frappe.db.add_index("File", ["attached_to_doctype", "attached_to_name"])
def has_permission(doc, ptype=None, user=None):
def has_permission(doc, ptype=None, user=None, debug=False):
user = user or frappe.session.user
if ptype == "create":
return frappe.has_permission("File", "create", user=user)
return frappe.has_permission("File", "create", user=user, debug=debug)
if not doc.is_private or (user != "Guest" and doc.owner == user) or user == "Administrator":
return True
@ -798,9 +798,9 @@ def has_permission(doc, ptype=None, user=None):
return False
if ptype in ["write", "create", "delete"]:
return ref_doc.has_permission("write")
return ref_doc.has_permission("write", debug=debug, user=user)
else:
return ref_doc.has_permission("read")
return ref_doc.has_permission("read", debug=debug, user=user)
return False

View file

@ -214,7 +214,7 @@ class Document(BaseDocument):
if not self.has_permission(permtype):
self.raise_no_permission_to(permtype)
def has_permission(self, permtype="read") -> bool:
def has_permission(self, permtype="read", *, debug=False, user=None) -> bool:
"""
Call `frappe.permissions.has_permission` if `ignore_permissions` flag isn't truthy
@ -226,7 +226,7 @@ class Document(BaseDocument):
import frappe.permissions
return frappe.permissions.has_permission(self.doctype, permtype, self)
return frappe.permissions.has_permission(self.doctype, permtype, self, debug=debug, user=user)
def raise_no_permission_to(self, perm_type):
"""Raise `frappe.PermissionError`."""

View file

@ -447,7 +447,7 @@ def has_controller_permissions(doc, ptype, user=None, debug=False):
return None
for method in reversed(methods):
controller_permission = frappe.call(frappe.get_attr(method), doc=doc, ptype=ptype, user=user)
controller_permission = frappe.call(method, doc=doc, ptype=ptype, user=user, debug=debug)
debug and _debug_log(f"Controller permission check from {method}: {controller_permission}")
if controller_permission is not None:
return controller_permission