From b5fdd3a4529d2193107d3b0035abb9addf4b6082 Mon Sep 17 00:00:00 2001 From: Carsten Schmitz Date: Fri, 20 Jul 2012 13:23:22 +0200 Subject: [PATCH] Fixed issue #6341: Installation fails if ./tmp/runtime is not writable --- .../controllers/InstallerController.php | 28 +++++++++++++++---- application/views/installer/precheck_view.php | 4 +-- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/application/controllers/InstallerController.php b/application/controllers/InstallerController.php index 258bb0cb89b..568b39378fc 100644 --- a/application/controllers/InstallerController.php +++ b/application/controllers/InstallerController.php @@ -703,6 +703,22 @@ function check_HTML_image($result) return sprintf('Found', Yii::app()->baseUrl, $label[$result]); } + + function is_writable_recursive($dir) + { + $folder = opendir($dir); + while($file = readdir( $folder )) + if($file != '.' && $file != '..' && + ( !is_writable( $dir."/".$file ) || + ( is_dir( $dir."/".$file ) && !is_writable_recursive( $dir."/".$file ) ) )) + { + closedir($folder); + return false; + } + closedir($folder); + return true; + } + /** * check for a specific PHPFunction, return HTML image * @@ -727,7 +743,7 @@ function check_PHPFunction($function, &$image) * @param string $keyError key for error data * @return bool result of check (that it is writeable which implies existance) */ - function check_PathWriteable($path, $type, &$data, $base, $keyError) + function check_PathWriteable($path, $type, &$data, $base, $keyError, $bRecursive=false) { $result = false; $data[$base.'Present'] = 'Not Found'; @@ -745,7 +761,7 @@ function check_PathWriteable($path, $type, &$data, $base, $keyError) if ($exists) { $data[$base.'Present'] = 'Found'; - if (is_writable($path)) + if ((!$bRecursive && is_writable($path)) || ($bRecursive && is_writable_recursive($path))) { $data[$base.'Writable'] = 'Writable'; $result = true; @@ -783,9 +799,9 @@ function check_FileWriteable($file, &$data, $base, $keyError) * @param string $keyError key for error data * @return bool result of check (that it is writeable which implies existance) */ - function check_DirectoryWriteable($directory, &$data, $base, $keyError) + function check_DirectoryWriteable($directory, &$data, $base, $keyError, $bRecursive=false) { - return check_PathWriteable($directory, 2, $data, $base, $keyError); + return check_PathWriteable($directory, 2, $data, $base, $keyError, $bRecursive); } // version check @@ -803,11 +819,11 @@ function check_DirectoryWriteable($directory, &$data, $base, $keyError) $bProceed = false; // templates directory check - if (!check_DirectoryWriteable(Yii::app()->getConfig('rootdir').'/templates/', $data, 'templatedir', 'tperror') ) + if (!check_DirectoryWriteable(Yii::app()->getConfig('tempdir').'/', $data, 'tmpdir', 'tperror',true) ) $bProceed = false; //upload directory check - if (!check_DirectoryWriteable(Yii::app()->getConfig('rootdir').'/upload/', $data, 'uploaddir', 'uerror') ) + if (!check_DirectoryWriteable(Yii::app()->getConfig('uploaddir').'/', $data, 'uploaddir', 'uerror',true) ) $bProceed = false; // ** optional settings check ** diff --git a/application/views/installer/precheck_view.php b/application/views/installer/precheck_view.php index 56cd27ad2f3..e5cb4daefde 100644 --- a/application/views/installer/precheck_view.php +++ b/application/views/installer/precheck_view.php @@ -83,9 +83,9 @@ function dirReport($dir, $write, $clang) - /templates eT("directory"); ?> + /tmp eT("directory"); ?> eT("Found & writable"); ?> - +