Issues (865)

Security Analysis    4 potential vulnerabilities

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Code Injection (1)
Code Injection enables an attacker to execute arbitrary code on the server.
  Variable Injection (2)
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Cross-Site Scripting (1)
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  Header Injection
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

wp-font-awesome-settings.php (10 issues)

1
<?php
2
/**
3
 * A class for adjusting font awesome settings on WordPress
4
 *
5
 * This class can be added to any plugin or theme and will add a settings screen to WordPress to control Font Awesome settings.
6
 *
7
 * @link https://github.com/AyeCode/wp-font-awesome-settings
8
 *
9
 * @internal This file should not be edited directly but pulled from the github repo above.
10
 */
11
12
/**
13
 * Bail if we are not in WP.
14
 */
15
if ( ! defined( 'ABSPATH' ) ) {
16
	exit;
17
}
18
19
/**
20
 * Only add if the class does not already exist.
21
 */
22
if ( ! class_exists( 'WP_Font_Awesome_Settings' ) ) {
23
24
	/**
25
	 * A Class to be able to change settings for Font Awesome.
26
	 *
27
	 * Class WP_Font_Awesome_Settings
28
	 */
29
	class WP_Font_Awesome_Settings {
30
31
		/**
32
		 * Class version version.
33
		 *
34
		 * @var string
35
		 */
36
		public $version = '1.1.10';
37
38
		/**
39
		 * Class textdomain.
40
		 *
41
		 * @var string
42
		 */
43
		public $textdomain = 'font-awesome-settings';
44
45
		/**
46
		 * Latest version of Font Awesome at time of publish published.
47
		 *
48
		 * @var string
49
		 */
50
		public $latest = "6.4.2";
51
52
		/**
53
		 * The title.
54
		 *
55
		 * @var string
56
		 */
57
		public $name = 'Font Awesome';
58
59
		/**
60
		 * Holds the settings values.
61
		 *
62
		 * @var array
63
		 */
64
		private $settings;
65
66
		/**
67
		 * WP_Font_Awesome_Settings instance.
68
		 *
69
		 * @access private
70
		 * @since  1.0.0
71
		 * @var    WP_Font_Awesome_Settings There can be only one!
72
		 */
73
		private static $instance = null;
74
75
		/**
76
		 * Main WP_Font_Awesome_Settings Instance.
77
		 *
78
		 * Ensures only one instance of WP_Font_Awesome_Settings is loaded or can be loaded.
79
		 *
80
		 * @since 1.0.0
81
		 * @static
82
		 * @return WP_Font_Awesome_Settings - Main instance.
83
		 */
84
		public static function instance() {
85
			if ( ! isset( self::$instance ) && ! ( self::$instance instanceof WP_Font_Awesome_Settings ) ) {
86
				self::$instance = new WP_Font_Awesome_Settings;
87
88
				add_action( 'init', array( self::$instance, 'init' ) ); // set settings
89
90
				if ( is_admin() ) {
91
					add_action( 'admin_menu', array( self::$instance, 'menu_item' ) );
92
					add_action( 'admin_init', array( self::$instance, 'register_settings' ) );
93
					add_action( 'admin_init', array( self::$instance, 'constants' ) );
94
					add_action( 'admin_notices', array( self::$instance, 'admin_notices' ) );
95
				}
96
97
				do_action( 'wp_font_awesome_settings_loaded' );
98
			}
99
100
			return self::$instance;
101
		}
102
103
		/**
104
         * Define any constants that may be needed by other packages.
105
         *
106
		 * @return void
107
		 */
108
		public function constants(){
109
110
			// register iconpicker constant
111
			if ( ! defined( 'FAS_ICONPICKER_JS_URL' ) ) {
112
				$url = $this->get_path_url();
113
				$version = $this->settings['version'];
114
115
				if( !$version || version_compare($version,'5.999','>')){
116
					$url .= 'assets/js/fa-iconpicker-v6.min.js';
117
				}else{
118
					$url .= 'assets/js/fa-iconpicker-v5.min.js';
119
				}
120
121
				define( 'FAS_ICONPICKER_JS_URL', $url );
122
123
			}
124
125
            // Set a constant if pro enabled
126
			if ( ! defined( 'FAS_PRO' ) && $this->settings['pro'] ) {
127
				define( 'FAS_PRO', true );
128
			}
129
		}
130
131
		/**
132
		 * Get the url path to the current folder.
133
		 *
134
		 * @return string
135
		 */
136
		public function get_path_url() {
137
			$content_dir = wp_normalize_path( untrailingslashit( WP_CONTENT_DIR ) );
138
			$content_url = untrailingslashit( WP_CONTENT_URL );
139
140
			// Replace http:// to https://.
141
			if ( strpos( $content_url, 'http://' ) === 0 && strpos( plugins_url(), 'https://' ) === 0 ) {
142
				$content_url = str_replace( 'http://', 'https://', $content_url );
143
			}
144
145
			// Check if we are inside a plugin
146
			$file_dir = str_replace( "/includes", "", wp_normalize_path( dirname( __FILE__ ) ) );
147
			$url = str_replace( $content_dir, $content_url, $file_dir );
148
149
			return trailingslashit( $url );
150
		}
151
152
		/**
153
		 * Initiate the settings and add the required action hooks.
154
		 *
155
		 * @since 1.0.8 Settings name wrong - FIXED
156
		 */
157
		public function init() {
158
			// Download fontawesome locally.
159
			add_action( 'add_option_wp-font-awesome-settings', array( $this, 'add_option_wp_font_awesome_settings' ), 10, 2 );
160
			add_action( 'update_option_wp-font-awesome-settings', array( $this, 'update_option_wp_font_awesome_settings' ), 10, 2 );
161
162
			$this->settings = $this->get_settings();
163
164
			// Check if the official plugin is active and use that instead if so.
165
			if ( ! defined( 'FONTAWESOME_PLUGIN_FILE' ) ) {
166
				if ( $this->settings['enqueue'] == '' || $this->settings['enqueue'] == 'backend' ) {
167
					add_action( 'admin_head', array( $this, 'add_generator' ), 99 );
168
				}
169
170
				if ( $this->settings['enqueue'] == '' || $this->settings['enqueue'] == 'frontend' ) {
171
					add_action( 'wp_head', array( $this, 'add_generator' ), 99 );
172
				}
173
174
				if ( $this->settings['type'] == 'CSS' ) {
175
					if ( $this->settings['enqueue'] == '' || $this->settings['enqueue'] == 'frontend' ) {
176
						add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_style' ), 5000 );
177
						//add_action( 'wp_footer', array( $this, 'enqueue_style' ), 5000 ); // not sure why this was added, seems to break frontend
178
					}
179
180
					if ( $this->settings['enqueue'] == '' || $this->settings['enqueue'] == 'backend' ) {
181
						add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_style' ), 5000 );
182
						add_filter( 'block_editor_settings_all', array( $this, 'enqueue_editor_styles' ), 10, 2 );
183
					}
184
				} else {
185
					$enqueue = false;
186
187
					if ( $this->settings['enqueue'] == '' || $this->settings['enqueue'] == 'frontend' ) {
188
						$enqueue = true;
189
						add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ), 5000 );
190
					}
191
192
					if ( $this->settings['enqueue'] == '' || $this->settings['enqueue'] == 'backend' ) {
193
						$enqueue = true;
194
						add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ), 5000 );
195
						add_filter( 'block_editor_settings_all', array( $this, 'enqueue_editor_scripts' ), 10, 2 );
196
					}
197
198
					if ( $enqueue ) {
199
						add_filter( 'script_loader_tag', array( $this, 'script_loader_tag' ), 20, 3 );
200
					}
201
				}
