Entropic 2.11.1
Local-first agentic inference engine
Loading...
Searching...
No Matches
permission_manager.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
10
11#include <fnmatch.h>
12
13static auto logger = entropic::log::get("mcp.permissions");
14
15namespace entropic {
16
25 std::vector<std::string> allow_patterns,
26 std::vector<std::string> deny_patterns)
27 : allow_list_(std::move(allow_patterns)),
28 deny_list_(std::move(deny_patterns)) {}
29
45 const std::string& tool_name,
46 const std::string& pattern) const {
47 for (const auto& deny : deny_list_) {
48 if (pattern_matches(tool_name, pattern, deny)) {
49 logger->info("Permission DENIED: {} (matched '{}')",
50 tool_name, deny);
51 return true;
52 }
53 }
54 return false;
55}
56
68 const std::string& tool_name,
69 const std::string& pattern) const {
70 for (const auto& allow : allow_list_) {
71 if (pattern_matches(tool_name, pattern, allow)) {
72 logger->info("Permission ALLOWED: {} (matched '{}')",
73 tool_name, allow);
74 return true;
75 }
76 }
77 return false;
78}
79
95 const std::string& pattern, bool allow) {
96 auto& list = allow ? allow_list_ : deny_list_;
97 for (const auto& existing : list) {
98 if (existing == pattern) {
99 return;
100 }
101 }
102 list.push_back(pattern);
103 logger->info("Added {} permission: {}",
104 allow ? "allow" : "deny", pattern);
105}
106
124bool PermissionManager::pattern_matches(
125 const std::string& tool_name,
126 const std::string& full_pattern,
127 const std::string& permission_pattern) {
128
129 // Split permission pattern at ':'
130 auto colon = permission_pattern.find(':');
131 std::string pattern_tool = (colon != std::string::npos)
132 ? permission_pattern.substr(0, colon)
133 : permission_pattern;
134
135 // Tool name must match the tool portion
136 if (fnmatch(pattern_tool.c_str(), tool_name.c_str(), 0) != 0) {
137 return false;
138 }
139
140 // If no arg pattern, tool match is sufficient
141 if (colon == std::string::npos) {
142 return true;
143 }
144
145 // Full pattern must match
146 return fnmatch(permission_pattern.c_str(),
147 full_pattern.c_str(), 0) == 0;
148}
149
150} // namespace entropic
bool is_denied(const std::string &tool_name, const std::string &pattern) const
Check if a tool call is explicitly denied.
PermissionManager(std::vector< std::string > allow_patterns={}, std::vector< std::string > deny_patterns={})
Construct with initial allow/deny lists.
void add_permission(const std::string &pattern, bool allow)
Add a permission pattern at runtime.
bool is_allowed(const std::string &tool_name, const std::string &pattern) const
Check if a tool call is explicitly allowed (skip prompting).
spdlog initialization and logger access.
ENTROPIC_EXPORT std::shared_ptr< spdlog::logger > get(const std::string &name)
Get or create a named logger.
Definition logging.cpp:211
Activate model on GPU (WARM → ACTIVE).
Permission manager for MCP tool access control.