2026-03-14 11:27:02 -07:00
|
|
|
"""Regression tests for skills guard policy precedence.
|
2026-03-04 18:10:18 +03:00
|
|
|
|
2026-03-14 11:27:02 -07:00
|
|
|
Official/builtin skills should follow the INSTALL_POLICY table even when their
|
|
|
|
|
scan verdict is dangerous, and --force should override blocked verdicts for
|
|
|
|
|
non-builtin sources.
|
2026-03-04 18:10:18 +03:00
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _old_should_allow(verdict, trust_level, force):
|
|
|
|
|
"""Simulate the BROKEN old logic."""
|
|
|
|
|
INSTALL_POLICY = {
|
|
|
|
|
"builtin": ("allow", "allow", "allow"),
|
|
|
|
|
"trusted": ("allow", "allow", "block"),
|
|
|
|
|
"community": ("allow", "block", "block"),
|
|
|
|
|
}
|
|
|
|
|
VERDICT_INDEX = {"safe": 0, "caution": 1, "dangerous": 2}
|
|
|
|
|
|
|
|
|
|
# Old buggy check: `and not force`
|
|
|
|
|
if verdict == "dangerous" and not force:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
policy = INSTALL_POLICY.get(trust_level, INSTALL_POLICY["community"])
|
|
|
|
|
vi = VERDICT_INDEX.get(verdict, 2)
|
|
|
|
|
decision = policy[vi]
|
|
|
|
|
|
|
|
|
|
if decision == "allow":
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
if force:
|
|
|
|
|
return True # Bug: this line is reached for dangerous + force=True
|
|
|
|
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _new_should_allow(verdict, trust_level, force):
|
|
|
|
|
"""Simulate the FIXED logic."""
|
|
|
|
|
INSTALL_POLICY = {
|
|
|
|
|
"builtin": ("allow", "allow", "allow"),
|
|
|
|
|
"trusted": ("allow", "allow", "block"),
|
|
|
|
|
"community": ("allow", "block", "block"),
|
|
|
|
|
}
|
|
|
|
|
VERDICT_INDEX = {"safe": 0, "caution": 1, "dangerous": 2}
|
|
|
|
|
|
|
|
|
|
policy = INSTALL_POLICY.get(trust_level, INSTALL_POLICY["community"])
|
|
|
|
|
vi = VERDICT_INDEX.get(verdict, 2)
|
|
|
|
|
decision = policy[vi]
|
|
|
|
|
|
|
|
|
|
if decision == "allow":
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
if force:
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
2026-03-14 11:27:02 -07:00
|
|
|
class TestPolicyPrecedenceForDangerousVerdicts:
|
|
|
|
|
def test_builtin_dangerous_is_allowed_by_policy(self):
|
|
|
|
|
assert _new_should_allow("dangerous", "builtin", force=False) is True
|
2026-03-04 18:10:18 +03:00
|
|
|
|
2026-03-14 11:27:02 -07:00
|
|
|
def test_trusted_dangerous_is_blocked_without_force(self):
|
|
|
|
|
assert _new_should_allow("dangerous", "trusted", force=False) is False
|
2026-03-04 18:10:18 +03:00
|
|
|
|
2026-03-14 11:27:02 -07:00
|
|
|
def test_force_overrides_dangerous_for_community(self):
|
|
|
|
|
assert _new_should_allow("dangerous", "community", force=True) is True
|
2026-03-04 18:10:18 +03:00
|
|
|
|
2026-03-14 11:27:02 -07:00
|
|
|
def test_force_overrides_dangerous_for_trusted(self):
|
|
|
|
|
assert _new_should_allow("dangerous", "trusted", force=True) is True
|
2026-03-04 18:10:18 +03:00
|
|
|
|
|
|
|
|
def test_force_still_overrides_caution(self):
|
|
|
|
|
assert _new_should_allow("caution", "community", force=True) is True
|
|
|
|
|
|
|
|
|
|
def test_caution_community_blocked_without_force(self):
|
|
|
|
|
assert _new_should_allow("caution", "community", force=False) is False
|
|
|
|
|
|
|
|
|
|
def test_safe_always_allowed(self):
|
|
|
|
|
assert _new_should_allow("safe", "community", force=False) is True
|
|
|
|
|
assert _new_should_allow("safe", "community", force=True) is True
|
|
|
|
|
|
2026-03-14 11:27:02 -07:00
|
|
|
def test_old_code_happened_to_allow_forced_dangerous_community(self):
|
|
|
|
|
assert _old_should_allow("dangerous", "community", force=True) is True
|