Project

General

Profile

Actions

Bug #88118

open

Loose reference while remove items from a tree based on a callback in PageTreeRepository

Added by Steve Lenz about 5 years ago. Updated about 1 year ago.

Status:
Under Review
Priority:
Must have
Assignee:
Category:
Authentication
Target version:
-
Start date:
2019-04-09
Due date:
% Done:

0%

Estimated time:
TYPO3 Version:
9
PHP Version:
7.2
Tags:
Complexity:
Is Regression:
Sprint Focus:

Description

Hook "$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_userauthgroup.php']['calcPerms']" in BackendUserAuthentication has no effect.

The bug is in PageTreeRepository::applyCallbackToChildren in line 145:

/**
     * Removes items from a tree based on a callback, usually used for permission checks
     *
     * @param array $tree
     * @param callable $callback
     */
    protected function applyCallbackToChildren(array &$tree, callable $callback)
    {
        if (!isset($tree['_children'])) {
            return;
        }
        foreach ($tree['_children'] as $k => $childPage) {
            if (!call_user_func_array($callback, [$childPage])) {
                unset($tree['_children'][$k]);
                continue;
            }
            $this->applyCallbackToChildren($childPage, $callback);
        }
    }

The unset does not effect on _children array, because the iteration ignores the reference.

The solution to set reference for $childPage:

foreach ($tree['_children'] as $k => &$childPage) {
...
}

Related issues 1 (0 open1 closed)

Has duplicate TYPO3 Core - Bug #88257: Pages below first menu level visible in pagetree even if the backend user has no permissionsClosed2019-05-02

Actions
Actions

Also available in: Atom PDF