<?php if ( ! class_exists( 'anr_captcha_class' ) ) { class anr_captcha_class { private static $instance; private static $captcha_count = 0; public static function init() { if ( ! self::$instance instanceof self ) { self::$instance = new self(); } return self::$instance; } function actions_filters() { if ( anr_is_form_enabled( 'fep_contact_form' ) ) { add_action( 'fepcf_message_form_after_content', array( $this, 'form_field' ), 99 ); add_action( 'fepcf_action_message_before_send', array( $this, 'fepcf_verify' ) ); } if ( anr_is_form_enabled( 'login' ) && ! defined( 'XMLRPC_REQUEST' ) ) { add_action( 'login_form', array( $this, 'login_form_field' ), 99 ); add_filter( 'login_form_middle', array( $this, 'login_form_return' ), 99 ); add_action( 'um_after_login_fields', array( $this, 'login_form_field' ), 99 ); add_action( 'woocommerce_login_form', array( $this, 'login_form_field' ), 99 ); add_filter( 'authenticate', array( $this, 'login_verify' ), 999, 3 ); add_action( 'wp_login', array( $this, 'clear_data' ), 10, 2 ); } if ( anr_is_form_enabled( 'wc_checkout' ) ) { add_action( 'woocommerce_after_checkout_validation', array( $this, 'wc_checkout_verify' ), 10, 2 ); add_action( 'woocommerce_checkout_after_order_review', array( $this, 'wc_form_field' ) ); } if ( anr_is_form_enabled( 'registration' ) ) { add_action( 'register_form', array( $this, 'form_field' ), 99 ); add_action( 'woocommerce_register_form', array( $this, 'form_field' ), 99 ); add_filter( 'registration_errors', array( $this, 'registration_verify' ), 10, 3 ); add_filter( 'woocommerce_registration_errors', array( $this, 'wc_registration_verify' ), 10, 3 ); // add_action ('woocommerce_checkout_after_order_review', array($this, 'wc_form_field') ); } if ( anr_is_form_enabled( 'bp_register' ) ) { add_action( 'bp_before_registration_submit_buttons', array( $this, 'bp_form_field' ), 99 ); add_action( 'bp_signup_validate', array( $this, 'bp_registration_verify' ) ); } if ( anr_is_form_enabled( 'ms_user_signup' ) && is_multisite() ) { add_action( 'signup_extra_fields', array( $this, 'ms_form_field' ), 99 ); add_filter( 'wpmu_validate_user_signup', array( $this, 'ms_form_field_verify' ) ); add_action( 'signup_blogform', array( $this, 'ms_form_field' ), 99 ); add_filter( 'wpmu_validate_blog_signup', array( $this, 'ms_blog_verify' ) ); } if ( anr_is_form_enabled( 'lost_password' ) ) { add_action( 'lostpassword_form', array( $this, 'form_field' ), 99 ); add_action( 'woocommerce_lostpassword_form', array( $this, 'form_field' ), 99 ); // add_action ('allow_password_reset', array($this, 'lostpassword_verify'), 10, 2); //lostpassword_post does not return wp_error( prior WP 4.4 ) add_action( 'lostpassword_post', array( $this, 'lostpassword_verify_44' ) ); } if ( anr_is_form_enabled( 'reset_password' ) ) { add_action( 'resetpass_form', array( $this, 'form_field' ), 99 ); add_action( 'woocommerce_resetpassword_form', array( $this, 'form_field' ), 99 ); add_filter( 'validate_password_reset', array( $this, 'reset_password_verify' ), 10, 2 ); } if ( anr_is_form_enabled( 'comment' ) && ( ! is_admin() || ! current_user_can( 'moderate_comments' ) ) ) { if ( ! is_user_logged_in() ) { add_action( 'comment_form_after_fields', array( $this, 'form_field' ), 99 ); } else { add_filter( 'comment_form_field_comment', array( $this, 'form_field_return' ), 99 ); } if ( version_compare( get_bloginfo( 'version' ), '4.9.0', '>=' ) ) { add_filter( 'pre_comment_approved', array( $this, 'comment_verify_490' ), 99 ); } else { add_filter( 'preprocess_comment', array( $this, 'comment_verify' ) ); } } if ( function_exists( 'wpcf7_add_form_tag' ) ) { if( class_exists( 'WPCF7' ) && WPCF7::get_option( 'recaptcha' ) && apply_filters( 'anr_remove_cf7_recaptcha', false ) ) { //remove recaptcha keys from CF7 which will disable CF7 recaptcha WPCF7::update_option( 'recaptcha', null ); } if( is_user_logged_in() && anr_get_option( 'loggedin_hide' ) ) { //enable verify nonce otherwie is_user_logged_in() return false when validate recaptcha add_filter( 'wpcf7_verify_nonce', '__return_true' ); } wpcf7_add_form_tag( 'anr_nocaptcha', array( $this, 'wpcf7_form_field' ), array( 'name-attr' => true ) ); add_filter( 'wpcf7_validate_anr_nocaptcha', array( $this, 'wpcf7_verify' ), 10, 2 ); } elseif ( function_exists( 'wpcf7_add_shortcode' ) ) { wpcf7_add_shortcode( 'anr_nocaptcha', array( $this, 'wpcf7_form_field' ), true ); add_filter( 'wpcf7_validate_anr_nocaptcha', array( $this, 'wpcf7_verify' ), 10, 2 ); } if ( anr_is_form_enabled( 'bbp_new' ) ) { add_action( 'bbp_theme_before_topic_form_submit_wrapper', array( $this, 'form_field' ), 99 ); add_action( 'bbp_new_topic_pre_extras', array( $this, 'bbp_new_verify' ) ); } if ( anr_is_form_enabled( 'bbp_reply' ) ) { add_action( 'bbp_theme_before_reply_form_submit_wrapper', array( $this, 'form_field' ), 99 ); add_action( 'bbp_new_reply_pre_extras', array( $this, 'bbp_reply_verify' ), 10, 2 ); } } function add_error_to_mgs( $mgs = false ) { if ( false === $mgs ) { $mgs = anr_get_option( 'error_message', '' ); } if ( ! $mgs ) { $mgs = __( 'Please solve Captcha correctly', 'advanced-nocaptcha-recaptcha' ); } $message = '<strong>' . __( 'ERROR', 'advanced-nocaptcha-recaptcha' ) . '</strong>: ' . $mgs; return apply_filters( 'anr_error_message', $message, $mgs ); } function total_captcha() { return self::$captcha_count; } function captcha_form_field() { self::$captcha_count++; $no_js = anr_get_option( 'no_js' ); $site_key = trim( anr_get_option( 'site_key' ) ); $number = $this->total_captcha(); $version = anr_get_option( 'captcha_version', 'v2_checkbox' ); $field = '<div class="anr_captcha_field"><div id="anr_captcha_field_' . $number . '" class="anr_captcha_field_div">'; if ( 'v3' === $version ) { $field .= '<input type="hidden" name="g-recaptcha-response" value="" />'; } $field .= '</div></div>'; if ( 1 == $no_js && 'v2_checkbox' === $version ) { $field .= sprintf( '<noscript> <div> <div style="width: 302px; height: 422px; position: relative;"> <div style="width: 302px; height: 422px; position: absolute;"> <iframe src="https://www.%s/recaptcha/api/fallback?k=' . $site_key . '" frameborder="0" scrolling="no" style="width: 302px; height:422px; border-style: none;"> </iframe> </div> </div> <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;"> <textarea id="g-recaptcha-response-' . $number . '" name="g-recaptcha-response" class="g-recaptcha-response" style="width: 250px; height: 40px; border: 1px solid #c1c1c1; margin: 10px 25px; padding: 0px; resize: none;" ></textarea> </div> </div> </noscript>', anr_recaptcha_domain() ); } return $field; } function footer_script() { static $included = false; $number = $this->total_captcha(); $version = anr_get_option( 'captcha_version', 'v2_checkbox' ); if ( ! $number && ( 'v3' !== $version || 'all_pages' !== anr_get_option( 'v3_script_load', 'all_pages' ) ) ) { return; } if ( $included ) { return; } $included = true; if ( 'v2_checkbox' === $version ) { $this->v2_checkbox_script(); } elseif ( 'v2_invisible' === $version ) { $this->v2_invisible_script(); } elseif ( 'v3' === $version ) { $this->v3_script(); } } function v2_checkbox_script() { ?> <script type="text/javascript"> var anr_onloadCallback = function() { for ( var i = 0; i < document.forms.length; i++ ) { var form = document.forms[i]; var captcha_div = form.querySelector( '.anr_captcha_field_div' ); if ( null === captcha_div ) continue; captcha_div.innerHTML = ''; ( function( form ) { var anr_captcha = grecaptcha.render( captcha_div,{ 'sitekey' : '<?php echo esc_js( trim( anr_get_option( 'site_key' ) ) ); ?>', 'size' : '<?php echo esc_js( anr_get_option( 'size', 'normal' ) ); ?>', 'theme' : '<?php echo esc_js( anr_get_option( 'theme', 'light' ) ); ?>' }); if ( typeof jQuery !== 'undefined' ) { jQuery( document.body ).on( 'checkout_error', function(){ grecaptcha.reset(anr_captcha); }); } if ( typeof wpcf7 !== 'undefined' ) { document.addEventListener( 'wpcf7submit', function() { grecaptcha.reset(anr_captcha); }, false ); } })(form); } }; </script> <?php $language = trim( anr_get_option( 'language' ) ); $lang = ''; if ( $language ) { $lang = '&hl=' . $language; } $google_url = apply_filters( 'anr_v2_checkbox_script_api_src', sprintf( 'https://www.%s/recaptcha/api.js?onload=anr_onloadCallback&render=explicit' . $lang, anr_recaptcha_domain() ), $lang ); ?> <script src="<?php echo esc_url( $google_url ); ?>" async defer> </script> <?php } function v2_invisible_script() { ?> <script type="text/javascript"> var anr_onloadCallback = function() { for ( var i = 0; i < document.forms.length; i++ ) { var form = document.forms[i]; var captcha_div = form.querySelector( '.anr_captcha_field_div' ); if ( null === captcha_div ) continue; captcha_div.innerHTML = ''; ( function( form ) { var anr_captcha = grecaptcha.render( captcha_div,{ 'sitekey' : '<?php echo esc_js( trim( anr_get_option( 'site_key' ) ) ); ?>', 'size' : 'invisible', 'theme' : '<?php echo esc_js( anr_get_option( 'theme', 'light' ) ); ?>', 'badge' : '<?php echo esc_js( anr_get_option( 'badge', 'bottomright' ) ); ?>', 'callback' : function ( token ) { if( typeof jQuery !== 'undefined' ){ jQuery(form).submit(); grecaptcha.reset( anr_captcha ); } else { HTMLFormElement.prototype.submit.call( form ); } }, 'expired-callback' : function(){ grecaptcha.reset( anr_captcha ); } }); var cf7_submit = form.querySelector( '.wpcf7-submit' ); if( null !== cf7_submit && ( typeof jQuery !== 'undefined' ) ){ jQuery( cf7_submit ).off('click').on('click', function( e ){ e.preventDefault(); jQuery( '.ajax-loader', form ).addClass( 'is-active' ); grecaptcha.execute( anr_captcha ); }); } else { form.onsubmit = function( e ){ e.preventDefault(); grecaptcha.execute( anr_captcha ); }; } })(form); } }; </script> <?php $language = trim( anr_get_option( 'language' ) ); $lang = ''; if ( $language ) { $lang = '&hl=' . $language; } $google_url = apply_filters( 'anr_v2_invisible_script_api_src', sprintf( 'https://www.%s/recaptcha/api.js?onload=anr_onloadCallback&render=explicit' . $lang, anr_recaptcha_domain() ), $lang ); ?> <script src="<?php echo esc_url( $google_url ); ?>" async defer> </script> <?php } function v3_script() { // v3 support v2 script. So use it // $this->v2_invisible_script(); $language = trim( anr_get_option( 'language' ) ); $site_key = trim( anr_get_option( 'site_key' ) ); $lang = ''; if ( $language ) { $lang = '&hl=' . $language; } $google_url = apply_filters( 'anr_v3_script_api_src', sprintf( 'https://www.%s/recaptcha/api.js?render=' . $site_key . $lang, anr_recaptcha_domain() ), $site_key, $lang ); ?> <script src="<?php echo esc_url( $google_url ); ?>"></script> <script type="text/javascript"> ( function( grecaptcha ) { var anr_onloadCallback = function() { grecaptcha.execute( '<?php echo esc_js( $site_key ); ?>', { action: 'advanced_nocaptcha_recaptcha' } ).then( function( token ) { for ( var i = 0; i < document.forms.length; i++ ) { var form = document.forms[i]; var captcha = form.querySelector( 'input[name="g-recaptcha-response"]' ); if ( null === captcha ) continue; captcha.value = token; } }); }; grecaptcha.ready( anr_onloadCallback ); document.addEventListener( 'wpcf7submit', anr_onloadCallback, false ); if ( typeof jQuery !== 'undefined' ) { //Woocommerce jQuery( document.body ).on( 'checkout_error', anr_onloadCallback ); } //token is valid for 2 minutes, So get new token every after 1 minutes 50 seconds setInterval(anr_onloadCallback, 110000); } )( grecaptcha ); </script> <?php } function form_field() { echo $this->form_field_return(); } function form_field_return( $return = '' ) { if ( is_user_logged_in() && anr_get_option( 'loggedin_hide' ) ) { return $return; } $ip = $_SERVER['REMOTE_ADDR']; if ( in_array( $ip, array_filter( explode( '\n', anr_get_option( 'whitelisted_ips' ) ) ) ) ) { return $return; } return $return . $this->captcha_form_field(); } function post_id() { global $wpdb; static $post_id; if ( ! absint( anr_get_option( 'failed_login_allow' ) ) ) { return 0; } if ( is_numeric( $post_id ) ) { return $post_id; } $post_id = $wpdb->get_var( "SELECT ID FROM $wpdb->posts WHERE post_type = 'anr-post' LIMIT 1" ); if ( ! $post_id ) { $wpdb->insert( $wpdb->posts, array( 'post_type' => 'anr-post' ) ); $post_id = $wpdb->insert_id; } $post_id = absint( $post_id ); return $post_id; } function show_login_captcha() { global $wpdb; $show_captcha = true; $ip = $_SERVER['REMOTE_ADDR']; if ( in_array( $ip, array_filter( explode( '\n', anr_get_option( 'whitelisted_ips' ) ) ) ) ) { return false; } // filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ); $count = absint( anr_get_option( 'failed_login_allow' ) ); $post_id = $this->post_id(); if ( $count && $post_id && filter_var( $ip, FILTER_VALIDATE_IP ) ) { $user_logins = $wpdb->get_col( $wpdb->prepare( "SELECT meta_value FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s", $post_id, md5( $ip ) ) ); if ( count( $user_logins ) < $count && count( array_unique( $user_logins ) ) <= 1 ) { $show_captcha = false; } } return $show_captcha; } function login_form_field() { if ( $this->show_login_captcha() ) { $this->form_field(); } } function login_form_return( $field = '' ) { if ( $this->show_login_captcha() ) { $field = $this->form_field_return( $field ); } return $field; } function wc_form_field() { if ( ! is_user_logged_in() && 'yes' == get_option( 'woocommerce_enable_signup_and_login_from_checkout', 'yes' ) && anr_is_form_enabled( 'registration' ) ) { $this->form_field(); } elseif ( anr_is_form_enabled( 'wc_checkout' ) ) { $this->form_field(); } } function ms_form_field( $errors ) { if ( $errmsg = $errors->get_error_message( 'anr_error' ) ) { echo '<p class="error">' . $errmsg . '</p>'; } $this->form_field(); } function verify( $response = false ) { static $last_verify = null; if ( is_user_logged_in() && anr_get_option( 'loggedin_hide' ) ) { return true; } $secre_key = trim( anr_get_option( 'secret_key' ) ); $remoteip = $_SERVER['REMOTE_ADDR']; $verify = false; if ( in_array( $remoteip, array_filter( explode( '\n', anr_get_option( 'whitelisted_ips' ) ) ) ) ) { return true; } if ( false === $response ) { $response = isset( $_POST['g-recaptcha-response'] ) ? $_POST['g-recaptcha-response'] : ''; } $pre_check = apply_filters( 'anr_verify_captcha_pre', null, $response ); if ( null !== $pre_check ) { return $pre_check; } if ( ! $secre_key ) { // if $secre_key is not set return true; } if ( ! $response || ! $remoteip ) { return $verify; } if ( null !== $last_verify ) { return $last_verify; } $url = apply_filters( 'anr_google_verify_url', sprintf( 'https://www.%s/recaptcha/api/siteverify', anr_recaptcha_domain() ) ); // make a POST request to the Google reCAPTCHA Server $request = wp_remote_post( $url, array( 'timeout' => 10, 'body' => array( 'secret' => $secre_key, 'response' => $response, 'remoteip' => $remoteip, ), ) ); // get the request response body $request_body = wp_remote_retrieve_body( $request ); if ( ! $request_body ) { return $verify; } $result = json_decode( $request_body, true ); if ( isset( $result['success'] ) && true == $result['success'] ) { if ( 'v3' === anr_get_option( 'captcha_version' ) ) { $score = isset( $result['score'] ) ? $result['score'] : 0; $action = isset( $result['action'] ) ? $result['action'] : ''; $verify = anr_get_option( 'score', '0.5' ) <= $score && 'advanced_nocaptcha_recaptcha' == $action; } else { $verify = true; } } $verify = apply_filters( 'anr_verify_captcha', $verify, $result, $response ); $last_verify = $verify; return $verify; } function fepcf_verify( $errors ) { if ( ! $this->verify() ) { $errors->add( 'anr_error', anr_get_option( 'error_message' ) ); } } function login_verify( $user, $username = '', $password = '' ) { global $wpdb; if ( ! $username ) { return $user; } $show_captcha = $this->show_login_captcha(); if ( ! ( $user instanceof WP_User ) ) { if ( ! $show_captcha && ( $post_id = $this->post_id() ) ) { if ( is_email( $username ) ) { $user_data = get_user_by( 'email', $username ); if ( $user_data ) { $username = $user_data->user_login; } } $wpdb->insert( $wpdb->postmeta, array( 'post_id' => $post_id, 'meta_key' => md5( $_SERVER['REMOTE_ADDR'] ), 'meta_value' => $username, ), array( '%d', '%s', '%s' ) ); } // return $user; } if ( $show_captcha && ! $this->verify() ) { return new WP_Error( 'anr_error', $this->add_error_to_mgs() ); } return $user; } function clear_data( $user_login, $user ) { global $wpdb; if ( $post_id = $this->post_id() ) { $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE post_id = %d AND ( meta_key = %s OR meta_value = %s )", $post_id, md5( $_SERVER['REMOTE_ADDR'] ), $user_login ) ); } } function registration_verify( $errors, $sanitized_user_login, $user_email ) { if ( ! $this->verify() ) { $errors->add( 'anr_error', $this->add_error_to_mgs() ); } return $errors; } function wc_registration_verify( $errors, $sanitized_user_login, $user_email ) { if ( defined( 'WOOCOMMERCE_CHECKOUT' ) && ! anr_is_form_enabled( 'wc_checkout' ) ) { return $errors; } if ( ! $this->verify() ) { $errors->add( 'anr_error', anr_get_option( 'error_message' ) ); } return $errors; } function bp_form_field() { do_action( 'bp_anr_error_errors' ); $this->form_field(); } function bp_registration_verify() { if ( ! $this->verify() ) { buddypress()->signup->errors['anr_error'] = anr_get_option( 'error_message' ); } } function ms_form_field_verify( $result ) { if ( isset( $_POST['stage'] ) && 'validate-user-signup' === $_POST['stage'] && ! $this->verify() ) { $result['errors']->add( 'anr_error', anr_get_option( 'error_message' ) ); } return $result; } function ms_blog_verify( $result ) { if ( ! $this->verify() ) { $result['errors']->add( 'anr_error', anr_get_option( 'error_message' ) ); } return $result; } function lostpassword_verify( $result, $user_id ) { if ( ! $this->verify() ) { return new WP_Error( 'anr_error', $this->add_error_to_mgs() ); } return $result; } function lostpassword_verify_44( $errors ) { if ( ! $this->verify() ) { $errors->add( 'anr_error', $this->add_error_to_mgs() ); } } function reset_password_verify( $errors, $user ) { if ( ! $this->verify() ) { $errors->add( 'anr_error', $this->add_error_to_mgs() ); } } function comment_verify( $commentdata ) { if ( ! $this->verify() ) { wp_die( '<p>' . $this->add_error_to_mgs() . '</p>', __( 'Comment Submission Failure' ), array( 'response' => 403, 'back_link' => true, ) ); } return $commentdata; } function comment_verify_490( $approved ) { if ( ! $this->verify() ) { return new WP_Error( 'anr_error', $this->add_error_to_mgs(), 403 ); } return $approved; } function wpcf7_form_field( $tag ) { return $this->form_field_return() . sprintf( '<span class="wpcf7-form-control-wrap %s"></span>', $tag->name ); } function wpcf7_verify( $result, $tag ) { if ( ! $this->verify() ) { $result->invalidate( $tag, anr_get_option( 'error_message' ) ); } return $result; } function bbp_new_verify( $forum_id ) { if ( ! $this->verify() ) { bbp_add_error( 'anr_error', $this->add_error_to_mgs() ); } } function bbp_reply_verify( $topic_id, $forum_id ) { if ( ! $this->verify() ) { bbp_add_error( 'anr_error', $this->add_error_to_mgs() ); } } function wc_checkout_verify( $data, $errors ) { $is_reg_enable = apply_filters( 'woocommerce_checkout_registration_enabled', 'yes' === get_option( 'woocommerce_enable_signup_and_login_from_checkout' ) ); $is_reg_required = apply_filters( 'woocommerce_checkout_registration_required', 'yes' !== get_option( 'woocommerce_enable_guest_checkout' ) ); if ( ! is_user_logged_in() && $is_reg_enable && anr_is_form_enabled( 'registration' ) && ( $is_reg_required || ! empty( $data['createaccount'] ) ) ) { // verification done during ragistration, So no need any more verification } elseif ( ! $this->verify() ) { $errors->add( 'anr_error', anr_get_option( 'error_message' ) ); } } } //END CLASS } //ENDIF add_action( 'init', array( anr_captcha_class::init(), 'actions_filters' ), -9 );