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 a static directory path that is suitable to be presented to * unauthenticated visitors, in order to circumvent "Full Path Disclosure" issues. * This is just used for display purposes. */ public static function getStaticLocationForInstallToolEnableFileDirectory(): string { return Environment::isComposerMode() ? 'var/transient/' : 'typo3conf/'; } public static function getBestLocationForInstallToolEnableFile(): string { return self::getTransientPath() . '/' . self::INSTALL_TOOL_ENABLE_FILE_PATH; } /** * Based on composer or legacy mode, return a directory * location where lock file can be stored. */ protected static function getTransientPath(): string { $possibleLocations = [ 'composer' => Environment::getVarPath() . '/transient', 'legacy' => Environment::getConfigPath(), ]; return Environment::isComposerMode() ? $possibleLocations['composer'] : $possibleLocations['legacy']; } /** * Returns the absolute path to the INSTALL_TOOL_ENABLE file */ protected static function getInstallToolEnableFilePath(): string { $possibleLocations = [ 'default' => Environment::getVarPath() . '/transient/' . self::INSTALL_TOOL_ENABLE_FILE_PATH, 'permanent' => Environment::getConfigPath() . '/' . self::INSTALL_TOOL_ENABLE_FILE_PATH, 'legacy' => Environment::getLegacyConfigPath() . self::INSTALL_TOOL_ENABLE_FILE_PATH, ]; foreach ($possibleLocations as $location) { if (@is_file($location)) { return $location; } } return self::getBestLocationForInstallToolEnableFile(); } /** * List of found `FIRST_INSTALL` files with different casings in public and project folder. * * @returns non-empty-string[] */ protected static function getFirstInstallFilePaths(): array { // Check in public path $files = scandir(Environment::getPublicPath() . '/'); $files = is_array($files) ? $files : []; $files = array_filter($files, static function ($file) { return @is_file(Environment::getPublicPath() . '/' . $file) && preg_match('~^' . self::FIRST_INSTALL_FILE_PATH . '.*~i', $file); }); $files = array_map(fn(string $file): string => Environment::getPublicPath() . '/' . $file, $files); // Check in project path (only if different from public path) if (Environment::getPublicPath() !== Environment::getProjectPath()) { $projectFiles = scandir(Environment::getProjectPath() . '/'); $projectFiles = is_array($projectFiles) ? $projectFiles : []; $projectFiles = array_filter($projectFiles, static function ($file) { return @is_file(Environment::getProjectPath() . '/' . $file) && preg_match('~^' . self::FIRST_INSTALL_FILE_PATH . '.*~i', $file); }); $projectFiles = array_map(fn(string $file): string => Environment::getProjectPath() . '/' . $file, $projectFiles); $files = array_unique(array_merge($files, $projectFiles)); } return $files; } }