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
|