Unverified Commit 16edf0a2 authored by Lee Rowlands's avatar Lee Rowlands
Browse files

Issue #3224530 by phenaproxima, effulgentsia: Pass the media library state object to createAccess()

parent 65fb3829
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -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 [];
    }

+12 −0
Original line number Diff line number Diff line
@@ -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().
 */
+30 −0
Original line number Diff line number Diff line
@@ -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.
   *