diff --git a/typo3/sysext/workspaces/Classes/Service/WorkspaceService.php b/typo3/sysext/workspaces/Classes/Service/WorkspaceService.php index d6c0ea8c340943d1baf4b116ebf01779d8e15d4c..9b0c50717d96e2076e9c7f3994bd9ba46d2013b0 100644 --- a/typo3/sysext/workspaces/Classes/Service/WorkspaceService.php +++ b/typo3/sysext/workspaces/Classes/Service/WorkspaceService.php @@ -187,13 +187,14 @@ class WorkspaceService implements \TYPO3\CMS\Core\SingletonInterface { $wsid = (int)$wsid; $filter = (int)$filter; $output = array(); + // Include root level page as there might be some records with where root level restriction is ignored (e.g. FAL records) + $pageList = '0,'; // Contains either nothing or a list with live-uids if ($pageId != -1 && $recursionLevel > 0) { - $pageList = $this->getTreeUids($pageId, $wsid, $recursionLevel); + $pageList .= $this->getTreeUids($pageId, $wsid, $recursionLevel); } elseif ($pageId != -1) { - $pageList = $pageId; + $pageList .= $pageId; } else { - $pageList = ''; // check if person may only see a "virtual" page-root $mountPoints = array_map('intval', $GLOBALS['BE_USER']->returnWebmounts()); $mountPoints = array_unique($mountPoints); @@ -202,7 +203,7 @@ class WorkspaceService implements \TYPO3\CMS\Core\SingletonInterface { foreach ($mountPoints as $mountPoint) { $tempPageIds[] = $this->getTreeUids($mountPoint, $wsid, $recursionLevel); } - $pageList = implode(',', $tempPageIds); + $pageList .= implode(',', $tempPageIds); } } // Traversing all tables supporting versioning: @@ -414,12 +415,10 @@ class WorkspaceService implements \TYPO3\CMS\Core\SingletonInterface { * @return array */ protected function filterPermittedElements($recs, $table) { - $checkField = $table == 'pages' ? 'uid' : 'wspid'; $permittedElements = array(); if (is_array($recs)) { foreach ($recs as $rec) { - $page = BackendUtility::getRecord('pages', $rec[$checkField], 'uid,pid,perms_userid,perms_user,perms_groupid,perms_group,perms_everybody'); - if ($GLOBALS['BE_USER']->doesUserHaveAccess($page, 1) && $this->isLanguageAccessibleForCurrentUser($table, $rec)) { + if ($this->isPageAccessibleForCurrentUser($table, $rec) && $this->isLanguageAccessibleForCurrentUser($table, $rec)) { $permittedElements[] = $rec; } } @@ -427,6 +426,27 @@ class WorkspaceService implements \TYPO3\CMS\Core\SingletonInterface { return $permittedElements; } + /** + * Checking access to the page the record is on, respecting ignored root level restrictions + * + * @param string $table Name of the table + * @param array $record Record row to be checked + * @return bool + */ + protected function isPageAccessibleForCurrentUser($table, array $record) { + $pageIdField = $table == 'pages' ? 'uid' : 'wspid'; + $pageId = isset($record[$pageIdField]) ? (int)$record[$pageIdField] : NULL; + if ($pageId === NULL) { + return FALSE; + } + if ($pageId === 0 && BackendUtility::isRootLevelRestrictionIgnored($table)) { + return TRUE; + } + $page = BackendUtility::getRecord('pages', $pageId, 'uid,pid,perms_userid,perms_user,perms_groupid,perms_group,perms_everybody'); + + return $GLOBALS['BE_USER']->doesUserHaveAccess($page, 1); + } + /** * Check current be users language access on given record. * @@ -435,7 +455,6 @@ class WorkspaceService implements \TYPO3\CMS\Core\SingletonInterface { * @return bool */ protected function isLanguageAccessibleForCurrentUser($table, array $record) { - $languageUid = 0; if (BackendUtility::isTableLocalizable($table)) { $languageUid = $record[$GLOBALS['TCA'][$table]['ctrl']['languageField']]; } else {