Entropic 2.3.8
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
39 const std::string& tool_name,
40 const std::string& pattern) const {
41 for (const auto& deny : deny_list_) {
42 if (pattern_matches(tool_name, pattern, deny)) {
43 logger->info("Permission DENIED: {} (matched '{}')",
44 tool_name, deny);
45 return true;
46 }
47 }
48 return false;
49}
50
60 const std::string& tool_name,
61 const std::string& pattern) const {
62 for (const auto& allow : allow_list_) {
63 if (pattern_matches(tool_name, pattern, allow)) {
64 logger->info("Permission ALLOWED: {} (matched '{}')",
65 tool_name, allow);
66 return true;
67 }
68 }
69 return false;
70}
71
80 const std::string& pattern, bool allow) {
81 auto& list = allow ? allow_list_ : deny_list_;
82 for (const auto& existing : list) {
83 if (existing == pattern) {
84 return;
85 }
86 }
87 list.push_back(pattern);
88 logger->info("Added {} permission: {}",
89 allow ? "allow" : "deny", pattern);
90}
91
101bool PermissionManager::pattern_matches(
102 const std::string& tool_name,
103 const std::string& full_pattern,
104 const std::string& permission_pattern) {
105
106 // Split permission pattern at ':'
107 auto colon = permission_pattern.find(':');
108 std::string pattern_tool = (colon != std::string::npos)
109 ? permission_pattern.substr(0, colon)
110 : permission_pattern;
111
112 // Tool name must match the tool portion
113 if (fnmatch(pattern_tool.c_str(), tool_name.c_str(), 0) != 0) {
114 return false;
115 }
116
117 // If no arg pattern, tool match is sufficient
118 if (colon == std::string::npos) {
119 return true;
120 }
121
122 // Full pattern must match
123 return fnmatch(permission_pattern.c_str(),
124 full_pattern.c_str(), 0) == 0;
125}
126
127} // 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.