[rule]
id = "py-check-helper-call"
languages = ["python"]
category = "abac"
confidence = "medium"
description = "Permission check_* helper call (e.g. check_can_invite_users(user), check_basic_stream_access(...))"
query = """
(call
function: (identifier) @fn_name
) @match
"""
[rule.predicates.fn_name]
match = "^(check_can_[a-z_]+|check_basic_[a-z_]+|check_message_[a-z_]+access|check_stream_[a-z_]+access|check_[a-z_]+_access|check_[a-z_]+_permission|check_[a-z_]+_authz)$"
[[rule.tests]]
input = """
def maybe_invite():
check_can_invite_users(user_profile, invite_as)
invite()
"""
expect_match = true
[[rule.tests]]
input = """
def read_stream(stream):
check_basic_stream_access(user_profile, stream)
return stream.messages.all()
"""
expect_match = true
[[rule.tests]]
input = """
def edit(message):
check_message_edit_access(user_profile, message)
do_edit()
"""
expect_match = true
[[rule.tests]]
input = """
def view(stream_id):
check_stream_access(user_profile, stream_id)
return render()
"""
expect_match = true
[[rule.tests]]
input = """
def parse(payload):
check_format(payload)
return payload
"""
expect_match = false
[[rule.tests]]
input = """
def post(message):
check_message_format(message)
deliver()
"""
expect_match = false
[[rule.tests]]
input = """
if user.can("delete"):
delete_resource()
"""
expect_match = false