[BUGFIX] Make sys_file_metadata publishable 88/34188/5
authorHelmut Hummel <helmut.hummel@typo3.org>
Fri, 14 Nov 2014 11:14:09 +0000 (12:14 +0100)
committerHelmut Hummel <helmut.hummel@typo3.org>
Mon, 17 Nov 2014 15:07:41 +0000 (16:07 +0100)
Currently sys_file_metadata records that are edited in a workspace
cannot be published because the workspace module does not know
about ignored root level restrictions and these records are on
root level by definition.

Include the root page when searching for workspace records
and show elements for which root level restriction is ignored.

Resolves: #60343
Releases: 6.2, master
Change-Id: I43a273661addff4a4e337bb464eb0cc4fd1fb823
Reviewed-on: http://review.typo3.org/34188
Reviewed-by: Oliver Hader <oliver.hader@typo3.org>
Tested-by: Oliver Hader <oliver.hader@typo3.org>
Reviewed-by: Alex Kellner <alexander.kellner@einpraegsam.net>
Tested-by: Alex Kellner <alexander.kellner@einpraegsam.net>
typo3/sysext/workspaces/Classes/Service/WorkspaceService.php

index d6c0ea8..ece24ff 100644 (file)
@@ -238,6 +238,10 @@ class WorkspaceService implements \TYPO3\CMS\Core\SingletonInterface {
         * @return array
         */
        protected function selectAllVersionsFromPages($table, $pageList, $wsid, $filter, $stage, $language = NULL) {
+               // Include root level page as there might be some records with where root level restriction is ignored (e.g. FAL records)
+               if ($pageList !== '' && BackendUtility::isRootLevelRestrictionIgnored($table)) {
+                       $pageList .= ',0';
+               }
                $isTableLocalizable = BackendUtility::isTableLocalizable($table);
                $languageParentField = '';
                // If table is not localizable, but localized reocrds shall
@@ -414,12 +418,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;
                                }
                        }
@@ -428,6 +430,27 @@ class WorkspaceService implements \TYPO3\CMS\Core\SingletonInterface {
        }
 
        /**
+        * 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.
         *
         * @param string $table Name of the table
@@ -435,7 +458,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 {
@@ -451,7 +473,6 @@ class WorkspaceService implements \TYPO3\CMS\Core\SingletonInterface {
         * @return bool
         */
        static public function isOldStyleWorkspaceUsed() {
-               $oldStyleWorkspaceIsUsed = FALSE;
                $cacheKey = 'workspace-oldstyleworkspace-notused';
                $cacheResult = $GLOBALS['BE_USER']->getSessionData($cacheKey);
                if (!$cacheResult) {