PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 7.5.0.1
Jetpack – WP Security, Backup, Speed, & Growth v7.5.0.1
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 / functions.photon.php
jetpack Last commit date
3rd-party 6 years ago _inc 6 years ago bin 6 years ago css 6 years ago extensions 6 years ago images 7 years ago json-endpoints 6 years ago languages 6 years ago logs 9 years ago modules 6 years ago sal 6 years ago src 6 years ago sync 6 years ago vendor 6 years ago views 7 years ago wp-cli-templates 7 years ago .svnignore 12 years ago CODE-OF-CONDUCT.md 9 years ago changelog.txt 6 years ago class.frame-nonce-preview.php 9 years ago class.jetpack-admin.php 7 years ago class.jetpack-affiliate.php 7 years ago class.jetpack-autoupdate.php 7 years ago class.jetpack-bbpress-json-api-compat.php 9 years ago class.jetpack-cli.php 6 years ago class.jetpack-client-server.php 6 years ago class.jetpack-client.php 6 years ago class.jetpack-connection-banner.php 6 years ago class.jetpack-constants.php 6 years ago class.jetpack-data.php 6 years ago class.jetpack-debugger.php 7 years ago class.jetpack-error.php 10 years ago class.jetpack-gutenberg.php 6 years ago class.jetpack-heartbeat.php 7 years ago class.jetpack-idc.php 6 years ago class.jetpack-ixr-client.php 6 years ago class.jetpack-jitm.php 6 years ago class.jetpack-modules-list-table.php 6 years ago class.jetpack-network-sites-list-table.php 9 years ago class.jetpack-network.php 6 years ago class.jetpack-options.php 6 years ago class.jetpack-plan.php 6 years ago class.jetpack-post-images.php 7 years ago class.jetpack-signature.php 6 years ago class.jetpack-tracks.php 6 years ago class.jetpack-twitter-cards.php 7 years ago class.jetpack-user-agent.php 7 years ago class.jetpack-xmlrpc-server.php 6 years ago class.jetpack.php 6 years ago class.json-api-endpoints.php 6 years ago class.json-api.php 7 years ago class.photon.php 6 years ago composer.json 6 years ago functions.compat.php 6 years ago functions.gallery.php 6 years ago functions.global.php 6 years ago functions.opengraph.php 7 years ago functions.photon.php 6 years ago jest.config.js 7 years ago jetpack.php 6 years ago json-api-config.php 10 years ago json-endpoints.php 7 years ago load-jetpack.php 6 years ago locales.php 7 years ago readme.txt 6 years ago require-lib.php 6 years ago uninstall.php 6 years ago wpml-config.xml 10 years ago
functions.photon.php
328 lines
1 <?php
2
3 /**
4 * Generates a Photon URL.
5 *
6 * @see http://developer.wordpress.com/docs/photon/
7 *
8 * @param string $image_url URL to the publicly accessible image you want to manipulate
9 * @param array|string $args An array of arguments, i.e. array( 'w' => '300', 'resize' => array( 123, 456 ) ), or in string form (w=123&h=456)
10 * @return string The raw final URL. You should run this through esc_url() before displaying it.
11 */
12 function jetpack_photon_url( $image_url, $args = array(), $scheme = null ) {
13 $image_url = trim( $image_url );
14
15 if ( ! defined( 'IS_WPCOM' ) || ! IS_WPCOM ) {
16 /**
17 * Disables Photon URL processing for local development
18 *
19 * @module photon
20 *
21 * @since 4.1.0
22 *
23 * @param bool false Result of Jetpack::is_development_mode.
24 */
25 if ( true === apply_filters( 'jetpack_photon_development_mode', Jetpack::is_development_mode() ) ) {
26 return $image_url;
27 }
28 }
29
30 /**
31 * Allow specific image URls to avoid going through Photon.
32 *
33 * @module photon
34 *
35 * @since 3.2.0
36 *
37 * @param bool false Should the image be returned as is, without going through Photon. Default to false.
38 * @param string $image_url Image URL.
39 * @param array|string $args Array of Photon arguments.
40 * @param string|null $scheme Image scheme. Default to null.
41 */
42 if ( false !== apply_filters( 'jetpack_photon_skip_for_url', false, $image_url, $args, $scheme ) ) {
43 return $image_url;
44 }
45
46 /**
47 * Filter the original image URL before it goes through Photon.
48 *
49 * @module photon
50 *
51 * @since 1.9.0
52 *
53 * @param string $image_url Image URL.
54 * @param array|string $args Array of Photon arguments.
55 * @param string|null $scheme Image scheme. Default to null.
56 */
57 $image_url = apply_filters( 'jetpack_photon_pre_image_url', $image_url, $args, $scheme );
58 /**
59 * Filter the original Photon image parameters before Photon is applied to an image.
60 *
61 * @module photon
62 *
63 * @since 1.9.0
64 *
65 * @param array|string $args Array of Photon arguments.
66 * @param string $image_url Image URL.
67 * @param string|null $scheme Image scheme. Default to null.
68 */
69 $args = apply_filters( 'jetpack_photon_pre_args', $args, $image_url, $scheme );
70
71 if ( empty( $image_url ) ) {
72 return $image_url;
73 }
74
75 $image_url_parts = @jetpack_photon_parse_url( $image_url );
76
77 // Unable to parse
78 if ( ! is_array( $image_url_parts ) || empty( $image_url_parts['host'] ) || empty( $image_url_parts['path'] ) ) {
79 return $image_url;
80 }
81
82 if ( is_array( $args ) ){
83 // Convert values that are arrays into strings
84 foreach ( $args as $arg => $value ) {
85 if ( is_array( $value ) ) {
86 $args[$arg] = implode( ',', $value );
87 }
88 }
89
90 // Encode values
91 // See http://core.trac.wordpress.org/ticket/17923
92 $args = rawurlencode_deep( $args );
93 }
94
95 // Don't photon-ize WPCOM hosted images -- we can serve them up from wpcom directly.
96 $is_wpcom_image = false;
97 if ( wp_endswith( strtolower( $image_url_parts['host'] ), '.files.wordpress.com' ) ) {
98 $is_wpcom_image = true;
99 if ( isset( $args['ssl'] ) ) {
100 // Do not send the ssl argument to prevent caching issues
101 unset( $args['ssl'] );
102 }
103 }
104
105 /** This filter is documented below. */
106 $custom_photon_url = apply_filters( 'jetpack_photon_domain', '', $image_url );
107 $custom_photon_url = esc_url( $custom_photon_url );
108
109 // You can't run a Photon URL through Photon again because query strings are stripped.
110 // So if the image is already a Photon URL, append the new arguments to the existing URL.
111 // Alternately, if it's a *.files.wordpress.com url, then keep the domain as is.
112 if (
113 in_array( $image_url_parts['host'], array( 'i0.wp.com', 'i1.wp.com', 'i2.wp.com' ) )
114 || $image_url_parts['host'] === jetpack_photon_parse_url( $custom_photon_url, PHP_URL_HOST )
115 || $is_wpcom_image
116 ) {
117 /*
118 * VideoPress Poster images should only keep one param, ssl.
119 */
120 if (
121 is_array( $args )
122 && 'videos.files.wordpress.com' === strtolower( $image_url_parts['host'] )
123 ) {
124 $args = array_intersect_key( array( 'ssl' => 1 ), $args );
125 }
126
127 $photon_url = add_query_arg( $args, $image_url );
128 return jetpack_photon_url_scheme( $photon_url, $scheme );
129 }
130
131 /**
132 * Allow Photon to use query strings as well.
133 * By default, Photon doesn't support query strings so we ignore them and look only at the path.
134 * This setting is Photon Server dependent.
135 *
136 * @module photon
137 *
138 * @since 1.9.0
139 *
140 * @param bool false Should images using query strings go through Photon. Default is false.
141 * @param string $image_url_parts['host'] Image URL's host.
142 */
143 if ( ! apply_filters( 'jetpack_photon_any_extension_for_domain', false, $image_url_parts['host'] ) ) {
144 // Photon doesn't support query strings so we ignore them and look only at the path.
145 // However some source images are served via PHP so check the no-query-string extension.
146 // For future proofing, this is a blacklist of common issues rather than a whitelist.
147 $extension = pathinfo( $image_url_parts['path'], PATHINFO_EXTENSION );
148 if ( empty( $extension ) || in_array( $extension, array( 'php', 'ashx' ) ) ) {
149 return $image_url;
150 }
151 }
152
153 $image_host_path = $image_url_parts['host'] . $image_url_parts['path'];
154
155 // Figure out which CDN subdomain to use
156 srand( crc32( $image_host_path ) );
157 $subdomain = rand( 0, 2 );
158 srand();
159
160 /**
161 * Filters the domain used by the Photon module.
162 *
163 * @module photon
164 *
165 * @since 3.4.2
166 *
167 * @param string https://i{$subdomain}.wp.com Domain used by Photon. $subdomain is a random number between 0 and 2.
168 * @param string $image_url URL of the image to be photonized.
169 */
170 $photon_domain = apply_filters( 'jetpack_photon_domain', "https://i{$subdomain}.wp.com", $image_url );
171 $photon_domain = trailingslashit( esc_url( $photon_domain ) );
172 $photon_url = $photon_domain . $image_host_path;
173
174 /**
175 * Add query strings to Photon URL.
176 * By default, Photon doesn't support query strings so we ignore them.
177 * This setting is Photon Server dependent.
178 *
179 * @module photon
180 *
181 * @since 1.9.0
182 *
183 * @param bool false Should query strings be added to the image URL. Default is false.
184 * @param string $image_url_parts['host'] Image URL's host.
185 */
186 if ( isset( $image_url_parts['query'] ) && apply_filters( 'jetpack_photon_add_query_string_to_domain', false, $image_url_parts['host'] ) ) {
187 $photon_url .= '?q=' . rawurlencode( $image_url_parts['query'] );
188 }
189
190 if ( $args ) {
191 if ( is_array( $args ) ) {
192 $photon_url = add_query_arg( $args, $photon_url );
193 } else {
194 // You can pass a query string for complicated requests but where you still want CDN subdomain help, etc.
195 $photon_url .= '?' . $args;
196 }
197 }
198
199 if ( isset( $image_url_parts['scheme'] ) && 'https' == $image_url_parts['scheme'] ) {
200 $photon_url = add_query_arg( array( 'ssl' => 1 ), $photon_url );
201 }
202
203 return jetpack_photon_url_scheme( $photon_url, $scheme );
204 }
205 add_filter( 'jetpack_photon_url', 'jetpack_photon_url', 10, 3 );
206
207 /**
208 * WordPress.com
209 *
210 * If a cropped WP.com-hosted image is the source image, have Photon replicate the crop.
211 */
212 add_filter( 'jetpack_photon_pre_args', 'jetpack_photon_parse_wpcom_query_args', 10, 2 );
213
214 function jetpack_photon_parse_wpcom_query_args( $args, $image_url ) {
215 $parsed_url = @parse_url( $image_url );
216
217 if ( ! $parsed_url )
218 return $args;
219
220 $image_url_parts = wp_parse_args( $parsed_url, array(
221 'host' => '',
222 'query' => ''
223 ) );
224
225 if ( '.files.wordpress.com' != substr( $image_url_parts['host'], -20 ) )
226 return $args;
227
228 if ( empty( $image_url_parts['query'] ) )
229 return $args;
230
231 $wpcom_args = wp_parse_args( $image_url_parts['query'] );
232
233 if ( empty( $wpcom_args['w'] ) || empty( $wpcom_args['h'] ) )
234 return $args;
235
236 // Keep the crop by using "resize"
237 if ( ! empty( $wpcom_args['crop'] ) ) {
238 if ( is_array( $args ) ) {
239 $args = array_merge( array( 'resize' => array( $wpcom_args['w'], $wpcom_args['h'] ) ), $args );
240 } else {
241 $args = 'resize=' . rawurlencode( absint( $wpcom_args['w'] ) . ',' . absint( $wpcom_args['h'] ) ) . '&' . $args;
242 }
243 } else {
244 if ( is_array( $args ) ) {
245 $args = array_merge( array( 'fit' => array( $wpcom_args['w'], $wpcom_args['h'] ) ), $args );
246 } else {
247 $args = 'fit=' . rawurlencode( absint( $wpcom_args['w'] ) . ',' . absint( $wpcom_args['h'] ) ) . '&' . $args;
248 }
249 }
250
251 return $args;
252 }
253
254 function jetpack_photon_url_scheme( $url, $scheme ) {
255 if ( ! in_array( $scheme, array( 'http', 'https', 'network_path' ) ) ) {
256 if ( preg_match( '#^(https?:)?//#', $url ) ) {
257 return $url;
258 }
259
260 $scheme = 'http';
261 }
262
263 if ( 'network_path' == $scheme ) {
264 $scheme_slashes = '//';
265 } else {
266 $scheme_slashes = "$scheme://";
267 }
268
269 return preg_replace( '#^([a-z:]+)?//#i', $scheme_slashes, $url );
270 }
271
272 /**
273 * A wrapper for PHP's parse_url, prepending assumed scheme for network path
274 * URLs. PHP versions 5.4.6 and earlier do not correctly parse without scheme.
275 *
276 * @see http://php.net/manual/en/function.parse-url.php#refsect1-function.parse-url-changelog
277 *
278 * @param string $url The URL to parse
279 * @param integer $component Retrieve specific URL component
280 * @return mixed Result of parse_url
281 */
282 function jetpack_photon_parse_url( $url, $component = -1 ) {
283 if ( 0 === strpos( $url, '//' ) ) {
284 $url = ( is_ssl() ? 'https:' : 'http:' ) . $url;
285 }
286
287 return parse_url( $url, $component );
288 }
289
290 add_filter( 'jetpack_photon_skip_for_url', 'jetpack_photon_banned_domains', 9, 2 );
291 function jetpack_photon_banned_domains( $skip, $image_url ) {
292 $banned_host_patterns = array(
293 '/^chart\.googleapis\.com$/',
294 '/^chart\.apis\.google\.com$/',
295 '/^graph\.facebook\.com$/',
296 '/\.fbcdn\.net$/',
297 '/\.paypalobjects\.com$/',
298 '/\.dropbox\.com$/',
299 '/\.cdninstagram\.com$/',
300 );
301
302 $host = jetpack_photon_parse_url( $image_url, PHP_URL_HOST );
303
304 foreach ( $banned_host_patterns as $banned_host_pattern ) {
305 if ( 1 === preg_match( $banned_host_pattern, $host ) ) {
306 return true;
307 }
308 }
309
310 return $skip;
311 }
312
313
314 /**
315 * Jetpack Photon - Support Text Widgets.
316 *
317 * @access public
318 * @param string $content Content from text widget.
319 * @return string
320 */
321 function jetpack_photon_support_text_widgets( $content ) {
322 if ( class_exists( 'Jetpack_Photon' ) && Jetpack::is_module_active( 'photon' ) ) {
323 return Jetpack_Photon::filter_the_content( $content );
324 }
325 return $content;
326 }
327 add_filter( 'widget_text', 'jetpack_photon_support_text_widgets' );
328