fix(security): give permission denies precedence (#11477)

This commit is contained in:
Jasper
2026-08-24 18:51:25 +00:00
committed by GitHub
parent 6808b4d15b
commit df147d32d4
+50 -5
View File
@@ -149,6 +149,11 @@ impl PermissionManager {
if let Some(permission_config) = map.get(name) {
// Check the permission levels for the given tool
if permission_config
.never_allow
.contains(&principal_name.to_string())
{
return Some(PermissionLevel::NeverAllow);
} else if permission_config
.always_allow
.contains(&principal_name.to_string())
{
@@ -158,11 +163,6 @@ impl PermissionManager {
.contains(&principal_name.to_string())
{
return Some(PermissionLevel::AskBefore);
} else if permission_config
.never_allow
.contains(&principal_name.to_string())
{
return Some(PermissionLevel::NeverAllow);
}
}
None // Return None if no matching permission level is found
@@ -318,6 +318,51 @@ mod tests {
);
}
#[test]
fn test_persisted_never_allow_takes_precedence_over_other_levels() {
let temp_dir = TempDir::new().unwrap();
fs::write(
temp_dir.path().join(PERMISSION_FILE),
r#"user:
always_allow:
- denied_from_allow
- allowed
ask_before:
- denied_from_ask
- prompted
never_allow:
- denied_from_allow
- denied_from_ask
- denied
"#,
)
.unwrap();
let manager = PermissionManager::new(temp_dir.path().to_path_buf());
assert_eq!(
manager.get_user_permission("denied_from_allow"),
Some(PermissionLevel::NeverAllow)
);
assert_eq!(
manager.get_user_permission("denied_from_ask"),
Some(PermissionLevel::NeverAllow)
);
assert_eq!(
manager.get_user_permission("allowed"),
Some(PermissionLevel::AlwaysAllow)
);
assert_eq!(
manager.get_user_permission("prompted"),
Some(PermissionLevel::AskBefore)
);
assert_eq!(
manager.get_user_permission("denied"),
Some(PermissionLevel::NeverAllow)
);
assert_eq!(manager.get_user_permission("unknown"), None);
}
#[test]
fn test_permission_update_replaces_existing_level() {
let (manager, _temp_dir) = create_test_permission_manager();