[BUGFIX] Migration of CTypes to textmedia misses explicitAllow flags 58/44558/7
authorPatrick Schriner <patrick.schriner@diemedialen.de>
Thu, 5 Nov 2015 17:05:57 +0000 (18:05 +0100)
committerFrans Saris <franssaris@gmail.com>
Tue, 10 Nov 2015 11:42:54 +0000 (12:42 +0100)
While the content is migrated, the access rights for restricted users
are not adapted. The migration is adapted accordingly.

Resolves: #71351
Related: #67954
Releases: master
Change-Id: Ib0e1971526a0c1f4322f9a0a901e983f27666f06
Reviewed-on: https://review.typo3.org/44558
Reviewed-by: Nicole Cordes <typo3@cordes.co>
Tested-by: Nicole Cordes <typo3@cordes.co>
Reviewed-by: Patrick Schriner <patrick.schriner@diemedialen.de>
Tested-by: Patrick Schriner <patrick.schriner@diemedialen.de>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Frans Saris <franssaris@gmail.com>
Tested-by: Frans Saris <franssaris@gmail.com>
typo3/sysext/install/Classes/Updates/ContentTypesToTextMediaUpdate.php

index ccb1ee1..b6c64f5 100644 (file)
@@ -56,7 +56,9 @@ class ContentTypesToTextMediaUpdate extends AbstractUpdate
 
         $description = 'The extension "fluid_styled_content" is using a new CType, textmedia, ' .
             'which replaces the CTypes text, image and textpic. ' .
-            'This update wizard migrates these old CTypes to the new one in the database.';
+            'This update wizard migrates these old CTypes to the new one in the database. ' .
+            'If backend groups have the explicit deny/allow flag set for any of the old CTypes, ' .
+            'the according flag for the CType textmedia is set as well.';
 
         return $updateNeeded;
     }
