diff --git a/security/PermissionCheckboxSetField.php b/security/PermissionCheckboxSetField.php
index 0c2ca25f6..d3b7ab151 100644
--- a/security/PermissionCheckboxSetField.php
+++ b/security/PermissionCheckboxSetField.php
@@ -162,6 +162,8 @@ class PermissionCheckboxSetField extends FormField {
$options = '';
$globalHidden = (array)Config::inst()->get('Permission', 'hidden_permissions');
if($this->source) {
+ $privilegedPermissions = Permission::config()->privileged_permissions;
+
// loop through all available categorized permissions and see if they're assigned for the given groups
foreach($this->source as $categoryName => $permissions) {
$options .= "
$categoryName
";
@@ -194,6 +196,11 @@ class PermissionCheckboxSetField extends FormField {
$inheritMessage = ' (' . join(', ', $uninheritedCodes[$code]).')';
}
+ // Disallow modification of "privileged" permissions unless currently logged-in user is an admin
+ if(!Permission::check('ADMIN') && in_array($code, $privilegedPermissions)) {
+ $disabled = ' disabled="true"';
+ }
+
// If the field is readonly, always mark as "disabled"
if($this->readonly) $disabled = ' disabled="true"';
@@ -246,6 +253,16 @@ class PermissionCheckboxSetField extends FormField {
$fieldname = $this->name;
$managedClass = $this->managedClass;
+ // Remove all "privileged" permissions if the currently logged-in user is not an admin
+ $privilegedPermissions = Permission::config()->privileged_permissions;
+ if(!Permission::check('ADMIN')) {
+ foreach($this->value as $id => $bool) {
+ if(in_array($id, $privilegedPermissions)) {
+ unset($this->value[$id]);
+ }
+ }
+ }
+
// remove all permissions and re-add them afterwards
$permissions = $record->$fieldname();
foreach ( $permissions as $permission ) {