. */ /* */ /*************************************************************************************/ namespace Thelia\Install; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use Symfony\Component\Translation\TranslatorInterface; use Thelia\Core\Translation\Translator; /** * Class CheckPermission * * Take care of integration tests (files permissions) * * @package Thelia\Install * @author Manuel Raynaud * @author Guillaume MOREL */ class CheckPermission extends BaseInstall { const DIR_CONF = 'local/config'; const DIR_LOG = 'log'; const DIR_CACHE = 'cache'; /** @var array Directory needed to be writable */ protected $directoriesToBeWritable = array( self::DIR_CONF, self::DIR_LOG, self::DIR_CACHE, ); protected $validationMessages = array(); /** @var bool If permissions are OK */ protected $isValid = true; /** @var TranslatorInterface Translator Service */ protected $translator = null; /** * Constructor * * @param bool $verifyInstall If verify install * @param Translator $translator Translator Service * necessary for install wizard */ public function __construct($verifyInstall = true, Translator $translator = null) { $this->translator = $translator; foreach ($this->directoriesToBeWritable as $directory) { $this->validationMessages[$directory] = array( 'text' => '', 'hint' => '', 'status' => true ); } parent::__construct($verifyInstall); } /** * Perform file permission check * * @return bool */ public function exec() { foreach ($this->directoriesToBeWritable as $directory) { $fullDirectory = THELIA_ROOT . $directory; $this->validationMessages[$directory]['text'] = $this->getI18nText($fullDirectory, true); if (is_writable($fullDirectory) === false) { if (!$this->makeDirectoryWritable($fullDirectory)) { $this->isValid = false; $this->validationMessages[$directory]['status'] = false; $this->validationMessages[$directory]['text'] = $this->getI18nText($fullDirectory, false); $this->validationMessages[$directory]['hint'] = $this->getI18nHint($fullDirectory); } } } return $this->isValid; } /** * Get validation messages * * @return array */ public function getValidationMessages() { return $this->validationMessages; } /** * Make a directory writable (recursively) * * @param string $directory path to directory * * @return bool */ protected function makeDirectoryWritable($directory) { chmod($directory, 0777); $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($directory) ); foreach ($iterator as $item) { chmod($item, 0777); } return (is_writable(THELIA_ROOT . $directory) === true); } /** * Get Translated text about the directory state * * @param string $directory Directory being checked * @param bool $isValid If directory permission is valid * * @return string */ protected function getI18nText($directory, $isValid) { if ($this->translator !== null) { if ($isValid) { $sentence = 'Your directory %directory% is writable'; } else { $sentence = 'Your directory %directory% is not writable'; } $translatedText = $this->translator->trans( $sentence, array( '%directory%' => $directory ), 'install-wizard' ); } else { $translatedText = sprintf('Your directory %s needs to be writable', $directory); } return $translatedText; } /** * Get Translated hint about the directory state * * @param string $directory Directory being checked * * @return string */ protected function getI18nHint($directory) { if ($this->translator !== null) { $sentence = 'chmod 777 %directory% on your server with admin rights could help'; $translatedText = $this->translator->trans( $sentence, array( '%directory%' => $directory ), 'install-wizard' ); } else { $translatedText = sprintf('chmod 777 %s on your server with admin rights could help', $directory); } return $translatedText; } }