Skip to content
Snippets Groups Projects
Verified Commit 8a4467d5 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3411837 by larowlan, longwave, catch, uditrawat, marcoscano,...

Issue #3411837 by larowlan, longwave, catch, uditrawat, marcoscano, smustgrave, cilefen, greggles: Media revision listing is accessible to anonymous users

(cherry picked from commit 8f3f3749)
parent 1a28e2e1
Branches
Tags
15 merge requests!8376Drupal views: adding more granularity to the ‘use ajax’ functionality,!8300Issue #3443586 View area displays even when parent view has no results.,!7567Issue #3153723 by quietone, Hardik_Patel_12: Change the scaffolding...,!7565Issue #3153723 by quietone, Hardik_Patel_12: Change the scaffolding...,!7509Change label "Block description" to "Block type",!7344Issue #3292350 by O'Briat, KlemenDEV, hswong3i, smustgrave, quietone: Update...,!6922Issue #3412959 by quietone, smustgrave, longwave: Fix 12 'un' words,!6848Issue #3417553 by longwave: Remove withConsecutive() in CacheCollectorTest,!6720Revert "Issue #3358581 by pfrenssen, _tarik_, a.dmitriiev, smustgrave:...,!6560Update ClaroPreRender.php, confirming classes provided are in array format,!6528Issue #3414261 by catch: Add authenticated user umami performance tests,!6501Issue #3263668 by omkar-pd, Wim Leers, hooroomoo: Re-enable inline form errors...,!6354Draft: Issue #3380392 by phma: Updating language weight from the overview reverts label if translated,!6324Issue #3416723 by Ludo.R: Provide a "node type" views default argument,!6119Issue #3405704 by Spokje, longwave: symfony/psr-http-message-bridge major version bump
Pipeline #71456 passed with warnings
Pipeline: drupal

