Skip to content

Commit 3ae4929

Browse files
committed
FIX Add SingleRecordAdmin to permission management
1 parent 9598816 commit 3ae4929

File tree

3 files changed

+48
-17
lines changed

3 files changed

+48
-17
lines changed

code/CMSProfileController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ class CMSProfileController extends SingleRecordAdmin
2020

2121
private static $ignore_menuitem = true;
2222

23+
private static bool $skip_permission_generation = true;
24+
2325
private static bool $restrict_to_single_record = false;
2426

2527
private static bool $allow_new_record = false;

code/LeftAndMain.php

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,24 @@
44

55
use InvalidArgumentException;
66
use LogicException;
7-
use ReflectionClass;
8-
use SilverStripe\CMS\Controllers\CMSMain;
7+
use SilverStripe\Admin\Forms\UnsavedChangesIndicator;
98
use SilverStripe\Admin\Navigator\SilverStripeNavigator;
9+
use SilverStripe\Admin\SingleRecordAdmin;
10+
use SilverStripe\CMS\Controllers\CMSMain;
1011
use SilverStripe\Control\Controller;
1112
use SilverStripe\Control\Director;
1213
use SilverStripe\Control\HTTPRequest;
13-
use SilverStripe\Control\HTTPResponse;
1414
use SilverStripe\Control\HTTPResponse_Exception;
15+
use SilverStripe\Control\HTTPResponse;
1516
use SilverStripe\Control\PjaxResponseNegotiator;
1617
use SilverStripe\Core\ClassInfo;
1718
use SilverStripe\Core\Config\Config;
1819
use SilverStripe\Core\Convert;
1920
use SilverStripe\Core\Injector\Injector;
2021
use SilverStripe\Core\Manifest\ModuleResourceLoader;
2122
use SilverStripe\Core\Manifest\VersionProvider;
23+
use SilverStripe\Core\Validation\ValidationException;
24+
use SilverStripe\Core\Validation\ValidationResult;
2225
use SilverStripe\Dev\TestOnly;
2326
use SilverStripe\Forms\DropdownField;
2427
use SilverStripe\Forms\FieldList;
@@ -28,22 +31,19 @@
2831
use SilverStripe\Forms\LiteralField;
2932
use SilverStripe\Forms\PrintableTransformation;
3033
use SilverStripe\i18n\i18n;
34+
use SilverStripe\Model\ArrayData;
3135
use SilverStripe\Model\List\ArrayList;
36+
use SilverStripe\Model\List\SS_List;
3237
use SilverStripe\ORM\CMSPreviewable;
3338
use SilverStripe\ORM\DataObject;
3439
use SilverStripe\ORM\FieldType\DBField;
3540
use SilverStripe\ORM\FieldType\DBHTMLText;
3641
use SilverStripe\ORM\Hierarchy\Hierarchy;
37-
use SilverStripe\Model\List\SS_List;
38-
use SilverStripe\Core\Validation\ValidationException;
39-
use SilverStripe\Core\Validation\ValidationResult;
40-
use SilverStripe\Admin\Forms\UnsavedChangesIndicator;
4142
use SilverStripe\Security\Permission;
4243
use SilverStripe\Security\PermissionProvider;
4344
use SilverStripe\Security\Security;
4445
use SilverStripe\Security\SecurityToken;
4546
use SilverStripe\SiteConfig\SiteConfig;
46-
use SilverStripe\Model\ArrayData;
4747
use SilverStripe\View\Requirements;
4848
use SilverStripe\View\SSViewer;
4949

@@ -87,6 +87,11 @@ class LeftAndMain extends FormSchemaController implements PermissionProvider
8787
*/
8888
private static bool $ignore_menuitem = false;
8989

90+
/**
91+
* When set to true, this controller is skipped when generating CMS access permissions.
92+
*/
93+
private static bool $skip_permission_generation = false;
94+
9095
/**
9196
* A subclass of {@link DataObject}.
9297
*
@@ -1442,22 +1447,22 @@ public function providePermissions()
14421447
'sort' => -100
14431448
]
14441449
];
1445-
1446-
// Add any custom ModelAdmin subclasses. Can't put this on ModelAdmin itself
1447-
// since its marked abstract, and needs to be singleton instantiated.
1448-
foreach (ClassInfo::subclassesFor(ModelAdmin::class) as $i => $class) {
1449-
if ($class === ModelAdmin::class) {
1450+
// Add any custom ModelAdmin or SingleRecordAdmin subclasses.
1451+
$classes = array_merge(
1452+
ClassInfo::subclassesFor(ModelAdmin::class, false),
1453+
ClassInfo::subclassesFor(SingleRecordAdmin::class, false)
1454+
);
1455+
foreach ($classes as $class) {
1456+
if (ClassInfo::classImplements($class, TestOnly::class)) {
14501457
continue;
14511458
}
1452-
if (ClassInfo::classImplements($class, TestOnly::class)) {
1459+
if (Config::inst()->get($class, 'skip_permission_generation')) {
14531460
continue;
14541461
}
1455-
14561462
// Check if modeladmin has explicit required_permission_codes option.
14571463
// If a modeladmin is namespaced you can apply this config to override
14581464
// the default permission generation based on fully qualified class name.
14591465
$code = $class::getRequiredPermissions();
1460-
14611466
if (!$code) {
14621467
continue;
14631468
}
@@ -1476,7 +1481,6 @@ public function providePermissions()
14761481
'category' => _t(__CLASS__ . '.CMS_ACCESS_CATEGORY', 'CMS Access')
14771482
];
14781483
}
1479-
14801484
return $perms;
14811485
}
14821486

tests/php/SingleRecordAdminTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace SilverStripe\Admin\Tests;
44

55
use PHPUnit\Framework\Attributes\DataProvider;
6+
use SilverStripe\Admin\CMSProfileController;
7+
use SilverStripe\Admin\LeftAndMain;
68
use SilverStripe\Admin\Tests\SingleRecordAdminTest\TestAdmin;
79
use SilverStripe\Admin\Tests\SingleRecordAdminTest\TestRecord;
810
use SilverStripe\Dev\SapphireTest;
@@ -114,4 +116,27 @@ public function testGetRecord(
114116
$this->assertNull($result);
115117
}
116118
}
119+
120+
public function testProvidePermissionsSkipsConfiguredClass(): void
121+
{
122+
CMSProfileController::config()->set('skip_permission_generation', true);
123+
$permissions = LeftAndMain::singleton()->providePermissions();
124+
$code = CMSProfileController::getRequiredPermissions();
125+
if (is_array($code)) {
126+
$code = reset($code);
127+
}
128+
$this->assertArrayNotHasKey($code, $permissions);
129+
}
130+
131+
public function testProvidePermissionsIncludesClassWhenNotSkipped(): void
132+
{
133+
CMSProfileController::config()->set('skip_permission_generation', false);
134+
$permissions = LeftAndMain::singleton()->providePermissions();
135+
$code = CMSProfileController::getRequiredPermissions();
136+
if (is_array($code)) {
137+
$code = reset($code);
138+
}
139+
$this->assertSame("Access to 'My Profile' section", $permissions[$code]['name']);
140+
$this->assertSame('CMS Access', $permissions[$code]['category']);
141+
}
117142
}

0 commit comments

Comments
 (0)