FIX Environment file finder logic

Fixing the logic that searches for environment files so that warnings
due to open_basedir are suppressed and both the 'realdir' and the server
path are spidered for the environment file.
This commit is contained in:
Daniel Hensby 2013-05-22 12:29:19 +01:00
parent abad856534
commit bc9567c9ef
2 changed files with 76 additions and 34 deletions

View File

@ -44,24 +44,46 @@
error_reporting(E_ALL | E_STRICT); error_reporting(E_ALL | E_STRICT);
/** /**
* Include _ss_environment.php files * Include _ss_environment.php file
*/ */
//define the name of the environment file //define the name of the environment file
$envFile = '_ss_environment.php'; $envFile = '_ss_environment.php';
//define the dir to start scanning from (have to add the trailing slash) //define the dirs to start scanning from (have to add the trailing slash)
$dir = '.'; // we're going to check the realpath AND the path as the script sees it
//check this dir and every parent dir (until we hit the base of the drive) $dirsToCheck = array(
do { realpath('.'),
$dir = realpath($dir) . '/'; dirname($_SERVER['SCRIPT_FILENAME'])
);
//if they are the same, remove one of them
if ($dirsToCheck[0] == $dirsToCheck[1]) {
unset($dirsToCheck[1]);
}
foreach ($dirsToCheck as $dir) {
//check this dir and every parent dir (until we hit the base of the drive)
// or until we hit a dir we can't read
do {
//add the trailing slash we need to concatenate properly
$dir .= DIRECTORY_SEPARATOR;
//if it's readable, go ahead
if (@is_readable($dir)) {
//if the file exists, then we include it, set relevant vars and break out //if the file exists, then we include it, set relevant vars and break out
if (file_exists($dir . $envFile)) { if (file_exists($dir . $envFile)) {
define('SS_ENVIRONMENT_FILE', $dir . $envFile); define('SS_ENVIRONMENT_FILE', $dir . $envFile);
include_once(SS_ENVIRONMENT_FILE); include_once(SS_ENVIRONMENT_FILE);
//break out of BOTH loops because we found the $envFile
break(2);
}
}
else {
//break out of the while loop, we can't read the dir
break; break;
} }
//here we need to check that the real path of the last dir and the next one are //go up a directory
// not the same, if they are, we have hit the root of the drive $dir = dirname($dir);
} while (realpath($dir) != realpath($dir .= '../')); //here we need to check that the path of the last dir and the next one are
// not the same, if they are, we have hit the root of the drive
} while (dirname($dir) != $dir);
}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// GLOBALS AND DEFINE SETTING // GLOBALS AND DEFINE SETTING

View File

@ -28,27 +28,47 @@ if (function_exists('session_start')) {
session_start(); session_start();
} }
// Include environment files /**
$usingEnv = false; * Include _ss_environment.php file
$envFileExists = false; */
//define the name of the environment file //define the name of the environment file
$envFile = '_ss_environment.php'; $envFile = '_ss_environment.php';
//define the dir to start scanning from //define the dirs to start scanning from (have to add the trailing slash)
$dir = '.'; // we're going to check the realpath AND the path as the script sees it
//check this dir and every parent dir (until we hit the base of the drive) $dirsToCheck = array(
do { realpath('.'),
$dir = realpath($dir) . '/'; dirname($_SERVER['SCRIPT_FILENAME'])
);
//if they are the same, remove one of them
if ($dirsToCheck[0] == $dirsToCheck[1]) {
unset($dirsToCheck[1]);
}
foreach ($dirsToCheck as $dir) {
//check this dir and every parent dir (until we hit the base of the drive)
// or until we hit a dir we can't read
do {
//add the trailing slash we need to concatenate properly
$dir .= DIRECTORY_SEPARATOR;
//if it's readable, go ahead
if (@is_readable($dir)) {
//if the file exists, then we include it, set relevant vars and break out //if the file exists, then we include it, set relevant vars and break out
if (file_exists($dir . $envFile)) { if (file_exists($dir . $envFile)) {
include_once($dir . $envFile); define('SS_ENVIRONMENT_FILE', $dir . $envFile);
$envFileExists = true; include_once(SS_ENVIRONMENT_FILE);
//legacy variable assignment //break out of BOTH loops because we found the $envFile
$usingEnv = true; break(2);
}
}
else {
//break out of the while loop, we can't read the dir
break; break;
} }
//here we need to check that the real path of the last dir and the next one are //go up a directory
// not the same, if they are, we have hit the root of the drive $dir = dirname($dir);
} while (realpath($dir) != realpath($dir .= '../')); //here we need to check that the path of the last dir and the next one are
// not the same, if they are, we have hit the root of the drive
} while (dirname($dir) != $dir);
}
if($envFileExists) { if($envFileExists) {
if(!empty($_REQUEST['useEnv'])) { if(!empty($_REQUEST['useEnv'])) {