Problem/Motivation

While creating reports for some of the users on one of the sites I'm currently working on, I realized that they should be reachable from the Reports menu, not the Content menu, which is where we've been putting our custom reports up to this point.

When I masqueraded as one of the users (a non-admin user) who would access these reports, I found that some dblog reports were still visible in the menu. This led me to find that the dblog reports' permissions are based on the 'access site reports' permission, which is the same permission used to grant access to the Reports menu item (specifically the system.admin_reports route in web/core/modules/system/system.routing.yml).

There should be a permission specific to the dblog module that grants access to dblog-related reports to prevent users who shouldn't see these reports from being able to see them.

Proposed resolution

I propose the following changes:

  • Add an 'access dblog reports' permission
  • Change the permission requirement on all dblog routes from 'access site reports' to 'access dblog reports'

Remaining tasks

  • Write tests to ensure the 'access dblog reports' permission works as intended.

User interface changes

Users with the 'access site reports' permission but without the 'access dblog reports' permission will no longer be able to access dblog reports. Users who should be able to access these reports will need the 'access dblog reports' permission added to at least one of their assigned roles.

UPDATE!: In the most recent push to the branch I added an update hook that will add the 'access dblog reports' permission to any roles that have the 'access site reports' permission. This way users won't lose access to the reports.

Introduced terminology

None.

API changes

None.

Data model changes

None.

Release notes snippet

  • Added the 'access dblog reports' permission to control access to dblog routes.
  • Updated dblog routes to use the 'access dblog reports' permission.

Issue fork drupal-3493583

Command icon Show commands

Start within a Git clone of the project using the version control instructions.

Or, if you do not have SSH keys set up on git.drupalcode.org:

Comments

jsutta created an issue. See original summary.

jsutta’s picture

