Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * Base class to handle Google reCAPTCHA API functionality.
- *
- * @tutorial https://developers.google.com/recaptcha/docs/faq
- * @since 4.5.3
- * @since 4.5.7.2 refactored by Günter
- */
- if( ! defined('AVIA_FW') ) { exit( 'No direct script access allowed' ); }
- if( ! class_exists( 'av_google_recaptcha' ) )
- {
- class av_google_recaptcha
- {
- const API_URL = 'https://www.google.com/recaptcha/api.js';
- const API_VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify';
- const API_URL_LANG = '?hl=fr';
- const AJAX_VERIFY_NONCE = 'av_google_recaptcha_verify_nonce';
- const TRANSIENT_PREFIX = 'av_google_recaptcha_';
- /**
- *
- * @since 4.5.7.2
- * @var av_google_recaptcha
- */
- static protected $_instance = null;
- /**
- * Version of reCAPTCHA
- *
- * @since 4.5.7.2
- * @var string
- */
- protected $version;
- /**
- *
- * @since 4.5.7.2
- * @var array
- */
- protected $site_keys;
- /**
- *
- * @since 4.5.7.2
- * @var array
- */
- protected $secret_keys;
- /**
- * Stores the last verified keys (user might change keys and save without verifying)
- *
- * @since 4.5.7.2
- * @var array '' | 'string combination to verify' | 'verify_error'
- */
- protected $verified_keys;
- /**
- * V3 score threshold (0.0 - 1.0)
- *
- * @since 4.5.7.2
- * @var float
- */
- protected $score;
- /**
- * Backend theme color for V2
- *
- * @since 4.5.7.2
- * @var string
- */
- protected $theme;
- /**
- * Contains the option value
- *
- * @since 4.5.7.2
- * @var string
- */
- protected $display_badge;
- /**
- * Contains the HTML for replacement text
- *
- * @since 4.6.2
- * @var string
- */
- protected $display_badge_html;
- /**
- *
- * @since 4.5.7.2
- * @var boolean|null
- */
- protected $loading_prohibited;
- /**
- * Return the instance of this class
- *
- * @since 4.5.7.2
- * @return av_google_recaptcha
- */
- static public function instance()
- {
- if( is_null( av_google_recaptcha::$_instance ) )
- {
- av_google_recaptcha::$_instance = new av_google_recaptcha();
- }
- return av_google_recaptcha::$_instance;
- }
- /**
- *
- * @since 4.5.7.2
- */
- protected function __construct()
- {
- $this->loading_prohibited = null;
- $this->version = '';
- $this->site_keys = array();
- $this->secret_keys = array();
- $this->verified_keys = array();
- $this->score = 0.5;
- $this->theme = 'light';
- $this->display_badge = '';
- $this->display_badge_html = '';
- // needed because not all framework functions are loaded at this point
- add_action( 'after_setup_theme', array( $this, 'handler_after_setup_theme' ), 10 );
- add_action( 'init', array( $this, 'handler_wp_register_scripts' ), 20 );
- add_action( 'wp_enqueue_scripts', array( $this, 'handler_wp_enqueue_scripts' ), 500 );
- add_action( 'admin_enqueue_scripts', array( $this, 'handler_wp_admin_enqueue_scripts' ), 500 );
- add_filter( 'body_class', array( $this, 'handler_body_class' ), 500, 2 );
- // We hook with low priority as reCAPTCHA verification should overrule other positive checks
- add_filter( 'avf_form_send', array( $this, 'handler_avf_form_send' ), 999999, 4 );
- add_action( 'wp_ajax_avia_recaptcha_verify_frontend', array( $this, 'handler_recaptcha_verify_frontend' ), 10 );
- add_action( 'wp_ajax_nopriv_avia_recaptcha_verify_frontend', array( $this, 'handler_recaptcha_verify_frontend' ), 10 );
- }
- /**
- *
- * @since 4.5.7.2
- */
- public function __destruct()
- {
- unset( $this->site_keys );
- unset( $this->secret_keys );
- unset( $this->verified_keys );
- }
- /**
- * @since 4.5.7.2
- */
- public function handler_after_setup_theme()
- {
- $this->version = avia_get_option( 'avia_recaptcha_version', '' );
- $this->site_keys['avia_recaptcha_v2'] = avia_get_option( 'avia_recaptcha_pkey_v2', '' );
- $this->site_keys['avia_recaptcha_v3'] = avia_get_option( 'avia_recaptcha_pkey_v3', '' );
- $this->secret_keys['avia_recaptcha_v2'] = avia_get_option( 'avia_recaptcha_skey_v2', '' );
- $this->secret_keys['avia_recaptcha_v3'] = avia_get_option( 'avia_recaptcha_skey_v3', '' );
- $this->verified_keys['avia_recaptcha_v2'] = avia_get_option( 'recaptcha_verified_keys_v2', '' );
- $this->verified_keys['avia_recaptcha_v3'] = avia_get_option( 'recaptcha_verified_keys_v3', '' );
- $this->score = avia_get_option( 'avia_recaptcha_score', 5 );
- $this->score = is_numeric( $this->score ) ? $this->score / 10.0 : 0.5;
- $this->display_badge = avia_get_option( 'avia_recaptcha_badge', '' );
- if( ! current_theme_supports( 'avia_recaptcha_show_legal_information' ) )
- {
- $this->display_badge = 'contact_only_message';
- }
- /**
- * see https://developers.google.com/recaptcha/docs/faq#id-like-to-hide-the-recaptcha-badge-what-is-allowed
- *
- * @since 4.5.7.2
- * @param string
- * @return string
- */
- $badge = '<div class="av-google-badge-message hidden">';
- $badge .= __( 'This site is protected by reCAPTCHA and the Google <a href="https://policies.google.com/privacy">Privacy Policy</a> and <a href="https://policies.google.com/terms">Terms of Service</a> apply.', 'avia_framework' );
- $badge .= '</div>';
- $this->display_badge_html = apply_filters( 'avf_google_recaptcha_badge_content', $badge );
- }
- /**
- * @since 4.5.7.2
- */
- public function handler_wp_register_scripts()
- {
- $vn = avia_get_theme_version();
- $min_js = avia_minify_extension( 'js' );
- wp_register_script( 'avia_google_recaptcha_front_script' , AVIA_JS_URL . "conditional_load/avia_google_recaptcha_front{$min_js}.js", array( 'jquery' ), $vn, true );
- wp_register_script( 'avia_google_recaptcha_api_script' , AVIA_JS_URL . "conditional_load/avia_google_recaptcha_api{$min_js}.js", array( 'jquery' ), $vn, true );
- }
- /**
- * Frontend we load conditionally. This script checks after pageload if loading of main scripts are necessary.
- *
- * @since 4.5.7.2
- */
- public function handler_wp_enqueue_scripts()
- {
- if( $this->is_loading_prohibited() )
- {
- return;
- }
- wp_enqueue_script( 'avia_google_recaptcha_front_script' );
- $args = array(
- 'version' => $this->get_version(),
- 'site_key2' => $this->get_site_key( 'avia_recaptcha_v2' ),
- 'site_key3' => $this->get_site_key( 'avia_recaptcha_v3' ),
- 'api' => apply_filters( 'av_google_recaptcha_apiurl', av_google_recaptcha::API_URL ),
- 'avia_api_script' => AVIA_JS_URL . 'conditional_load/avia_google_recaptcha_api.js',
- 'theme' => $this->get_theme(),
- 'score' => $this->get_score(),
- 'verify_nonce' => wp_create_nonce( av_google_recaptcha::AJAX_VERIFY_NONCE ),
- // 'submission_nonce' => wp_create_nonce( av_google_recaptcha::AJAX_SUBMISSION_NONCE ),
- 'cannot_use' => '<h3 class="av-recaptcha-error-main">' . __( 'Sorry, a problem occurred trying to communicate with Google reCAPTCHA API. You are currently not able to submit the contact form. Please try again later - reload the page and also check your internet connection.', 'avia_framework' ) . '</h3>',
- 'init_error_msg' => __( 'Initial setting failed. Sitekey 2 and/or sitekey 3 missing in frontend.', 'avia_framework' ),
- 'v3_timeout_pageload' => __( 'Timeout occurred connecting to V3 API on initial pageload', 'avia_framework' ),
- 'v3_timeout_verify' => __( 'Timeout occurred connecting to V3 API on verifying submit', 'avia_framework' ),
- 'v2_timeout_verify' => __( 'Timeout occurred connecting to V2 API on verifying you as human. Please try again and check your internet connection. It might be necessary to reload the page.', 'avia_framework' ),
- 'verify_msg' => __( 'Verify....', 'avia_framework' ),
- 'connection_error' => __( 'Could not connect to the internet. Please reload the page and try again.', 'avia_framework' ),
- 'validate_first' => __( 'Please validate that you are a human first', 'avia_framework' ),
- 'validate_submit' => __( 'Before submitting we validate that you are a human first.', 'avia_framework' ),
- 'no_token' => __( 'Missing internal token on valid submit - unable to proceed.', 'avia_framework' ),
- 'invalid_version' => __( 'Invalid reCAPTCHA version found.', 'avia_framework' ),
- 'api_load_error' => __( 'Google reCAPTCHA API could not be loaded.', 'avia_framework' ),
- );
- wp_localize_script( 'avia_google_recaptcha_front_script', 'AviaReCAPTCHA_front', $args );
- }
- /**
- *
- * @since 4.5.7.2
- */
- public function handler_wp_admin_enqueue_scripts()
- {
- /**
- * Some 3rd party plugins need to supress loading scripts
- * Not loading the scripts might result in breaking backend !!!
- * Check if everything is working as expected.
- *
- * @since 4.7.5.1
- * @param boolean
- * @return string return 'skip_loading' to prohibit loading of backend scripts
- */
- $skip_loading = apply_filters( 'avf_skip_enqueue_scripts_backend_grecaptcha', '' );
- if( 'skip_loading' === $skip_loading )
- {
- return;
- }
- /**
- * In backend we must enqueue to validate keys and localize script
- */
- wp_enqueue_script( 'avia_google_recaptcha_front_script' );
- $args = array(
- 'version' => $this->get_version(),
- // 'site_key' => $this->get_site_key(),
- 'api' => apply_filters( 'av_google_recaptcha_apiurl', av_google_recaptcha::API_URL ),
- 'theme' => $this->get_theme(),
- 'api_load_error' => __( 'Google reCAPTCHA API could not be loaded. We are not able to verify keys. Check your internet connection and try again.', 'avia_framework' ),
- 'invalid_version' => __( 'Please select Version 2 or 3 for reCAPTCHA', 'avia_framework' ),
- 'invalid_keys' => __( 'You have to enter a site key and a secret key to verify it.', 'avia_framework' ),
- 'v3_timeout' => __( 'A network timeout problem occurred. Could be caused by an invalid V3 sitekey. Please recheck the key and try again.', 'avia_framework' )
- );
- wp_localize_script( 'avia_google_recaptcha_front_script', 'AviaReCAPTCHA_data', $args );
- }
- /**
- * We add classes to allow js script to decide what to load
- *
- * @since 4.5.7.2
- * @param array $classes
- * @param array $class
- * @return array
- */
- public function handler_body_class( array $classes, array $class )
- {
- if( $this->is_loading_prohibited() )
- {
- return $classes;
- }
- /**
- * Allows to disable recaptcha for special pages.
- * Only makes sense for V3 as V2 is only loaded if needed on page/post.
- * Be careful not to disable it on pages where you need it !!!
- *
- * @since 4.5.7.2
- * @param boolean
- * @return boolean
- */
- $disable = apply_filters( 'avf_disable_recaptchaV3_for_post', false );
- if( false === $disable )
- {
- $classes[] = 'av-recaptcha-enabled';
- }
- if( $this->show_extended_errors() )
- {
- $classes[] = 'av-recaptcha-extended-errors';
- }
- if( in_array( $this->display_badge, array( 'contact_only_message', 'hide' ) ) )
- {
- $classes[] = 'av-google-badge-hide';
- }
- return $classes;
- }
- /**
- * Returns the selected version for the recaptcha
- *
- * @since 4.5.7.2
- * @return string '' | 'avia_recaptcha_v2' | 'avia_recaptcha_v3'
- */
- public function get_version()
- {
- return $this->version;
- }
- /**
- * Returns the site key for the selected version
- *
- * @since 4.5.7.2
- * @param string $version
- * @return string
- */
- public function get_site_key( $version = null )
- {
- if( is_null( $version ) )
- {
- $version = $this->get_version();
- }
- return isset( $this->site_keys[ $version ] ) ? $this->site_keys[ $version ] : '';
- }
- /**
- * Returns the secret key for the selected version
- *
- * @since 4.5.7.2
- * @param string $version
- * @return string
- */
- public function get_secret_key( $version = null )
- {
- if( is_null( $version ) )
- {
- $version = $this->get_version();
- }
- return isset( $this->secret_keys[ $version ] ) ? $this->secret_keys[ $version ] : '';
- }
- /**
- * Returns the last saved verified key string:
- * "version site_key secret_key"
- *
- * @since 4.5.7.2
- * @param string $version
- * @return string
- */
- public function get_verified_keys( $version = null )
- {
- if( is_null( $version ) )
- {
- $version = $this->get_version();
- }
- return isset( $this->verified_keys[ $version ] ) ? $this->verified_keys[ $version ] : '';
- }
- /**
- * Returns the float value for selected score threshold (0.0 - 1.0)
- *
- * @since 4.5.7.2
- * @return float
- */
- public function get_score()
- {
- return $this->score;
- }
- /**
- * Returns the necessary HTML if user selected to use
- *
- * @since 4.5.7.2
- * @return string
- */
- public function get_display_badge_html()
- {
- if( ! in_array( $this->display_badge, array( 'message', 'contact_only_message' ) ) )
- {
- return '';
- }
- return $this->display_badge_html;
- }
- /**
- * Returns the selected backend theme style
- *
- * @since 4.5.7.2
- * @return string 'light' | 'dark'
- */
- public function get_theme()
- {
- if( ! in_array( $this->theme, array( 'light', 'dark' ) ) )
- {
- $this->theme = 'light';
- }
- return $this->theme;
- }
- /**
- *
- * @since 4.5.7.2
- * @return boolean
- */
- public function is_loading_prohibited()
- {
- if( is_null( $this->loading_prohibited ) )
- {
- // Check backend setting
- $prohibited = ! $this->is_activated() || ! $this->are_keys_set();
- /**
- * Filter allows to supress loading of script on desired pages
- *
- * @since 4.5.7.2
- * @param boolean
- * @return boolean
- */
- $prohibited = apply_filters( 'avf_load_google_recaptcha_api_prohibited', $prohibited );
- $this->loading_prohibited = is_bool( $prohibited ) ? $prohibited : true;
- }
- return $this->loading_prohibited;
- }
- /**
- * Checks if the version activates gRECAPTCHA
- *
- * @since 4.5.7.2
- * @param string $version
- * @return boolean
- */
- public function is_activated( $version = null )
- {
- if( is_null( $version ) )
- {
- $version = $this->get_version();
- }
- return in_array( $version, array( 'avia_recaptcha_v2', 'avia_recaptcha_v3' ) );
- }
- /**
- * Checks if all necessary keys are set for a version.
- * Returns false if an invalid version or if disabled
- *
- * @since 4.5.7.2
- * @param string $version
- * @return boolean
- */
- public function are_keys_set( $version = null )
- {
- if( is_null( $version ) )
- {
- $version = $this->get_version();
- }
- $keys2 = ! empty( $this->get_site_key( 'avia_recaptcha_v2' ) ) && ! empty( $this->get_secret_key( 'avia_recaptcha_v2' ) );
- $keys3 = ! empty( $this->get_site_key( 'avia_recaptcha_v3' ) ) && ! empty( $this->get_secret_key( 'avia_recaptcha_v3' ) );
- if( 'avia_recaptcha_v2' == $version )
- {
- return $keys2;
- }
- if( 'avia_recaptcha_v3' == $version )
- {
- return $keys2 && $keys3;
- }
- return false;
- }
- /**
- * Allow admins to see more detailed error messages
- *
- * @since 4.5.7.2
- * @return boolean
- */
- protected function show_extended_errors()
- {
- $show_extended_errors = current_user_can( 'manage_options' );
- /**
- *
- *
- * @since 4.5.7.2
- * @param boolean
- * @return boolean return true to show extended messages
- */
- return apply_filters( 'avf_recaptcha_show_extended_error_messages', $show_extended_errors );
- }
- /**
- * Verify a token with gRECAPTCHA.
- *
- * @since 4.5.7.2
- * @param string $token
- * @param string|null $secretkey if null -> verification of key
- * @return array|\WP_Error check $result['success'] = true
- */
- protected function verify_token( $token, $secretkey = null )
- {
- if( is_null( $secretkey ) )
- {
- $secretkey = $this->get_secret_key();
- }
- $params = array(
- 'body' => array(
- 'secret' => $secretkey,
- 'response' => $token,
- 'remoteip' => $_SERVER['REMOTE_ADDR'],
- )
- );
- $response = wp_safe_remote_post( av_google_recaptcha::API_VERIFY_URL, $params );
- if( $response instanceof WP_Error )
- {
- $msg = $response->get_error_messages();
- $msg = implode( '<br />', $msg );
- return new WP_Error( 'site_down', sprintf( __( 'Unable to communicate with gRECAPTCHA: <br /><br />%s', 'avia_framework' ), $msg ) );
- }
- $code = wp_remote_retrieve_response_code( $response );
- if ( 200 != $code )
- {
- $msg = wp_remote_retrieve_response_message( $response );
- if( empty( $msg ) )
- {
- $msg = __( 'Unknown error code', 'avia_framework' );
- }
- return new WP_Error( 'invalid_response', sprintf( __( 'gRECAPTCHA returned error %d (= %s).', 'avia_framework' ), $code, $msg ) );
- }
- $body = wp_remote_retrieve_body( $response );
- $result = json_decode( $body, true );
- if( true === $result['success'] )
- {
- return $result;
- }
- if( isset( $result['error-codes'] ) && is_array( $result['error-codes'] ) )
- {
- foreach( $result['error-codes'] as $key => $value )
- {
- switch( $value )
- {
- case 'missing-input-secret':
- $result['error-codes'][ $key ] = __( 'The secret parameter is missing.', 'avia_framework' );
- break;
- case 'invalid-input-secret':
- $result['error-codes'][ $key ] = __( 'The secret parameter is invalid or malformed.', 'avia_framework' );
- break;
- case 'missing-input-response':
- $result['error-codes'][ $key ] = __( 'The response parameter is missing.', 'avia_framework' );
- break;
- case 'invalid-input-response':
- $result['error-codes'][ $key ] = __( 'The response parameter is invalid or malformed.', 'avia_framework' );
- break;
- case 'bad-request':
- $result['error-codes'][ $key ] = __( 'The request is invalid or malformed.', 'avia_framework' );
- break;
- case 'timeout-or-duplicate':
- $result['error-codes'][ $key ] = __( 'The response is no longer valid: either is too old or has been used previously.', 'avia_framework' );
- break;
- default:
- $result['error-codes'][ $key ] = sprintf( __( '%s - unknown error code', 'avia_framework' ), $value );
- }
- }
- }
- return $result;
- }
- /**
- * Callback - verifies the token and creates a transient if valid.
- * In case of a false score returns
- *
- * @since 4.5.7.2
- */
- public function handler_recaptcha_verify_frontend()
- {
- header( "Content-Type: application/json" );
- $response = array(
- 'success' => false,
- 'alert' => '',
- 'score_failed' => false,
- 'transient' => ''
- );
- $show_extended_errors = $this->show_extended_errors();
- /**
- * Nonce check removed with 4.7.4.1
- *
- * Makes problems with caching plugins.
- * As reCaptcha is bound to a site verifying the reCaptcha should be enough to verify a valid callback.
- *
- */
- // $nonce = isset( $_REQUEST['_wpnonce'] ) ? $_REQUEST['_wpnonce'] : '';
- // $result = wp_verify_nonce( $nonce, av_google_recaptcha::AJAX_VERIFY_NONCE );
- //
- // if( 1 !== $result )
- // {
- // $response['alert'] = __( 'Sorry, but the session time for this page has expired. Please reload the page.', 'avia_framework' );
- // if( true === $show_extended_errors )
- // {
- // $response['alert'] .= '<br />' . __( 'WP Nonce check failed.', 'avia_framework' );
- // }
- //
- // echo json_encode( $response );
- // exit;
- // }
- $version = isset( $_REQUEST['version'] ) ? $_REQUEST['version'] : '';
- $token = isset( $_REQUEST['token'] ) ? $_REQUEST['token'] : '';
- $score = isset( $_REQUEST['score'] ) ? $_REQUEST['score'] : -1;
- $action = isset( $_REQUEST['recaptcha_action'] ) ? $_REQUEST['recaptcha_action'] : '';
- $secret_key = $this->get_secret_key( $version );
- $check = $this->verify_token( $token, $secret_key );
- $validate_error = __( 'Sorry, but the verification failed. Please reload the page and try again.', 'avia_framework' );
- if( true !== $check['success'] )
- {
- $response['alert'] = $validate_error;
- if( true === $show_extended_errors )
- {
- $response['alert'] .= '<br />' . __( 'API check returned false.', 'avia_framework' );
- }
- echo json_encode( $response );
- exit;
- }
- if( 'avia_recaptcha_v3' == $version )
- {
- if( ! isset( $check['score'] ) || ! isset( $check['action'] ) || ( $check['action'] != $action ) )
- {
- $response['alert'] = $validate_error;
- if( true === $show_extended_errors )
- {
- $response['alert'] .= '<br />' . __( 'Invalid V3 response. Actions:', 'avia_framework' ) . $check['action'] . '/' . $action;
- }
- echo json_encode( $response );
- exit;
- }
- if( (float) $score >= (float)$check['score'] )
- {
- if( true === $show_extended_errors )
- {
- $response['score_failed'] = sprintf( __( 'Score requested %s - returned %s', 'avia_framework' ), $score, $check['score'] );
- }
- else
- {
- $response['score_failed'] = true;
- }
- echo json_encode( $response );
- exit;
- }
- }
- $transient = uniqid( av_google_recaptcha::TRANSIENT_PREFIX, true );
- /**
- * @since 4.5.7.2
- * @param int
- * @return int
- */
- $expiration = 30 * MINUTE_IN_SECONDS;
- $expiration = apply_filters( 'avf_recaptcha_transient_expiration', $expiration );
- if( ! is_numeric( $expiration ) )
- {
- $expiration = 30 * MINUTE_IN_SECONDS;
- }
- set_transient( $transient, $version, $expiration );
- $response['success'] = true;
- $response['transient'] = $transient;
- echo json_encode( $response );
- exit;
- }
- /**
- * Check if we have a valid token.
- * This is also a fallback to prevent bots using same token several times.
- * In case $proceed !== true we also remove the transient to clean up.
- *
- * @since 4.5.7.2
- * @param boolean $proceed
- * @param array $new_post
- * @param array $form_params
- * @param avia_form $form_class
- * @return boolean|null true if you want to continue | null for error message
- */
- public function handler_avf_form_send( $proceed, array $new_post, array $form_params, avia_form $form_class )
- {
- $use_recaptcha = false;
- foreach( $form_class->form_elements as $element )
- {
- if( isset( $element['type'] ) && ( 'grecaptcha' == $element['type'] ) )
- {
- $use_recaptcha = $element;
- break;
- }
- }
- if( false === $use_recaptcha )
- {
- return $proceed;
- }
- $show_extended_errors = $this->show_extended_errors();
- $token = isset( $element['token_input'] ) ? $element['token_input'] : '';
- $token_value = ( isset( $_REQUEST[ $token ] ) ) ? trim( $_REQUEST[ $token ] ) : '';
- $requested_version = ( isset( $_REQUEST[ $token . '-version' ] ) ) ? trim( $_REQUEST[ $token . '-version' ] ) : $element['version'];
- if( true !== $proceed )
- {
- if( ! empty( $token_value ) )
- {
- delete_transient( $token_value );
- }
- return $proceed;
- }
- $reload_msg = '<br />' . __( 'Form could not be submitted. Please reload page and try again.', 'avia_framework' );
- if( empty( $token_value ) )
- {
- $form_class->submit_error .= __( 'Invalid form for reCAPTCHA sent.', 'avia_framework' ) . $reload_msg;
- if( $show_extended_errors )
- {
- $form_class->submit_error .= '<br />' . __( 'Name for token field was missing.', 'avia_framework' );
- }
- return null;
- }
- $version = get_transient( $token_value );
- if( false === $version )
- {
- $form_class->submit_error .= __( 'Token to validate form already expired.', 'avia_framework' ) . $reload_msg;
- if( $show_extended_errors )
- {
- $form_class->submit_error .= '<br />' . __( 'Transient to verify form was missing or expired.', 'avia_framework' );
- }
- return null;
- }
- delete_transient( $token_value );
- if( $version != $requested_version )
- {
- $form_class->submit_error .= __( 'Token to validate form is not valid.', 'avia_framework' ) . $reload_msg;
- if( $show_extended_errors )
- {
- $form_class->submit_error .= '<br />' . __( 'reCAPTCHA version in transient differs from selected version in element.', 'avia_framework' );
- }
- return null;
- }
- return $proceed;
- }
- /**
- * Output options page backend HTML or perform the key verification and return HTML message
- *
- * @since 4.5.7.2
- * @param string $api_key
- * @param boolean $ajax
- * @param array|boolean|null $check_keys
- * @param array $element used in backend for output of key verification
- * @return string|array
- */
- public function backend_html( $api_key = '', $ajax = true, $check_keys = false, $element = array() )
- {
- $return = array(
- 'html' => '',
- 'update_input_fields' => array()
- );
- $api_key = trim( $api_key );
- $valid_key = false;
- $response_text = __( 'Could not connect and verify these API Keys with Google reCAPTCHA.', 'avia_framework' );
- $response_class = "av-notice-error";
- $content_default = '<h4>' . esc_html__( 'Troubleshooting:', 'avia_framework' ) . '</h4>';
- $content_default .= '<ol>';
- $content_default .= '<li>';
- $content_default .= esc_html__( 'Check if you typed the keys correctly.', 'avia_framework' );
- $content_default .= '</li>';
- $content_default .= '<li>';
- $content_default .= esc_html__( 'If you use the restriction setting on Google try to remove that, wait a few minutes for google to apply your changes and then check again if the keys work here. If it does, you probably have a syntax error in your referrer url', 'avia_framework' );
- $content_default .= '</li>';
- $content_default .= '<li>';
- $content_default .= esc_html__( 'If none of this helps: deactivate all plugins and then check if the API works by using the button above. If thats the case then one of your plugins is interfering.', 'avia_framework' );
- $content_default .= '</li>';
- $content_default .= '</ol>';
- if( $ajax )
- {
- /**
- * called by user pressing the ajax check button
- */
- $token = isset( $check_keys['token'] ) ? trim( $check_keys['token'] ) : '';
- $secretkey = isset( $check_keys['secretkey'] ) ? trim( $check_keys['secretkey'] ) : '';
- $version = isset( $check_keys['version'] ) ? trim( $check_keys['version'] ) : '';
- switch( $version )
- {
- case 'avia_recaptcha_v2':
- $verify_field = 'recaptcha_verified_keys_v2';
- break;
- case 'avia_recaptcha_v3':
- $verify_field = 'recaptcha_verified_keys_v3';
- break;
- default:
- $verify_field = '';
- break;
- }
- $check = $this->verify_token( $token, $secretkey );
- if( true === $check['success'] )
- {
- $valid_key = true;
- $response_class = '';
- $response_text = __( 'We were able to properly connect and verify your API keys with Google reCAPTCHA', 'avia_framework' );
- //will be stripped from the final output but tells the ajax script to save the page after the check was performed
- $response_text .= ' avia_trigger_save';
- $keys = array(
- $check_keys['version'],
- $check_keys['sitekey'],
- $check_keys['secretkey']
- );
- if( ! empty( $verify_field ) )
- {
- $return['update_input_fields'][ $verify_field ] = implode( ' ', $keys );
- }
- }
- else
- {
- $content_default = '';
- if( $check instanceof WP_Error )
- {
- $response_text = $check->get_error_message();
- }
- else
- {
- $msg = '';
- if( is_array( $check['error-codes'] ) && count( $check['error-codes'] ) > 0 )
- {
- $msg = implode( '<br />', $check['error-codes'] );
- }
- $response_text = __( 'Error on connecting to Google reCAPTCHA - please retry.', 'avia_framework' );
- if( ! empty( $msg) )
- {
- $response_text .= '<br /><br />' . $msg;
- }
- }
- if( ! empty( $verify_field ) )
- {
- $return['update_input_fields'][ $verify_field ] = 'verify_error';
- }
- }
- }
- else
- {
- /**
- * called on a normal page load. in this case we either show the stored result or if we got no stored result we show nothing
- */
- if( $this->is_activated() )
- {
- switch( $element['id'] )
- {
- case 'avia_recaptcha_key_verify_v2':
- $version = 'avia_recaptcha_v2';
- break;
- case 'avia_recaptcha_key_verify_v3':
- $version = 'avia_recaptcha_v3';
- break;
- default:
- $version = '';
- break;
- }
- $keys = array(
- $version,
- $this->get_site_key( $version ),
- $this->get_secret_key( $version )
- );
- $check = implode( ' ', $keys );
- if( $this->get_verified_keys( $version ) == $check )
- {
- $valid_key = true;
- }
- else if( '' == $this->get_site_key( $version ) && '' == $this->get_secret_key( $version ) )
- {
- $response_class = '';
- $response_text = '';
- }
- else if( 'verify_error' == $this->get_verified_keys() )
- {
- $response_text = __( 'A connection error occurred last time we tried verify your keys with Google reCAPTCHA - please revalidate the keys.', 'avia_framework' );
- }
- else if( '' == $this->get_verified_keys( $version ) )
- {
- $response_text = __( 'Please verify the keys', 'avia_framework' );
- }
- else
- {
- $response_text = __( 'Please verify the keys - the last verified keys are different.', 'avia_framework' );
- }
- $content_default = '';
- }
- if( $valid_key )
- {
- $response_class = '';
- $response_text = __( 'Last time we checked we were able to connected to Google reCAPTCHA with your API keys', 'avia_framework' );
- }
- }
- if( $valid_key )
- {
- $content_default = __( 'If you ever change your API key or the URL restrictions of the key please verify the key here again, to test if it works properly','avia_framework');
- }
- $output = '';
- if( ! empty( $response_text ) )
- {
- $output = "<div class='av-verification-response-wrapper'>";
- $output .= "<div class='av-text-notice {$response_class}'>";
- $output .= $response_text;
- $output .= "</div>";
- $output .= "<div class='av-verification-cell'>{$content_default}</div>";
- $output .= "</div>";
- }
- if( $ajax )
- {
- $return['html'] = $output;
- }
- else
- {
- $return = $output;
- }
- return $return;
- }
- }
- /**
- * Returns the main instance of av_google_recaptcha to prevent the need to use globals.
- *
- * @since 4.5.7.2
- * @return av_google_recaptcha
- */
- function Avia_Google_reCAPTCHA()
- {
- return av_google_recaptcha::instance();
- }
- }
- Avia_Google_reCAPTCHA();
- if( ! function_exists( 'av_recaptcha_api_check' ) )
- {
- /**
- * Callback function:
- * - ajax callback from verification button
- * - php callback when creating output on option page
- *
- * @since 4.5.7.2
- * @param string $value
- * @param boolean $ajax
- * @param array|null $js_value
- * @param array $element
- * @return string
- */
- function av_recaptcha_api_check( $value, $ajax = true, $js_value = null, $element = array() )
- {
- $api = Avia_Google_reCAPTCHA();
- return $api->backend_html( $value, $ajax, $js_value, $element );
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement