Aleksander Machniak
2016-01-16 ed1d212ae2daea5e4bd043417610177093e99f19
program/lib/Roundcube/rcube_base_replacer.php
@@ -1,6 +1,6 @@
<?php
/*
/**
 +-----------------------------------------------------------------------+
 | This file is part of the Roundcube Webmail client                     |
 | Copyright (C) 2005-2012, The Roundcube Dev Team                       |
@@ -21,7 +21,7 @@
 * using a predefined base
 *
 * @package    Framework
 * @subpackage Core
 * @subpackage Utils
 * @author     Thomas Bruederli <roundcube@gmail.com>
 */
class rcube_base_replacer
@@ -29,27 +29,44 @@
    private $base_url;
    /**
     * Class constructor
     *
     * @param string $base Base URL
     */
    public function __construct($base)
    {
        $this->base_url = $base;
    }
    /**
     * Replace callback
     *
     * @param array $matches Matching entries
     *
     * @return string Replaced text with absolute URL
     */
    public function callback($matches)
    {
        return $matches[1] . '="' . self::absolute_url($matches[3], $this->base_url) . '"';
    }
    /**
     * Convert base URLs to absolute ones
     *
     * @param string $body Text body
     *
     * @return string Replaced text
     */
    public function replace($body)
    {
        return preg_replace_callback(array(
            '/(src|background|href)=(["\']?)([^"\'\s]+)(\2|\s|>)/Ui',
            '/(url\s*\()(["\']?)([^"\'\)\s]+)(\2)\)/Ui',
        ),
        array($this, 'callback'), $body);
    }
        $regexp = array(
            '/(src|background|href)=(["\']?)([^"\'\s>]+)(\2|\s|>)/i',
            '/(url\s*\()(["\']?)([^"\'\)\s]+)(\2)\)/i',
        );
        return preg_replace_callback($regexp, array($this, 'callback'), $body);
    }
    /**
     * Convert paths like ../xxx to an absolute path using a base url
@@ -61,9 +78,6 @@
     */
    public static function absolute_url($path, $base_url)
    {
        $host_url = $base_url;
        $abs_path = $path;
        // check if path is an absolute URL
        if (preg_match('/^[fhtps]+:\/\//', $path)) {
            return $path;
@@ -73,6 +87,9 @@
        if (strpos($path, 'cid:') === 0) {
            return $path;
        }
        $host_url = $base_url;
        $abs_path = $path;
        // cut base_url to the last directory
        if (strrpos($base_url, '/') > 7) {
@@ -89,9 +106,10 @@
            $path = preg_replace('/^\.\//', '', $path);
            if (preg_match_all('/\.\.\//', $path, $matches, PREG_SET_ORDER)) {
                foreach ($matches as $a_match) {
                    if (strrpos($base_url, '/')) {
                        $base_url = substr($base_url, 0, strrpos($base_url, '/'));
                $cnt = count($matches);
                while ($cnt--) {
                    if ($pos = strrpos($base_url, '/')) {
                        $base_url = substr($base_url, 0, $pos);
                    }
                    $path = substr($path, 3);
                }