From ed1d212ae2daea5e4bd043417610177093e99f19 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Sat, 16 Jan 2016 03:03:51 -0500
Subject: [PATCH] Improved SVG cleanup code

---
 program/lib/Roundcube/rcube_base_replacer.php |   50 ++++++++++++++++++++++++++++++++++----------------
 1 files changed, 34 insertions(+), 16 deletions(-)

diff --git a/program/lib/Roundcube/rcube_base_replacer.php b/program/lib/Roundcube/rcube_base_replacer.php
index fcd85c2..a5d3f8a 100644
--- a/program/lib/Roundcube/rcube_base_replacer.php
+++ b/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);
                 }

--
Gitblit v1.9.1