diff options
Diffstat (limited to 'phpBB/includes')
| -rw-r--r-- | phpBB/includes/template/asset.php | 182 | ||||
| -rw-r--r-- | phpBB/includes/template/twig/node/includeasset.php | 23 | 
2 files changed, 191 insertions, 14 deletions
diff --git a/phpBB/includes/template/asset.php b/phpBB/includes/template/asset.php new file mode 100644 index 0000000000..7c322cd971 --- /dev/null +++ b/phpBB/includes/template/asset.php @@ -0,0 +1,182 @@ +<?php +/** +* +* @package phpBB3 +* @copyright (c) 2013 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ +	exit; +} + +class phpbb_template_asset +{ +	protected $components = array(); + +	/** +	* Constructor +	* +	* @param string $url URL +	*/ +	public function __construct($url) +	{ +		$this->set_url($url); +	} + +	/** +	* Set URL +	* +	* @param string $url URL +	*/ +	public function set_url($url) +	{ +		if (version_compare(PHP_VERSION, '5.4.7') < 0 && substr($url, 0, 2) === '//') +		{ +			// Workaround for PHP 5.4.6 and older bug #62844 - add fake scheme and then remove it +			$this->components = parse_url('http:' . $url); +			$this->components['scheme'] = ''; +			return; +		} +		$this->components = parse_url($url); +	} + +	/** +	* Convert URL components into string +	* +	* @param array $components URL components +	* @return string URL +	*/ +	protected function join_url($components) +	{ +		$path = ''; +		if (isset($components['scheme'])) +		{ +			$path = $components['scheme'] === '' ? '//' : $components['scheme'] . '://'; +		} + +		if (isset($components['user']) || isset($components['pass'])) +		{ +			if ($path === '' && !isset($components['port'])) +			{ +				$path = '//'; +			} +			$path .= $components['user']; +			if (isset($components['pass'])) +			{ +				$path .= ':' . $components['pass']; +			} +			$path .= '@'; +		} + +		if (isset($components['host'])) +		{ +			if ($path === '' && !isset($components['port'])) +			{ +				$path = '//'; +			} +			$path .= $components['host']; +			if (isset($components['port'])) +			{ +				$path .= ':' . $components['port']; +			} +		} + +		if (isset($components['path'])) +		{ +			$path .= $components['path']; +		} + +		if (isset($components['query'])) +		{ +			$path .= '?' . $components['query']; +		} + +		if (isset($components['fragment'])) +		{ +			$path .= '#' . $components['fragment']; +		} + +		return $path; +	} + +	/** +	* Get URL +	* +	* @return string URL +	*/ +	public function get_url() +	{ +		return $this->join_url($this->components); +	} + +	/** +	* Checks if URL is local and relative +	* +	* @return boolean True if URL is local and relative +	*/ +	public function is_relative() +	{ +		if (empty($this->components) || !isset($this->components['path'])) +		{ +			// Invalid URL +			return false; +		} +		return !isset($this->components['scheme']) && !isset($this->components['host']) && substr($this->components['path'], 0, 1) !== '/'; +	} + +	/** +	* Get path component of current URL +	* +	* @return string Path +	*/ +	public function get_path() +	{ +		return isset($this->components['path']) ? $this->components['path'] : ''; +	} + +	/** +	* Set path component +	* +	* @param string $path Path component +	* @param boolean $urlencode If true, parts of path should be encoded with rawurlencode() +	*/ +	public function set_path($path, $urlencode = false) +	{ +		if ($urlencode) +		{ +			$paths = explode('/', $path); +			foreach ($paths as &$dir) +			{ +				$dir = rawurlencode($dir); +			} +			$path = implode('/', $paths); +		} +		$this->components['path'] = $path; +	} + +	/** +	* Add assets_version parameter to URL. +	* Parameter will not be added if assets_version already exists in URL +	* +	* @param string $version Version +	*/ +	public function add_assets_version($version) +	{ +		if (!isset($this->components['query'])) +		{ +			$this->components['query'] = 'assets_version=' . $version; +			return; +		} +		$query = $this->components['query']; +		if (!preg_match('/(^|[&;])assets_version=/', $query)) +		{ +			$this->components['query'] = $query . '&assets_version=' . $version; +		} +	} +} diff --git a/phpBB/includes/template/twig/node/includeasset.php b/phpBB/includes/template/twig/node/includeasset.php index 5abff10e3f..ae113cadc8 100644 --- a/phpBB/includes/template/twig/node/includeasset.php +++ b/phpBB/includes/template/twig/node/includeasset.php @@ -33,26 +33,21 @@ class phpbb_template_twig_node_includeasset extends Twig_Node  			->write("\$asset_file = ")  			->subcompile($this->getNode('expr'))  			->raw(";\n") -			->write("\$argument_string = \$anchor_string = '';\n") -			->write("if ((\$argument_string_start = strpos(\$asset_file, '?')) !== false) {\n") +			->write("\$asset = new phpbb_template_asset(\$asset_file);\n") +			->write("if (\$asset->is_relative()) {\n")  			->indent() -				->write("\$argument_string = substr(\$asset_file, \$argument_string_start);\n") -				->write("\$asset_file = substr(\$asset_file, 0, \$argument_string_start);\n") -				->write("if ((\$anchor_string_start = strpos(\$argument_string, '#')) !== false) {\n") +				->write("\$asset_path = \$asset->get_path();") +				->write("\$local_file = \$this->getEnvironment()->get_phpbb_root_path() . \$asset_path;\n") +				->write("if (!file_exists(\$local_file)) {\n")  				->indent() -					->write("\$anchor_string = substr(\$argument_string, \$anchor_string_start);\n") -					->write("\$argument_string = substr(\$argument_string, 0, \$anchor_string_start);\n") +					->write("\$local_file = \$this->getEnvironment()->getLoader()->getCacheKey(\$asset_path);\n") +					->write("\$asset->set_path(\$local_file, true);\n")  				->outdent() +				->write("\$asset->add_assets_version({$config['assets_version']});\n") +				->write("\$asset_file = \$asset->get_url();\n")  				->write("}\n")  			->outdent()  			->write("}\n") -			->write("if (strpos(\$asset_file, '//') !== 0 && strpos(\$asset_file, 'http://') !== 0 && strpos(\$asset_file, 'https://') !== 0 && !file_exists(\$asset_file)) {\n") -			->indent() -				->write("\$asset_file = \$this->getEnvironment()->getLoader()->getCacheKey(\$asset_file);\n") -				->write("\$argument_string .= ((\$argument_string) ? '&' : '?') . 'assets_version={$config['assets_version']}';\n") -			->outdent() -			->write("}\n") -			->write("\$asset_file .= \$argument_string . \$anchor_string;\n")  			->write("\$context['definition']->append('{$this->get_definition_name()}', '")  		;  | 