202
203
				// remove font awesome if set to do so
204
				if ( $this->settings['dequeue'] == '1' ) {
205
					add_action( 'clean_url', array( $this, 'remove_font_awesome' ), 5000, 3 );
206
				}
207
			}
208
209
		}
210
211
		/**
212
		 * Add FA to the FSE.
213
		 *
214
		 * @param $editor_settings
215
		 * @param $block_editor_context
216
		 *
217
		 * @return array
218
		 */
219
		public function enqueue_editor_styles( $editor_settings, $block_editor_context ){
0 ignored issues
show
The parameter $block_editor_context is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

219
		public function enqueue_editor_styles( $editor_settings, /** @scrutinizer ignore-unused */ $block_editor_context ){

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
220
221
			if ( ! empty( $editor_settings['__unstableResolvedAssets']['styles'] ) ) {
222
				$url = $this->get_url();
223
				$editor_settings['__unstableResolvedAssets']['styles'] .= "<link rel='stylesheet' id='font-awesome-css'  href='$url' media='all' />";
224
			}
225
226
			return $editor_settings;
227
		}
228
229
		/**
230
		 * Add FA to the FSE.
231
		 *
232
		 * @param $editor_settings
233
		 * @param $block_editor_context
234
		 *
235
		 * @return array
236
		 */
237
		public function enqueue_editor_scripts( $editor_settings, $block_editor_context ) {
0 ignored issues
show
The parameter $block_editor_context is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

237
		public function enqueue_editor_scripts( $editor_settings, /** @scrutinizer ignore-unused */ $block_editor_context ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
238
			$url = $this->get_url();
239
240
			$editor_settings['__unstableResolvedAssets']['scripts'] .= "<script src='$url' id='font-awesome-js' defer crossorigin='anonymous'></script>";
241
242
			return $editor_settings;
243
		}
244
245
		/**
246
		 * Adds the Font Awesome styles.
247
		 */
248
		public function enqueue_style() {
249
			// build url
250
			$url = $this->get_url();
251
			$version = ! empty( $this->settings['local'] ) && empty( $this->settings['pro'] ) ? strip_tags( $this->settings['local_version'] ) : null;
252
253
			wp_deregister_style( 'font-awesome' ); // deregister in case its already there
254
			wp_register_style( 'font-awesome', $url, array(), $version );
255
			wp_enqueue_style( 'font-awesome' );
256
257
			// RTL language support CSS.
258
			if ( is_rtl() ) {
259
				wp_add_inline_style( 'font-awesome', $this->rtl_inline_css() );
260
			}
261
262
			if ( $this->settings['shims'] ) {
263
				$url = $this->get_url( true );
264
				wp_deregister_style( 'font-awesome-shims' ); // deregister in case its already there
265
				wp_register_style( 'font-awesome-shims', $url, array(), $version );
266
				wp_enqueue_style( 'font-awesome-shims' );
267
			}
268
		}
269
270
		/**
271
		 * Adds the Font Awesome JS.
272
		 */
273
		public function enqueue_scripts() {
274
			// build url
275
			$url = $this->get_url();
276
277
			$deregister_function = 'wp' . '_' . 'deregister' . '_' . 'script';
278
			call_user_func( $deregister_function, 'font-awesome' ); // deregister in case its already there
279
			wp_register_script( 'font-awesome', $url, array(), null );
280
			wp_enqueue_script( 'font-awesome' );
281
282
			if ( $this->settings['shims'] ) {
283
				$url = $this->get_url( true );
284
				call_user_func( $deregister_function, 'font-awesome-shims' ); // deregister in case its already there
285
				wp_register_script( 'font-awesome-shims', $url, array(), null );
286
				wp_enqueue_script( 'font-awesome-shims' );
287
			}
288
		}
289
290
		/**
291
		 * Get the url of the Font Awesome files.
292
		 *
293
		 * @param bool $shims If this is a shim file or not.
294
		 * @param bool $local Load locally if allowed.
295
		 *
296
		 * @return string The url to the file.
297
		 */
298
		public function get_url( $shims = false, $local = true ) {
299
			$script  = $shims ? 'v4-shims' : 'all';
300
			$sub     = $this->settings['pro'] ? 'pro' : 'use';
301
			$type    = $this->settings['type'];
302
			$version = $this->settings['version'];
303
			$kit_url = $this->settings['kit-url'] ? sanitize_text_field( $this->settings['kit-url'] ) : '';
304
			$url     = '';
305
306
			if ( $type == 'KIT' && $kit_url ) {
307
				if ( $shims ) {
308
					// if its a kit then we don't add shims here
309
					return '';
310
				}
311
				$url .= $kit_url; // CDN
312
				$url .= "?wpfas=true"; // set our var so our version is not removed
313
			} else {
314
				$v = '';
315
				// Check and load locally.
316
				if ( $local && $this->has_local() ) {
317
					$script .= ".min";
318
					$v .= '&ver=' . strip_tags( $this->settings['local_version'] );
319
					$url .= $this->get_fonts_url(); // Local fonts url.
320
				} else {
321
					$url .= "https://$sub.fontawesome.com/releases/"; // CDN
322
					$url .= ! empty( $version ) ? "v" . $version . '/' : "v" . $this->get_latest_version() . '/'; // version
323
				}
324
				$url .= $type == 'CSS' ? 'css/' : 'js/'; // type
325
				$url .= $type == 'CSS' ? $script . '.css' : $script . '.js'; // type
326
				$url .= "?wpfas=true" . $v; // set our var so our version is not removed
327
			}
328
329
			return $url;
330
		}
331
332
		/**
333
		 * Try and remove any other versions of Font Awesome added by other plugins/themes.
334
		 *
335
		 * Uses the clean_url filter to try and remove any other Font Awesome files added, it can also add pseudo-elements flag for the JS version.
336
		 *
337
		 * @param $url
338
		 * @param $original_url
339
		 * @param $_context
340
		 *
341
		 * @return string The filtered url.
342
		 */
343
		public function remove_font_awesome( $url, $original_url, $_context ) {
344
345
			if ( $_context == 'display'
346
			     && ( strstr( $url, "fontawesome" ) !== false || strstr( $url, "font-awesome" ) !== false )
347
			     && ( strstr( $url, ".js" ) !== false || strstr( $url, ".css" ) !== false )
348
			) {// it's a font-awesome-url (probably)
349
350
				if ( strstr( $url, "wpfas=true" ) !== false ) {
351
					if ( $this->settings['type'] == 'JS' ) {
352
						if ( $this->settings['js-pseudo'] ) {
353
							$url .= "' data-search-pseudo-elements defer='defer";
354
						} else {
355
							$url .= "' defer='defer";
356
						}
357
					}
358
				} else {
359
					$url = ''; // removing the url removes the file
360
				}
361
362
			}
363
364
			return $url;
365
		}
366
367
		/**
368
		 * Register the database settings with WordPress.
369
		 */
370
		public function register_settings() {
371
			register_setting( 'wp-font-awesome-settings', 'wp-font-awesome-settings' );
372
		}
373
374
		/**
375
		 * Add the WordPress settings menu item.
376
		 * @since 1.0.10 Calling function name direct will fail theme check so we don't.
377
		 */
378
		public function menu_item() {
379
			$menu_function = 'add' . '_' . 'options' . '_' . 'page'; // won't pass theme check if function name present in theme
380
			call_user_func( $menu_function, $this->name, $this->name, 'manage_options', 'wp-font-awesome-settings', array(
381
				$this,
382
				'settings_page'
383
			) );
384
		}
385
386
		/**
387
		 * Get the current Font Awesome output settings.
388
		 *
389
		 * @return array The array of settings.
390
		 */
391
		public function get_settings() {
392
			$db_settings = get_option( 'wp-font-awesome-settings' );
393
394
			$defaults = array(
395
				'type'      => 'CSS', // type to use, CSS or JS or KIT
396
				'version'   => '', // latest
397
				'enqueue'   => '', // front and backend
398
				'shims'     => '0', // default OFF now in 2020
399
				'js-pseudo' => '0', // if the pseudo elements flag should be set (CPU intensive)
400
				'dequeue'   => '0', // if we should try to remove other versions added by other plugins/themes
401
				'pro'       => '0', // if pro CDN url should be used
402
				'local'     => '0', // Store fonts locally.
403
				'local_version' => '', // Local fonts version.
404
				'kit-url'   => '', // the kit url
405
			);
406
407
			$settings = wp_parse_args( $db_settings, $defaults );
0 ignored issues
show
It seems like $db_settings can also be of type false; however, parameter $args of wp_parse_args() does only seem to accept array|object|string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

407
			$settings = wp_parse_args( /** @scrutinizer ignore-type */ $db_settings, $defaults );
Loading history...
408
409
			/**
410
			 * Filter the Font Awesome settings.
411
			 *
412
			 * @todo if we add this filer people might use it and then it defeates the purpose of this class :/
413
			 */
414
			return $this->settings = apply_filters( 'wp-font-awesome-settings', $settings, $db_settings, $defaults );
415
		}
416
417
		/**
418
		 * The settings page html output.
419
		 */
420
		public function settings_page() {
421
			if ( ! current_user_can( 'manage_options' ) ) {
422
				wp_die( __( 'You do not have sufficient permissions to access this page.', 'ayecode-connect' ) );
423
			}
424
425
			// a hidden way to force the update of the version number via api instead of waiting the 48 hours
426
			if ( isset( $_REQUEST['force-version-check'] ) ) {
427
				$this->get_latest_version( $force_api = true );
428
			}
429
430
			if ( ! defined( 'FONTAWESOME_PLUGIN_FILE' ) ) {
431
				?>
432
                <style>
433
                    .wpfas-kit-show {
434
                        display: none;
435
                    }
436
                    .wpfas-kit-set .wpfas-kit-hide,.wpfas-has-pro .wpfas-hide-pro {
437
                        display: none;
438
                    }
439
                    .wpfas-kit-set .wpfas-kit-show {
440
                        display: table-row;
441
                    }
442
                    .fas-settings-form .submit{
443
                        display: inline;
444
                        padding-right: 5px;
445
                    }
446
                    .fas-settings-form .fas-buttons{
447
                        margin: 15px 0;
448
                    }
449
                    #wpfas-version{
450
                        color: #646970;
451
                    }
452
                </style>
453
                <div class="wrap">
454
                    <h1><?php echo $this->name; ?></h1>
455
                    <form method="post" action="options.php" class="fas-settings-form">
456
						<?php
457
						settings_fields( 'wp-font-awesome-settings' );
458
						do_settings_sections( 'wp-font-awesome-settings' );
459
						$table_class = '';
460
						if ( $this->settings['type'] ) {
461
							$table_class .= 'wpfas-' . sanitize_html_class( strtolower( $this->settings['type'] ) ) . '-set';
462
						}
463
						if ( ! empty( $this->settings['pro'] ) ) {
464
							$table_class .= ' wpfas-has-pro';
465
						}
466
						?>
467
						<?php if ( $this->settings['type'] != 'KIT' && ! empty( $this->settings['local'] ) && empty( $this->settings['pro'] ) ) { ?>
468
							<?php if ( $this->has_local() ) { ?>
469
                                <div class="notice notice-info"><p><strong><?php _e( 'Font Awesome fonts are loading locally.', 'ayecode-connect' ); ?></strong></p></div>
470
							<?php } else { ?>
471
                                <div class="notice notice-error"><p><strong><?php _e( 'Font Awesome fonts are not loading locally!', 'ayecode-connect' ); ?></strong></p></div>
472
							<?php } ?>
473
						<?php } ?>
474
                        <table class="form-table wpfas-table-settings <?php echo esc_attr( $table_class ); ?>">
475
                            <tr valign="top">
476
                                <th scope="row"><label for="wpfas-type"><?php _e( 'Type', 'ayecode-connect' ); ?></label></th>
477
                                <td>
478
                                    <select name="wp-font-awesome-settings[type]" id="wpfas-type" onchange="if(this.value=='KIT'){jQuery('.wpfas-table-settings').addClass('wpfas-kit-set');}else{jQuery('.wpfas-table-settings').removeClass('wpfas-kit-set');}">
479
                                        <option value="CSS" <?php selected( $this->settings['type'], 'CSS' ); ?>><?php _e( 'CSS (default)', 'ayecode-connect' ); ?></option>
480
                                        <option value="JS" <?php selected( $this->settings['type'], 'JS' ); ?>>JS</option>
481
                                        <option value="KIT" <?php selected( $this->settings['type'], 'KIT' ); ?>><?php _e( 'Kits (settings managed on fontawesome.com)', 'ayecode-connect' ); ?></option>
482
                                    </select>
483
                                </td>
484
                            </tr>
485
486
                            <tr valign="top" class="wpfas-kit-show">
487
                                <th scope="row"><label for="wpfas-kit-url"><?php _e( 'Kit URL', 'ayecode-connect' ); ?></label></th>
488
                                <td>
489
                                    <input class="regular-text" id="wpfas-kit-url" type="url" name="wp-font-awesome-settings[kit-url]" value="<?php echo esc_attr( $this->settings['kit-url'] ); ?>" placeholder="<?php echo 'https://kit.font';echo 'awesome.com/123abc.js'; // this won't pass theme check :(?>"/>
490
                                    <span><?php
491
										echo wp_sprintf(
492
											__( 'Requires a free account with Font Awesome. %sGet kit url%s', 'ayecode-connect' ),
493
											'<a rel="noopener noreferrer" target="_blank" href="https://fontawesome.com/kits"><i class="fas fa-external-link-alt"></i> ',
494
											'</a>'
495
										);
496
										?></span>
497
                                </td>
498
                            </tr>
499
                            <tr valign="top" class="wpfas-kit-hide">
500
                                <th scope="row"><label for="wpfas-version"><?php _e( 'Version', 'ayecode-connect' ); ?></label></th>
501
                                <td>
502
                                    <select name="wp-font-awesome-settings[version]" id="wpfas-version">
503
                                        <?php /* @todo Remove after FA7 compatibility */ ?>
504
                                        <option value="" <?php selected( $this->settings['version'], '' ); ?>><?php echo wp_sprintf( __( '%s (default)', 'ayecode-connect' ), '6.7.2' ); ?></option>
505
                                        <?php $latest_version = $this->get_latest_version( false, true ); if ( $latest_version && version_compare( $latest_version, '7.0.0', '>' ) ) { ?>
506
                                        <option value="<?php echo esc_attr( $latest_version ); ?>" <?php selected( $this->settings['version'], $latest_version ); ?>><?php echo esc_html( $latest_version ); ?></option>
507
                                        <?php } ?>
508
                                        <?php /* @todo Remove after after FA7 compatibility */ ?>
509
510
                                        <?php /* @todo Un-comment after FA7 compatibility */ ?>
511
                                        <?php /* ?><option value="" <?php selected( $this->settings['version'], '' ); ?>><?php echo wp_sprintf( __( 'Latest - %s (default)', 'ayecode-connect' ), $this->get_latest_version() ); ?></option><?php */ ?>
512
                                        <option value="7.0.0" <?php selected( $this->settings['version'], '7.0.0' ); ?>>7.0.0</option>
513
                                        <option value="6.4.2" <?php selected( $this->settings['version'], '6.4.2' ); ?>>6.4.2</option>
514
                                        <option value="6.1.0" <?php selected( $this->settings['version'], '6.1.0' ); ?>>6.1.0</option>
515
                                        <option value="6.0.0" <?php selected( $this->settings['version'], '6.0.0' ); ?>>6.0.0</option>
516
                                        <option value="5.15.4" <?php selected( $this->settings['version'], '5.15.4' ); ?>>5.15.4</option>
517
                                        <option value="5.6.0" <?php selected( $this->settings['version'], '5.6.0' ); ?>>5.6.0</option>
518
                                        <option value="5.5.0" <?php selected( $this->settings['version'], '5.5.0' ); ?>>5.5.0</option>
519
                                        <option value="5.4.0" <?php selected( $this->settings['version'], '5.4.0' ); ?>>5.4.0</option>
520
                                        <option value="5.3.0" <?php selected( $this->settings['version'], '5.3.0' ); ?>>5.3.0</option>
521
                                        <option value="5.2.0" <?php selected( $this->settings['version'], '5.2.0' ); ?>>5.2.0</option>
522
                                        <option value="5.1.0" <?php selected( $this->settings['version'], '5.1.0' ); ?>>5.1.0</option>
523
                                        <option value="4.7.0" <?php selected( $this->settings['version'], '4.7.0' ); ?>>4.7.1 (CSS only)</option>
524
                                    </select>
525
                                </td>
526
                            </tr>
527
528
                            <tr valign="top">
529
                                <th scope="row"><label for="wpfas-enqueue"><?php _e( 'Enqueue', 'ayecode-connect' ); ?></label></th>
530
                                <td>
531
                                    <select name="wp-font-awesome-settings[enqueue]" id="wpfas-enqueue">
532
                                        <option value="" <?php selected( $this->settings['enqueue'], '' ); ?>><?php _e( 'Frontend + Backend (default)', 'ayecode-connect' ); ?></option>
533
                                        <option value="frontend" <?php selected( $this->settings['enqueue'], 'frontend' ); ?>><?php _e( 'Frontend', 'ayecode-connect' ); ?></option>
534
                                        <option value="backend" <?php selected( $this->settings['enqueue'], 'backend' ); ?>><?php _e( 'Backend', 'ayecode-connect' ); ?></option>
535
                                    </select>
536
                                </td>
537
                            </tr>
538
539
                            <tr valign="top" class="wpfas-kit-hide">
540
                                <th scope="row"><label
541
                                            for="wpfas-pro"><?php _e( 'Enable pro', 'ayecode-connect' ); ?></label></th>
542
                                <td>
543
                                    <input type="hidden" name="wp-font-awesome-settings[pro]" value="0"/>
544
                                    <input type="checkbox" name="wp-font-awesome-settings[pro]" value="1" <?php checked( $this->settings['pro'], '1' ); ?> id="wpfas-pro" onchange="if(jQuery(this).is(':checked')){jQuery('.wpfas-table-settings').addClass('wpfas-has-pro')}else{jQuery('.wpfas-table-settings').removeClass('wpfas-has-pro')}"/>
545
                                    <span><?php
546
										echo wp_sprintf(
547
											__( 'Requires a subscription. %sLearn more%s  %sManage my allowed domains%s', 'ayecode-connect' ),
548
											'<a rel="noopener noreferrer" target="_blank" href="https://fontawesome.com/referral?a=c9b89e1418">',
549
											' <i class="fas fa-external-link-alt"></i></a>',
550
											'<a rel="noopener noreferrer" target="_blank" href="https://fontawesome.com/account/cdn">',
551
											' <i class="fas fa-external-link-alt"></i></a>'
552
										);
553
										?></span>
554
                                </td>
555
                            </tr>
556
557
                            <tr valign="top" class="wpfas-kit-hide wpfas-hide-pro">
558
                                <th scope="row"><label for="wpfas-local"><?php _e( 'Load Fonts Locally', 'ayecode-connect' ); ?></label></th>
559
                                <td>
560
                                    <input type="hidden" name="wp-font-awesome-settings[local]" value="0"/>
561
                                    <input type="hidden" name="wp-font-awesome-settings[local_version]" value="<?php echo esc_attr( $this->settings['local_version'] ); ?>"/>
562
                                    <input type="checkbox" name="wp-font-awesome-settings[local]" value="1" <?php checked( $this->settings['local'], '1' ); ?> id="wpfas-local"/>
563
                                    <span><?php _e( '(For free version only) Load FontAwesome fonts from locally. This downloads FontAwesome fonts from fontawesome.com & stores at the local site.', 'ayecode-connect' ); ?></span>
564
                                </td>
565
                            </tr>
566
567
                            <tr valign="top" class="wpfas-kit-hide">
568
                                <th scope="row"><label
569
                                            for="wpfas-shims"><?php _e( 'Enable v4 shims compatibility', 'ayecode-connect' ); ?></label>
570
                                </th>
571
                                <td>
572
                                    <input type="hidden" name="wp-font-awesome-settings[shims]" value="0"/>
573
                                    <input type="checkbox" name="wp-font-awesome-settings[shims]"
574
                                           value="1" <?php checked( $this->settings['shims'], '1' ); ?> id="wpfas-shims"/>
575
                                    <span><?php _e( 'This enables v4 classes to work with v5, sort of like a band-aid until everyone has updated everything to v5.', 'ayecode-connect' ); ?></span>
576
                                </td>
577
                            </tr>
578
579
                            <tr valign="top" class="wpfas-kit-hide">
580
                                <th scope="row"><label
581
                                            for="wpfas-js-pseudo"><?php _e( 'Enable JS pseudo elements (not recommended)', 'ayecode-connect' ); ?></label>
582
                                </th>
583
                                <td>
584
                                    <input type="hidden" name="wp-font-awesome-settings[js-pseudo]" value="0"/>
585
                                    <input type="checkbox" name="wp-font-awesome-settings[js-pseudo]"
586
                                           value="1" <?php checked( $this->settings['js-pseudo'], '1' ); ?>
587
                                           id="wpfas-js-pseudo"/>
588
                                    <span><?php _e( 'Used only with the JS version, this will make pseudo-elements work but can be CPU intensive on some sites.', 'ayecode-connect' ); ?></span>
589
                                </td>
590
                            </tr>
591
592
                            <tr valign="top">
593
                                <th scope="row"><label
594
                                            for="wpfas-dequeue"><?php _e( 'Dequeue', 'ayecode-connect' ); ?></label></th>
595
                                <td>
596
                                    <input type="hidden" name="wp-font-awesome-settings[dequeue]" value="0"/>
597
                                    <input type="checkbox" name="wp-font-awesome-settings[dequeue]"
598
                                           value="1" <?php checked( $this->settings['dequeue'], '1' ); ?>
599
                                           id="wpfas-dequeue"/>
600
                                    <span><?php _e( 'This will try to dequeue any other Font Awesome versions loaded by other sources if they are added with `font-awesome` or `fontawesome` in the name.', 'ayecode-connect' ); ?></span>
601
                                </td>
602
                            </tr>
603
604
                        </table>
605
                        <div class="fas-buttons">
606
							<?php
607
							submit_button();
608
							?>
609
                            <p class="submit"><a href="https://fontawesome.com/referral?a=c9b89e1418" class="button button-secondary"><?php _e('Get 24,000+ more icons with Font Awesome Pro','ayecode-connect'); ?> <i class="fas fa-external-link-alt"></i></a></p>
610
611
                        </div>
612
                    </form>
613
614
                    <div id="wpfas-version"><?php echo wp_sprintf(__( 'Version: %s (affiliate links provided)', 'ayecode-connect' ), $this->version ); ?></div>
615
                </div>
616
				<?php
617
			}
618
		}
619
620
		/**
621
		 * Check a version number is valid and if so return it or else return an empty string.
622
		 *
623
		 * @param $version string The version number to check.
624
		 *
625
		 * @since 1.0.6
626
		 *
627
		 * @return string Either a valid version number or an empty string.
628
		 */
629
		public function validate_version_number( $version ) {
630
631
			if ( version_compare( $version, '0.0.1', '>=' ) >= 0 ) {
632
				// valid
633
			} else {
634
				$version = '';// not validated
635
			}
636
637
			return $version;
638
		}
639
640
641
		/**
642
		 * Get the latest version of Font Awesome.
643
		 *
644
		 * We check for a cached version and if none we will check for a live version via API and then cache it for 48 hours.
645
		 *
646
		 * @since 1.0.7
647
		 * @return mixed|string The latest version number found.
648
		 */
649
		public function get_latest_version( $force_api = false, $force_latest = false ) {
650
			$latest_version = $this->latest;
651
652
			$cache = get_transient( 'wp-font-awesome-settings-version' );
653
654
			if ( $cache === false || $force_api ) { // its not set
655
				$api_ver = $this->get_latest_version_from_api();
656
				if ( version_compare( $api_ver, $this->latest, '>=' ) >= 0 ) {
657
					$latest_version = $api_ver;
658
					set_transient( 'wp-font-awesome-settings-version', $api_ver, 48 * HOUR_IN_SECONDS );
659
				}
660
			} elseif ( $this->validate_version_number( $cache ) ) {
661
				if ( version_compare( $cache, $this->latest, '>=' ) >= 0 ) {
662
					$latest_version = $cache;
663
				}
664
			}
665
666
			// @todo remove after FA7 compatibility
667
			if ( ! $force_latest && version_compare( $cache, '7.0.0', '>=' ) >= 0 ) {
668
				$latest_version = '6.7.2';
669
			}
670
671
			// Check and auto download fonts locally.
672
			if ( empty( $this->settings['pro'] ) && empty( $this->settings['version'] ) && $this->settings['type'] != 'KIT' && ! empty( $this->settings['local'] ) && ! empty( $this->settings['local_version'] ) && ! empty( $latest_version ) ) {
673
				if ( version_compare( $latest_version, $this->settings['local_version'], '>' ) && is_admin() && ! wp_doing_ajax() ) {
674
					$this->download_package( $latest_version );
675
				}
676
			}
677
678
			return $latest_version;
679
		}
680
681
		/**
682
		 * Get the latest Font Awesome version from the github API.
683
		 *
684
		 * @since 1.0.7
685
		 * @return string The latest version number or `0` on API fail.
686
		 */
687
		public function get_latest_version_from_api() {
688
			$version  = "0";
689
			$response = wp_remote_get( "https://api.github.com/repos/FortAwesome/Font-Awesome/releases/latest" );
690
			if ( ! is_wp_error( $response ) && is_array( $response ) ) {
691
				$api_response = json_decode( wp_remote_retrieve_body( $response ), true );
692
				if ( isset( $api_response['tag_name'] ) && version_compare( $api_response['tag_name'], $this->latest, '>=' ) >= 0 && empty( $api_response['prerelease'] ) ) {
693
					$version = $api_response['tag_name'];
694
				}
695
			}
696
697
			return $version;
698
		}
699
700
		/**
701
		 * Inline CSS for RTL language support.
702
		 *
703
		 * @since 1.0.13
704
		 * @return string Inline CSS.
705
		 */
706
		public function rtl_inline_css() {
707
			$inline_css = '[dir=rtl] .fa-address,[dir=rtl] .fa-address-card,[dir=rtl] .fa-adjust,[dir=rtl] .fa-alarm-clock,[dir=rtl] .fa-align-left,[dir=rtl] .fa-align-right,[dir=rtl] .fa-analytics,[dir=rtl] .fa-angle-double-left,[dir=rtl] .fa-angle-double-right,[dir=rtl] .fa-angle-left,[dir=rtl] .fa-angle-right,[dir=rtl] .fa-arrow-alt-circle-left,[dir=rtl] .fa-arrow-alt-circle-right,[dir=rtl] .fa-arrow-alt-from-left,[dir=rtl] .fa-arrow-alt-from-right,[dir=rtl] .fa-arrow-alt-left,[dir=rtl] .fa-arrow-alt-right,[dir=rtl] .fa-arrow-alt-square-left,[dir=rtl] .fa-arrow-alt-square-right,[dir=rtl] .fa-arrow-alt-to-left,[dir=rtl] .fa-arrow-alt-to-right,[dir=rtl] .fa-arrow-circle-left,[dir=rtl] .fa-arrow-circle-right,[dir=rtl] .fa-arrow-from-left,[dir=rtl] .fa-arrow-from-right,[dir=rtl] .fa-arrow-left,[dir=rtl] .fa-arrow-right,[dir=rtl] .fa-arrow-square-left,[dir=rtl] .fa-arrow-square-right,[dir=rtl] .fa-arrow-to-left,[dir=rtl] .fa-arrow-to-right,[dir=rtl] .fa-balance-scale-left,[dir=rtl] .fa-balance-scale-right,[dir=rtl] .fa-bed,[dir=rtl] .fa-bed-bunk,[dir=rtl] .fa-bed-empty,[dir=rtl] .fa-border-left,[dir=rtl] .fa-border-right,[dir=rtl] .fa-calendar-check,[dir=rtl] .fa-caret-circle-left,[dir=rtl] .fa-caret-circle-right,[dir=rtl] .fa-caret-left,[dir=rtl] .fa-caret-right,[dir=rtl] .fa-caret-square-left,[dir=rtl] .fa-caret-square-right,[dir=rtl] .fa-cart-arrow-down,[dir=rtl] .fa-cart-plus,[dir=rtl] .fa-chart-area,[dir=rtl] .fa-chart-bar,[dir=rtl] .fa-chart-line,[dir=rtl] .fa-chart-line-down,[dir=rtl] .fa-chart-network,[dir=rtl] .fa-chart-pie,[dir=rtl] .fa-chart-pie-alt,[dir=rtl] .fa-chart-scatter,[dir=rtl] .fa-check-circle,[dir=rtl] .fa-check-square,[dir=rtl] .fa-chevron-circle-left,[dir=rtl] .fa-chevron-circle-right,[dir=rtl] .fa-chevron-double-left,[dir=rtl] .fa-chevron-double-right,[dir=rtl] .fa-chevron-left,[dir=rtl] .fa-chevron-right,[dir=rtl] .fa-chevron-square-left,[dir=rtl] .fa-chevron-square-right,[dir=rtl] .fa-clock,[dir=rtl] .fa-file,[dir=rtl] .fa-file-alt,[dir=rtl] .fa-file-archive,[dir=rtl] .fa-file-audio,[dir=rtl] .fa-file-chart-line,[dir=rtl] .fa-file-chart-pie,[dir=rtl] .fa-file-code,[dir=rtl] .fa-file-excel,[dir=rtl] .fa-file-image,[dir=rtl] .fa-file-pdf,[dir=rtl] .fa-file-powerpoint,[dir=rtl] .fa-file-video,[dir=rtl] .fa-file-word,[dir=rtl] .fa-flag,[dir=rtl] .fa-folder,[dir=rtl] .fa-folder-open,[dir=rtl] .fa-hand-lizard,[dir=rtl] .fa-hand-point-down,[dir=rtl] .fa-hand-point-left,[dir=rtl] .fa-hand-point-right,[dir=rtl] .fa-hand-point-up,[dir=rtl] .fa-hand-scissors,[dir=rtl] .fa-image,[dir=rtl] .fa-long-arrow-alt-left,[dir=rtl] .fa-long-arrow-alt-right,[dir=rtl] .fa-long-arrow-left,[dir=rtl] .fa-long-arrow-right,[dir=rtl] .fa-luggage-cart,[dir=rtl] .fa-moon,[dir=rtl] .fa-pencil,[dir=rtl] .fa-pencil-alt,[dir=rtl] .fa-play-circle,[dir=rtl] .fa-project-diagram,[dir=rtl] .fa-quote-left,[dir=rtl] .fa-quote-right,[dir=rtl] .fa-shopping-cart,[dir=rtl] .fa-thumbs-down,[dir=rtl] .fa-thumbs-up,[dir=rtl] .fa-user-chart{filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);transform:scale(-1,1)}[dir=rtl] .fa-spin{animation-direction:reverse}';
708
709
			return $inline_css;
710
		}
711
712
		/**
713
		 * Show any warnings as an admin notice.
714
		 *
715
		 * @return void
716
		 */
717
		public function admin_notices() {
718
			$settings = $this->settings;
719
720
			if ( defined( 'FONTAWESOME_PLUGIN_FILE' ) ) {
721
				if ( ! empty( $_REQUEST['page'] ) && $_REQUEST['page'] == 'wp-font-awesome-settings' ) {
722
					?>
723
                    <div class="notice  notice-error is-dismissible">
724
                        <p><?php _e( 'The Official Font Awesome Plugin is active, please adjust your settings there.', 'ayecode-connect' ); ?></p>
725
                    </div>
726
					<?php
727
				}
728
			} else {
729
				if ( ! empty( $settings ) ) {
730
					if ( $settings['type'] != 'KIT' && $settings['pro'] && ( $settings['version'] == '' || version_compare( $settings['version'], '6', '>=' ) ) ) {
731
						$link = admin_url('options-general.php?page=wp-font-awesome-settings');
732
						?>
733
                        <div class="notice  notice-error is-dismissible">
734
                            <p><?php echo wp_sprintf( __( 'Font Awesome Pro v6 requires the use of a kit, please setup your kit in %ssettings.%s', 'ayecode-connect' ),"<a href='". esc_url_raw( $link )."'>","</a>" ); ?></p>
735
                        </div>
736
						<?php
737
					}
738
				}
739
			}
740
		}
741
742
		/**
743
		 * Handle fontawesome add settings to download fontawesome to store locally.
744
		 *
745
		 * @since 1.1.1
746
		 *
747
		 * @param string $option The option name.
748
		 * @param mixed  $value  The option value.
749
		 */
750
		public function add_option_wp_font_awesome_settings( $option, $value ) {
751
			// Do nothing if WordPress is being installed.
752
			if ( wp_installing() ) {
753
				return;
754
			}
755
756
			if ( ! empty( $value['local'] ) && empty( $value['pro'] ) && ! ( ! empty( $value['type'] ) && $value['type'] == 'KIT' ) ) {
757
				$version = isset( $value['version'] ) && $value['version'] ? $value['version'] : $this->get_latest_version();
758
759
				if ( ! empty( $version ) ) {
760
					$response = $this->download_package( $version, $value );
761
762
					if ( is_wp_error( $response ) ) {
763
						add_settings_error( 'general', 'fontawesome_download', __( 'ERROR:', 'ayecode-connect' ) . ' ' . $response->get_error_message(), 'error' );
764
					}
765
				}
766
			}
767
		}
768
769
		/**
770
		 * Handle fontawesome update settings to download fontawesome to store locally.
771
		 *
772
		 * @since 1.1.0
773
		 *
774
		 * @param mixed $old_value The old option value.
775
		 * @param mixed $value     The new option value.
776
		 */
777
		public function update_option_wp_font_awesome_settings( $old_value, $new_value ) {
778
			// Do nothing if WordPress is being installed.
779
			if ( wp_installing() ) {
780
				return;
781
			}
782
783
			if ( ! empty( $new_value['local'] ) && empty( $new_value['pro'] ) && ! ( ! empty( $new_value['type'] ) && $new_value['type'] == 'KIT' ) ) {
784
				// Old values
785
				$old_version = isset( $old_value['version'] ) && $old_value['version'] ? $old_value['version'] : ( isset( $old_value['local_version'] ) ? $old_value['local_version'] : '' );
786
				$old_local = isset( $old_value['local'] ) ? (int) $old_value['local'] : 0;
787
788
				// New values
789
				$new_version = isset( $new_value['version'] ) && $new_value['version'] ? $new_value['version'] : $this->get_latest_version();
790
791
				if ( empty( $old_local ) || $old_version !== $new_version || ! file_exists( $this->get_fonts_dir() . 'css' . DIRECTORY_SEPARATOR . 'all.css' ) ) {
792
					$response = $this->download_package( $new_version, $new_value );
793
794
					if ( is_wp_error( $response ) ) {
795
						add_settings_error( 'general', 'fontawesome_download', __( 'ERROR:', 'ayecode-connect' ) . ' ' . $response->get_error_message(), 'error' );
796
					}
797
				}
798
			}
799
		}
800
801
		/**
802
		 * Get the fonts directory local path.
803
		 *
804
		 * @since 1.1.0
805
		 *
806
		 * @param string Fonts directory local path.
0 ignored issues
show
The type Fonts was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
807
		 */
808
		public function get_fonts_dir() {
809
			$upload_dir = wp_upload_dir( null, false );
810
811
			return $upload_dir['basedir'] . DIRECTORY_SEPARATOR .  'ayefonts' . DIRECTORY_SEPARATOR . 'fa' . DIRECTORY_SEPARATOR;
812
		}
813
814
		/**
815
		 * Get the fonts directory local url.
816
		 *
817
		 * @since 1.1.0
818
		 *
819
		 * @param string Fonts directory local url.
820
		 */
821
		public function get_fonts_url() {
822
			$upload_dir = wp_upload_dir( null, false );
823
824
			return $upload_dir['baseurl'] .  '/ayefonts/fa/';
825
		}
826
827
		/**
828
		 * Check whether load locally active.
829
		 *
830
		 * @since 1.1.0
831
		 *
832
		 * @return bool True if active else false.
833
		 */
834
		public function has_local() {
835
			if ( ! empty( $this->settings['local'] ) && empty( $this->settings['pro'] ) && file_exists( $this->get_fonts_dir() . 'css' . DIRECTORY_SEPARATOR . 'all.css' ) ) {
836
				return true;
837
			}
838
839
			return false;
840
		}
841
842
		/**
843
		 * Get the WP Filesystem access.
844
		 *
845
		 * @since 1.1.0
846
		 *
847
		 * @return object The WP Filesystem.
848
		 */
849
		public function get_wp_filesystem() {
850
			if ( ! function_exists( 'get_filesystem_method' ) ) {
851
				require_once( ABSPATH . "/wp-admin/includes/file.php" );
852
			}
853
854
			$access_type = get_filesystem_method();
855
856
			if ( $access_type === 'direct' ) {
857
				/* You can safely run request_filesystem_credentials() without any issues and don't need to worry about passing in a URL */
858
				$creds = request_filesystem_credentials( trailingslashit( site_url() ) . 'wp-admin/', '', false, false, array() );
0 ignored issues
show
false of type false is incompatible with the type string expected by parameter $context of request_filesystem_credentials(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

858
				$creds = request_filesystem_credentials( trailingslashit( site_url() ) . 'wp-admin/', '', false, /** @scrutinizer ignore-type */ false, array() );
Loading history...
859
860
				/* Initialize the API */
861
				if ( ! WP_Filesystem( $creds ) ) {
862
					/* Any problems and we exit */
863
					return false;
0 ignored issues
show
Bug Best Practice introduced by
The expression return false returns the type false which is incompatible with the documented return type object.
Loading history...
864
				}
865
866
				global $wp_filesystem;
867
868
				return $wp_filesystem;
869
				/* Do our file manipulations below */
870
			} else if ( defined( 'FTP_USER' ) ) {
871
				$creds = request_filesystem_credentials( trailingslashit( site_url() ) . 'wp-admin/', '', false, false, array() );
872
873
				/* Initialize the API */
874
				if ( ! WP_Filesystem( $creds ) ) {
875
					/* Any problems and we exit */
876
					return false;
0 ignored issues
show
Bug Best Practice introduced by
The expression return false returns the type false which is incompatible with the documented return type object.
Loading history...
877
				}
878
879
				global $wp_filesystem;
880
881
				return $wp_filesystem;
882
			} else {
883
				/* Don't have direct write access. Prompt user with our notice */
884
				return false;
0 ignored issues
show
Bug Best Practice introduced by
The expression return false returns the type false which is incompatible with the documented return type object.
Loading history...
885
			}
886
		}
887
888
		/**
889
		 * Download the fontawesome package file.
890
		 *
891
		 * @since 1.1.0
892
		 *
893
		 * @param mixed $version The font awesome.
894
		 * @param array $option Fontawesome settings.
895
		 * @return WP_ERROR|bool Error on fail and true on success.
896
		 */
897
		public function download_package( $version, $option = array() ) {
898
			$filename = 'fontawesome-free-' . $version . '-web';
899
			$url = 'https://use.fontawesome.com/releases/v' . $version . '/' . $filename . '.zip';
900
901
			if ( ! function_exists( 'wp_handle_upload' ) ) {
902
				require_once ABSPATH . 'wp-admin/includes/file.php';
903
			}
904
905
			$download_file = download_url( esc_url_raw( $url ) );
906
907
			if ( is_wp_error( $download_file ) ) {
908
				return new WP_Error( 'fontawesome_download_failed', __( $download_file->get_error_message(), 'ayecode-connect' ) );
909
			} else if ( empty( $download_file ) ) {
910
				return new WP_Error( 'fontawesome_download_failed', __( 'Something went wrong in downloading the font awesome to store locally.', 'ayecode-connect' ) );
911
			}
912
913
			$response = $this->extract_package( $download_file, $filename, true );
0 ignored issues
show
$download_file of type WP_Error is incompatible with the type string expected by parameter $package of WP_Font_Awesome_Settings::extract_package(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

913
			$response = $this->extract_package( /** @scrutinizer ignore-type */ $download_file, $filename, true );
Loading history...
914
915
			// Update local version.
916
			if ( is_wp_error( $response ) ) {
917
				return $response;
918
			} else if ( $response ) {
919
				if ( empty( $option ) ) {
920
					$option = get_option( 'wp-font-awesome-settings' );
921
				}
922
923
				$option['local_version'] = $version;
924
925
				// Remove action to prevent looping.
926
				remove_action( 'update_option_wp-font-awesome-settings', array( $this, 'update_option_wp_font_awesome_settings' ), 10, 2 );
0 ignored issues
show
The call to remove_action() has too many arguments starting with 2. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

926
				/** @scrutinizer ignore-call */ 
927
    remove_action( 'update_option_wp-font-awesome-settings', array( $this, 'update_option_wp_font_awesome_settings' ), 10, 2 );

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
927
928
				update_option( 'wp-font-awesome-settings', $option );
929
930
				return true;
931
			}
932
933
			return false;
934
		}
935
936
		/**
937
		 * Extract the fontawesome package file.
938
		 *
939
		 * @since 1.1.0
940
		 *
941
		 * @param string $package The package file path.
942
		 * @param string $dirname Package file name.
943
		 * @param bool   $delete_package Delete temp file or not.
944
		 * @return WP_Error|bool True on success WP_Error on fail.
945
		 */
946
		public function extract_package( $package, $dirname = '', $delete_package = false ) {
947
			global $wp_filesystem;
948
949
			$wp_filesystem = $this->get_wp_filesystem();
950
951
			if ( empty( $wp_filesystem ) && isset( $wp_filesystem->errors ) && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->get_error_code() ) {
952
				return new WP_Error( 'fontawesome_filesystem_error', __( $wp_filesystem->errors->get_error_message(), 'ayecode-connect' ) );
953
			} else if ( empty( $wp_filesystem ) ) {
954
				return new WP_Error( 'fontawesome_filesystem_error', __( 'Failed to initialise WP_Filesystem while trying to download the Font Awesome package.', 'ayecode-connect' ) );
955
			}
956
957
			$fonts_dir = $this->get_fonts_dir();
958
			$fonts_tmp_dir = dirname( $fonts_dir ) . DIRECTORY_SEPARATOR . 'fa-tmp' . DIRECTORY_SEPARATOR;
959
960
			if ( $wp_filesystem->is_dir( $fonts_tmp_dir ) ) {
961
				$wp_filesystem->delete( $fonts_tmp_dir, true );
962
			}
963
964
			// Unzip package to working directory.
965
			$result = unzip_file( $package, $fonts_tmp_dir );
966
967
			if ( is_wp_error( $result ) ) {
968
				$wp_filesystem->delete( $fonts_tmp_dir, true );
969
970
				if ( 'incompatible_archive' === $result->get_error_code() ) {
971
					return new WP_Error( 'fontawesome_incompatible_archive', __( $result->get_error_message(), 'ayecode-connect' ) );
972
				}
973
974
				return $result;
975
			}
976
977
			if ( $wp_filesystem->is_dir( $fonts_dir ) ) {
978
				$wp_filesystem->delete( $fonts_dir, true );
979
			}
980
981
			$extract_dir = $fonts_tmp_dir;
982
983
			if ( $dirname && $wp_filesystem->is_dir( $extract_dir . $dirname . DIRECTORY_SEPARATOR ) ) {
984
				$extract_dir .= $dirname . DIRECTORY_SEPARATOR;
985
			}
986
987
			try {
988
				$return = $wp_filesystem->move( $extract_dir, $fonts_dir, true );
989
			} catch ( Exception $e ) {
990
				$return = new WP_Error( 'fontawesome_move_package', __( 'Fail to move font awesome package!', 'ayecode-connect' ) );
991
			}
992
993
			if ( $wp_filesystem->is_dir( $fonts_tmp_dir ) ) {
994
				$wp_filesystem->delete( $fonts_tmp_dir, true );
995
			}
996
997
			// Once extracted, delete the package if required.
998
			if ( $delete_package ) {
999
				unlink( $package );
1000
			}
1001
1002
			return $return;
1003
		}
1004
1005
		/**
1006
		 * Output the version in the header.
1007
		 */
1008
		public function add_generator() {
1009
			$file = str_replace( array( "/", "\\" ), "/", realpath( __FILE__ ) );
1010
			$plugins_dir = str_replace( array( "/", "\\" ), "/", realpath( WP_PLUGIN_DIR ) );
1011
1012
			// Find source plugin/theme.
1013
			$source = array();
1014
			if ( strpos( $file, $plugins_dir ) !== false ) {
1015
				$source = explode( "/", plugin_basename( $file ) );
1016
			} else if ( function_exists( 'get_theme_root' ) ) {
1017
				$themes_dir = str_replace( array( "/", "\\" ), "/", realpath( get_theme_root() ) );
1018
1019
				if ( strpos( $file, $themes_dir ) !== false ) {
1020
					$source = explode( "/", ltrim( str_replace( $themes_dir, "", $file ), "/" ) );
1021
				}
1022
			}
1023
1024
			echo '<meta name="generator" content="WP Font Awesome Settings v' . esc_attr( $this->version ) . '"' . ( ! empty( $source[0] ) ? ' data-ac-source="' . esc_attr( $source[0] ) . '"' : '' ) . ' />';
1025
		}
1026
1027
		/**
1028
		 * Add extra parameters to the script tag.
1029
		 *
1030
		 * Add crossorigin="anonymous" to prevent OpaqueResponseBlocking
1031
		 * (NS_BINDING_ABORTED) http error.
1032
		 *
1033
		 * @since 1.1.8
1034
		 *
1035
		 * @param string $tag The script tag.
1036
		 * @param string $handle The script handle.
1037
		 * @param string $src The script url.
1038
		 * @return string The script tag.
1039
		 */
1040
		public function script_loader_tag( $tag, $handle, $src ) {
1041
			if ( ( $handle == 'font-awesome' || $handle == 'font-awesome-shims' ) && ( strpos( $src, "kit.fontawesome.com" ) !== false || strpos( $src, ".fontawesome.com/releases/" ) !== false ) ) {
1042
				$tag = preg_replace(
1043
					'/<script[\s]+(.*?)>/',
1044
					'<script defer crossorigin="anonymous" \1>',
1045
					$tag
1046
				);
1047
			}
1048
1049
			return $tag;
1050
		}
1051
	}
1052
1053
	/**
1054
	 * Run the class if found.
1055
	 */
1056
	WP_Font_Awesome_Settings::instance();
1057
}
1058