152 lines
4.6 KiB
PHP
152 lines
4.6 KiB
PHP
<?php
|
|
namespace ElementorPro\Modules\Forms\Classes;
|
|
|
|
use Elementor\Settings;
|
|
use Elementor\Widget_Base;
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit; // Exit if accessed directly
|
|
}
|
|
|
|
/**
|
|
* Integration with Google reCAPTCHA
|
|
*/
|
|
class Recaptcha_V3_Handler extends Recaptcha_Handler {
|
|
|
|
const OPTION_NAME_V3_SITE_KEY = 'elementor_pro_recaptcha_v3_site_key';
|
|
const OPTION_NAME_V3_SECRET_KEY = 'elementor_pro_recaptcha_v3_secret_key';
|
|
const OPTION_NAME_RECAPTCHA_THRESHOLD = 'elementor_pro_recaptcha_v3_threshold';
|
|
const V3 = 'v3';
|
|
const V3_DEFAULT_THRESHOLD = 0.5;
|
|
const V3_DEFAULT_ACTION = 'Form';
|
|
|
|
protected static function get_recaptcha_name() {
|
|
return 'recaptcha_v3';
|
|
}
|
|
|
|
public static function get_site_key() {
|
|
return get_option( self::OPTION_NAME_V3_SITE_KEY );
|
|
}
|
|
|
|
public static function get_secret_key() {
|
|
return get_option( self::OPTION_NAME_V3_SECRET_KEY );
|
|
}
|
|
|
|
public static function get_recaptcha_type() {
|
|
return self::V3;
|
|
}
|
|
|
|
public static function get_recaptcha_threshold() {
|
|
$threshold = get_option( self::OPTION_NAME_RECAPTCHA_THRESHOLD, self::V3_DEFAULT_THRESHOLD );
|
|
if ( 0 > $threshold || 1 < $threshold ) {
|
|
return self::V3_DEFAULT_THRESHOLD;
|
|
}
|
|
return $threshold;
|
|
}
|
|
|
|
public static function is_enabled() {
|
|
return static::get_site_key() && static::get_secret_key();
|
|
}
|
|
|
|
public static function get_setup_message() {
|
|
return esc_html__( 'To use reCAPTCHA V3, you need to add the API Key and complete the setup process in Dashboard > Elementor > Settings > Integrations > reCAPTCHA V3.', 'elementor-pro' );
|
|
}
|
|
|
|
public function register_admin_fields( Settings $settings ) {
|
|
$settings->add_section( Settings::TAB_INTEGRATIONS, 'recaptcha_v3', [
|
|
'label' => esc_html__( 'reCAPTCHA V3', 'elementor-pro' ),
|
|
'callback' => function() {
|
|
echo sprintf(
|
|
/* translators: 1: Link opening tag, 2: Link closing tag. */
|
|
esc_html__( '%1$sreCAPTCHA V3%2$s is a free service by Google that protects your website from spam and abuse. It does this while letting your valid users pass through with ease.', 'elementor-pro' ),
|
|
'<a href="https://www.google.com/recaptcha/intro/v3.html" target="_blank">',
|
|
'</a>'
|
|
);
|
|
},
|
|
'fields' => [
|
|
'pro_recaptcha_v3_site_key' => [
|
|
'label' => esc_html__( 'Site Key', 'elementor-pro' ),
|
|
'field_args' => [
|
|
'type' => 'text',
|
|
],
|
|
],
|
|
'pro_recaptcha_v3_secret_key' => [
|
|
'label' => esc_html__( 'Secret Key', 'elementor-pro' ),
|
|
'field_args' => [
|
|
'type' => 'text',
|
|
],
|
|
],
|
|
'pro_recaptcha_v3_threshold' => [
|
|
'label' => esc_html__( 'Score Threshold', 'elementor-pro' ),
|
|
'field_args' => [
|
|
'attributes' => [
|
|
'min' => 0,
|
|
'max' => 1,
|
|
'placeholder' => '0.5',
|
|
'step' => '0.1',
|
|
],
|
|
'std' => 0.5,
|
|
'type' => 'number',
|
|
'desc' => esc_html__( 'Score threshold should be a value between 0 and 1, default: 0.5', 'elementor-pro' ),
|
|
],
|
|
],
|
|
],
|
|
] );
|
|
}
|
|
|
|
/**
|
|
* @param $item
|
|
* @param $item_index
|
|
* @param $widget Widget_Base
|
|
*/
|
|
protected function add_version_specific_render_attributes( $item, $item_index, $widget ) {
|
|
$recaptcha_name = static::get_recaptcha_name();
|
|
$widget->add_render_attribute( $recaptcha_name . $item_index, [
|
|
'data-action' => self::V3_DEFAULT_ACTION,
|
|
'data-badge' => $item['recaptcha_badge'],
|
|
'data-size' => 'invisible',
|
|
] );
|
|
}
|
|
|
|
/**
|
|
* @param Ajax_Handler $ajax_handler
|
|
* @param $field
|
|
* @param $message
|
|
*/
|
|
protected function add_error( $ajax_handler, $field, $message ) {
|
|
parent::add_error( $ajax_handler, $field, $message );
|
|
$ajax_handler->add_error_message( esc_html__( 'reCAPTCHA V3 validation failed, suspected as abusive usage', 'elementor-pro' ) );
|
|
}
|
|
|
|
protected function validate_result( $result, $field ) {
|
|
$action = self::V3_DEFAULT_ACTION;
|
|
$action_ok = ! isset( $result['action'] ) ? true : $action === $result['action'];
|
|
return $action_ok && ( $result['score'] > self::get_recaptcha_threshold() );
|
|
}
|
|
|
|
public function add_field_type( $field_types ) {
|
|
$field_types['recaptcha_v3'] = esc_html__( 'reCAPTCHA V3', 'elementor-pro' );
|
|
|
|
return $field_types;
|
|
}
|
|
|
|
/**
|
|
* @param $item
|
|
* @param $item_index
|
|
* @param Widget_Base $widget
|
|
*
|
|
* @return $item
|
|
*/
|
|
public function filter_recaptcha_item( $item, $item_index, $widget ) {
|
|
$widget->add_render_attribute( 'field-group' . $item_index, 'class', [
|
|
self::get_recaptcha_name() . '-' . $item['recaptcha_badge'],
|
|
] );
|
|
|
|
return $item;
|
|
}
|
|
|
|
public function __construct() {
|
|
parent::__construct();
|
|
add_filter( 'elementor_pro/forms/render/item/' . self::get_recaptcha_name(), [ $this, 'filter_recaptcha_item' ], 10, 3 );
|
|
}
|
|
}
|