595 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			595 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * WP Captcha
 | |
|  * https://getwpcaptcha.com/
 | |
|  * (c) WebFactory Ltd, 2022 - 2023, www.webfactoryltd.com
 | |
|  */
 | |
| 
 | |
| use WFMaxMind\Db\Reader;
 | |
| 
 | |
| class WPCaptcha_Utility extends WPCaptcha
 | |
| {
 | |
|     /**
 | |
|      * Display settings notice
 | |
|      *
 | |
|      * @param $redirect
 | |
|      * @return bool
 | |
|      */
 | |
|     static function display_notice($message, $type = 'error', $code = 'advanced-google-recaptcha')
 | |
|     {
 | |
|         global $wp_settings_errors;
 | |
| 
 | |
|         $wp_settings_errors[] = array(
 | |
|             'setting' => WPCAPTCHA_OPTIONS_KEY,
 | |
|             'code'    => $code,
 | |
|             'message' => $message,
 | |
|             'type'    => $type
 | |
|         );
 | |
|         set_transient('settings_errors', $wp_settings_errors);
 | |
|     } // display_notice
 | |
| 
 | |
|     /**
 | |
|      * Empty cache in various 3rd party plugins
 | |
|      *
 | |
|      * @since 5.0
 | |
|      *
 | |
|      * @return null
 | |
|      *
 | |
|      */
 | |
|     static function clear_3rdparty_cache()
 | |
|     {
 | |
|         if (function_exists('w3tc_pgcache_flush')) {
 | |
|             w3tc_pgcache_flush();
 | |
|         }
 | |
|         if (function_exists('wp_cache_clean_cache')) {
 | |
|             global $file_prefix;
 | |
|             wp_cache_clean_cache($file_prefix);
 | |
|         }
 | |
|         if (function_exists('wp_cache_clear_cache')) {
 | |
|             wp_cache_clear_cache();
 | |
|         }
 | |
|         if (class_exists('Endurance_Page_Cache')) {
 | |
|             $epc = new Endurance_Page_Cache;
 | |
|             $epc->purge_all();
 | |
|         }
 | |
|         if (method_exists('SG_CachePress_Supercacher', 'purge_cache')) {
 | |
|             SG_CachePress_Supercacher::purge_cache(true);
 | |
|         }
 | |
| 
 | |
|         if (class_exists('SiteGround_Optimizer\Supercacher\Supercacher')) {
 | |
|             SiteGround_Optimizer\Supercacher\Supercacher::purge_cache();
 | |
|         }
 | |
|     } // empty_3rdparty_cache
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * Dismiss pointer
 | |
|      *
 | |
|      * @since 5.0
 | |
|      *
 | |
|      * @return null
 | |
|      *
 | |
|      */
 | |
|     static function dismiss_pointer_ajax()
 | |
|     {
 | |
|         delete_option(WPCAPTCHA_POINTERS_KEY);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * checkbox helper function
 | |
|      *
 | |
|      * @since 5.0
 | |
|      *
 | |
|      * @return string checked HTML
 | |
|      *
 | |
|      */
 | |
|     static function checked($value, $current, $echo = false)
 | |
|     {
 | |
|         $out = '';
 | |
| 
 | |
|         if (!is_array($current)) {
 | |
|             $current = (array) $current;
 | |
|         }
 | |
| 
 | |
|         if (in_array($value, $current)) {
 | |
|             $out = ' checked="checked" ';
 | |
|         }
 | |
| 
 | |
|         if ($echo) {
 | |
|             WPCaptcha_Utility::wp_kses_wf($out);
 | |
|         } else {
 | |
|             return $out;
 | |
|         }
 | |
|     } // checked
 | |
| 
 | |
|     /**
 | |
|      * Create toggle switch
 | |
|      *
 | |
|      * @since 5.0
 | |
|      *
 | |
|      * @return string Switch HTML
 | |
|      *
 | |
|      */
 | |
|     static function create_toggle_switch($name, $options = array(), $output = true, $class = '')
 | |
|     {
 | |
|         $default_options = array('value' => '1', 'saved_value' => '', 'option_key' => $name);
 | |
|         $options = array_merge($default_options, $options);
 | |
| 
 | |
|         $out = "\n";
 | |
|         $out .= '<div class="toggle-wrapper">';
 | |
|         $out .= '<input class="' . $class . '" type="checkbox" id="' . $name . '" ' . self::checked($options['value'], $options['saved_value']) . ' type="checkbox" value="' . $options['value'] . '" name="' . $options['option_key'] . '">';
 | |
|         $out .= '<label for="' . $name . '" class="toggle"><span class="toggle_handler"></span></label>';
 | |
|         $out .= '</div>';
 | |
| 
 | |
|         if ($output) {
 | |
|             WPCaptcha_Utility::wp_kses_wf($out);
 | |
|         } else {
 | |
|             return $out;
 | |
|         }
 | |
|     } // create_toggle_switch
 | |
| 
 | |
|     /**
 | |
|      * Get user IP
 | |
|      *
 | |
|      * @since 5.0
 | |
|      *
 | |
|      * @return string userip
 | |
|      *
 | |
|      */
 | |
|     static function getUserIP($force_clear = false)
 | |
|     {
 | |
|         $options = WPCaptcha_Setup::get_options();
 | |
|         $ip = '';
 | |
| 
 | |
|         if (!empty($_SERVER['REMOTE_ADDR'])) {
 | |
|             $ip = $_SERVER['REMOTE_ADDR'];
 | |
|         }
 | |
| 
 | |
|         if ($options['anonymous_logging'] == '1' && !$force_clear) {
 | |
|             $ip = md5($ip);
 | |
|         }
 | |
| 
 | |
|         return $ip;
 | |
|     } // getUserIP
 | |
| 
 | |
|     /**
 | |
|      * Create select options for select
 | |
|      *
 | |
|      * @since 5.0
 | |
|      *
 | |
|      * @param array $options options
 | |
|      * @param string $selected selected value
 | |
|      * @param bool $output echo, if false return html as string
 | |
|      * @return string html with options
 | |
|      */
 | |
|     static function create_select_options($options, $selected = null, $output = true)
 | |
|     {
 | |
|         $out = "\n";
 | |
| 
 | |
|         foreach ($options as $tmp) {
 | |
|             if ((is_array($selected) && in_array($tmp['val'], $selected)) || $selected == $tmp['val']) {
 | |
|                 $out .= "<option selected=\"selected\" value=\"{$tmp['val']}\" " . (isset($tmp['class']) ? "class=\"{$tmp['class']}\"" : "") . ">{$tmp['label']} </option>\n";
 | |
|             } else {
 | |
|                 $out .= "<option value=\"{$tmp['val']}\" " . (isset($tmp['class']) ? "class=\"{$tmp['class']}\"" : "") . ">{$tmp['label']} </option>\n";
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         if ($output) {
 | |
|             WPCaptcha_Utility::wp_kses_wf($out);
 | |
|         } else {
 | |
|             return $out;
 | |
|         }
 | |
|     } //  create_select_options
 | |
| 
 | |
| 
 | |
|     static function create_radio_group($name, $options, $selected = null, $output = true)
 | |
|     {
 | |
|         $out = "\n";
 | |
| 
 | |
|         foreach ($options as $tmp) {
 | |
|             if ($selected == $tmp['val']) {
 | |
|                 $out .= "<label for=\"{$name}_{$tmp['val']}\" class=\"radio_wrapper\"><input id=\"{$name}_{$tmp['val']}\" name=\"{$name}\" type=\"radio\" checked=\"checked\" value=\"{$tmp['val']}\">{$tmp['label']} </option></label>\n";
 | |
|             } else {
 | |
|                 $out .= "<label for=\"{$name}_{$tmp['val']}\" class=\"radio_wrapper\"><input id=\"{$name}_{$tmp['val']}\" name=\"{$name}\" type=\"radio\" value=\"{$tmp['val']}\">{$tmp['label']} </option></label>\n";
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         if ($output) {
 | |
|             WPCaptcha_Utility::wp_kses_wf($out);
 | |
|         } else {
 | |
|             return $out;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Parse user agent to add device icon and clean text
 | |
|      *
 | |
|      * @since 5.0
 | |
|      *
 | |
|      * @param string $user_agent
 | |
|      * @return string $user_agent
 | |
|      */
 | |
|     static function parse_user_agent($user_agent = false)
 | |
|     {
 | |
|         if (!$user_agent) {
 | |
|             $user_agent = array();
 | |
|             foreach ($_SERVER as $name => $value) {
 | |
|                 if (substr($name, 0, 5) == 'HTTP_') {
 | |
|                     $user_agent[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         $user_agent = new WhichBrowser\Parser($user_agent);
 | |
| 
 | |
|         $user_agent_string = '';
 | |
|         if ($user_agent->isType('mobile')) {
 | |
|             $user_agent_string .= '<i class="tooltip fas fa-mobile-alt" title="Phone"></i>';
 | |
|         } else if ($user_agent->isType('tablet')) {
 | |
|             $user_agent_string .= '<i class="tooltip fas fa-tablet-alt" title="Table"></i>';
 | |
|         } else if ($user_agent->isType('desktop')) {
 | |
|             $user_agent_string .= '<i class="tooltip fas fa-desktop" title="Desktop"></i>';
 | |
|         } else {
 | |
|             $user_agent_string .= '<i class="tooltip fas fa-robot" title="Bot"></i>';
 | |
|         }
 | |
| 
 | |
|         if (isset($user_agent->browser) && isset($user_agent->browser->version)) {
 | |
|             $browser_version = explode('.', $user_agent->browser->version->toString());
 | |
|         } else {
 | |
|             $browser_version = array('unknown');
 | |
|         }
 | |
| 
 | |
|         if ($user_agent->os) {
 | |
|             $os = $user_agent->os->toString();
 | |
|         } else {
 | |
|             $os = 'unknown';
 | |
|         }
 | |
| 
 | |
|         if (isset($user_agent->browser) && isset($user_agent->browser->name)) {
 | |
|             $browser_name = $user_agent->browser->name;
 | |
|         } else {
 | |
|             $browser_name = 'unknown';
 | |
|         }
 | |
| 
 | |
|         $user_agent_string .= ' ' . $browser_name . ' ' . $browser_version[0] . ' on ' . $os;
 | |
| 
 | |
| 
 | |
|         return $user_agent_string;
 | |
|     } // parse_user_agent
 | |
| 
 | |
|     static function get_home_path()
 | |
|     {
 | |
| 
 | |
|         if (!function_exists('get_home_path')) {
 | |
| 
 | |
|             require_once(ABSPATH . 'wp-admin/includes/file.php');
 | |
|         }
 | |
| 
 | |
|         return get_home_path();
 | |
|     }
 | |
| 
 | |
|     static function wp_kses_wf($html)
 | |
|     {
 | |
|         add_filter('safe_style_css', function ($styles) {
 | |
|             $styles_wf = array(
 | |
|                 'text-align',
 | |
|                 'margin',
 | |
|                 'color',
 | |
|                 'float',
 | |
|                 'border',
 | |
|                 'background',
 | |
|                 'background-color',
 | |
|                 'border-bottom',
 | |
|                 'border-bottom-color',
 | |
|                 'border-bottom-style',
 | |
|                 'border-bottom-width',
 | |
|                 'border-collapse',
 | |
|                 'border-color',
 | |
|                 'border-left',
 | |
|                 'border-left-color',
 | |
|                 'border-left-style',
 | |
|                 'border-left-width',
 | |
|                 'border-right',
 | |
|                 'border-right-color',
 | |
|                 'border-right-style',
 | |
|                 'border-right-width',
 | |
|                 'border-spacing',
 | |
|                 'border-style',
 | |
|                 'border-top',
 | |
|                 'border-top-color',
 | |
|                 'border-top-style',
 | |
|                 'border-top-width',
 | |
|                 'border-width',
 | |
|                 'caption-side',
 | |
|                 'clear',
 | |
|                 'cursor',
 | |
|                 'direction',
 | |
|                 'font',
 | |
|                 'font-family',
 | |
|                 'font-size',
 | |
|                 'font-style',
 | |
|                 'font-variant',
 | |
|                 'font-weight',
 | |
|                 'height',
 | |
|                 'letter-spacing',
 | |
|                 'line-height',
 | |
|                 'margin-bottom',
 | |
|                 'margin-left',
 | |
|                 'margin-right',
 | |
|                 'margin-top',
 | |
|                 'overflow',
 | |
|                 'padding',
 | |
|                 'padding-bottom',
 | |
|                 'padding-left',
 | |
|                 'padding-right',
 | |
|                 'padding-top',
 | |
|                 'text-decoration',
 | |
|                 'text-indent',
 | |
|                 'vertical-align',
 | |
|                 'width',
 | |
|                 'display',
 | |
|             );
 | |
| 
 | |
|             foreach ($styles_wf as $style_wf) {
 | |
|                 $styles[] = $style_wf;
 | |
|             }
 | |
|             return $styles;
 | |
|         });
 | |
| 
 | |
|         $allowed_tags = wp_kses_allowed_html('post');
 | |
|         $allowed_tags['input'] = array(
 | |
|             'type' => true,
 | |
|             'style' => true,
 | |
|             'class' => true,
 | |
|             'id' => true,
 | |
|             'checked' => true,
 | |
|             'disabled' => true,
 | |
|             'name' => true,
 | |
|             'size' => true,
 | |
|             'placeholder' => true,
 | |
|             'value' => true,
 | |
|             'data-*' => true,
 | |
|             'size' => true,
 | |
|             'disabled' => true
 | |
|         );
 | |
| 
 | |
|         $allowed_tags['textarea'] = array(
 | |
|             'type' => true,
 | |
|             'style' => true,
 | |
|             'class' => true,
 | |
|             'id' => true,
 | |
|             'checked' => true,
 | |
|             'disabled' => true,
 | |
|             'name' => true,
 | |
|             'size' => true,
 | |
|             'placeholder' => true,
 | |
|             'value' => true,
 | |
|             'data-*' => true,
 | |
|             'cols' => true,
 | |
|             'rows' => true,
 | |
|             'disabled' => true,
 | |
|             'autocomplete' => true
 | |
|         );
 | |
| 
 | |
|         $allowed_tags['select'] = array(
 | |
|             'type' => true,
 | |
|             'style' => true,
 | |
|             'class' => true,
 | |
|             'id' => true,
 | |
|             'checked' => true,
 | |
|             'disabled' => true,
 | |
|             'name' => true,
 | |
|             'size' => true,
 | |
|             'placeholder' => true,
 | |
|             'value' => true,
 | |
|             'data-*' => true,
 | |
|             'multiple' => true,
 | |
|             'disabled' => true
 | |
|         );
 | |
| 
 | |
|         $allowed_tags['option'] = array(
 | |
|             'type' => true,
 | |
|             'style' => true,
 | |
|             'class' => true,
 | |
|             'id' => true,
 | |
|             'checked' => true,
 | |
|             'disabled' => true,
 | |
|             'name' => true,
 | |
|             'size' => true,
 | |
|             'placeholder' => true,
 | |
|             'value' => true,
 | |
|             'selected' => true,
 | |
|             'data-*' => true
 | |
|         );
 | |
|         $allowed_tags['optgroup'] = array(
 | |
|             'type' => true,
 | |
|             'style' => true,
 | |
|             'class' => true,
 | |
|             'id' => true,
 | |
|             'checked' => true,
 | |
|             'disabled' => true,
 | |
|             'name' => true,
 | |
|             'size' => true,
 | |
|             'placeholder' => true,
 | |
|             'value' => true,
 | |
|             'selected' => true,
 | |
|             'data-*' => true,
 | |
|             'label' => true
 | |
|         );
 | |
| 
 | |
|         $allowed_tags['a'] = array(
 | |
|             'href' => true,
 | |
|             'data-*' => true,
 | |
|             'class' => true,
 | |
|             'style' => true,
 | |
|             'id' => true,
 | |
|             'target' => true,
 | |
|             'data-*' => true,
 | |
|             'role' => true,
 | |
|             'aria-controls' => true,
 | |
|             'aria-selected' => true,
 | |
|             'disabled' => true
 | |
|         );
 | |
| 
 | |
|         $allowed_tags['div'] = array(
 | |
|             'style' => true,
 | |
|             'class' => true,
 | |
|             'id' => true,
 | |
|             'data-*' => true,
 | |
|             'role' => true,
 | |
|             'aria-labelledby' => true,
 | |
|             'value' => true,
 | |
|             'aria-modal' => true,
 | |
|             'tabindex' => true
 | |
|         );
 | |
| 
 | |
|         $allowed_tags['li'] = array(
 | |
|             'style' => true,
 | |
|             'class' => true,
 | |
|             'id' => true,
 | |
|             'data-*' => true,
 | |
|             'role' => true,
 | |
|             'aria-labelledby' => true,
 | |
|             'value' => true,
 | |
|             'aria-modal' => true,
 | |
|             'tabindex' => true
 | |
|         );
 | |
| 
 | |
|         $allowed_tags['span'] = array(
 | |
|             'style' => true,
 | |
|             'class' => true,
 | |
|             'id' => true,
 | |
|             'data-*' => true,
 | |
|             'aria-hidden' => true
 | |
|         );
 | |
| 
 | |
|         $allowed_tags['style'] = array(
 | |
|             'class' => true,
 | |
|             'id' => true,
 | |
|             'type' => true,
 | |
|             'style' => true
 | |
|         );
 | |
| 
 | |
|         $allowed_tags['fieldset'] = array(
 | |
|             'class' => true,
 | |
|             'id' => true,
 | |
|             'type' => true,
 | |
|             'style' => true
 | |
|         );
 | |
| 
 | |
|         $allowed_tags['link'] = array(
 | |
|             'class' => true,
 | |
|             'id' => true,
 | |
|             'type' => true,
 | |
|             'rel' => true,
 | |
|             'href' => true,
 | |
|             'media' => true,
 | |
|             'style' => true
 | |
|         );
 | |
| 
 | |
|         $allowed_tags['form'] = array(
 | |
|             'style' => true,
 | |
|             'class' => true,
 | |
|             'id' => true,
 | |
|             'method' => true,
 | |
|             'action' => true,
 | |
|             'data-*' => true,
 | |
|             'style' => true
 | |
|         );
 | |
| 
 | |
|         $allowed_tags['script'] = array(
 | |
|             'class' => true,
 | |
|             'id' => true,
 | |
|             'type' => true,
 | |
|             'src' => true,
 | |
|             'style' => true
 | |
|         );
 | |
| 
 | |
|         $allowed_tags['table'] = array(
 | |
|             'class' => true,
 | |
|             'id' => true,
 | |
|             'type' => true,
 | |
|             'cellpadding' => true,
 | |
|             'cellspacing' => true,
 | |
|             'border' => true,
 | |
|             'style' => true
 | |
|         );
 | |
| 
 | |
|         $allowed_tags['canvas'] = array(
 | |
|             'class' => true,
 | |
|             'id' => true,
 | |
|             'style' => true
 | |
|         );
 | |
| 
 | |
|         echo wp_kses($html, $allowed_tags);
 | |
| 
 | |
|         add_filter('safe_style_css', function ($styles) {
 | |
|             $styles_wf = array(
 | |
|                 'text-align',
 | |
|                 'margin',
 | |
|                 'color',
 | |
|                 'float',
 | |
|                 'border',
 | |
|                 'background',
 | |
|                 'background-color',
 | |
|                 'border-bottom',
 | |
|                 'border-bottom-color',
 | |
|                 'border-bottom-style',
 | |
|                 'border-bottom-width',
 | |
|                 'border-collapse',
 | |
|                 'border-color',
 | |
|                 'border-left',
 | |
|                 'border-left-color',
 | |
|                 'border-left-style',
 | |
|                 'border-left-width',
 | |
|                 'border-right',
 | |
|                 'border-right-color',
 | |
|                 'border-right-style',
 | |
|                 'border-right-width',
 | |
|                 'border-spacing',
 | |
|                 'border-style',
 | |
|                 'border-top',
 | |
|                 'border-top-color',
 | |
|                 'border-top-style',
 | |
|                 'border-top-width',
 | |
|                 'border-width',
 | |
|                 'caption-side',
 | |
|                 'clear',
 | |
|                 'cursor',
 | |
|                 'direction',
 | |
|                 'font',
 | |
|                 'font-family',
 | |
|                 'font-size',
 | |
|                 'font-style',
 | |
|                 'font-variant',
 | |
|                 'font-weight',
 | |
|                 'height',
 | |
|                 'letter-spacing',
 | |
|                 'line-height',
 | |
|                 'margin-bottom',
 | |
|                 'margin-left',
 | |
|                 'margin-right',
 | |
|                 'margin-top',
 | |
|                 'overflow',
 | |
|                 'padding',
 | |
|                 'padding-bottom',
 | |
|                 'padding-left',
 | |
|                 'padding-right',
 | |
|                 'padding-top',
 | |
|                 'text-decoration',
 | |
|                 'text-indent',
 | |
|                 'vertical-align',
 | |
|                 'width'
 | |
|             );
 | |
| 
 | |
|             foreach ($styles_wf as $style_wf) {
 | |
|                 if (($key = array_search($style_wf, $styles)) !== false) {
 | |
|                     unset($styles[$key]);
 | |
|                 }
 | |
|             }
 | |
|             return $styles;
 | |
|         });
 | |
|     }
 | |
| } // class
 |