'Upload files', self::CreateOwnFolders => 'Create own folders', self::EditFiles => 'Edit own files', self::EditOthersFiles => "Edit others' files", self::DeleteFiles => 'Delete own files', self::DeleteOthersFiles => "Delete others' files", self::SetFileExpirationDate => 'Set file expiration dates', self::SetFileCategories => 'Assign categories to files', self::UploadPublic => 'Upload public files', self::UploadToPublicFolders => 'Upload to public folders', self::ImportOrphans => 'Import orphan files', self::LimitDownloads => 'Limit download counts', self::ModerateComments => 'Moderate comments', self::ReleaseQuarantinedFiles => 'Release quarantined files', self::CreateCategories => 'Create categories', self::EditCategories => 'Edit categories', self::DeleteCategories => 'Delete categories', self::CreateClients => 'Create clients', self::EditClients => 'Edit clients', self::DeleteClients => 'Delete clients', self::CreateUsers => 'Create system users', self::EditUsers => 'Edit system users', self::DeleteUsers => 'Delete system users', self::ApproveAccountRequests => 'Approve account requests', self::ManageUsers => 'Manage system users and roles', // Not "manage": this key opens the client list page and its // sidebar link, nothing else. Creating, editing and deleting // have keys of their own. The stored value stays // `manage_clients` — v1's vocabulary is preserved verbatim so // the importer needs no mapping table — but the label people // read should say what it actually does. self::ManageClients => 'View the client list', self::ManageCustomFields => 'Manage client custom fields', self::CreateGroups => 'Create groups', self::EditGroups => 'Edit groups', self::DeleteGroups => 'Delete groups', self::ApproveGroupsMembershipsRequests => 'Approve group membership requests', // Same shape as ManageClients above. self::ManageGroups => 'View the group list', self::EditSettings => 'Edit system settings', self::EditEmailTemplates => 'Edit email templates', self::ViewActionsLog => 'View the activity log', self::ViewStatistics => 'View statistics', self::ViewNews => 'View news', self::ViewSystemInfo => 'View system information', self::ViewDashboardCounters => 'View dashboard counters', self::ManageUpdates => 'Manage updates', self::CreateAssets => 'Create custom assets', self::EditAssets => 'Edit custom assets', self::DeleteAssets => 'Delete custom assets', }; } /** * The capability this permission depends on, if any. * * Permissions and capabilities are independent gates: a permission says * what a *role* may do, a capability says what this *edition* has at all. * The surfaces they guard already apply both — routes/web.php pairs * `capability:users.manage` with `can:manage_users`, and the sidebar * pairs them again for visibility. Holding `manage_users` on a cloud * install therefore means nothing: the feature is absent, not merely * hidden. * * Expressed here so anything that enumerates permissions (the API token * form is the first) can ask rather than hardcode its own copy of the * pairing, and so a new permission's capability requirement is decided * in the same file as the case itself. * * Null means "available in every edition", which is most of them. */ public function capability(): ?Capability { return match ($this) { self::CreateUsers, self::EditUsers, self::DeleteUsers, self::ManageUsers => Capability::UsersManage, self::ManageUpdates => Capability::SystemUpdates, self::CreateAssets, self::EditAssets, self::DeleteAssets => Capability::CustomAssets, default => null, }; } public function category(): PermissionCategory { return match ($this) { self::Upload, self::CreateOwnFolders, self::EditFiles, self::EditOthersFiles, self::DeleteFiles, self::DeleteOthersFiles, self::SetFileExpirationDate, self::SetFileCategories, self::UploadPublic, self::UploadToPublicFolders, self::ImportOrphans, self::LimitDownloads, self::ModerateComments => PermissionCategory::Files, self::ReleaseQuarantinedFiles => PermissionCategory::Files, self::CreateCategories, self::EditCategories, self::DeleteCategories => PermissionCategory::Categories, // Staff accounts — the people who administer the installation. self::CreateUsers, self::EditUsers, self::DeleteUsers, self::ManageUsers => PermissionCategory::Users, // The client population, which is a different thing entirely: // custom fields describe clients, and the account-request queue // is where self-registered clients wait for approval. self::CreateClients, self::EditClients, self::DeleteClients, self::ManageClients, self::ManageCustomFields, self::ApproveAccountRequests => PermissionCategory::Clients, self::CreateGroups, self::EditGroups, self::DeleteGroups, self::ApproveGroupsMembershipsRequests, self::ManageGroups => PermissionCategory::Groups, self::EditSettings, self::EditEmailTemplates, self::ViewActionsLog, self::ViewStatistics, self::ViewNews, self::ViewSystemInfo, self::ViewDashboardCounters, self::ManageUpdates => PermissionCategory::System, self::CreateAssets, self::EditAssets, self::DeleteAssets => PermissionCategory::Assets, }; } }