| 98 | const EDIT_TOOLS: &[&str] = &["edit", "write", "patch", "multiedit"]; |
| 99 | |
| 100 | pub fn disabled( |
| 101 | tools: &[String], |
| 102 | ruleset: &PermissionRuleset, |
| 103 | ) -> std::collections::HashSet<String> { |
| 104 | let mut result = std::collections::HashSet::new(); |
| 105 | |
| 106 | for tool in tools { |
| 107 | let permission = if EDIT_TOOLS.contains(&tool.as_str()) { |
| 108 | "edit" |
| 109 | } else { |
| 110 | tool.as_str() |
| 111 | }; |
| 112 | |
| 113 | let rule = ruleset |
| 114 | .iter() |
| 115 | .rev() |
| 116 | .find(|r| wildcard_match(permission, &r.permission)); |
| 117 | |
| 118 | if let Some(rule) = rule { |
| 119 | if rule.pattern == "*" && rule.action == PermissionAction::Deny { |
| 120 | result.insert(tool.clone()); |
| 121 | } |
| 122 | } |
| 123 | } |
| 124 | |
| 125 | result |
| 126 | } |
| 127 | |
| 128 | fn wildcard_match(text: &str, pattern: &str) -> bool { |
| 129 | if pattern == "*" { |