#71488

    Pipeline: drupal

    #71475

      Pipeline: drupal

      #71468

        +1
        ...@@ -50,6 +50,7 @@ public static function createInstance(ContainerInterface $container, EntityTypeI ...@@ -50,6 +50,7 @@ public static function createInstance(ContainerInterface $container, EntityTypeI
        * {@inheritdoc} * {@inheritdoc}
        */ */
        protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) { protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) {
        /** @var \Drupal\media\MediaInterface $entity */
        // Allow admin permission to override all operations. // Allow admin permission to override all operations.
        if ($account->hasPermission($this->entityType->getAdminPermission())) { if ($account->hasPermission($this->entityType->getAdminPermission())) {
        return AccessResult::allowed()->cachePerPermissions(); return AccessResult::allowed()->cachePerPermissions();
        ...@@ -121,18 +122,17 @@ protected function checkAccess(EntityInterface $entity, $operation, AccountInter ...@@ -121,18 +122,17 @@ protected function checkAccess(EntityInterface $entity, $operation, AccountInter
        case 'view all revisions': case 'view all revisions':
        case 'view revision': case 'view revision':
        if ($account->hasPermission('view any ' . $type . ' media revisions') || $account->hasPermission("view all media revisions")) { if ($account->hasPermission('view any ' . $type . ' media revisions') || $account->hasPermission("view all media revisions")) {
        return AccessResult::allowed()->cachePerPermissions(); // Check the access to this revision and if the media passed in is not
        } // the default revision then access to that too.
        $entity_access = $entity->access('view', $account, TRUE);
        if (!$entity->isDefaultRevision()) {
        $media_storage = $this->entityTypeManager->getStorage($entity->getEntityTypeId());
        $entity_access->andIf($this->access($media_storage->load($entity->id()), 'view', $account, TRUE));
        }
        // First check the access to the default revision and finally, if the return AccessResult::allowed()->cachePerPermissions()->andIf($entity_access);
        // media passed in is not the default revision then access to that,
        // too.
        $media_storage = $this->entityTypeManager->getStorage($entity->getEntityTypeId());
        $access = $this->access($media_storage->load($entity->id()), 'view', $account, TRUE);
        if (!$entity->isDefaultRevision()) {
        $access = $access->andIf($this->access($entity, 'view', $account, TRUE));
        } }
        return $access->cachePerPermissions()->addCacheableDependency($entity); return AccessResult::neutral()->cachePerPermissions();
        case 'revert': case 'revert':
        return AccessResult::allowedIfHasPermission($account, 'revert any ' . $type . ' media revisions') return AccessResult::allowedIfHasPermission($account, 'revert any ' . $type . ' media revisions')
        ......
        ...@@ -106,7 +106,9 @@ public function testMediaAccess() { ...@@ -106,7 +106,9 @@ public function testMediaAccess() {
        $this->assertNoCacheContext('user'); $this->assertNoCacheContext('user');
        $this->assertCacheContext('user.permissions'); $this->assertCacheContext('user.permissions');
        $assert_session->statusCodeEquals(200); $assert_session->statusCodeEquals(200);
        $user_media->setUnpublished()->save(); $previous_revision = $user_media->getLoadedRevisionId();
        $user_media->setUnpublished()->setNewRevision();
        $user_media->save();
        $this->drupalGet('media/' . $user_media->id()); $this->drupalGet('media/' . $user_media->id());
        $this->assertCacheContext('user.permissions'); $this->assertCacheContext('user.permissions');
        $assert_session->statusCodeEquals(403); $assert_session->statusCodeEquals(403);
        ...@@ -117,6 +119,43 @@ public function testMediaAccess() { ...@@ -117,6 +119,43 @@ public function testMediaAccess() {
        $this->assertCacheContext('user'); $this->assertCacheContext('user');
        $assert_session->statusCodeEquals(200); $assert_session->statusCodeEquals(200);
        // Test revision access - logged-in user.
        $this->grantPermissions($role, ['view all media revisions']);
        $this->drupalGet('media/' . $user_media->id() . '/revisions');
        $this->assertCacheContext('user');
        $assert_session->statusCodeEquals(200);
        $this->drupalGet('media/' . $user_media->id() . '/revisions/' . $user_media->getRevisionId() . '/view');
        $this->assertCacheContext('user');
        $assert_session->statusCodeEquals(200);
        $this->drupalGet('media/' . $user_media->id() . '/revisions/' . $previous_revision . '/view');
        $this->assertCacheContext('user.permissions');
        $assert_session->statusCodeEquals(200);
        $role->revokePermission('view own unpublished media')->save();
        $this->drupalGet('media/' . $user_media->id() . '/revisions/' . $user_media->getRevisionId() . '/view');
        $this->assertCacheContext('user.permissions');
        $assert_session->statusCodeEquals(403);
        $user_media->setPublished()->setNewRevision();
        $user_media->save();
        // Revision access - logged-out user.
        $this->drupalLogout();
        $this->drupalGet('media/' . $user_media->id() . '/revisions');
        $assert_session->statusCodeEquals(403);
        $this->drupalGet('media/' . $user_media->id() . '/revisions/' . $user_media->getRevisionId() . '/view');
        $assert_session->statusCodeEquals(403);
        $this->drupalGet('media/' . $user_media->id() . '/revisions/' . $previous_revision . '/view');
        $assert_session->statusCodeEquals(403);
        // Reverse revision access testing changes.
        $role
        ->revokePermission('view all media revisions')
        ->grantPermission('view own unpublished media')
        ->save();
        $user_media->setPublished()->setNewRevision();
        $user_media->save();
        $this->drupalLogin($this->nonAdminUser);
        // Test 'create media' permission. // Test 'create media' permission.
        $this->drupalGet('media/add/' . $media_type->id()); $this->drupalGet('media/add/' . $media_type->id());
        $this->assertCacheContext('user.permissions'); $this->assertCacheContext('user.permissions');
        ......
        ...@@ -83,7 +83,6 @@ public function testRevisions() { ...@@ -83,7 +83,6 @@ public function testRevisions() {
        // Test 'view all media revisions' permission ('view media' permission is // Test 'view all media revisions' permission ('view media' permission is
        // needed as well). // needed as well).
        user_role_revoke_permissions($role->id(), [ user_role_revoke_permissions($role->id(), [
        'view media',
        'view all media revisions', 'view all media revisions',
        ]); ]);
        $this->drupalGet($media->toUrl('revision')); $this->drupalGet($media->toUrl('revision'));
        ......
        ...@@ -245,7 +245,6 @@ protected function getExpectedNormalizedEntity() { ...@@ -245,7 +245,6 @@ protected function getExpectedNormalizedEntity() {
        'url' => base_path() . 'user/' . $author->id(), 'url' => base_path() . 'user/' . $author->id(),
        ], ],
        ], ],
        'revision_log_message' => [],
        'revision_translation_affected' => [ 'revision_translation_affected' => [
        [ [
        'value' => TRUE, 'value' => TRUE,
        ......
        ...@@ -483,7 +483,7 @@ public function providerAccess() { ...@@ -483,7 +483,7 @@ public function providerAccess() {
        'view all revisions', 'view all revisions',
        AccessResult::neutral(), AccessResult::neutral(),
        ['user.permissions'], ['user.permissions'],
        ['media:1'], [],
        TRUE, TRUE,
        ]; ];
        $test_data['admins can view all revisions'] = [ $test_data['admins can view all revisions'] = [
        ...@@ -496,12 +496,12 @@ public function providerAccess() { ...@@ -496,12 +496,12 @@ public function providerAccess() {
        TRUE, TRUE,
        ]; ];
        $test_data['view all revisions with view bundle permission'] = [ $test_data['view all revisions with view bundle permission'] = [
        ['view any test media revisions'], ['view any test media revisions', 'view media'],
        [], ['status' => TRUE],
        'view all revisions', 'view all revisions',
        AccessResult::allowed(), AccessResult::allowed(),
        ['user.permissions'], ['user.permissions'],
        [], ['media:1'],
        TRUE, TRUE,
        ]; ];
        // Revert revisions: // Revert revisions:
        ...@@ -769,10 +769,7 @@ public function testRevisionLogFieldAccess(): void { ...@@ -769,10 +769,7 @@ public function testRevisionLogFieldAccess(): void {
        $entity->save(); $entity->save();
        $this->assertTrue($entity->get('revision_log_message')->access('view', $admin)); $this->assertTrue($entity->get('revision_log_message')->access('view', $admin));
        $this->assertTrue($entity->get('revision_log_message')->access('view', $editor)); $this->assertTrue($entity->get('revision_log_message')->access('view', $editor));
        // revision_log_message field access can be granted with the "view revision" $this->assertFalse($entity->get('revision_log_message')->access('view', $viewer));
        // operation. "view revision" access is granted if the user is allowed to
        // view the default revision of the media entity.
        $this->assertTrue($entity->get('revision_log_message')->access('view', $viewer));
        $entity->setUnpublished()->save(); $entity->setUnpublished()->save();
        \Drupal::entityTypeManager()->getAccessControlHandler('media')->resetCache(); \Drupal::entityTypeManager()->getAccessControlHandler('media')->resetCache();
        $this->assertFalse($entity->get('revision_log_message')->access('view', $viewer)); $this->assertFalse($entity->get('revision_log_message')->access('view', $viewer));
        ......
        0% Loading or .
        You are about to add 0 people to the discussion. Proceed with caution.
        Please register or to comment