@@ -71,18 +73,19 @@ class ContentTypesToTextMediaUpdate extends AbstractUpdate
     public function performUpdate(array &$databaseQueries, &$customMessages)
     {
         $databaseConnection = $this->getDatabaseConnection();
+        $databaseConnection->store_lastBuiltQuery = true;
 
         // Update 'text' records
-        $query = '
-                       UPDATE tt_content
-                       SET tt_content.CType = \'textmedia\'
-                       WHERE
-                       tt_content.CType = \'text\'
-               ';
-        $databaseConnection->sql_query($query);
+        $databaseConnection->exec_UPDATEquery(
+            'tt_content',
+            'tt_content.CType=' . $databaseConnection->fullQuoteStr('text', 'tt_content'),
+            [
+                'CType' => 'textmedia',
+            ]
+        );
 
         // Store last executed query
-        $databaseQueries[] = str_replace(chr(10), ' ', $query);
+        $databaseQueries[] = str_replace(chr(10), ' ', $databaseConnection->debug_lastBuiltQuery);
         // Check for errors
         if ($databaseConnection->sql_error()) {
             $customMessages = 'SQL-ERROR: ' . htmlspecialchars($databaseConnection->sql_error());
@@ -91,19 +94,18 @@ class ContentTypesToTextMediaUpdate extends AbstractUpdate
 
         // Update 'textpic' and 'image' records
         $query = '
-                       UPDATE tt_content
-                       LEFT JOIN sys_file_reference
-                       ON sys_file_reference.uid_foreign = tt_content.uid
-                       AND sys_file_reference.tablenames =\'tt_content\'
-                       AND sys_file_reference.fieldname = \'image\'
-                       SET tt_content.CType = \'textmedia\',
-                       tt_content.assets = image,
-                       tt_content.image = 0,
-                       sys_file_reference.fieldname = \'assets\'
-                       WHERE
-                       tt_content.CType = \'textpic\'
-                       OR tt_content.CType = \'image\'
-               ';
+            UPDATE tt_content
+            LEFT JOIN sys_file_reference
+            ON sys_file_reference.uid_foreign=tt_content.uid
+            AND sys_file_reference.tablenames=' . $databaseConnection->fullQuoteStr('tt_content', 'sys_file_reference')
+            . ' AND sys_file_reference.fieldname=' . $databaseConnection->fullQuoteStr('image', 'sys_file_reference')
+            . ' SET tt_content.CType=' . $databaseConnection->fullQuoteStr('textmedia', 'tt_content')
+            . ', tt_content.assets=tt_content.image,
+            tt_content.image=0,
+            sys_file_reference.fieldname=' . $databaseConnection->fullQuoteStr('assets', 'tt_content')
+            . ' WHERE
+            tt_content.CType=' . $databaseConnection->fullQuoteStr('textpic', 'tt_content')
+            . ' OR tt_content.CType=' . $databaseConnection->fullQuoteStr('image', 'tt_content');
         $databaseConnection->sql_query($query);
 
         // Store last executed query
@@ -114,6 +116,42 @@ class ContentTypesToTextMediaUpdate extends AbstractUpdate
             return false;
         }
 
+        // Update explicitDeny - ALLOW
+        $databaseConnection->exec_UPDATEquery(
+            'be_groups',
+            '(explicit_allowdeny LIKE ' . $databaseConnection->fullQuoteStr('%' . $databaseConnection->escapeStrForLike('tt_content:CType:textpic:ALLOW', 'tt_content') . '%', 'tt_content')
+                . ' OR explicit_allowdeny LIKE ' . $databaseConnection->fullQuoteStr('%' . $databaseConnection->escapeStrForLike('tt_content:CType:image:ALLOW', 'tt_content') . '%', 'tt_content')
+                . ' OR explicit_allowdeny LIKE ' . $databaseConnection->fullQuoteStr('%' . $databaseConnection->escapeStrForLike('tt_content:CType:text:ALLOW', 'tt_content') . '%', 'tt_content')
+                . ') AND explicit_allowdeny NOT LIKE ' . $databaseConnection->fullQuoteStr('%' . $databaseConnection->escapeStrForLike('tt_content:CType:textmedia:ALLOW', 'tt_content') . '%', 'tt_content'),
+            [
+                'explicit_allowdeny' => 'CONCAT(explicit_allowdeny,' . $databaseConnection->fullQuoteStr(',tt_content:CType:textmedia:ALLOW', 'tt_content') . ')',
+            ],
+            [
+                'explicit_allowdeny',
+            ]
+        );
+
+        // Store last executed query
+        $databaseQueries[] = str_replace(chr(10), ' ', $databaseConnection->debug_lastBuiltQuery);
+
+        // Update explicitDeny - DENY
+        $databaseConnection->exec_UPDATEquery(
+            'be_groups',
+            '(explicit_allowdeny LIKE ' . $databaseConnection->fullQuoteStr('%' . $databaseConnection->escapeStrForLike('tt_content:CType:textpic:DENY', 'tt_content') . '%', 'tt_content')
+                . ' OR explicit_allowdeny LIKE ' . $databaseConnection->fullQuoteStr('%' . $databaseConnection->escapeStrForLike('tt_content:CType:image:DENY', 'tt_content') . '%', 'tt_content')
+                . ' OR explicit_allowdeny LIKE ' . $databaseConnection->fullQuoteStr('%' . $databaseConnection->escapeStrForLike('tt_content:CType:text:DENY', 'tt_content') . '%', 'tt_content')
+                . ') AND explicit_allowdeny NOT LIKE ' . $databaseConnection->fullQuoteStr('%' . $databaseConnection->escapeStrForLike('tt_content:CType:textmedia:DENY', 'tt_content') . '%', 'tt_content'),
+            [
+                'explicit_allowdeny' => 'CONCAT(explicit_allowdeny,' . $databaseConnection->fullQuoteStr(',tt_content:CType:textmedia:DENY', 'tt_content') . ')',
+            ],
+            [
+                'explicit_allowdeny',
+            ]
+        );
+
+        // Store last executed query
+        $databaseQueries[] = str_replace(chr(10), ' ', $databaseConnection->debug_lastBuiltQuery);
+
         $this->markWizardAsDone();
 
         return true;