Adding a patch for 10.3.x (that's our current branch) in case anyone else can use it.

jsutta’s picture

Assigned: jsutta » Unassigned
Issue summary: View changes
Status: Active » Needs review
jsutta’s picture

Issue summary: View changes
jsutta’s picture

Issue summary: View changes
jsutta’s picture

StatusFileSize
new5.87 KB

Updated the patch as I missed a couple uses of the 'access site reports' permission.

jsutta’s picture

StatusFileSize
new6.19 KB

One more new version of the patch. I forgot to add dblog.permissions.yml to the previous versions.

smustgrave’s picture

Status: Needs review » Needs work
Issue tags: +Needs Review Queue Initiative, +Needs upgrade path tests, +Needs change record

So I wonder if we will need an upgrade hook for the view change, maybe not though since we aren't removing a permission.

The update hook will need test coverage though.

Probably need to expand on the existing tests too that if I have 'access site reports' then I can't access the logs
And other side if I have 'access dblogs reports' then I can still get to the "Reports" tab but it only contains the one link

Appears to have test failures also.

jsutta’s picture

@smustgrave Thank you for the suggestions and I apologize it took me so long to circle back to this.

Here's a summary of the latest changes:

  • Added an update hook to update the Watchdog view if it uses the default permissions (I assume we want to leave it alone if the site owner has customized it).
  • Added test coverage for the update hook (the test coverage checks the permission on the Watchdog view before and after the update).
  • Added test coverage to check if a user with the 'access site reports' permission can see the Reports menu item in the admin toolbar.
  • Added test coverage to check if a user with the 'access dblog reports' permission can access the Recent log messages page.

This is the first time I've written these types of tests, so please double-check them and let me know if anything is missing or incorrect.

Also, I haven't addressed the test failures yet. I hope to do so within the next couple days.

jsutta’s picture

@smustgrave I finally got the tests completed and all are now passing. Would you take another look at it and let me know if any other changes need to be made?

jsutta’s picture

Status: Needs work » Needs review
dagmar’s picture

Status: Needs review » Needs work

@jsutta Thanks for the patch!

There are a few files that are outside dblog but will need an upgrade as well:

Here are a bunch of patters to check:

rg 'dblog' | rg 'access site reports'

modules/update/update.report.inc:  if (\Drupal::moduleHandler()->moduleExists('dblog') && \Drupal::currentUser()->hasPermission('access site reports')) {
modules/system/system.theme.inc:  if (\Drupal::moduleHandler()->moduleExists('dblog') && \Drupal::currentUser()->hasPermission('access site reports')) {
modules/ckeditor5/src/SmartDefaultSettings.php:      $can_access_dblog = ($this->currentUser->hasPermission('access site reports') && $this->moduleHandler->moduleExists('dblog'));
modules/locale/locale.batch.inc:      if (\Drupal::moduleHandler()->moduleExists('dblog') && \Drupal::currentUser()->hasPermission('access site reports')) {
modules/locale/locale.bulk.inc:        if (\Drupal::moduleHandler()->moduleExists('dblog') && \Drupal::currentUser()->hasPermission('access site reports')) {

And the following files reference the dblog routing as well, so it may be worth to check the permissions there:

lib/Drupal/Core/Routing/routing.api.php:1
modules/system/tests/src/Functional/Menu/BreadcrumbTest.php:1
modules/system/tests/src/Functional/File/FileSaveHtaccessLoggingTest.php:1
modules/system/tests/src/Functional/Pager/PagerTest.php:4
modules/migrate_drupal/tests/fixtures/drupal7.php:4
modules/search/tests/src/Functional/SearchNumberMatchingTest.php:1
modules/search/tests/src/Functional/SearchNumbersTest.php:1
modules/search/tests/src/Functional/SearchConfigSettingsFormTest.php:2
modules/user/tests/src/Functional/UserPermissionsTest.php:1
modules/filter/tests/src/Functional/FilterAdminTest.php:2
modules/contact/tests/src/Functional/ContactPersonalTest.php:1
modules/contact/tests/src/Functional/ContactSitewideTest.php:1
tests/fixtures/config_install/multilingual/views.view.watchdog.yml:2
modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php:1
modules/file/tests/src/Functional/SaveUploadTest.php:1
modules/file/tests/src/Functional/SaveUploadFormTest.php:1
tests/Drupal/FunctionalTests/Theme/ClaroTest.php:1
jsutta’s picture

Status: Needs work » Needs review

@dagmar Thank you for the catches! I've added the access dblog reports permission in the other locations where the access site reports was already being used, with one exception:

In modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php: The user in this test is the root user (uid 1), so should implicitly have all permissions. With that in mind there's no need to set the specific permission.

dagmar’s picture

Status: Needs review » Needs work
StatusFileSize
new71.89 KB

Thanks @jsutta Please take a look to the rest of the failing tests in https://git.drupalcode.org/issue/drupal-3493583/-/pipelines/461051

failing tests

jsutta’s picture

Status: Needs work » Needs review

@dagmar Thank you for pointing these out. I believe I've fixed all of the failed tests at this point, but please review the results and let me know if I missed anything.

smustgrave’s picture

Status: Needs review » Needs work
Issue tags: -Needs upgrade path tests

Upgrade path tests seem to be added so removing that tag

Still appears to need a CR so moving to NW for that.

Will let @dagmar do the final review before RTBC as he seems to have more knowledge with this code already.

dagmar’s picture

It seems there is a missing change to do to fix the Nighwatch related tests.

jsutta’s picture

Been picking away at this and I'm at the point where I need some help with the tests.

The only remaining PHPUnit test issues are related to the issue below. I checked the default config for the Watchdog table in views.view.watchdog.yml and found that there's no default class provided. At this point I think fixing this is outside the scope of this issue, but I'm more than happy to fix it if anyone feels it should be included.

The update to add a default table CSS class for view "watchdog" is deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. Profile, module and theme provided configuration should be updated. See <a href="https://www.drupal.org/node/3499943">https://www.drupal.org/node/3499943</a>.

The PHPUnit Functional JavaScript errors are also unrelated:

Behat\Mink\Exception\ExpectationException: The string "Added text format ckeditor5." was not found anywhere in the HTML response of the current page.

As for Nightwatch, the error is below. I don't believe it's related to the changes in this issue:

An error occurred while running .click() command on <input[name="i5byg6bay[administer modules]"]>: element click intercepted: Element <input class="rid-i5byg6bay js-rid-i5byg6bay form-checkbox" data-drupal-selector="edit-i5byg6bay-administer-modules" type="checkbox" id="edit-i5byg6bay-administer-modules" name="i5byg6bay[administer modules]" value="1"> is not clickable at point (674, 52). Other element would receive the click: <th class="checkbox">...</th>

I'm happy to continue digging into the test results, but at this point I don't feel like there's much more I can do.

dagmar’s picture

@jsutta I think the problem here is the way we are updating the Watchdog table. Potentially any other view could be be using the access dblog reports permission and we want to make sure those views are updated as well.

The way this is done is via the ViewsConfigUpdater. See for example this function

Converting the code from dblog_update_112002 into the ViewsConfigUpdater should point you in the right direction.

The test you mentioned are failing because a deprecation triggered by #3045871: Add "Table class" option to views table formatter UI which is caused by how the view is saved.

jsutta’s picture

@dagmar I finally had a chance to take a look at your last suggestion. I haven't used this method to update config before. Would you mind checking my logic to make sure I'm on the right track?

Convert dblog_update_112002 to the following, which would be in dblog.post_update.php:

/**
 * Update view permissions from 'access site reports' to 'access dblog reports'.
 */
function dblog_update_permissions(ViewEntityInterface $view): void {
  $changed = FALSE;
  $displays = $view->get('display');
  
  foreach ($displays as &$display) {
    if (
      isset($display['access']['options']['perm'])
      && $display['access']['options']['perm'] === 'access site reports'
    ) {
      $changed = TRUE;
      $display['access']['options']['perm'] = 'access dblog reports';
    }
  }
  
  if ($changed) {
    $view->set('display', $displays);
  }
}
jsutta’s picture

@here Sorry for all the git spam! I rebased the issue branch against 11.3.x and resolved a bunch of issues from that. I'll see about fixing the remaining test issues so hopefully this can start moving forward again.

Version: 11.x-dev » main

Drupal core is now using the main branch as the primary development branch. New developments and disruptive changes should now be targeted to the main branch.

Read more in the announcement.