[ticket/11832] Fix the web path corrections

Add some real life examples to test

PHPBB3-11832
This commit is contained in:
Nathan Guse 2013-09-12 10:25:49 -05:00
parent 3a4efa7959
commit b06c8a80d1
2 changed files with 45 additions and 12 deletions

View file

@ -90,25 +90,49 @@ class phpbb_filesystem
return $this->web_root_path; return $this->web_root_path;
} }
$path_info = $symfony_request->getPathInfo(); // Path info (e.g. /foo/bar)
$path_info = $this->clean_path($symfony_request->getPathInfo());
// Full request URI (e.g. phpBB/index.php/foo/bar)
$request_uri = $symfony_request->getRequestUri();
// Script name URI (e.g. phpBB/index.php)
$script_name = $symfony_request->getScriptName();
/*
* If the path info is empty (single /), then we're not using
* a route like index.php/foo/bar
*/
if ($path_info === '/') if ($path_info === '/')
{ {
return $this->web_root_path = $this->phpbb_root_path; return $this->web_root_path = $this->phpbb_root_path;
} }
$path_info = $this->clean_path($path_info); // How many corrections might we need?
$corrections = substr_count($path_info, '/');
// Do not count / at start of path /*
$corrections = substr_count(substr($path_info, 1), '/'); * If the script name (e.g. phpBB/app.php) exists in the
* requestUri (e.g. phpBB/app.php/foo/template), then we
// When URL Rewriting is enabled, app.php is optional. We have to * are have a non-rewritten URL.
// correct for it not being there */
if (strpos($symfony_request->getRequestUri(), $symfony_request->getScriptName()) === false) if (strpos($request_uri, $script_name) === 0)
{ {
$corrections -= 1; /*
* Append ../ to the end of the phpbb_root_path as many times
* as / exists in path_info
*/
return $this->web_root_path = $this->phpbb_root_path . str_repeat('../', $corrections);
} }
return $this->web_root_path = $this->phpbb_root_path . str_repeat('../', $corrections); /*
* If we're here it means we're at a re-written path, so we must
* correct the relative path for web URLs. We must append ../
* to the end of the root path as many times as / exists in path_info
* less one time (because the script, e.g. /app.php, doesn't exist in
* the URL)
*/
return $this->web_root_path = $this->phpbb_root_path . str_repeat('../', $corrections - 1);
} }
/** /**

View file

@ -62,7 +62,7 @@ class phpbb_filesystem_web_root_path_test extends phpbb_test_case
), ),
array( array(
$this->phpbb_root_path . 'test.php', $this->phpbb_root_path . 'test.php',
$this->phpbb_root_path . 'test.php', $this->phpbb_root_path . '../test.php',
'//', '//',
), ),
array( array(
@ -75,7 +75,16 @@ class phpbb_filesystem_web_root_path_test extends phpbb_test_case
array( array(
$this->phpbb_root_path . 'test.php', $this->phpbb_root_path . 'test.php',
$this->phpbb_root_path . '../../test.php', $this->phpbb_root_path . '../../test.php',
'////', '/foo/template',
'/phpbb3-fork/phpBB/app.php/foo/template',
'/phpbb3-fork/phpBB/app.php',
),
array(
$this->phpbb_root_path . 'test.php',
$this->phpbb_root_path . '../test.php',
'/foo/template',
'/phpbb3-fork/phpBB/foo/template',
'/phpbb3-fork/phpBB/app.php',
), ),
); );
} }