PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta.2
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta.2
16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / vendor / wp-php-toolkit / data-liberation / URL / functions.php
jetpack / vendor / wp-php-toolkit / data-liberation / URL Last commit date
PHP 6 days ago class-convertedurl.php 6 days ago class-cssurlprocessor.php 6 days ago class-nativeurlintextprocessorwrapper.php 6 days ago class-urlintextprocessor.php 6 days ago class-urlrewritecache.php 6 days ago class-wpurl.php 6 days ago class-wpwhatwgurl.php 6 days ago class-wpwhatwgurlsearchparams.php 6 days ago functions.php 6 days ago public-suffix-list.php 6 days ago
functions.php
215 lines
1 <?php
2
3 namespace WordPress\DataLiberation\URL;
4
5 use Rowbot\URL\URL;
6 use WordPress\DataLiberation\BlockMarkup\BlockMarkupUrlProcessor;
7
8 require_once __DIR__ . '/class-urlrewritecache.php';
9
10 /**
11 * Migrate URLs in post content. See WPRewriteUrlsTests for
12 * specific examples. TODO: A better description.
13 *
14 * Example:
15 *
16 * ```php
17 * php > wp_rewrite_urls([
18 * 'block_markup' => '<!-- wp:image {"src": "http://legacy-blog.com/image.jpg"} -->',
19 * 'url-mapping' => [
20 * 'http://legacy-blog.com' => 'https://modern-webstore.org'
21 * ]
22 * ])
23 * <!-- wp:image {"src":"https:\/\/modern-webstore.org\/image.jpg"} -->
24 * ```
25 *
26 * @TODO Use a proper JSON parser and encoder to:
27 * * Support UTF-16 characters
28 * * Gracefully handle recoverable encoding issues
29 * * Avoid changing the whitespace in the same manner as
30 * we do in WP_HTML_Tag_Processor. e.g. if we start with:
31 *
32 * ```html
33 * <!-- wp:block {"url":"https://w.org"}` -->
34 * ^ no space here
35 * ```
36 *
37 * then it would be nice to re-encode that block markup also without the space character. This is similar
38 * to how the tag processor avoids changing parts of the tag it doesn't need to change.
39 */
40 function wp_rewrite_urls( $options ) {
41 static $rewrite_cache = null;
42
43 if ( null === $rewrite_cache ) {
44 $rewrite_cache = new URLRewriteCache();
45 }
46
47 if ( empty( $options['base_url'] ) ) {
48 // Use first from-url as base_url if not specified.
49 $from_urls = array_keys( $options['url-mapping'] );
50 $options['base_url'] = $from_urls[0];
51 }
52
53 $base_url_object = WPURL::parse( $options['base_url'] );
54 if ( false === $base_url_object ) {
55 return $options['block_markup'];
56 }
57
58 $url_mapping = array();
59 $mapping_key_parts = array( 'base=' . $options['base_url'] );
60 foreach ( $options['url-mapping'] as $from_url_string => $to_url_string ) {
61 $url_mapping[] = array(
62 'from_url' => WPURL::parse( $from_url_string ),
63 'to_url' => WPURL::parse( $to_url_string ),
64 );
65 $mapping_key_parts[] = $from_url_string . '=>' . $to_url_string;
66 }
67 $mapping_cache_key = sha1( implode( "\0", $mapping_key_parts ) );
68
69 $p = new BlockMarkupUrlProcessor( $options['block_markup'], $options['base_url'] );
70 while ( $p->next_url() ) {
71 $token_type = $p->get_token_type();
72 $raw_url = $p->get_raw_url();
73 $cache_key = $mapping_cache_key . "\0" . $token_type . "\0" . $raw_url;
74
75 $cached = $rewrite_cache->get( $cache_key );
76 if ( null !== $cached ) {
77 if ( false !== $cached ) {
78 $p->set_url( $cached['raw_url'], $cached['parsed_url'] );
79 }
80 continue;
81 }
82
83 $parsed_url = $p->get_parsed_url();
84 $converted = false;
85 foreach ( $url_mapping as $mapping ) {
86 if ( is_child_url_of( $parsed_url, $mapping['from_url'] ) ) {
87 $converted = WPURL::replace_base_url(
88 $parsed_url,
89 array(
90 'old_base_url' => $base_url_object,
91 'new_base_url' => $mapping['to_url'],
92 'raw_url' => $raw_url,
93 'is_relative' => (
94 '#text' !== $token_type &&
95 ! WPURL::can_parse( $raw_url )
96 ),
97 )
98 );
99 break;
100 }
101 }
102
103 $cache_value = false;
104 if ( false !== $converted ) {
105 $cache_value = array(
106 'raw_url' => (string) $converted,
107 'parsed_url' => $converted->new_url,
108 );
109 $p->set_url( $cache_value['raw_url'], $cache_value['parsed_url'] );
110 }
111
112 $rewrite_cache->set( $cache_key, $cache_value );
113 }
114
115 return $p->get_updated_html();
116 }
117
118 /**
119 * Check if a given URL matches the current site URL.
120 *
121 * @param URL $child The URL to check.
122 * @param string $parent_url The current site URL to compare against.
123 *
124 * @return bool Whether the URL matches the current site URL.
125 */
126 function is_child_url_of( $child, $parent_url ) {
127 $parent_url = is_string( $parent_url ) ? WPURL::parse( $parent_url ) : $parent_url;
128 $child = is_string( $child ) ? WPURL::parse( $child ) : $child;
129 $child_pathname_no_trailing_slash = rtrim( urldecode( $child->pathname ), '/' );
130
131 if ( false === $child || false === $parent_url ) {
132 return false;
133 }
134
135 if ( $parent_url->hostname !== $child->hostname ) {
136 return false;
137 }
138
139 if ( $parent_url->protocol !== $child->protocol ) {
140 return false;
141 }
142
143 $parent_pathname = urldecode( $parent_url->pathname );
144
145 return (
146 // Direct match.
147 $parent_pathname === $child_pathname_no_trailing_slash ||
148 $parent_pathname === $child_pathname_no_trailing_slash . '/' ||
149 // Path prefix.
150 0 === strncmp( $child_pathname_no_trailing_slash . '/', $parent_pathname, strlen( $parent_pathname ) )
151 );
152 }
153
154 /**
155 * Decodes the first n **encoded bytes** a URL-encoded string.
156 *
157 * For example, `urldecode_n( '%22is 6 %3C 6?%22 – asked Achilles', 1 )` returns
158 * '"is 6 %3C 6?%22 – asked Achilles' because only the first encoded byte is decoded.
159 *
160 * @param string $input The string to decode.
161 * @param int $decode_n The number of bytes to decode in $input
162 *
163 * @return string The decoded string.
164 */
165 function urldecode_n( $input, $decode_n ) {
166 // Fast paths: nothing to do.
167 if ( $decode_n <= 0 || false === strpos( $input, '%' ) ) {
168 return $input;
169 }
170
171 $result = '';
172 $at = 0;
173 while ( true ) {
174 if ( $at + 3 > strlen( $input ) ) {
175 break;
176 }
177
178 $last_at = $at;
179 $at += strcspn( $input, '%', $at );
180 // Consume bytes except for the percent sign.
181 $result .= substr( $input, $last_at, $at - $last_at );
182
183 // If we've already decoded the requested number of bytes, stop.
184 if ( strlen( $result ) >= $decode_n ) {
185 break;
186 }
187
188 ++$at;
189 if ( $at > strlen( $input ) ) {
190 break;
191 }
192
193 $decodable_length = strspn(
194 $input,
195 '0123456789ABCDEFabcdef',
196 $at,
197 2
198 );
199
200 if ( 2 === $decodable_length ) {
201 // Decodes the urlencoded hex sequence from URL.
202 // Note: This decodes bytes, not characters. It will recover the original byte sequence,
203 // not necessarily any valid UTF-8 characters.
204 $result .= chr( hexdec( $input[ $at ] . $input[ $at + 1 ] ) );
205 $at += 2;
206 } else {
207 // Consume the next byte and move on.
208 $result .= '%';
209 }
210 }
211 $result .= substr( $input, $at );
212
213 return $result;
214 }
215