From f383d4221ce085dc36ef4c04a0a2c7c3f381b108 Mon Sep 17 00:00:00 2001 From: Pico88 Date: Mon, 21 Apr 2014 19:53:46 +0200 Subject: [ticket/12099] Add request argument to path_helper service PHPBB3-12099 --- phpBB/phpbb/path_helper.php | 54 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) (limited to 'phpBB/phpbb/path_helper.php') diff --git a/phpBB/phpbb/path_helper.php b/phpBB/phpbb/path_helper.php index b592cc4460..b157c5930a 100644 --- a/phpBB/phpbb/path_helper.php +++ b/phpBB/phpbb/path_helper.php @@ -24,6 +24,12 @@ class path_helper /** @var \phpbb\filesystem */ protected $filesystem; + /** @var \phpbb\request\request */ + protected $request; + + /** @var \phpbb\config\config */ + protected $config; + /** @var string */ protected $phpbb_root_path; @@ -41,13 +47,17 @@ class path_helper * * @param \phpbb\symfony_request $symfony_request * @param \phpbb\filesystem $filesystem + * @param \phpbb\request\request $request + * @param \phpbb\config\config $config * @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\filesystem $filesystem, $phpbb_root_path, $php_ext, $adm_relative_path = null) + public function __construct(\phpbb\symfony_request $symfony_request, \phpbb\filesystem $filesystem, \phpbb\request\request $request, \phpbb\config\config $config, $phpbb_root_path, $php_ext, $adm_relative_path = null) { $this->symfony_request = $symfony_request; $this->filesystem = $filesystem; + $this->request = $request; + $this->config = $config; $this->phpbb_root_path = $phpbb_root_path; $this->php_ext = $php_ext; $this->adm_relative_path = $adm_relative_path; @@ -170,7 +180,47 @@ class path_helper return $this->web_root_path = $this->phpbb_root_path; } - // How many corrections might we need? + /* + * Check AJAX request + */ + if ($this->request->is_ajax()) + { + // Check referer + $referer = strtolower($this->request->header('Referer')); + + // Count chars + $chars = strlen($this->config['server_name'] . $this->config['script_path']) - 1; + + /* + * Return string without server name and script path + * e.g. 'http://localhost/phpBB/app.php', where server name is 'localhost' + * and script path is '/phpBB', will be cut to '/app.php' + */ + $ref = substr(strstr($referer, strtolower($this->config['server_name'] . $this->config['script_path'])), $chars); + + // How many slashes does the referer used? + $count_slashes = substr_count($ref, '/'); + + /* + * If the shorten referer has only 1 slash, + * return default path + */ + if ($count_slashes == 1) + { + return $this->web_root_path = $this->phpbb_root_path; + } + /* + * Otherwise we are on routed page 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 shorten referer less one time + */ + else + { + return $this->web_root_path = $this->phpbb_root_path . str_repeat('../', $count_slashes - 1); + } + } + + // How many corrections might we need? $corrections = substr_count($path_info, '/'); /* -- cgit v1.2.1 From 779d8a68ffa1b48e61ebf514648aaadaf232b6ca Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 7 May 2014 23:13:45 +0200 Subject: [ticket/12099] Correctly fix the path when performing AJAX requests If the current request is a AJAX we need to fix the paths. We need to get the root path based on the Referer, so we can use the generated URLs in the template of the Referer. If we do not generate the relative path based on the Referer, but based on the currently requested URL, the generated URLs will not point to the intended locations: Referer desired URL desired relative root path memberlist.php faq.php ./ memberlist.php app.php/foo/bar ./ app.php/foo memberlist.php ../ app.php/foo app.php/fox ../ app.php/foo/bar memberlist.php ../../ ../page.php memberlist.php ./phpBB/ ../sub/page.php memberlist.php ./../phpBB/ PHPBB3-12099 --- phpBB/phpbb/path_helper.php | 119 ++++++++++++++++++++++++++++++-------------- 1 file changed, 82 insertions(+), 37 deletions(-) (limited to 'phpBB/phpbb/path_helper.php') diff --git a/phpBB/phpbb/path_helper.php b/phpBB/phpbb/path_helper.php index b157c5930a..8552dbeb3a 100644 --- a/phpBB/phpbb/path_helper.php +++ b/phpBB/phpbb/path_helper.php @@ -24,7 +24,7 @@ class path_helper /** @var \phpbb\filesystem */ protected $filesystem; - /** @var \phpbb\request\request */ + /** @var \phpbb\request\request_interface */ protected $request; /** @var \phpbb\config\config */ @@ -181,46 +181,32 @@ class path_helper } /* - * Check AJAX request + * Check AJAX request: + * If the current request is a AJAX we need to fix the paths. + * We need to get the root path based on the Referer, so we can use + * the generated URLs in the template of the Referer. If we do not + * generate the relative path based on the Referer, but based on the + * currently requested URL, the generated URLs will not point to the + * intended locations: + * Referer desired URL desired relative root path + * memberlist.php faq.php ./ + * memberlist.php app.php/foo/bar ./ + * app.php/foo memberlist.php ../ + * app.php/foo app.php/fox ../ + * app.php/foo/bar memberlist.php ../../ + * ../page.php memberlist.php ./phpBB/ + * ../sub/page.php memberlist.php ./../phpBB/ */ - if ($this->request->is_ajax()) + if ($this->request->is_ajax() && $this->request->header('Referer')) { - // Check referer - $referer = strtolower($this->request->header('Referer')); - - // Count chars - $chars = strlen($this->config['server_name'] . $this->config['script_path']) - 1; - - /* - * Return string without server name and script path - * e.g. 'http://localhost/phpBB/app.php', where server name is 'localhost' - * and script path is '/phpBB', will be cut to '/app.php' - */ - $ref = substr(strstr($referer, strtolower($this->config['server_name'] . $this->config['script_path'])), $chars); - - // How many slashes does the referer used? - $count_slashes = substr_count($ref, '/'); - - /* - * If the shorten referer has only 1 slash, - * return default path - */ - if ($count_slashes == 1) - { - return $this->web_root_path = $this->phpbb_root_path; - } - /* - * Otherwise we are on routed page 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 shorten referer less one time - */ - else - { - return $this->web_root_path = $this->phpbb_root_path . str_repeat('../', $count_slashes - 1); - } + $referer_web_root_path = $this->get_web_root_path_from_ajax_referer( + $this->request->header('Referer'), + $this->symfony_request->getUriForPath('') + ); + return $this->web_root_path = $this->phpbb_root_path . $referer_web_root_path; } - // How many corrections might we need? + // How many corrections might we need? $corrections = substr_count($path_info, '/'); /* @@ -240,6 +226,65 @@ class path_helper return $this->web_root_path; } + /** + * Get the web root path of the referer form an ajax request + * + * @param string $absolute_referer_url + * @param string $absolute_board_url + * @return string + */ + public function get_web_root_path_from_ajax_referer($absolute_referer_url, $absolute_board_url) + { + // If the board URL is in the beginning of the referer, this means + // we the referer is in the board URL or a subdirectory of it. + // So we just need to count the / (slashes) in the left over part of + // the referer and prepend ../ the the current root_path, to get the + // web root path of the referer. + if (strpos($absolute_referer_url, $absolute_board_url) === 0) + { + $relative_referer_path = substr($absolute_referer_url, strlen($absolute_board_url)); + $has_params = strpos($relative_referer_path, '?'); + if ($has_params !== false) + { + $relative_referer_path = substr($relative_referer_path, 0, $has_params); + } + $corrections = substr_count($relative_referer_path, '/'); + return $this->phpbb_root_path . str_repeat('../', $corrections - 1); + } + + // If not, it's a bit more complicated. We go to the parent directory + // of the referer until we find the remaining referer in the board URL. + // Foreach directory we need to add a ../ to the fixed root_path. + // When we finally found it, we need to remove the remaining referer + // from the board URL, to get the boards root path. + // If the then append these two strings, we get our fixed web root path. + $fixed_root_path = ''; + $referer_dir = $absolute_referer_url; + $has_params = strpos($referer_dir, '?'); + if ($has_params !== false) + { + $referer_dir = substr($referer_dir, 0, $has_params); + } + + // If we do not find a slash at the end of the referer, we come + // from a file. So the first dirname() does not need a traversal + // path correction. + if (substr($referer_dir, -1) !== '/') + { + $referer_dir = dirname($referer_dir); + } + + while (strpos($absolute_board_url, $referer_dir) !== 0) + { + $fixed_root_path .= '../'; + $referer_dir = dirname($referer_dir); + } + + $fixed_root_path .= substr($absolute_board_url, strlen($referer_dir) + 1); + // Add trailing slash + return $this->phpbb_root_path . $fixed_root_path . '/'; + } + /** * Eliminates useless . and .. components from specified URL * -- cgit v1.2.1 From b7e1959d56a3334f730e5d0fd4194f5e4d0597a3 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 7 May 2014 23:22:53 +0200 Subject: [ticket/12099] Remove config again PHPBB3-12099 --- phpBB/phpbb/path_helper.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'phpBB/phpbb/path_helper.php') diff --git a/phpBB/phpbb/path_helper.php b/phpBB/phpbb/path_helper.php index 8552dbeb3a..ea45393709 100644 --- a/phpBB/phpbb/path_helper.php +++ b/phpBB/phpbb/path_helper.php @@ -27,9 +27,6 @@ class path_helper /** @var \phpbb\request\request_interface */ protected $request; - /** @var \phpbb\config\config */ - protected $config; - /** @var string */ protected $phpbb_root_path; @@ -47,17 +44,16 @@ class path_helper * * @param \phpbb\symfony_request $symfony_request * @param \phpbb\filesystem $filesystem - * @param \phpbb\request\request $request - * @param \phpbb\config\config $config + * @param \phpbb\request\request_interface $request * @param string $phpbb_root_path Relative path to phpBB root * @param string $php_ext PHP extension (php) + * @param mixed $adm_relative_path Relative path admin path to adm/ root */ - public function __construct(\phpbb\symfony_request $symfony_request, \phpbb\filesystem $filesystem, \phpbb\request\request $request, \phpbb\config\config $config, $phpbb_root_path, $php_ext, $adm_relative_path = null) + public function __construct(\phpbb\symfony_request $symfony_request, \phpbb\filesystem $filesystem, \phpbb\request\request_interface $request, $phpbb_root_path, $php_ext, $adm_relative_path = null) { $this->symfony_request = $symfony_request; $this->filesystem = $filesystem; $this->request = $request; - $this->config = $config; $this->phpbb_root_path = $phpbb_root_path; $this->php_ext = $php_ext; $this->adm_relative_path = $adm_relative_path; -- cgit v1.2.1 From 31099a8efda204d764a1d6677a80ff5f710f4575 Mon Sep 17 00:00:00 2001 From: Tristan Darricau Date: Sun, 29 Jun 2014 21:02:03 +0200 Subject: [ticket/12787] Use a parameter (_referer) instead of the Referer header PHPBB3-12787 --- phpBB/phpbb/path_helper.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'phpBB/phpbb/path_helper.php') diff --git a/phpBB/phpbb/path_helper.php b/phpBB/phpbb/path_helper.php index ea45393709..287d5d9e0a 100644 --- a/phpBB/phpbb/path_helper.php +++ b/phpBB/phpbb/path_helper.php @@ -192,11 +192,13 @@ class path_helper * app.php/foo/bar memberlist.php ../../ * ../page.php memberlist.php ./phpBB/ * ../sub/page.php memberlist.php ./../phpBB/ + * + * The referer must be specified as a parameter in the query. */ - if ($this->request->is_ajax() && $this->request->header('Referer')) + if ($this->request->is_ajax() && $this->symfony_request->get('_referer')) { $referer_web_root_path = $this->get_web_root_path_from_ajax_referer( - $this->request->header('Referer'), + $this->symfony_request->get('_referer'), $this->symfony_request->getUriForPath('') ); return $this->web_root_path = $this->phpbb_root_path . $referer_web_root_path; -- cgit v1.2.1 From bc47e719b1c10ba43b7da0062f8236a8d137a159 Mon Sep 17 00:00:00 2001 From: Tristan Darricau Date: Sun, 29 Jun 2014 22:23:32 +0200 Subject: [ticket/12787] Fix the absolute board url PHPBB3-12787 --- phpBB/phpbb/path_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'phpBB/phpbb/path_helper.php') diff --git a/phpBB/phpbb/path_helper.php b/phpBB/phpbb/path_helper.php index 287d5d9e0a..8b2c31b478 100644 --- a/phpBB/phpbb/path_helper.php +++ b/phpBB/phpbb/path_helper.php @@ -199,7 +199,7 @@ class path_helper { $referer_web_root_path = $this->get_web_root_path_from_ajax_referer( $this->symfony_request->get('_referer'), - $this->symfony_request->getUriForPath('') + $this->symfony_request->getSchemeAndHttpHost() . $this->symfony_request->getBasePath() ); return $this->web_root_path = $this->phpbb_root_path . $referer_web_root_path; } -- cgit v1.2.1 From 7399f29df8f764ff8096620a8f11afae0decc215 Mon Sep 17 00:00:00 2001 From: Tristan Darricau Date: Sat, 5 Jul 2014 14:01:14 +0200 Subject: [ticket/12787] Remove one app.php when it's both in $path and $web_root_path PHPBB3-12787 --- phpBB/phpbb/path_helper.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'phpBB/phpbb/path_helper.php') diff --git a/phpBB/phpbb/path_helper.php b/phpBB/phpbb/path_helper.php index 8b2c31b478..a8592eac6c 100644 --- a/phpBB/phpbb/path_helper.php +++ b/phpBB/phpbb/path_helper.php @@ -104,7 +104,13 @@ class path_helper { $path = substr($path, strlen($this->phpbb_root_path)); - return $this->filesystem->clean_path($this->get_web_root_path() . $path); + $web_root_path = $this->get_web_root_path(); + if (substr($web_root_path, -8) === 'app.php/' && substr($path, 0, 7) === 'app.php') + { + $path = substr($path, 8); + } + + return $this->filesystem->clean_path($web_root_path . $path); } return $path; -- cgit v1.2.1