diff --git a/core/modules/media_library/src/MediaLibraryUiBuilder.php b/core/modules/media_library/src/MediaLibraryUiBuilder.php index b00bd7af9415361ce906125dbd9d53a6e8467857..fb5d5c41c05d0b79329d3705df241e27b27a922b 100644 --- a/core/modules/media_library/src/MediaLibraryUiBuilder.php +++ b/core/modules/media_library/src/MediaLibraryUiBuilder.php @@ -285,7 +285,11 @@ protected function buildMediaTypeMenu(MediaLibraryState $state) { protected function buildMediaTypeAddForm(MediaLibraryState $state) { $selected_type_id = $state->getSelectedTypeId(); - if (!$this->entityTypeManager->getAccessControlHandler('media')->createAccess($selected_type_id)) { + $access_handler = $this->entityTypeManager->getAccessControlHandler('media'); + $context = [ + 'media_library_state' => $state, + ]; + if (!$access_handler->createAccess($selected_type_id, NULL, $context)) { return []; } diff --git a/core/modules/media_library/tests/modules/media_library_test/media_library_test.module b/core/modules/media_library/tests/modules/media_library_test/media_library_test.module index 6c001f977138501ead2b01f71850a2bb078aeae0..20a285d53cac767d820c3c77ca3cf5005a74adf5 100644 --- a/core/modules/media_library/tests/modules/media_library_test/media_library_test.module +++ b/core/modules/media_library/tests/modules/media_library_test/media_library_test.module @@ -11,6 +11,18 @@ use Drupal\Core\Session\AccountInterface; use Drupal\media_library_test\Form\TestNodeFormOverride; +/** + * Implements hook_ENTITY_TYPE_create_access(). + */ +function media_library_test_media_create_access(AccountInterface $account, array $context, $entity_bundle) { + if (isset($context['media_library_state'])) { + /** @var \Drupal\media_library\MediaLibraryState $state */ + $state = $context['media_library_state']; + return AccessResult::forbiddenIf($state->getSelectedTypeId() === 'deny_access'); + } + return AccessResult::neutral(); +} + /** * Implements hook_entity_field_access(). */ diff --git a/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php b/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php index 5101c3f6b97ac1d07098b595d3bdea00a5ad582f..6db18eb9c3b197cc78c241adb5069761708998ac 100644 --- a/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php +++ b/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php @@ -11,6 +11,7 @@ use Drupal\image\Entity\ImageStyle; use Drupal\KernelTests\KernelTestBase; use Drupal\media_library\MediaLibraryState; +use Drupal\Tests\media\Traits\MediaTypeCreationTrait; use Drupal\Tests\user\Traits\UserCreationTrait; use Drupal\views\Views; @@ -22,6 +23,7 @@ class MediaLibraryAccessTest extends KernelTestBase { use UserCreationTrait; + use MediaTypeCreationTrait; /** * {@inheritdoc} @@ -368,6 +370,34 @@ public function testViewAccess() { $this->assertAccess($access_result, FALSE, 'The media library view does not exist.'); } + /** + * Tests that the media library respects arbitrary access to the add form. + */ + public function testAddFormAccess(): void { + // Access is denied if the media library is trying to create media whose + // type name is 'deny_access'. Also create a second media type that we *can* + // add, so we can be certain that the add form is otherwise visible. + // @see media_library_test_media_create_access() + $media_types = [ + $this->createMediaType('image', ['id' => 'deny_access'])->id(), + $this->createMediaType('image')->id(), + ]; + + $account = $this->createUser(['create media']); + $this->setCurrentUser($account); + + /** @var \Drupal\media_library\MediaLibraryUiBuilder $ui_builder */ + $ui_builder = $this->container->get('media_library.ui_builder'); + + $state = MediaLibraryState::create('test', $media_types, $media_types[0], 1); + $build = $ui_builder->buildUi($state); + $this->assertEmpty($build['content']['form']); + + $state = MediaLibraryState::create('test', $media_types, $media_types[1], 1); + $build = $ui_builder->buildUi($state); + $this->assertNotEmpty($build['content']['form']); + } + /** * Asserts various aspects of an access result. *