XylotrechusZ
<?php
/**
* @copyright Copyright (c) 2009-2022 ThemeCatcher (https://www.themecatcher.net)
*/
class Quform_Element_Recaptcha extends Quform_Element_Field
{
/**
* The reCAPTCHA element has a static name
*
* @return string
*/
public function getName()
{
$provider = $this->config('provider');
if ($provider == 'hcaptcha') {
return 'h-captcha-response';
} elseif ($provider == 'turnstile') {
return 'cf-turnstile-response';
}
return 'g-recaptcha-response';
}
/**
* Get the classes for the outermost element wrapper
*
* @param array $context
* @return array
*/
protected function getElementClasses(array $context = array())
{
$classes = parent::getElementClasses($context);
if (in_array($this->config('provider'), array('hcaptcha', 'turnstile'), true)) {
if ($this->config('recaptchaSize') == 'invisible') {
$classes[] = 'quform-recaptcha-no-size';
}
} else {
if (($this->config('recaptchaVersion') == 'v3' || $this->config('recaptchaSize') == 'invisible') && $this->config('recaptchaBadge') != 'inline') {
$classes[] = 'quform-recaptcha-no-size';
}
}
return $classes;
}
/**
* Get the HTML for the element label
*
* @param array $context
* @param string|bool $forAttribute Set the "for" attribute to the element unique ID
* @param bool $id Add a unique ID to the label
* @return string
*/
protected function getLabelHtml(array $context = array(), $forAttribute = true, $id = false)
{
if ($this->config('recaptchaVersion') == 'v3' || $this->config('recaptchaSize') == 'invisible') {
return '';
}
return parent::getLabelHtml($context, false);
}
/**
* Get the HTML for the element input wrapper
*
* @param array $context
* @return string
*/
protected function getInputHtml(array $context = array())
{
$output = sprintf('<div class="%s">', Quform::escape(Quform::sanitizeClass($this->getInputClasses($context))));
$output .= $this->getFieldHtml();
$output .= '</div>';
return $output;
}
/**
* Get the HTML for the field
*
* @param array $context
* @return string
*/
protected function getFieldHtml(array $context = array())
{
$output = '';
if ($this->config('provider') == 'hcaptcha') {
if (!Quform::isNonEmptyString($this->config('hcaptchaSiteKey'))) {
$output .= esc_html__('To use hCaptcha you must enter the API keys on the Quform settings page.', 'quform');
} else {
$config = array(
'sitekey' => $this->config('hcaptchaSiteKey'),
'size' => $this->config('recaptchaSize'),
'theme' => $this->config('recaptchaTheme'),
);
$output .= sprintf(
'<div class="quform-hcaptcha" data-config="%s"></div>',
Quform::escape(wp_json_encode($config))
);
$output .= sprintf('<noscript>%s</noscript>', esc_html__('Please enable JavaScript to submit this form.', 'quform'));
if (!wp_script_is('quform-hcaptcha')) {
$args = array(
'onload' => 'QuformHcaptchaLoaded',
'render' => 'explicit',
'recaptchacompat' => apply_filters('quform_hcaptcha_recaptcha_compat', false) ? 'on' : 'off'
);
if (Quform::isNonEmptyString($this->config('hcaptchaLang'))) {
$args['hl'] = urlencode($this->config('hcaptchaLang'));
}
$url = add_query_arg($args, 'https://js.hcaptcha.com/1/api.js');
wp_enqueue_script('quform-hcaptcha', $url, array('jquery'), false, true);
wp_add_inline_script('quform-hcaptcha', 'window.QuformHcaptchaLoaded=function(){window.hcaptcha&&window.jQuery&&jQuery(".quform-hcaptcha").each(function(){var a=jQuery(this),c=a.data("config");a.is(":empty")&&("invisible"===c.size&&(c.callback=function(){a.closest(".quform-form").data("quform").submit()}),a.data("hcaptcha-id",hcaptcha.render(a[0],c)))})};', 'before');
}
}
} elseif ($this->config('provider') == 'turnstile') {
if (!Quform::isNonEmptyString($this->config('turnstileSiteKey'))) {
$output .= esc_html__('To use Cloudflare Turnstile you must enter the API keys on the Quform settings page.', 'quform');
} else {
$config = array(
'sitekey' => $this->config('turnstileSiteKey'),
'size' => $this->config('recaptchaSize'),
'theme' => $this->config('recaptchaTheme'),
);
if (Quform::isNonEmptyString($this->config('turnstileLang'))) {
$config['language'] = urlencode($this->config('turnstileLang'));
}
$output .= sprintf(
'<div class="quform-turnstile" data-config="%s"></div>',
Quform::escape(wp_json_encode($config))
);
$output .= sprintf('<noscript>%s</noscript>', esc_html__('Please enable JavaScript to submit this form.', 'quform'));
if (!wp_script_is('quform-turnstile')) {
$args = array(
'onload' => 'QuformTurnstileLoaded',
'render' => 'explicit'
);
if (apply_filters('quform_turnstile_recaptcha_compat', false)) {
$args['compat'] = 'recaptcha';
}
$url = add_query_arg($args, 'https://challenges.cloudflare.com/turnstile/v0/api.js');
wp_enqueue_script('quform-turnstile', $url, array('jquery'), false, true);
wp_add_inline_script('quform-turnstile', 'window.QuformTurnstileLoaded=function(){window.turnstile&&window.jQuery&&jQuery(".quform-turnstile").each(function(){var t=jQuery(this),i=t.data("config");t.is(":empty")&&t.data("turnstile-id",turnstile.render(t[0],i))})};', 'before');
}
}
} else {
if (!Quform::isNonEmptyString($this->config('recaptchaSiteKey'))) {
$output .= esc_html__('To use reCAPTCHA you must enter the API keys on the Quform settings page.', 'quform');
} else {
$config = array(
'sitekey' => $this->config('recaptchaSiteKey'),
'_version' => $this->config('recaptchaVersion'), /* 'version' is reserved */
'size' => $this->config('recaptchaSize'),
'type' => $this->config('recaptchaType'),
'theme' => $this->config('recaptchaTheme'),
'badge' => $this->config('recaptchaBadge'),
);
$output .= sprintf(
'<div class="quform-recaptcha" data-config="%s"></div>',
Quform::escape(wp_json_encode($config))
);
if ($this->config('recaptchaVersion') == 'v3' || $this->config('recaptchaSize') == 'invisible') {
$output .= sprintf('<noscript>%s</noscript>', esc_html__('Please enable JavaScript to submit this form.', 'quform'));
} else {
$output .= '<noscript><div>';
$output .= '<div style="width: 302px; height: 422px; position: relative;">';
$output .= '<div style="width: 302px; height: 422px; position: absolute;">';
$output .= sprintf('<iframe src="%s" frameborder="0" scrolling="no" style="width: 302px; height:422px; border-style: none;"></iframe>', esc_url(sprintf('https://www.google.com/recaptcha/api/fallback?k=%s', $this->config('recaptchaSiteKey'))));
$output .= '</div></div>';
$output .= '<div style="width: 300px; height: 60px; border-style: none; bottom: 12px; left: 25px; margin: 0px; padding: 0px; right: 25px; background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px;">';
$output .= '<textarea name="g-recaptcha-response" class="g-recaptcha-response" style="width: 250px; height: 40px; border: 1px solid #c1c1c1; margin: 10px 25px; padding: 0px; resize: none;" aria-hidden="true"></textarea>';
$output .= '</div></div></noscript>';
}
if (!wp_script_is('quform-recaptcha')) {
$args = array(
'onload' => 'QuformRecaptchaLoaded',
'render' => 'explicit'
);
if (Quform::isNonEmptyString($this->config('recaptchaLang'))) {
$args['hl'] = urlencode($this->config('recaptchaLang'));
}
$url = add_query_arg($args, 'https://www.google.com/recaptcha/api.js');
wp_enqueue_script('quform-recaptcha', $url, array('jquery'), false, true);
wp_add_inline_script('quform-recaptcha', 'window.QuformRecaptchaLoaded=function(){window.grecaptcha&&window.jQuery&&jQuery(".quform-recaptcha").each(function(){var a=jQuery(this),c=a.data("config");a.is(":empty")&&("v2"===c._version&&"invisible"===c.size&&(c.callback=function(){a.closest(".quform-form").data("quform").submit()}),a.data("recaptcha-id",grecaptcha.render(a[0],c)))})};', 'before');
}
}
}
return $output;
}
/**
* Inherit settings from this element into the context
*
* @param array $context
* @return array
*/
protected function prepareContext(array $context = array())
{
$context = parent::prepareContext($context);
// Inside labels are not possible so set it above
if ( ! in_array($context['labelPosition'], array('', 'left'), true)) {
$context['labelPosition'] = '';
}
// Icon is the only possible tooltip type for this element
$context['tooltipType'] = 'icon';
return $context;
}
/**
* Get the default element configuration
*
* @param string|null $key Get the config by key, if omitted the full config is returned
* @return array
*/
public static function getDefaultConfig($key = null)
{
$config = apply_filters('quform_default_config_recaptcha', array(
// Basic
'label' => __('Are you human?', 'quform'),
'description' => '',
'descriptionAbove' => '',
'provider' => 'recaptcha',
'recaptchaVersion' => 'v2',
'recaptchaSize' => 'normal',
'recaptchaType' => 'image',
'recaptchaTheme' => 'light',
'recaptchaBadge' => 'bottomright',
'recaptchaLang' => '',
'hcaptchaLang' => '',
'turnstileLang' => '',
'recaptchaThreshold' => '0.5',
// Styles
'labelIcon' => '',
'customElementClass' => '',
'styles' => array(),
// Labels
'subLabel' => '',
'subLabelAbove' => '',
'tooltip' => '',
'tooltipType' => 'icon',
'tooltipEvent' => 'inherit',
'labelPosition' => 'inherit',
'labelWidth' => '',
// Logic
'logicEnabled' => false,
'logicAction' => true,
'logicMatch' => 'all',
'logicRules' => array(),
// Advanced
'visibility' => '',
// Translations
'messageRequired' => '',
'messageRecaptchaMissingInputSecret' => '',
'messageRecaptchaInvalidInputSecret' => '',
'messageRecaptchaMissingInputResponse' => '',
'messageRecaptchaInvalidInputResponse' => '',
'messageRecaptchaError' => '',
'messageRecaptchaScoreTooLow' => ''
));
$config['type'] = 'recaptcha';
if (Quform::isNonEmptyString($key)) {
return Quform::get($config, $key);
}
return $config;
}
}