aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb/filesystem.php
diff options
context:
space:
mode:
authorNils Adermann <naderman@naderman.de>2013-09-17 16:56:50 +0200
committerNils Adermann <naderman@naderman.de>2013-09-17 16:56:50 +0200
commitf039a3308a3d57e7b9fab562bdd71cf1a9fb4dc9 (patch)
tree1fff31b35cc52590b0f14ef3b1f457cb84ad448c /phpBB/phpbb/filesystem.php
parent13ba981fc300171d88a197107317f3f1391ddb03 (diff)
parent6ba2fb6d62bb1429665f9e1b4f22dd241508950b (diff)
downloadforums-f039a3308a3d57e7b9fab562bdd71cf1a9fb4dc9.tar
forums-f039a3308a3d57e7b9fab562bdd71cf1a9fb4dc9.tar.gz
forums-f039a3308a3d57e7b9fab562bdd71cf1a9fb4dc9.tar.bz2
forums-f039a3308a3d57e7b9fab562bdd71cf1a9fb4dc9.tar.xz
forums-f039a3308a3d57e7b9fab562bdd71cf1a9fb4dc9.zip
Merge remote-tracking branch 'github-phpbb/develop' into ticket/11700
* github-phpbb/develop: [ticket/11832] Correct paths in tests [ticket/11832] Correct ROOT_PATH variable [ticket/11832] get_url() from phpbb_template_asset should return web path [ticket/11832] Fix INCLUDE(JS/CSS) [ticket/11832] Fix constructions of phpbb_filesystem [ticket/11832] Fix smiley paths [ticket/11832] Create phpbb_symfony_request to handle initiating symfony_request [ticket/11832] Fix build_url and the S_LOGIN_ACTION [ticket/11832] Changing comments to say app.php rather than index.php [ticket/11832] We must instantiate the $phpbb_filesystem in common [ticket/11832] Fix the web path corrections [ticket/11832] More extensive testing [ticket/11832] Use dirname(__FILE__) [ticket/11832] Use $phpbb_filesystem instead of the container in append_sid Revert "[ticket/11832] Make $phpbb_container a global initiated by the framework" [ticket/11832] Make $phpbb_container a global initiated by the framework [ticket/11832] Fix log tests [ticket/11832] update_web_root_path helper and tests [ticket/11832] Inject dependencies for phpbb_get_web_root_path (also moving) Conflicts: phpBB/common.php phpBB/config/services.yml phpBB/includes/bbcode.php phpBB/includes/functions.php phpBB/includes/functions_messenger.php phpBB/install/index.php phpBB/phpbb/filesystem.php phpBB/phpbb/template/twig/environment.php phpBB/phpbb/template/twig/node/includeasset.php phpBB/phpbb/template/twig/twig.php tests/controller/helper_url_test.php tests/dbal/migrator_test.php tests/extension/manager_test.php tests/extension/metadata_manager_test.php tests/filesystem/clean_path_test.php tests/mock/extension_manager.php tests/template/template_events_test.php tests/template/template_test_case.php tests/template/template_test_case_with_tree.php tests/test_framework/phpbb_functional_test_case.php
Diffstat (limited to 'phpBB/phpbb/filesystem.php')
-rw-r--r--phpBB/phpbb/filesystem.php146
1 files changed, 146 insertions, 0 deletions
diff --git a/phpBB/phpbb/filesystem.php b/phpBB/phpbb/filesystem.php
index 827e9fb139..ae656ad6e6 100644
--- a/phpBB/phpbb/filesystem.php
+++ b/phpBB/phpbb/filesystem.php
@@ -8,6 +8,7 @@
*/
namespace phpbb;
+
/**
* @ignore
*/
@@ -22,6 +23,151 @@ if (!defined('IN_PHPBB'))
*/
class filesystem
{
+ /** @var phpbb_symfony_request */
+ protected $symfony_request;
+
+ /** @var string */
+ protected $phpbb_root_path;
+
+ /** @var string */
+ protected $adm_relative_path;
+
+ /** @var string */
+ protected $php_ext;
+
+ /** @var string */
+ protected $web_root_path;
+
+ /**
+ * Constructor
+ *
+ * @param phpbb_symfony_request $symfony_request
+ * @param string $phpbb_root_path Relative path to phpBB root
+ * @param string $php_ext PHP extension (php)
+ */
+ public function __construct(phpbb_symfony_request $symfony_request, $phpbb_root_path, $php_ext, $adm_relative_path = null)
+ {
+ $this->symfony_request = $symfony_request;
+ $this->phpbb_root_path = $phpbb_root_path;
+ $this->php_ext = $php_ext;
+ $this->adm_relative_path = $adm_relative_path;
+ }
+
+ /**
+ * Get the phpBB root path
+ *
+ * @return string
+ */
+ public function get_phpbb_root_path()
+ {
+ return $this->phpbb_root_path;
+ }
+
+ /**
+ * Get the adm root path
+ *
+ * @return string
+ */
+ public function get_adm_relative_path()
+ {
+ return $this->adm_relative_path;
+ }
+
+ /**
+ * Get the php extension
+ *
+ * @return string
+ */
+ public function get_php_ext()
+ {
+ return $this->php_ext;
+ }
+
+ /**
+ * Update a path to the correct relative root path
+ *
+ * This replaces $phpbb_root_path . some_url with
+ * get_web_root_path() . some_url OR if $phpbb_root_path
+ * is not at the beginning of $path, just prepends the
+ * web root path
+ *
+ * @param string $path The path to be updated
+ * @return string
+ */
+ public function update_web_root_path($path)
+ {
+ $web_root_path = $this->get_web_root_path($this->symfony_request);
+
+ if (strpos($path, $this->phpbb_root_path) === 0)
+ {
+ $path = substr($path, strlen($this->phpbb_root_path));
+ }
+
+ return $web_root_path . $path;
+ }
+
+ /**
+ * Get a relative root path from the current URL
+ *
+ * @return string
+ */
+ public function get_web_root_path()
+ {
+ if ($this->symfony_request === null)
+ {
+ return $this->phpbb_root_path;
+ }
+
+ if (null !== $this->web_root_path)
+ {
+ return $this->web_root_path;
+ }
+
+ // Path info (e.g. /foo/bar)
+ $path_info = $this->clean_path($this->symfony_request->getPathInfo());
+
+ // Full request URI (e.g. phpBB/app.php/foo/bar)
+ $request_uri = $this->symfony_request->getRequestUri();
+
+ // Script name URI (e.g. phpBB/app.php)
+ $script_name = $this->symfony_request->getScriptName();
+
+ /*
+ * If the path info is empty (single /), then we're not using
+ * a route like app.php/foo/bar
+ */
+ if ($path_info === '/')
+ {
+ return $this->web_root_path = $this->phpbb_root_path;
+ }
+
+ // How many corrections might we need?
+ $corrections = substr_count($path_info, '/');
+
+ /*
+ * If the script name (e.g. phpBB/app.php) exists in the
+ * requestUri (e.g. phpBB/app.php/foo/template), then we
+ * are have a non-rewritten URL.
+ */
+ if (strpos($request_uri, $script_name) === 0)
+ {
+ /*
+ * 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);
+ }
+
+ /*
+ * 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);
+ }
+
/**
* Eliminates useless . and .. components from specified path.
*