PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 7.3.0.1
Jetpack – WP Security, Backup, Speed, & Growth v7.3.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 7 years ago _inc 7 years ago bin 7 years ago css 7 years ago extensions 7 years ago images 7 years ago json-endpoints 7 years ago languages 7 years ago logs 9 years ago modules 7 years ago sal 7 years ago scss 7 years ago sync 7 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 7 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 7 years ago class.jetpack-client-server.php 8 years ago class.jetpack-client.php 7 years ago class.jetpack-connection-banner.php 7 years ago class.jetpack-constants.php 8 years ago class.jetpack-data.php 7 years ago class.jetpack-debugger.php 7 years ago class.jetpack-error.php 10 years ago class.jetpack-gutenberg.php 7 years ago class.jetpack-heartbeat.php 7 years ago class.jetpack-idc.php 8 years ago class.jetpack-ixr-client.php 10 years ago class.jetpack-jitm.php 7 years ago class.jetpack-modules-list-table.php 7 years ago class.jetpack-network-sites-list-table.php 9 years ago class.jetpack-network.php 7 years ago class.jetpack-options.php 7 years ago class.jetpack-plan.php 7 years ago class.jetpack-post-images.php 7 years ago class.jetpack-signature.php 7 years ago class.jetpack-tracks.php 7 years ago class.jetpack-twitter-cards.php 7 years ago class.jetpack-user-agent.php 8 years ago class.jetpack-xmlrpc-server.php 7 years ago class.jetpack.php 7 years ago class.json-api-endpoints.php 7 years ago class.json-api.php 7 years ago class.photon.php 7 years ago composer.json 7 years ago functions.compat.php 7 years ago functions.gallery.php 8 years ago functions.global.php 7 years ago functions.opengraph.php 7 years ago functions.photon.php 7 years ago jest.config.js 7 years ago jetpack.php 7 years ago json-api-config.php 10 years ago json-endpoints.php 7 years ago locales.php 7 years ago readme.txt 7 years ago require-lib.php 7 years ago uninstall.php 7 years ago wpml-config.xml 10 years ago
functions.photon.php
318 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 $photon_url = add_query_arg( $args, $image_url );
118 return jetpack_photon_url_scheme( $photon_url, $scheme );
119 }
120
121 /**
122 * Allow Photon to use query strings as well.
123 * By default, Photon doesn't support query strings so we ignore them and look only at the path.
124 * This setting is Photon Server dependent.
125 *
126 * @module photon
127 *
128 * @since 1.9.0
129 *
130 * @param bool false Should images using query strings go through Photon. Default is false.
131 * @param string $image_url_parts['host'] Image URL's host.
132 */
133 if ( ! apply_filters( 'jetpack_photon_any_extension_for_domain', false, $image_url_parts['host'] ) ) {
134 // Photon doesn't support query strings so we ignore them and look only at the path.
135 // However some source images are served via PHP so check the no-query-string extension.
136 // For future proofing, this is a blacklist of common issues rather than a whitelist.
137 $extension = pathinfo( $image_url_parts['path'], PATHINFO_EXTENSION );
138 if ( empty( $extension ) || in_array( $extension, array( 'php', 'ashx' ) ) ) {
139 return $image_url;
140 }
141 }
142
143 $image_host_path = $image_url_parts['host'] . $image_url_parts['path'];
144
145 // Figure out which CDN subdomain to use
146 srand( crc32( $image_host_path ) );
147 $subdomain = rand( 0, 2 );
148 srand();
149
150 /**
151 * Filters the domain used by the Photon module.
152 *
153 * @module photon
154 *
155 * @since 3.4.2
156 *
157 * @param string https://i{$subdomain}.wp.com Domain used by Photon. $subdomain is a random number between 0 and 2.
158 * @param string $image_url URL of the image to be photonized.
159 */
160 $photon_domain = apply_filters( 'jetpack_photon_domain', "https://i{$subdomain}.wp.com", $image_url );
161 $photon_domain = trailingslashit( esc_url( $photon_domain ) );
162 $photon_url = $photon_domain . $image_host_path;
163
164 /**
165 * Add query strings to Photon URL.
166 * By default, Photon doesn't support query strings so we ignore them.
167 * This setting is Photon Server dependent.
168 *
169 * @module photon
170 *
171 * @since 1.9.0
172 *
173 * @param bool false Should query strings be added to the image URL. Default is false.
174 * @param string $image_url_parts['host'] Image URL's host.
175 */
176 if ( isset( $image_url_parts['query'] ) && apply_filters( 'jetpack_photon_add_query_string_to_domain', false, $image_url_parts['host'] ) ) {
177 $photon_url .= '?q=' . rawurlencode( $image_url_parts['query'] );
178 }
179
180 if ( $args ) {
181 if ( is_array( $args ) ) {
182 $photon_url = add_query_arg( $args, $photon_url );
183 } else {
184 // You can pass a query string for complicated requests but where you still want CDN subdomain help, etc.
185 $photon_url .= '?' . $args;
186 }
187 }
188
189 if ( isset( $image_url_parts['scheme'] ) && 'https' == $image_url_parts['scheme'] ) {
190 $photon_url = add_query_arg( array( 'ssl' => 1 ), $photon_url );
191 }
192
193 return jetpack_photon_url_scheme( $photon_url, $scheme );
194 }
195 add_filter( 'jetpack_photon_url', 'jetpack_photon_url', 10, 3 );
196
197 /**
198 * WordPress.com
199 *
200 * If a cropped WP.com-hosted image is the source image, have Photon replicate the crop.
201 */
202 add_filter( 'jetpack_photon_pre_args', 'jetpack_photon_parse_wpcom_query_args', 10, 2 );
203
204 function jetpack_photon_parse_wpcom_query_args( $args, $image_url ) {
205 $parsed_url = @parse_url( $image_url );
206
207 if ( ! $parsed_url )
208 return $args;
209
210 $image_url_parts = wp_parse_args( $parsed_url, array(
211 'host' => '',
212 'query' => ''
213 ) );
214
215 if ( '.files.wordpress.com' != substr( $image_url_parts['host'], -20 ) )
216 return $args;
217
218 if ( empty( $image_url_parts['query'] ) )
219 return $args;
220
221 $wpcom_args = wp_parse_args( $image_url_parts['query'] );
222
223 if ( empty( $wpcom_args['w'] ) || empty( $wpcom_args['h'] ) )
224 return $args;
225
226 // Keep the crop by using "resize"
227 if ( ! empty( $wpcom_args['crop'] ) ) {
228 if ( is_array( $args ) ) {
229 $args = array_merge( array( 'resize' => array( $wpcom_args['w'], $wpcom_args['h'] ) ), $args );
230 } else {
231 $args = 'resize=' . rawurlencode( absint( $wpcom_args['w'] ) . ',' . absint( $wpcom_args['h'] ) ) . '&' . $args;
232 }
233 } else {
234 if ( is_array( $args ) ) {
235 $args = array_merge( array( 'fit' => array( $wpcom_args['w'], $wpcom_args['h'] ) ), $args );
236 } else {
237 $args = 'fit=' . rawurlencode( absint( $wpcom_args['w'] ) . ',' . absint( $wpcom_args['h'] ) ) . '&' . $args;
238 }
239 }
240
241 return $args;
242 }
243
244 function jetpack_photon_url_scheme( $url, $scheme ) {
245 if ( ! in_array( $scheme, array( 'http', 'https', 'network_path' ) ) ) {
246 if ( preg_match( '#^(https?:)?//#', $url ) ) {
247 return $url;
248 }
249
250 $scheme = 'http';
251 }
252
253 if ( 'network_path' == $scheme ) {
254 $scheme_slashes = '//';
255 } else {
256 $scheme_slashes = "$scheme://";
257 }
258
259 return preg_replace( '#^([a-z:]+)?//#i', $scheme_slashes, $url );
260 }
261
262 /**
263 * A wrapper for PHP's parse_url, prepending assumed scheme for network path
264 * URLs. PHP versions 5.4.6 and earlier do not correctly parse without scheme.
265 *
266 * @see http://php.net/manual/en/function.parse-url.php#refsect1-function.parse-url-changelog
267 *
268 * @param string $url The URL to parse
269 * @param integer $component Retrieve specific URL component
270 * @return mixed Result of parse_url
271 */
272 function jetpack_photon_parse_url( $url, $component = -1 ) {
273 if ( 0 === strpos( $url, '//' ) ) {
274 $url = ( is_ssl() ? 'https:' : 'http:' ) . $url;
275 }
276
277 return parse_url( $url, $component );
278 }
279
280 add_filter( 'jetpack_photon_skip_for_url', 'jetpack_photon_banned_domains', 9, 2 );
281 function jetpack_photon_banned_domains( $skip, $image_url ) {
282 $banned_host_patterns = array(
283 '/^chart\.googleapis\.com$/',
284 '/^chart\.apis\.google\.com$/',
285 '/^graph\.facebook\.com$/',
286 '/\.fbcdn\.net$/',
287 '/\.paypalobjects\.com$/',
288 '/\.dropbox\.com$/',
289 '/\.cdninstagram\.com$/',
290 );
291
292 $host = jetpack_photon_parse_url( $image_url, PHP_URL_HOST );
293
294 foreach ( $banned_host_patterns as $banned_host_pattern ) {
295 if ( 1 === preg_match( $banned_host_pattern, $host ) ) {
296 return true;
297 }
298 }
299
300 return $skip;
301 }
302
303
304 /**
305 * Jetpack Photon - Support Text Widgets.
306 *
307 * @access public
308 * @param string $content Content from text widget.
309 * @return string
310 */
311 function jetpack_photon_support_text_widgets( $content ) {
312 if ( class_exists( 'Jetpack_Photon' ) && Jetpack::is_module_active( 'photon' ) ) {
313 return Jetpack_Photon::filter_the_content( $content );
314 }
315 return $content;
316 }
317 add_filter( 'widget_text', 'jetpack_photon_support_text_widgets' );
318