[rule]
id = "ts-role-check-conditional"
languages = ["typescript", "javascript"]
category = "rbac"
confidence = "high"
description = "Direct role comparison in conditional expression"
query = """
(if_statement
condition: (parenthesized_expression
(binary_expression
left: (member_expression
property: (property_identifier) @prop)
operator: ["==" "===" "!=" "!=="] @op
right: (string) @role_value))
) @match
"""
[rule.predicates.prop]
match = "^(role|roles|roleName|userRole|userType)$"
[rule.predicates.role_value]
not_match = "^[\"'](assistant|user|system|tool|function)[\"']$"
[rule.rego_template]
template = """
default allow := false
allow if {
input.user.role == "{{role_value}}"
}
"""
[rule.cedar_template]
template = """
permit (
principal,
action,
resource
)
when {
principal.role == "{{role_value}}"
};
"""
[[rule.tests]]
input = """
if (user.role === "admin") {
deleteUser(id);
}
"""
expect_match = true
[[rule.tests]]
input = """
if (session.user.role === "ADMIN") {
showAdminPanel();
}
"""
expect_match = true
[[rule.tests]]
input = """
if (session.user.role !== "ADMIN") {
throw new ForbiddenError();
}
"""
expect_match = true
[[rule.tests]]
input = """
if (session.user.roleName === "ADMIN") {
manage();
}
"""
expect_match = true
[[rule.tests]]
input = """
if (user.name === "admin") {
greet();
}
"""
expect_match = false
[[rule.tests]]
input = """
if (msg.role === "assistant") {
processResponse();
}
"""
expect_match = false