| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- #include "smartbotic/webserver/permissions.hpp"
- namespace smartbotic::permissions {
- auto BuildWorkspacePermission(std::string_view workspace_id,
- std::string_view action) -> std::string {
- std::string result;
- result.reserve(10 + workspace_id.size() + action.size());
- result.append("workspace:");
- result.append(workspace_id);
- result.append(":");
- result.append(action);
- return result;
- }
- auto BuildCollectionPermission(std::string_view workspace_id,
- std::string_view collection,
- std::string_view action) -> std::string {
- std::string result;
- result.reserve(12 + workspace_id.size() + collection.size() + action.size());
- result.append("collection:");
- result.append(workspace_id);
- result.append(":");
- result.append(collection);
- result.append(":");
- result.append(action);
- return result;
- }
- auto BuildPagePermission(std::string_view workspace_id,
- std::string_view action) -> std::string {
- std::string result;
- result.reserve(6 + workspace_id.size() + action.size());
- result.append("page:");
- result.append(workspace_id);
- result.append(":");
- result.append(action);
- return result;
- }
- auto BuildFieldPermission(std::string_view workspace_id,
- std::string_view collection,
- std::string_view field,
- std::string_view action) -> std::string {
- std::string result;
- result.reserve(8 + workspace_id.size() + collection.size() + field.size() + action.size());
- result.append("field:");
- result.append(workspace_id);
- result.append(":");
- result.append(collection);
- result.append(":");
- result.append(field);
- result.append(":");
- result.append(action);
- return result;
- }
- auto ParsePermission(std::string_view permission) -> std::vector<std::string> {
- std::vector<std::string> parts;
- std::string part;
- for (char c : permission) {
- if (c == ':') {
- parts.push_back(std::move(part));
- part.clear();
- } else {
- part += c;
- }
- }
- if (!part.empty()) {
- parts.push_back(std::move(part));
- }
- return parts;
- }
- auto MatchesPermission(std::string_view required,
- std::string_view granted) -> bool {
- // Wildcard "*" matches everything
- if (granted == kWildcard) {
- return true;
- }
- // Exact match
- if (required == granted) {
- return true;
- }
- // Parse both permissions into parts
- auto required_parts = ParsePermission(required);
- auto granted_parts = ParsePermission(granted);
- // If granted has fewer parts, it can't match
- if (granted_parts.size() < required_parts.size()) {
- // Unless the last part is a wildcard that covers the rest
- // e.g., "system:*" should match "system:users:read"
- if (granted_parts.empty()) {
- return false;
- }
- if (granted_parts.back() != "*") {
- return false;
- }
- // Check if the prefix matches
- for (size_t i = 0; i < granted_parts.size() - 1; ++i) {
- if (granted_parts[i] != "*" && granted_parts[i] != required_parts[i]) {
- return false;
- }
- }
- return true;
- }
- // Compare part by part
- for (size_t i = 0; i < required_parts.size(); ++i) {
- if (i >= granted_parts.size()) {
- return false;
- }
- // Wildcard in granted matches any value in required
- if (granted_parts[i] == "*") {
- continue;
- }
- if (granted_parts[i] != required_parts[i]) {
- return false;
- }
- }
- return true;
- }
- auto GetAllSystemPermissions() -> std::vector<std::string_view> {
- return {
- // Authentication
- kLoginAllow,
- kLoginDeny,
- // User management
- kUsersRead,
- kUsersCreate,
- kUsersUpdate,
- kUsersDelete,
- // Group management
- kGroupsRead,
- kGroupsCreate,
- kGroupsUpdate,
- kGroupsDelete,
- // System group management
- kSystemGroupsRead,
- kSystemGroupsCreate,
- kSystemGroupsUpdate,
- kSystemGroupsDelete,
- // Workspace management
- kWorkspacesRead,
- kWorkspacesCreate,
- kWorkspacesUpdate,
- kWorkspacesDelete,
- // Collection management
- kCollectionsRead,
- kCollectionsCreate,
- kCollectionsUpdate,
- kCollectionsDelete,
- // API key management
- kApiKeysRead,
- kApiKeysCreate,
- kApiKeysUpdate,
- kApiKeysDelete,
- // Membership management
- kMembershipsRead,
- kMembershipsCreate,
- kMembershipsUpdate,
- kMembershipsDelete,
- // View management
- kViewsRead,
- kViewsCreate,
- kViewsUpdate,
- kViewsDelete,
- // Page management
- kPagesRead,
- kPagesCreate,
- kPagesUpdate,
- kPagesDelete,
- // LLM Provider management
- kLlmProvidersRead,
- kLlmProvidersCreate,
- kLlmProvidersUpdate,
- kLlmProvidersDelete,
- // LLM Chat access
- kLlmChat,
- // Archive management
- kArchivesRead,
- kArchivesRestore,
- kArchivesDelete,
- kArchivesExport,
- };
- }
- auto GetAllCollectionActions() -> std::vector<std::string_view> {
- return {
- "read_all",
- "read_own",
- "write_all",
- "write_own",
- "create",
- "delete_all",
- "delete_own",
- "manage",
- };
- }
- auto GetAllFieldActions() -> std::vector<std::string_view> {
- return {
- "read",
- "write",
- };
- }
- auto GetAllPageActions() -> std::vector<std::string_view> {
- return {
- "create",
- "read_all",
- "read_own",
- "write_all",
- "write_own",
- "delete_all",
- "delete_own",
- "share",
- };
- }
- } // namespace smartbotic::permissions
|