Plugin Blocks Requests via Official API
-
Using official WC API and this plugin blocks registration via API. Please help! ??
Viewing 1 replies (of 1 total)
-
I got it working by using a variation of the below check based on this code
rest_prefix = trailingslashit( rest_get_url_prefix() ); if(!(strpos( $_SERVER['REQUEST_URI'], $rest_prefix )) ) {... }
Here is my final recaptcha-woo.php, which probably needs some additional optimization and testing..
<?php /** * Plugin Name: reCAPTCHA for WooCommerce * Description: Add Google reCAPTCHA to your WooCommerce Checkout, Login, and Registration Forms. * Version: 1.3.2 * Author: Elliot Sowersby, RelyWP * Author URI: https://www.relywp.com * License: GPLv3 or later * Text Domain: recaptcha-woo * * WC requires at least: 3.4 * WC tested up to: 7.8.0 **/ include( plugin_dir_path( __FILE__ ) . 'admin-options.php'); /** * On activate redirect to settings page */ register_activation_hook(__FILE__, function () { add_option('rcfwc_do_activation_redirect', true); add_option('rcfwc_tested', 'no'); }); add_action('admin_init', function () { if (get_option('rcfwc_do_activation_redirect', false)) { delete_option('rcfwc_do_activation_redirect'); exit( wp_redirect("options-general.php?page=recaptcha-woo%2Fadmin-options.php") ); } }); /** * Compatible with HPOS */ add_action( 'before_woocommerce_init', function() { if ( class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) { \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true ); } } ); // Plugin List - Settings Link add_filter( 'plugin_action_links', 'rcfwc_settings_link_plugin', 10, 5 ); function rcfwc_settings_link_plugin( $actions, $plugin_file ) { static $plugin; if (!isset($plugin)) $plugin = plugin_basename(__FILE__); if ($plugin == $plugin_file) { $settings = array('settings' => '<a href="options-general.php?page=recaptcha-woo%2Fadmin-options.php">' . __('Settings', 'General') . '</a>'); $actions = array_merge($settings, $actions); } return $actions; } // Enqueue recaptcha script only on account or checkout page add_action("wp_enqueue_scripts", "rcfwc_script_enqueue"); function rcfwc_script_enqueue() { wp_enqueue_script( 'rcfwc-js', plugins_url( '/js/rcfwc.js', __FILE__ ), array('jquery'), '1.0', false); wp_register_script("recaptcha", "https://www.google.com/recaptcha/api.js?explicit&hl=" . get_locale()); wp_enqueue_script("recaptcha"); } add_action("wp_enqueue_scripts", "rcfwc_script"); function rcfwc_script() { if( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) { if ( is_checkout() || is_account_page() ) { rcfwc_script_enqueue(); } } } // Enqueue recaptcha script on login add_action("login_enqueue_scripts", "rcfwc_script_login"); function rcfwc_script_login() { rcfwc_script_enqueue(); } // Field function rcfwc_field() { $key = esc_attr( get_option('rcfwc_key') ); $secret = esc_attr( get_option('rcfwc_secret') ); $theme = esc_attr( get_option('rcfwc_theme') ); if($key && $secret) { ?> <div class="g-recaptcha" <?php if($theme == "dark") { ?>data-theme="dark" <?php } ?>data-sitekey="<?php echo $key; ?>"></div> <br/> <?php } } // Field WP Admin function rcfwc_field_admin() { $key = esc_attr( get_option('rcfwc_key') ); $secret = esc_attr( get_option('rcfwc_secret') ); $theme = esc_attr( get_option('rcfwc_theme') ); if($key && $secret) { ?> <div style="margin-left: -15px;" class="g-recaptcha" <?php if($theme == "dark") { ?>data-theme="dark" <?php } ?>data-sitekey="<?php echo $key; ?>"></div> <br/> <?php } } // Field Checkout function rcfwc_field_checkout($checkout) { $key = esc_attr( get_option('rcfwc_key') ); $secret = esc_attr( get_option('rcfwc_secret') ); $theme = esc_attr( get_option('rcfwc_theme') ); $guest = esc_attr( get_option('rcfwc_guest_only') ); if(get_option('rcfwc_woo_checkout_pos') == "afterpay") { echo "<br/>"; } if( !$guest || ( $guest && !is_user_logged_in() ) ) { if($key && $secret) { ?> <div class="g-recaptcha" <?php if($theme == "dark") { ?>data-theme="dark" <?php } ?>data-sitekey="<?php echo $key; ?>"></div> <br/> <?php } } } // Check the reCAPTCHA on submit. function rcfwc_recaptcha_check() { $postdata = ""; if(isset($_POST['g-recaptcha-response'])) { $postdata = sanitize_text_field( $_POST['g-recaptcha-response'] ); } $key = esc_attr( get_option('rcfwc_key') ); $secret = esc_attr( get_option('rcfwc_secret') ); $guest = esc_attr( get_option('rcfwc_guest_only') ); if($key && $secret) { $verify = wp_remote_get( 'https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$postdata ); $verify = wp_remote_retrieve_body( $verify ); $response = json_decode($verify); $results['success'] = $response->success; foreach($response as $key => $val){ if($key == 'error-codes') foreach($val as $key => $error_val){ $results['error_code'] = $error_val; } } return $results; } else { return false; } } if(!empty(get_option('rcfwc_key')) && !empty(get_option('rcfwc_secret'))) { // WP Login Check if(get_option('rcfwc_login') && !defined( 'RESTRPC_REQUEST') && !defined( 'XMLRPC_REQUEST') ) { if(get_option('rcfwc_tested') == 'yes') { add_action('login_form','rcfwc_field_admin'); add_action('authenticate', 'rcfwc_wp_login_check', 21, 1); function rcfwc_wp_login_check($user){ // Start session if (!session_id()) { session_start(); } // Only run if $user exists if(!isset($user->ID)) { return $user; } // Check skip if(defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST) { return $user; } // Skip XMLRPC if(defined( 'REST_REQUEST' ) && REST_REQUEST) { return $user; } // Skip REST API if(isset($_POST['woocommerce-login-nonce']) && wp_verify_nonce(sanitize_text_field($_POST['woocommerce-login-nonce']), 'woocommerce-login')) { return $user; } // Skip Woo if(is_wp_error($user) && isset($user->errors['empty_username']) && isset($user->errors['empty_password']) ) {return $user; } // Skip Errors $rest_prefix = trailingslashit( rest_get_url_prefix() ); if(defined( 'DOING_CRON' ) || !(strpos( $_SERVER['REQUEST_URI'], $rest_prefix ) )) { return $user; } // Check if already validated if(isset($_SESSION['rcfwc_login_checked']) && wp_verify_nonce( sanitize_text_field($_SESSION['rcfwc_login_checked']), 'rcfwc_login_check' )) { return $user; } if(stripos($_SERVER["REQUEST_URI"], strrchr(wp_login_url(), '/')) !== false) { // Check if WP login page $check = rcfwc_recaptcha_check(); $success = $check['success']; if($success != true) { $user = new WP_Error( 'authentication_failed', __( 'Please complete the reCAPTCHA to verify that you are not a robot.', 'recaptcha-woo' ) ); } else { $nonce = wp_create_nonce( 'rcfwc_login_check' ); $_SESSION['rcfwc_login_checked'] = $nonce; } } return $user; } } } // Clear session on login add_action('wp_login', 'rcfwc_wp_login_clear', 10, 2); function rcfwc_wp_login_clear($user_login, $user) { if(isset($_SESSION['rcfwc_login_checked'])) { unset($_SESSION['rcfwc_login_checked']); } } // WP Register Check $rest_prefix = trailingslashit( rest_get_url_prefix() ); if(get_option('rcfwc_register') && !defined( 'RESTRPC_REQUEST') && !defined( 'XMLRPC_REQUEST') && !is_admin() && !defined( 'DOING_CRON' ) && !(strpos( $_SERVER['REQUEST_URI'], $rest_prefix ) )) { add_action('register_form','rcfwc_field_admin'); add_action('registration_errors', 'rcfwc_wp_register_check', 10, 3); function rcfwc_wp_register_check($errors, $sanitized_user_login, $user_email) { if(defined( 'XMLRPC_REQUEST')) { return $errors; } // Skip XMLRPC $rest_prefix = trailingslashit( rest_get_url_prefix() ); if(defined( 'DOING_CRON' ) || !(strpos( $_SERVER['REQUEST_URI'], $rest_prefix ) )) { return $errors; } $check = rcfwc_recaptcha_check(); $success = $check['success']; if($success != true) { $errors->add( 'rcfwc_error', sprintf('<strong>%s</strong>: %s',__( 'ERROR', 'recaptcha-woo' ), __( 'Please complete the reCAPTCHA to verify that you are not a robot.', 'recaptcha-woo' ) ) ); } return $errors; } } // WP Reset Check $rest_prefix = trailingslashit( rest_get_url_prefix() ); if(get_option('rcfwc_register') && !defined( 'RESTRPC_REQUEST') && !defined( 'XMLRPC_REQUEST') && !is_admin() && !defined( 'DOING_CRON' ) && !(strpos( $_SERVER['REQUEST_URI'], $rest_prefix ) )) { if(!is_admin()) { add_action('lostpassword_form','rcfwc_field_admin'); add_action('lostpassword_post','rcfwc_wp_reset_check', 10, 1); function rcfwc_wp_reset_check($validation_errors) { if(stripos($_SERVER["REQUEST_URI"], strrchr(wp_login_url(), '/')) !== false) { // Check if WP login page $check = rcfwc_recaptcha_check(); $success = $check['success']; if($success != true) { $validation_errors->add( 'rcfwc_error', __( 'Please complete the reCAPTCHA to verify that you are not a robot.', 'recaptcha-woo' ) ); } } } } } if( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) { // Woo Checkout if( get_option('rcfwc_key') && get_option('rcfwc_woo_checkout') ) { if(empty(get_option('rcfwc_woo_checkout_pos')) || get_option('rcfwc_woo_checkout_pos') == "beforepay") { add_action('woocommerce_review_order_before_payment', 'rcfwc_field_checkout', 10); } elseif(get_option('rcfwc_woo_checkout_pos') == "afterpay") { add_action('woocommerce_review_order_after_payment', 'rcfwc_field_checkout', 10); } elseif(get_option('rcfwc_woo_checkout_pos') == "beforebilling") { add_action('woocommerce_before_checkout_billing_form', 'rcfwc_field_checkout', 10); } elseif(get_option('rcfwc_woo_checkout_pos') == "afterbilling") { add_action('woocommerce_after_checkout_billing_form', 'rcfwc_field_checkout', 10); } elseif(get_option('rcfwc_woo_checkout_pos') == "beforesubmit") { add_action('woocommerce_review_order_before_submit', 'rcfwc_field_checkout', 10); } add_action('woocommerce_checkout_process', 'rcfwc_checkout_check'); function rcfwc_checkout_check() { // Skip if reCAPTCHA disabled for payment method $skip = 0; if ( isset( $_POST['payment_method'] ) ) { $chosen_payment_method = sanitize_text_field( $_POST['payment_method'] ); // Retrieve the selected payment methods from the rcfwc_selected_payment_methods option $selected_payment_methods = get_option('rcfwc_selected_payment_methods', array()); if(is_array($selected_payment_methods)) { // Check if the chosen payment method is in the selected payment methods array if ( in_array( $chosen_payment_method, $selected_payment_methods, true ) ) { $skip = 1; } } } // Check if guest only enabled $guest = esc_attr( get_option('rcfwc_guest_only') ); // Check if( !$skip && (!$guest || ( $guest && !is_user_logged_in() )) ) { $check = rcfwc_recaptcha_check(); $success = $check['success']; if($success != true) { wc_add_notice( __( 'Please complete the reCAPTCHA to verify that you are not a robot.', 'recaptcha-woo' ), 'error'); } } } } // Woo Login if(get_option('rcfwc_woo_login')) { add_action('woocommerce_login_form','rcfwc_field'); add_action('authenticate', 'rcfwc_woo_login_check', 21, 1); function rcfwc_woo_login_check($user){ if(defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST) { return $user; } // Skip XMLRPC if(defined( 'REST_REQUEST' ) && REST_REQUEST) { return $user; } // Skip REST API $rest_prefix = trailingslashit( rest_get_url_prefix() ); if(defined( 'DOING_CRON' ) || !(strpos( $_SERVER['REQUEST_URI'], $rest_prefix ) )) { return $user; } if(isset($_POST['woocommerce-login-nonce'])) { $check = rcfwc_recaptcha_check(); $success = $check['success']; if($success != true) { $user = new WP_Error( 'authentication_failed', __( 'Please complete the reCAPTCHA to verify that you are not a robot.', 'recaptcha-woo' ) ); } } return $user; } } // Woo Register if(get_option('rcfwc_woo_register')) { add_action('woocommerce_register_form','rcfwc_field'); add_action('woocommerce_register_post', 'rcfwc_woo_register_check', 10, 3); function rcfwc_woo_register_check($username, $email, $validation_errors) { $rest_prefix = trailingslashit( rest_get_url_prefix() ); if(!is_checkout() && !(strpos( $_SERVER['REQUEST_URI'], $rest_prefix )) ) { $check = rcfwc_recaptcha_check(); $success = $check['success']; if($success != true) { $validation_errors->add( 'rcfwc_error', __( 'Please complete the reCAPTCHA to verify that you are not a robot.', 'recaptcha-woo' ) ); } } } } // Woo Reset if(get_option('rcfwc_woo_reset')) { add_action('woocommerce_lostpassword_form','rcfwc_field'); add_action('lostpassword_post','rcfwc_woo_reset_check', 10, 1); function rcfwc_woo_reset_check($validation_errors) { $rest_prefix = trailingslashit( rest_get_url_prefix() ); if(isset($_POST['woocommerce-lost-password-nonce']) && !(strpos( $_SERVER['REQUEST_URI'], $rest_prefix )) ) { $check = rcfwc_recaptcha_check(); $success = $check['success']; if($success != true) { $validation_errors->add( 'rcfwc_error', __( 'Please complete the reCAPTCHA to verify that you are not a robot.', 'recaptcha-woo' ) ); } } } } } }
Viewing 1 replies (of 1 total)
- The topic ‘Plugin Blocks Requests via Official API’ is closed to new replies.