diff --git a/core/modules/decoupled_admin/decoupled_admin.info.yml b/core/modules/decoupled_admin/decoupled_admin.info.yml new file mode 100644 index 0000000000..e9e6890654 --- /dev/null +++ b/core/modules/decoupled_admin/decoupled_admin.info.yml @@ -0,0 +1,6 @@ +name: 'Decoupled admin' +type: module +description: 'Provides endpoints for decoupled admin.' +package: Experimental +version: VERSION +core: 8.x diff --git a/core/modules/user/src/Plugin/rest/resource/PermissionResource.php b/core/modules/decoupled_admin/src/Plugin/rest/resource/PermissionsCollectionResource.php similarity index 94% rename from core/modules/user/src/Plugin/rest/resource/PermissionResource.php rename to core/modules/decoupled_admin/src/Plugin/rest/resource/PermissionsCollectionResource.php index edd4169c72..76a3f38d70 100644 --- a/core/modules/user/src/Plugin/rest/resource/PermissionResource.php +++ b/core/modules/decoupled_admin/src/Plugin/rest/resource/PermissionsCollectionResource.php @@ -1,6 +1,6 @@ provisionResource([static::$format], $auth); + } + + /** + * {@inheritdoc} + */ + protected function provisionResource($formats = [], $authentication = []) { + $this->resourceConfigStorage->create([ + 'id' => static::$resourceConfigId, + 'granularity' => RestResourceConfigInterface::RESOURCE_GRANULARITY, + 'configuration' => [ + 'methods' => ['GET'], + 'formats' => $formats, + 'authentication' => $authentication, + ], + 'status' => TRUE, + ])->save(); + $this->refreshTestStateAfterRestConfigChange(); + } + + /** + * Writes a log messages and retrieves it via the REST API. + */ + public function testPermissionsCollection() { + $this->initAuthentication(); + $url = Url::fromRoute('rest.permissions_collection.GET', ['_format' => static::$format]); + $request_options = $this->getAuthenticationRequestOptions('GET'); + + $response = $this->request('GET', $url, $request_options); + $this->assertResourceResponse(403, '{"message":"The \u0027administer permissions\u0027 permission is required."}', $response); + + // create a user account that has the required permissions to read + // the watchdog resource via the rest api. + $this->setUpAuthorization('GET'); + + $response = $this->request('GET', $url, $request_options); + $this->assertResourceResponse(200, false, $response, ['config:rest.resource.user_permission', 'config:rest.settings', 'http_response'], ['user.permissions'], FALSE, 'MISS'); + $permissions = json::decode((string) $response->getBody()); + + $permission_handler = \drupal::service('user.permissions')->getPermissions(); + $this->assertSame(array_keys($permission_handler), array_keys($permissions)); + $this->assertSame([ + 'title' => 'Administer permissions', + 'restrict access' => TRUE, + 'description' => NULL, + 'provider' => 'user', + 'id' => 'administer permissions', + ], $permissions['administer permissions']); + } + + /** + * {@inheritdoc} + */ + protected function setUpAuthorization($method) { + switch ($method) { + case 'GET': + $this->grantPermissionsToTestedRole(['administer permissions']); + break; + + default: + throw new \UnexpectedValueException(); + } + } + + /** + * {@inheritdoc} + */ + protected function assertNormalizationEdgeCases($method, Url $url, array $request_options) {} + + /** + * {@inheritdoc} + */ + protected function getExpectedUnauthorizedAccessMessage($method) {} + + /** + * {@inheritdoc} + */ + protected function getExpectedUnauthorizedAccessCacheability() {} + +}