Commit 65625e63 authored by catch's avatar catch
Browse files

Issue #3447881 by plopesc, catch, larowlan, smustgrave, quietone: Improve...

Issue #3447881 by plopesc, catch, larowlan, smustgrave, quietone: Improve access logic for Navigation blocks page

(cherry picked from commit d7f114cd)
parent 39239159
Loading
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
access navigation:
  title: 'Access navigation bar'
administer navigation_block:
  title: 'Administer navigation blocks'
configure navigation layout:
  title: 'Configure navigation layout'
+28 −0
Original line number Diff line number Diff line
<?php

/**
 * @file
 * Post update functions for the Navigation module.
 */

use Drupal\Core\Config\Entity\ConfigEntityUpdater;
use Drupal\user\RoleInterface;

/**
 * Grants navigation specific permission to roles with access to any layout.
 */
function navigation_post_update_update_permissions(array &$sandbox) {
  \Drupal::classResolver(ConfigEntityUpdater::class)->update($sandbox, 'user_role', function (RoleInterface $role) {
    $needs_save = FALSE;
    if ($role->hasPermission('configure any layout')) {
      $role->grantPermission('configure navigation layout');
      $needs_save = TRUE;
    }
    if ($role->hasPermission('administer navigation_block')) {
      $role->revokePermission('administer navigation_block');
      $role->grantPermission('configure navigation layout');
      $needs_save = TRUE;
    }
    return $needs_save;
  });
}
+10 −7
Original line number Diff line number Diff line
@@ -30,12 +30,15 @@
 *
 * @internal The navigation module is experimental.
 */
#[SectionStorage(id: "navigation", context_definitions: [
#[SectionStorage(id: "navigation",
  context_definitions: [
    "navigation" => new ContextDefinition(
      data_type: "string",
      label: new TranslatableMarkup("Navigation flag"),
    ),
])]
  ],
  handles_permission_check: TRUE,
)]
final class NavigationSectionStorage extends PluginBase implements SectionStorageInterface, SectionStorageLocalTaskProviderInterface, ContainerFactoryPluginInterface, CacheableDependencyInterface {

  const STORAGE_ID = 'navigation.block_layout';
@@ -184,7 +187,7 @@ public function getRedirectUrl(): Url {
   * {@inheritdoc}
   */
  public function access($operation, AccountInterface $account = NULL, $return_as_object = FALSE): AccessResultInterface | bool {
    $result = AccessResult::allowed();
    $result = AccessResult::allowedIfHasPermission($account, 'configure navigation layout');
    return $return_as_object ? $result : $result->isAllowed();
  }

+1 −1
Original line number Diff line number Diff line
@@ -103,7 +103,7 @@ public function testNavigationBlock() {
      'access shortcuts',
      'administer site configuration',
      'access administration pages',
      'configure any layout',
      'configure navigation layout',
    ]);

    // Create two different users with the same role to assert that the second
+0 −2
Original line number Diff line number Diff line
@@ -51,12 +51,10 @@ protected function setUp(): void {
    parent::setUp();
    // Create and log in an administrative user.
    $this->adminUser = $this->drupalCreateUser([
      'administer navigation_block',
      'administer site configuration',
      'access administration pages',
      'access navigation',
      'bypass node access',
      'configure any layout',
    ]);
    $this->drupalLogin($this->adminUser);

Loading