2 namespace TYPO3\CMS\Install\Controller\Action\Tool;
19 use TYPO3\CMS\Install\Controller\Action;
44 if (isset($this->postValues[
'set'][
'clearTables'])) {
45 $this->actionMessages[] = $this->clearSelectedTables();
46 $this->view->assign(
'postAction',
'clearTables');
48 if (isset($this->postValues[
'set'][
'resetBackendUserUc'])) {
49 $this->actionMessages[] = $this->resetBackendUserUc();
50 $this->view->assign(
'postAction',
'resetBackendUserUc');
52 if (isset($this->postValues[
'set'][
'clearProcessedFiles'])) {
53 $this->actionMessages[] = $this->clearProcessedFiles();
54 $this->view->assign(
'postAction',
'clearProcessedFiles');
56 if (isset($this->postValues[
'set'][
'deleteTypo3TempFiles'])) {
57 $this->view->assign(
'postAction',
'deleteTypo3TempFiles');
63 $this->view->assign(
'typo3TempData', $typo3TempData);
65 $this->view->assign(
'actionMessages', $this->actionMessages);
66 return $this->view->render();
76 $tableCandidates = array(
78 'name' =>
'be_sessions',
79 'description' =>
'Backend user sessions'
82 'name' =>
'cache_md5params',
83 'description' =>
'Frontend redirects',
86 'name' =>
'fe_sessions',
87 'description' =>
'Frontend user sessions',
90 'name' =>
'fe_session_data',
91 'description' =>
'Frontend user session data',
94 'name' =>
'sys_history',
95 'description' =>
'Tracking of database record changes through TYPO3 backend forms',
98 'name' =>
'sys_lockedrecords',
99 'description' =>
'Record locking of backend user editing',
103 'description' =>
'General log table',
106 'name' =>
'sys_preview',
107 'description' =>
'Workspace preview links',
110 'name' =>
'tx_extensionmanager_domain_model_extension',
111 'description' =>
'List of TER extensions',
114 'name' =>
'tx_rsaauth_keys',
115 'description' =>
'Login process key storage'
118 $database = $this->getDatabaseConnection();
119 $allTables = array_keys($database->admin_get_tables());
121 foreach ($tableCandidates as $candidate) {
122 if (in_array($candidate[
'name'], $allTables)) {
123 $candidate[
'rows'] = $database->exec_SELECTcountRows(
'*', $candidate[
'name']);
124 $tables[] = $candidate;
135 protected function clearSelectedTables()
137 $clearedTables = array();
138 $database = $this->getDatabaseConnection();
139 if (isset($this->postValues[
'values']) && is_array($this->postValues[
'values'])) {
140 foreach ($this->postValues[
'values'] as $tableName => $selected) {
141 if ($selected == 1) {
142 $database->exec_TRUNCATEquery($tableName);
143 $clearedTables[] = $tableName;
147 if (!empty($clearedTables)) {
149 $message = $this->objectManager->get(OkStatus::class);
150 $message->setTitle(
'Cleared tables');
151 $message->setMessage(
'List of cleared tables: ' . implode(
', ', $clearedTables));
154 $message = $this->objectManager->get(InfoStatus::class);
155 $message->setTitle(
'No tables selected to clear');
165 protected function resetBackendUserUc()
167 $database = $this->getDatabaseConnection();
168 $database->exec_UPDATEquery(
'be_users',
'', array(
'uc' =>
''));
170 $message = $this->objectManager->get(OkStatus::class);
171 $message->setTitle(
'Reset all backend users preferences');
183 $pathTypo3Temp= PATH_site .
'typo3temp/';
190 $numberOfFilesToDelete = 0;
192 $numberOfFilesToDelete =
$postValues[
'numberOfFiles'];
203 $timeMap = array(
'day' => 1,
'week' => 7,
'month' => 30);
204 $directory = @dir($pathTypo3Temp . $subDirectory);
205 if (is_object($directory)) {
206 while ($entry = $directory->read()) {
207 $absoluteFile = $pathTypo3Temp . $subDirectory .
'/' . $entry;
208 if (@is_file($absoluteFile)) {
213 if (filesize($absoluteFile) > $condition * 1024) {
217 if (fileatime($absoluteFile) <
$GLOBALS[
'EXEC_TIME'] - (int)$timeMap[$condition] * 60 * 60 * 24) {
225 $hashPart = substr(basename($absoluteFile), -14, 10);
228 !preg_match(
'/[^a-f0-9]/', $hashPart)
229 || substr($absoluteFile, -6) ===
'.cache'
230 || substr($absoluteFile, -4) ===
'.tbl'
231 || substr($absoluteFile, -4) ===
'.css'
232 || substr($absoluteFile, -3) ===
'.js'
233 || substr($absoluteFile, -5) ===
'.gzip'
234 || substr(basename($absoluteFile), 0, 8) ===
'installTool'
236 if ($numberOfFilesToDelete && $deleteCounter < $numberOfFilesToDelete) {
238 unlink($absoluteFile);
248 $data[
'numberOfFilesMatchingCriteria'] = $criteriaMatch;
249 $data[
'numberOfDeletedFiles'] = $deleteCounter;
251 if ($deleteCounter > 0) {
252 $message = $this->objectManager->get(OkStatus::class);
253 $message->setTitle(
'Deleted ' . $deleteCounter .
' files from typo3temp/' . $subDirectory .
'/');
254 $this->actionMessages[] = $message;
257 $data[
'selectedCondition'] = $condition;
258 $data[
'numberOfFiles'] = $numberOfFilesToDelete;
259 $data[
'selectedSubDirectory'] = $subDirectory;
262 $data[
'subDirectories'] = array(
268 $directories = dir($pathTypo3Temp);
269 if (is_object($directories)) {
270 while ($entry = $directories->read()) {
271 if (is_dir($pathTypo3Temp . $entry) && $entry !=
'..' && $entry !=
'.') {
272 $data[
'subDirectories'][$entry][
'name'] = $entry;
274 $data[
'subDirectories'][$entry][
'selected'] =
false;
275 if ($entry === $data[
'selectedSubDirectory']) {
276 $data[
'subDirectories'][$entry][
'selected'] =
true;
281 $data[
'numberOfFilesInSelectedDirectory'] = $data[
'subDirectories'][$data[
'selectedSubDirectory']][
'filesNumber'];
293 protected function clearProcessedFiles()
296 $GLOBALS[
'TYPO3_DB'] = $this->getDatabaseConnection();
299 $failedDeletions = $repository->removeAll();
300 if ($failedDeletions) {
302 $message = $this->objectManager->get(ErrorStatus::class);
303 $message->setTitle(
'Failed to delete ' . $failedDeletions .
' processed files. See TYPO3 log (by default typo3temp/logs/typo3_*.log)');
306 $message = $this->objectManager->get(OkStatus::class);
307 $message->setTitle(
'Cleared processed files');