PluginProbe ʕ •ᴥ•ʔ
EmbedPress – PDF Embedder, Embed PDF viewer, YouTube Videos, 3D FlipBook, Social feeds & more / 2.0.1
EmbedPress – PDF Embedder, Embed PDF viewer, YouTube Videos, 3D FlipBook, Social feeds & more v2.0.1
4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 trunk 1.0.0 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.5.0 1.6.0 1.6.1 1.6.2 1.6.3 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 2.0.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.2.0 2.2.1 2.2.2 2.3.0 2.3.1 2.3.2 2.3.3 2.4.0 2.4.1 2.5.0 2.5.1 2.5.2 2.5.3 2.5.4 2.5.5 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.1.3 3.2.0 3.2.1 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.6.8 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 3.9.1 3.9.10 3.9.11 3.9.12 3.9.13 3.9.14 3.9.15 3.9.16 3.9.17 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9 4.0.0 4.0.1 4.0.10 4.0.11 4.0.12 4.0.13 4.0.14 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.0.9 4.1.0 4.1.1 4.1.10 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 4.1.9 4.2.0 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 4.2.7 4.2.8 4.2.9 4.3.0 4.3.1 4.4.0 4.4.1 4.4.10 4.4.11 4.4.2 4.4.3 4.4.4 4.4.5 4.4.6 4.4.7 4.4.8 4.4.9 4.5.0 4.5.1
embedpress / freemius / includes / fs-essential-functions.php
embedpress / freemius / includes Last commit date
debug 9 years ago entities 9 years ago managers 9 years ago sdk 9 years ago supplements 9 years ago class-freemius-abstract.php 9 years ago class-freemius.php 9 years ago class-fs-api.php 9 years ago class-fs-logger.php 9 years ago class-fs-plugin-updater.php 9 years ago class-fs-security.php 9 years ago fs-core-functions.php 9 years ago fs-essential-functions.php 9 years ago fs-plugin-info-dialog.php 9 years ago i18n.php 9 years ago index.php 9 years ago l10n.php 9 years ago
fs-essential-functions.php
459 lines
1 <?php
2 /**
3 * @package Freemius
4 * @copyright Copyright (c) 2015, Freemius, Inc.
5 * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
6 * @since 1.1.5
7 */
8
9 if ( ! function_exists( 'fs_normalize_path' ) ) {
10 if ( function_exists( 'wp_normalize_path' ) ) {
11 /**
12 * Normalize a filesystem path.
13 *
14 * Replaces backslashes with forward slashes for Windows systems, and ensures
15 * no duplicate slashes exist.
16 *
17 * @param string $path Path to normalize.
18 *
19 * @return string Normalized path.
20 */
21 function fs_normalize_path( $path ) {
22 return wp_normalize_path( $path );
23 }
24 } else {
25 function fs_normalize_path( $path ) {
26 $path = str_replace( '\\', '/', $path );
27 $path = preg_replace( '|/+|', '/', $path );
28
29 return $path;
30 }
31 }
32 }
33
34 #region Core Redirect (copied from BuddyPress) -----------------------------------------
35
36 if ( ! function_exists( 'fs_redirect' ) ) {
37 /**
38 * Redirects to another page, with a workaround for the IIS Set-Cookie bug.
39 *
40 * @link http://support.microsoft.com/kb/q176113/
41 * @since 1.5.1
42 * @uses apply_filters() Calls 'wp_redirect' hook on $location and $status.
43 *
44 * @param string $location The path to redirect to.
45 * @param bool $exit If true, exit after redirect (Since 1.2.1.5).
46 * @param int $status Status code to use.
47 *
48 * @return bool False if $location is not set
49 */
50 function fs_redirect( $location, $exit = true, $status = 302 ) {
51 global $is_IIS;
52
53 $file = '';
54 $line = '';
55 if ( headers_sent( $file, $line ) ) {
56 if ( WP_FS__DEBUG_SDK && class_exists( 'FS_Admin_Notice_Manager' ) ) {
57 $notices = FS_Admin_Notice_Manager::instance( 'global' );
58
59 $notices->add( "Freemius failed to redirect the page because the headers have been already sent from line <b><code>{$line}</code></b> in file <b><code>{$file}</code></b>. If it's unexpected, it usually happens due to invalid space and/or EOL character(s).", 'Oops...', 'error' );
60 }
61
62 return false;
63 }
64
65 if ( defined( 'DOING_AJAX' ) ) {
66 // Don't redirect on AJAX calls.
67 return false;
68 }
69
70 if ( ! $location ) // allows the wp_redirect filter to cancel a redirect
71 {
72 return false;
73 }
74
75 $location = fs_sanitize_redirect( $location );
76
77 if ( $is_IIS ) {
78 header( "Refresh: 0;url=$location" );
79 } else {
80 if ( php_sapi_name() != 'cgi-fcgi' ) {
81 status_header( $status );
82 } // This causes problems on IIS and some FastCGI setups
83 header( "Location: $location" );
84 }
85
86 if ( $exit ) {
87 exit();
88 }
89
90 return true;
91 }
92
93 if ( ! function_exists( 'fs_sanitize_redirect' ) ) {
94 /**
95 * Sanitizes a URL for use in a redirect.
96 *
97 * @since 2.3
98 *
99 * @param string $location
100 *
101 * @return string redirect-sanitized URL
102 */
103 function fs_sanitize_redirect( $location ) {
104 $location = preg_replace( '|[^a-z0-9-~+_.?#=&;,/:%!]|i', '', $location );
105 $location = fs_kses_no_null( $location );
106
107 // remove %0d and %0a from location
108 $strip = array( '%0d', '%0a' );
109 $found = true;
110 while ( $found ) {
111 $found = false;
112 foreach ( (array) $strip as $val ) {
113 while ( strpos( $location, $val ) !== false ) {
114 $found = true;
115 $location = str_replace( $val, '', $location );
116 }
117 }
118 }
119
120 return $location;
121 }
122 }
123
124 if ( ! function_exists( 'fs_kses_no_null' ) ) {
125 /**
126 * Removes any NULL characters in $string.
127 *
128 * @since 1.0.0
129 *
130 * @param string $string
131 *
132 * @return string
133 */
134 function fs_kses_no_null( $string ) {
135 $string = preg_replace( '/\0+/', '', $string );
136 $string = preg_replace( '/(\\\\0)+/', '', $string );
137
138 return $string;
139 }
140 }
141 }
142
143 #endregion Core Redirect (copied from BuddyPress) -----------------------------------------
144
145 if ( ! function_exists( '__fs' ) ) {
146 global $fs_text_overrides;
147
148 if ( ! isset( $fs_text_overrides ) ) {
149 $fs_text_overrides = array();
150 }
151
152 /**
153 * Retrieve a translated text by key.
154 *
155 * @deprecated Use `fs_text()` instead since methods starting with `__` trigger warnings in Php 7.
156 *
157 * @author Vova Feldman (@svovaf)
158 * @since 1.1.4
159 *
160 * @param string $key
161 * @param string $slug
162 *
163 * @return string
164 *
165 * @global $fs_text, $fs_text_overrides
166 */
167 function __fs( $key, $slug = 'freemius' ) {
168 global $fs_text,
169 $fs_module_info_text,
170 $fs_text_overrides;
171
172 if ( isset( $fs_text_overrides[ $slug ] ) ) {
173 if ( isset( $fs_text_overrides[ $slug ][ $key ] ) ) {
174 return $fs_text_overrides[ $slug ][ $key ];
175 }
176
177 $lower_key = strtolower( $key );
178 if ( isset( $fs_text_overrides[ $slug ][ $lower_key ] ) ) {
179 return $fs_text_overrides[ $slug ][ $lower_key ];
180 }
181 }
182
183 if ( ! isset( $fs_text ) ) {
184 $dir = defined( 'WP_FS__DIR_INCLUDES' ) ?
185 WP_FS__DIR_INCLUDES :
186 dirname( __FILE__ );
187
188 require_once $dir . '/i18n.php';
189 }
190
191 if ( isset( $fs_text[ $key ] ) ) {
192 return $fs_text[ $key ];
193 }
194
195 if ( isset( $fs_module_info_text[ $key ] ) ) {
196 return $fs_module_info_text[ $key ];
197 }
198
199 return $key;
200 }
201
202 /**
203 * Output a translated text by key.
204 *
205 * @deprecated Use `fs_echo()` instead for consistency with `fs_text()`.
206 *
207 * @author Vova Feldman (@svovaf)
208 * @since 1.1.4
209 *
210 * @param string $key
211 * @param string $slug
212 */
213 function _efs( $key, $slug = 'freemius' ) {
214 fs_echo( $key, $slug );
215 }
216 }
217
218 if ( ! function_exists( 'fs_override_i18n' ) ) {
219 /**
220 * Override default i18n text phrases.
221 *
222 * @author Vova Feldman (@svovaf)
223 * @since 1.1.6
224 *
225 * @param string[] $key_value
226 * @param string $slug
227 *
228 * @global $fs_text_overrides
229 */
230 function fs_override_i18n( array $key_value, $slug = 'freemius' ) {
231 global $fs_text_overrides;
232
233 if ( ! isset( $fs_text_overrides[ $slug ] ) ) {
234 $fs_text_overrides[ $slug ] = array();
235 }
236
237 foreach ( $key_value as $key => $value ) {
238 $fs_text_overrides[ $slug ][ $key ] = $value;
239 }
240 }
241 }
242
243 if ( ! function_exists( 'fs_get_ip' ) ) {
244 /**
245 * Get client IP.
246 *
247 * @author Vova Feldman (@svovaf)
248 * @since 1.1.2
249 *
250 * @return string|null
251 */
252 function fs_get_ip() {
253 $fields = array(
254 'HTTP_CF_CONNECTING_IP',
255 'HTTP_CLIENT_IP',
256 'HTTP_X_FORWARDED_FOR',
257 'HTTP_X_FORWARDED',
258 'HTTP_FORWARDED_FOR',
259 'HTTP_FORWARDED',
260 'REMOTE_ADDR',
261 );
262
263 foreach ( $fields as $ip_field ) {
264 if ( ! empty( $_SERVER[ $ip_field ] ) ) {
265 return $_SERVER[ $ip_field ];
266 }
267 }
268
269 return null;
270 }
271 }
272
273 /**
274 * Leverage backtrace to find caller plugin main file path.
275 *
276 * @author Vova Feldman (@svovaf)
277 * @since 1.0.6
278 *
279 * @return string
280 */
281 function fs_find_caller_plugin_file() {
282 /**
283 * All the code below will be executed once on activation.
284 * If the user changes the main plugin's file name, the file_exists()
285 * will catch it.
286 */
287 if ( ! function_exists( 'get_plugins' ) ) {
288 require_once ABSPATH . 'wp-admin/includes/plugin.php';
289 }
290
291 $all_plugins = get_plugins();
292 $all_plugins_paths = array();
293
294 // Get active plugin's main files real full names (might be symlinks).
295 foreach ( $all_plugins as $relative_path => &$data ) {
296 $all_plugins_paths[] = fs_normalize_path( realpath( WP_PLUGIN_DIR . '/' . $relative_path ) );
297 }
298
299 $plugin_file = null;
300 for ( $i = 1, $bt = debug_backtrace(), $len = count( $bt ); $i < $len; $i ++ ) {
301 if ( empty( $bt[ $i ]['file'] ) ) {
302 continue;
303 }
304
305 if ( in_array( fs_normalize_path( $bt[ $i ]['file'] ), $all_plugins_paths ) ) {
306 $plugin_file = $bt[ $i ]['file'];
307 break;
308 }
309 }
310
311 if ( is_null( $plugin_file ) ) {
312 // Throw an error to the developer in case of some edge case dev environment.
313 wp_die(
314 "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error.",
315 'Error',
316 array( 'back_link' => true )
317 );
318 }
319
320 return $plugin_file;
321 }
322
323 require_once dirname( __FILE__ ) . '/supplements/fs-essential-functions-1.1.7.1.php';
324
325 /**
326 * Update SDK newest version reference.
327 *
328 * @author Vova Feldman (@svovaf)
329 * @since 1.1.6
330 *
331 * @param string $sdk_relative_path
332 * @param string|bool $plugin_file
333 *
334 * @global $fs_active_plugins
335 */
336 function fs_update_sdk_newest_version( $sdk_relative_path, $plugin_file = false ) {
337 global $fs_active_plugins;
338
339 if ( ! is_string( $plugin_file ) ) {
340 $plugin_file = plugin_basename( fs_find_caller_plugin_file() );
341 }
342
343 $fs_active_plugins->newest = (object) array(
344 'plugin_path' => $plugin_file,
345 'sdk_path' => $sdk_relative_path,
346 'version' => $fs_active_plugins->plugins[ $sdk_relative_path ]->version,
347 'in_activation' => ! is_plugin_active( $plugin_file ),
348 'timestamp' => time(),
349 );
350
351 // Update DB with latest SDK version and path.
352 update_option( 'fs_active_plugins', $fs_active_plugins );
353 }
354
355 /**
356 * Reorder the plugins load order so the plugin with the newest Freemius SDK is loaded first.
357 *
358 * @author Vova Feldman (@svovaf)
359 * @since 1.1.6
360 *
361 * @return bool Was plugin order changed. Return false if plugin was loaded first anyways.
362 *
363 * @global $fs_active_plugins
364 */
365 function fs_newest_sdk_plugin_first() {
366 global $fs_active_plugins;
367
368 /**
369 * @todo Multi-site network activated plugin are always loaded prior to site plugins so if there's a a plugin activated in the network mode that has an older version of the SDK of another plugin which is site activated that has new SDK version, the fs-essential-functions.php will be loaded from the older SDK. Same thing about MU plugins (loaded even before network activated plugins).
370 *
371 * @link https://github.com/Freemius/wordpress-sdk/issues/26
372 */
373 // $active_sitewide_plugins = get_site_option( 'active_sitewide_plugins' );
374
375 $active_plugins = get_option( 'active_plugins' );
376 $newest_sdk_plugin_key = array_search( $fs_active_plugins->newest->plugin_path, $active_plugins );
377 if ( 0 == $newest_sdk_plugin_key ) {
378 // if it's 0 it's the first plugin already, no need to continue
379 return false;
380 }
381
382 array_splice( $active_plugins, $newest_sdk_plugin_key, 1 );
383 array_unshift( $active_plugins, $fs_active_plugins->newest->plugin_path );
384 update_option( 'active_plugins', $active_plugins );
385
386 return true;
387 }
388
389 /**
390 * Go over all Freemius SDKs in the system and find and "remember"
391 * the newest SDK which is associated with an active plugin.
392 *
393 * @author Vova Feldman (@svovaf)
394 * @since 1.1.6
395 *
396 * @global $fs_active_plugins
397 */
398 function fs_fallback_to_newest_active_sdk() {
399 global $fs_active_plugins;
400
401 /**
402 * @var object $newest_sdk_data
403 */
404 $newest_sdk_data = null;
405 $newest_sdk_path = null;
406
407 foreach ( $fs_active_plugins->plugins as $sdk_relative_path => $data ) {
408 if ( is_null( $newest_sdk_data ) || version_compare( $data->version, $newest_sdk_data->version, '>' )
409 ) {
410 // If plugin inactive or SDK starter file doesn't exist, remove SDK reference.
411 if ( ! is_plugin_active( $data->plugin_path ) ||
412 ! file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $sdk_relative_path . '/start.php' ) )
413 ) {
414 unset( $fs_active_plugins->plugins[ $sdk_relative_path ] );
415
416 // No need to store the data since it will be stored in fs_update_sdk_newest_version()
417 // or explicitly with update_option().
418 } else {
419 $newest_sdk_data = $data;
420 $newest_sdk_path = $sdk_relative_path;
421 }
422 }
423 }
424
425 if ( is_null( $newest_sdk_data ) ) {
426 // Couldn't find any SDK reference.
427 $fs_active_plugins = new stdClass();
428 update_option( 'fs_active_plugins', $fs_active_plugins );
429 } else {
430 fs_update_sdk_newest_version( $newest_sdk_path, $newest_sdk_data->plugin_path );
431 }
432 }
433
434 #region Actions / Filters -----------------------------------------
435
436 /**
437 * Apply filter for specific plugin.
438 *
439 * @author Vova Feldman (@svovaf)
440 * @since 1.0.9
441 *
442 * @param string $slug Plugin slug
443 * @param string $tag The name of the filter hook.
444 * @param mixed $value The value on which the filters hooked to `$tag` are applied on.
445 *
446 * @return mixed The filtered value after all hooked functions are applied to it.
447 *
448 * @uses apply_filters()
449 */
450 function fs_apply_filter( $slug, $tag, $value ) {
451 $args = func_get_args();
452
453 return call_user_func_array( 'apply_filters', array_merge(
454 array( "fs_{$tag}_{$slug}" ),
455 array_slice( $args, 2 ) )
456 );
457 }
458
459 #endregion Actions / Filters -----------------------------------------