comparison program/lib/Roundcube/rcube_base_replacer.php @ 0:4681f974d28b

vanilla 1.3.3 distro, I hope
author Charlie Root
date Thu, 04 Jan 2018 15:52:31 -0500
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4681f974d28b
1 <?php
2
3 /**
4 +-----------------------------------------------------------------------+
5 | This file is part of the Roundcube Webmail client |
6 | Copyright (C) 2005-2012, The Roundcube Dev Team |
7 | |
8 | Licensed under the GNU General Public License version 3 or |
9 | any later version with exceptions for skins & plugins. |
10 | See the README file for a full license statement. |
11 | |
12 | PURPOSE: |
13 | Provide basic functions for base URL replacement |
14 +-----------------------------------------------------------------------+
15 | Author: Thomas Bruederli <roundcube@gmail.com> |
16 +-----------------------------------------------------------------------+
17 */
18
19 /**
20 * Helper class to turn relative urls into absolute ones
21 * using a predefined base
22 *
23 * @package Framework
24 * @subpackage Utils
25 * @author Thomas Bruederli <roundcube@gmail.com>
26 */
27 class rcube_base_replacer
28 {
29 private $base_url;
30
31
32 /**
33 * Class constructor
34 *
35 * @param string $base Base URL
36 */
37 public function __construct($base)
38 {
39 $this->base_url = $base;
40 }
41
42 /**
43 * Replace callback
44 *
45 * @param array $matches Matching entries
46 *
47 * @return string Replaced text with absolute URL
48 */
49 public function callback($matches)
50 {
51 return $matches[1] . '="' . self::absolute_url($matches[3], $this->base_url) . '"';
52 }
53
54 /**
55 * Convert base URLs to absolute ones
56 *
57 * @param string $body Text body
58 *
59 * @return string Replaced text
60 */
61 public function replace($body)
62 {
63 $regexp = array(
64 '/(src|background|href)=(["\']?)([^"\'\s>]+)(\2|\s|>)/i',
65 '/(url\s*\()(["\']?)([^"\'\)\s]+)(\2)\)/i',
66 );
67
68 return preg_replace_callback($regexp, array($this, 'callback'), $body);
69 }
70
71 /**
72 * Convert paths like ../xxx to an absolute path using a base url
73 *
74 * @param string $path Relative path
75 * @param string $base_url Base URL
76 *
77 * @return string Absolute URL
78 */
79 public static function absolute_url($path, $base_url)
80 {
81 // check if path is an absolute URL
82 if (preg_match('/^[fhtps]+:\/\//', $path)) {
83 return $path;
84 }
85
86 // check if path is a content-id scheme
87 if (strpos($path, 'cid:') === 0) {
88 return $path;
89 }
90
91 $host_url = $base_url;
92 $abs_path = $path;
93
94 // cut base_url to the last directory
95 if (strrpos($base_url, '/') > 7) {
96 $host_url = substr($base_url, 0, strpos($base_url, '/', 7));
97 $base_url = substr($base_url, 0, strrpos($base_url, '/'));
98 }
99
100 // $path is absolute
101 if ($path[0] == '/') {
102 $abs_path = $host_url.$path;
103 }
104 else {
105 // strip './' because its the same as ''
106 $path = preg_replace('/^\.\//', '', $path);
107
108 if (preg_match_all('/\.\.\//', $path, $matches, PREG_SET_ORDER)) {
109 $cnt = count($matches);
110 while ($cnt--) {
111 if ($pos = strrpos($base_url, '/')) {
112 $base_url = substr($base_url, 0, $pos);
113 }
114 $path = substr($path, 3);
115 }
116 }
117
118 $abs_path = $base_url.'/'.$path;
119 }
120
121 return $abs_path;
122 }
123 }