Files
gutachten_t3/typo3/sysext/install/Classes/Service/EnableFileService.php
T
2026-10-19 08:18:39 +02:00

195 lines
5.3 KiB
PHP

<?php
namespace TYPO3\CMS\Install\Service;
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
use TYPO3\CMS\Core\Core\Environment;
use TYPO3\CMS\Core\Utility\GeneralUtility;
/**
* Basic Service to check and create install tool files
* @internal This class is only meant to be used within EXT:install and is not part of the TYPO3 Core API.
*/
class EnableFileService
{
/**
* @var string Relative path to ENABLE_INSTALL_TOOL file
*/
const INSTALL_TOOL_ENABLE_FILE_PATH = 'typo3conf/ENABLE_INSTALL_TOOL';
/**
* @var string Relative path to FIRST_INSTALL file
*/
const FIRST_INSTALL_FILE_PATH = 'FIRST_INSTALL';
/**
* @var string Maximum age of ENABLE_INSTALL_TOOL file before it gets removed (in seconds)
*/
const INSTALL_TOOL_ENABLE_FILE_LIFETIME = 3600;
/**
* @return bool
*/
public static function isFirstInstallAllowed()
{
$files = self::getFirstInstallFilePaths();
if (!empty($files)) {
return true;
}
return false;
}
/**
* Creates the INSTALL_TOOL_ENABLE file
*
* @return bool
*/
public static function createInstallToolEnableFile()
{
$installEnableFilePath = self::getInstallToolEnableFilePath();
if (!is_file($installEnableFilePath)) {
$result = touch($installEnableFilePath);
} else {
$result = true;
self::extendInstallToolEnableFileLifetime();
}
GeneralUtility::fixPermissions($installEnableFilePath);
return $result;
}
/**
* Removes the INSTALL_TOOL_ENABLE file
*
* @return bool
*/
public static function removeInstallToolEnableFile()
{
return unlink(self::getInstallToolEnableFilePath());
}
/**
* Removes the FIRST_INSTALL file
*
* @return bool
*/
public static function removeFirstInstallFile()
{
$result = true;
$files = self::getFirstInstallFilePaths();
foreach ($files as $file) {
$result = unlink(Environment::getPublicPath() . '/' . $file) && $result;
}
return $result;
}
/**
* Checks if the install tool file exists
*
* @return bool
*/
public static function installToolEnableFileExists()
{
return @is_file(self::getInstallToolEnableFilePath());
}
/**
* Checks if the install tool file exists
*
* @return bool
*/
public static function checkInstallToolEnableFile()
{
if (!self::installToolEnableFileExists()) {
return false;
}
if (!self::isInstallToolEnableFilePermanent()) {
if (self::installToolEnableFileLifetimeExpired()) {
self::removeInstallToolEnableFile();
return false;
}
self::extendInstallToolEnableFileLifetime();
}
return true;
}
/**
* Checks if the install tool file should be kept
*
* @return bool
*/
public static function isInstallToolEnableFilePermanent()
{
if (self::installToolEnableFileExists()) {
$content = @file_get_contents(self::getInstallToolEnableFilePath());
if (strpos($content, 'KEEP_FILE') !== false) {
return true;
}
}
return false;
}
/**
* Checks if the lifetime of the install tool file is expired
*
* @return bool
*/
public static function installToolEnableFileLifetimeExpired()
{
if (time() - @filemtime(self::getInstallToolEnableFilePath()) > self::INSTALL_TOOL_ENABLE_FILE_LIFETIME) {
return true;
}
return false;
}
/**
* Updates the last modification of the ENABLE_INSTALL_TOOL file
*/
protected static function extendInstallToolEnableFileLifetime()
{
$enableFile = self::getInstallToolEnableFilePath();
// Extend the age of the ENABLE_INSTALL_TOOL file by one hour
if (is_file($enableFile)) {
$couldTouch = @touch($enableFile);
if (!$couldTouch) {
// If we can't remove the creation method will call us again.
if (self::removeInstallToolEnableFile()) {
self::createInstallToolEnableFile();
}
}
}
}
/**
* Returns the path to the INSTALL_TOOL_ENABLE file
*
* @return string
*/
protected static function getInstallToolEnableFilePath()
{
return Environment::getPublicPath() . '/' . self::INSTALL_TOOL_ENABLE_FILE_PATH;
}
/**
* Returns the paths to the FIRST_INSTALL files
*
* @return array
*/
protected static function getFirstInstallFilePaths()
{
$files = array_filter(scandir(Environment::getPublicPath() . '/'), function ($file) {
return @is_file(Environment::getPublicPath() . '/' . $file) && preg_match('~^' . self::FIRST_INSTALL_FILE_PATH . '.*~i', $file);
});
return $files;
}
}