Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
62.50% covered (warning)
62.50%
5 / 8
CRAP
80.90% covered (warning)
80.90%
72 / 89
asset
0.00% covered (danger)
0.00%
0 / 1
62.50% covered (warning)
62.50%
5 / 8
46.54
80.90% covered (warning)
80.90%
72 / 89
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
 set_url
0.00% covered (danger)
0.00%
0 / 1
3.71
57.14% covered (warning)
57.14%
4 / 7
 join_url
0.00% covered (danger)
0.00%
0 / 1
21.22
69.77% covered (warning)
69.77%
30 / 43
 get_url
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 is_relative
0.00% covered (danger)
0.00%
0 / 1
5.39
75.00% covered (warning)
75.00%
3 / 4
 get_path
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
1 / 1
 set_path
100.00% covered (success)
100.00%
1 / 1
7
100.00% covered (success)
100.00%
19 / 19
 add_assets_version
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
10 / 10
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb\template;
class asset
{
    protected $components = array();
    /** @var \phpbb\path_helper **/
    protected $path_helper;
    /** @var \phpbb\filesystem\filesystem */
    protected $filesystem;
    /**
    * Constructor
    *
    * @param string $url URL
    * @param \phpbb\path_helper $path_helper Path helper object
    * @param \phpbb\filesystem\filesystem $filesystem
    */
    public function __construct($url, \phpbb\path_helper $path_helper, \phpbb\filesystem\filesystem $filesystem)
    {
        $this->path_helper = $path_helper;
        $this->filesystem = $filesystem;
        $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->path_helper->update_web_root_path($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)
    {
        // Since 1.7.0 Twig returns the real path of the file. We need it to be relative.
        $real_root_path = $this->filesystem->realpath($this->path_helper->get_phpbb_root_path()) . DIRECTORY_SEPARATOR;
        // If the asset is under the phpBB root path we need to remove its path and then prepend $phpbb_root_path
        if ($real_root_path && substr($path . DIRECTORY_SEPARATOR, 0, strlen($real_root_path)) === $real_root_path)
        {
            $path = $this->path_helper->get_phpbb_root_path() . str_replace('\\', '/', substr($path, strlen($real_root_path)));
        }
        else
        {
            // Else we make the path relative to the current working directory
            $real_root_path = $this->filesystem->realpath('.') . DIRECTORY_SEPARATOR;
            if ($real_root_path && substr($path . DIRECTORY_SEPARATOR, 0, strlen($real_root_path)) === $real_root_path)
            {
                $path = str_replace('\\', '/', substr($path, strlen($real_root_path)));
            }
        }
        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 . '&amp;assets_version=' . $version;
        }
    }
}