summaryrefslogtreecommitdiff
path: root/inc/init.php
diff options
context:
space:
mode:
authorAndreas Gohr <andi@splitbrain.org>2008-09-14 15:47:44 +0200
committerAndreas Gohr <andi@splitbrain.org>2008-09-14 15:47:44 +0200
commit4761d30ceb295143e72c59f91d19015d6b656ad5 (patch)
tree57b90444f129f759364052a5918ae471f55dbc1e /inc/init.php
parentf5c6743cf7fd971197b6ff56c658bd2457cbb02f (diff)
downloadrpg-4761d30ceb295143e72c59f91d19015d6b656ad5.tar.gz
rpg-4761d30ceb295143e72c59f91d19015d6b656ad5.tar.bz2
rewrote the fullpath function FS#1462
The fullpath function now correctly handles windows drive letter paths and UNC paths making sure that those are not destroyed with upper dir .. notation. Unit tests where added. darcs-hash:20080914134744-7ad00-9abf5931d910a0b12979b1f69b090e8ecd568c71.gz
Diffstat (limited to 'inc/init.php')
-rw-r--r--inc/init.php64
1 files changed, 39 insertions, 25 deletions
diff --git a/inc/init.php b/inc/init.php
index 5277206f6..def5d7997 100644
--- a/inc/init.php
+++ b/inc/init.php
@@ -42,14 +42,12 @@
//prepare config array()
global $conf;
- if (!defined('DOKU_UNITTEST')) {
- $conf = array();
+ $conf = array();
- // load the config file(s)
- require_once(DOKU_CONF.'dokuwiki.php');
- if(@file_exists(DOKU_CONF.'local.php')){
- require_once(DOKU_CONF.'local.php');
- }
+ // load the config file(s)
+ require_once(DOKU_CONF.'dokuwiki.php');
+ if(@file_exists(DOKU_CONF.'local.php')){
+ require_once(DOKU_CONF.'local.php');
}
//prepare language array
@@ -443,22 +441,40 @@ EOT;
* This function behaves similar to PHP's realpath() but does not resolve
* symlinks or accesses upper directories
*
+ * @author Andreas Gohr <andi@splitbrain.org>
* @author <richpageau at yahoo dot co dot uk>
* @link http://de3.php.net/manual/en/function.realpath.php#75992
*/
function fullpath($path){
- $iswin = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');
- $isunc = 0===strpos($path,'\\\\');
- if($iswin) $path = str_replace('\\','/',$path); // windows compatibility
-
- // check if path begins with "/" or "c:" ie. is absolute
- // if it isnt concat with script path
- if (!$isunc &&
- ((!$iswin && $path{0} !== '/') ||
- ($iswin && $path{1} !== ':'))) {
- $base=dirname($_SERVER['SCRIPT_FILENAME']);
- $path=$base."/".$path;
+ static $run = 0;
+ $root = '';
+ $iswin = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' || $GLOBALS['DOKU_UNITTEST_ASSUME_WINDOWS']);
+
+ // find the (indestructable) root of the path - keeps windows stuff intact
+ if($path{0} == '/'){
+ $root = '/';
+ }elseif($iswin){
+ // match drive letter and UNC paths
+ if(preg_match('!^([a-zA-z]:)(.*)!',$path,$match)){
+ $root = $match[1];
+ $path = $match[2];
+ }else if(preg_match('!^(\\\\\\\\[^\\\\/]+\\\\[^\\\\/]+[\\\\/])(.*)!',$path,$match)){
+ $root = $match[1];
+ $path = $match[2];
+ }
}
+ $path = str_replace('\\','/',$path);
+
+ // if the given path wasn't absolute already, prepend the script path and retry
+ if(!$root){
+ $base = dirname($_SERVER['SCRIPT_FILENAME']);
+ $path = $base.'/'.$path;
+ if($run == 0){ // avoid endless recursion when base isn't absolute for some reason
+ $run++;
+ return fullpath($path,1);
+ }
+ }
+ $run = 0;
// canonicalize
$path=explode('/', $path);
@@ -471,15 +487,13 @@ function fullpath($path){
}
array_push($newpath, $p);
}
- $finalpath = implode('/', $newpath);
- if($isunc) $finalpath = '//'.$finalpath;
- if(!$iswin) $finalpath = '/'.$finalpath;
+ $finalpath = $root.implode('/', $newpath);
- // check then return valid path or filename
- if (@file_exists($finalpath)) {
- return ($finalpath);
+ // check for existance (except when unit testing)
+ if(!defined('DOKU_UNITTEST') && !@file_exists($finalpath)) {
+ return false;
}
- else return false;
+ return $finalpath;
}