Plugin Directory

Changeset 3095155


Ignore:
Timestamp:
05/30/2024 12:22:23 PM (10 months ago)
Author:
friendlycaptcha
Message:

Update to version 1.14.0 from GitHub

Location:
friendly-captcha
Files:
22 added
4 deleted
32 edited
1 copied

Legend:

Unmodified
Added
Removed
  • friendly-captcha/tags/1.14.0/friendly-captcha.php

    r3080369 r3095155  
    44 * Plugin Name: Friendly Captcha for WordPress
    55 * Description: Protect WordPress website forms from spam and abuse with Friendly Captcha, a privacy-first anti-bot solution.
    6  * Version: 1.13.0
     6 * Version: 1.14.0
    77 * Requires at least: 5.0
    88 * Requires PHP: 7.3
     
    2020}
    2121
    22 define('FRIENDLY_CAPTCHA_VERSION', '1.13.0');
     22define('FRIENDLY_CAPTCHA_VERSION', '1.14.0');
    2323define('FRIENDLY_CAPTCHA_FRIENDLY_CHALLENGE_VERSION', '0.9.12');
     24define('FRIENDLY_CAPTCHA_FRIENDLY_CAPTCHA_SDK_VERSION', '0.1.7');
    2425define('FRIENDLY_CAPTCHA_SUPPORTED_LANGUAGES', [
    2526    "en" => "English",
     
    6667}
    6768
     69require plugin_dir_path(__FILE__) . 'vendor/autoload.php';
    6870require plugin_dir_path(__FILE__) . 'includes/core.php';
  • friendly-captcha/tags/1.14.0/includes/admin.php

    r2889247 r3095155  
    11<?php
    22
    3 require plugin_dir_path( __FILE__ ) . '../admin/options.php';
     3require plugin_dir_path(__FILE__) . '../admin/options.php';
    44
    55if (is_admin()) {
    6     add_action( 'admin_menu', 'frcaptcha_options_page' );
     6    add_action('admin_menu', 'frcaptcha_options_page');
    77
    88    // Add link to settings page in the navbar
    9     function frcaptcha_options_page() {
     9    function frcaptcha_options_page()
     10    {
    1011        add_options_page(
    1112            'Friendly Captcha',
     
    1920
    2021    // Add link to settings in the plugin list
    21     add_filter( 'plugin_action_links_friendly-captcha/friendly-captcha.php', 'frcaptcha_settings_link' );
    22     function frcaptcha_settings_link( $links ) {
    23         $url = esc_url( add_query_arg(
     22    add_filter('plugin_action_links_friendly-captcha/friendly-captcha.php', 'frcaptcha_settings_link');
     23    function frcaptcha_settings_link($links)
     24    {
     25        $url = esc_url(add_query_arg(
    2426            'page',
    2527            'friendly_captcha_admin',
    2628            get_admin_url() . 'options-general.php'
    27         ) );
    28         $settings_link = "<a href='$url'>" . __( 'Settings' ) . '</a>';
    29        
     29        ));
     30        $settings_link = "<a href='$url'>" . __('Settings') . '</a>';
     31
    3032        array_push(
    3133            $links,
     
    3638
    3739    if (!FriendlyCaptcha_Plugin::$instance->is_configured()) {
    38         function frcaptcha_admin_notice__not_configured() {
    39             $url = esc_url( add_query_arg(
     40        function frcaptcha_admin_notice__not_configured()
     41        {
     42            $url = esc_url(add_query_arg(
    4043                'page',
    4144                'friendly_captcha_admin',
    4245                get_admin_url() . 'options-general.php'
    43             ) );
     46            ));
    4447
    45             ?>
     48?>
    4649            <div class="notice notice-error is-dismissible">
    4750                <p>
    48                     <b>Friendly Captcha is not configured yet!</b>
    49                     Visit the <a href="<?php echo $url ?>">Friendly Captcha settings</a> and enter a valid Sitekey and API Key to complete the setup.</p>
     51                    <b>Friendly Captcha is not configured yet!</b>
     52                    Visit the <a href="<?php echo $url ?>">Friendly Captcha settings</a> and enter a valid Sitekey and API Key to complete the setup.
     53                </p>
    5054            </div>
    51             <?php
     55        <?php
    5256        }
    5357
    54         add_action( 'admin_notices', 'frcaptcha_admin_notice__not_configured' );
     58        add_action('admin_notices', 'frcaptcha_admin_notice__not_configured');
     59    }
     60
     61    if (isset($_GET['frcaptcha-verification-failed-dismissed'])) {
     62        FriendlyCaptcha_Plugin::$instance->remove_verification_failed_alert();
     63    }
     64
     65    if (FriendlyCaptcha_Plugin::$instance->get_verification_failed_alert() != false) {
     66        function frcaptcha_admin_notice__verification_failed()
     67        {
     68            $url = esc_url(add_query_arg(
     69                'page',
     70                'friendly_captcha_admin',
     71                get_admin_url() . 'options-general.php'
     72            ));
     73
     74        ?>
     75            <div class="notice notice-error is-dismissible">
     76                <p>
     77                    <b>Friendly Captcha verification has failed!</b>
     78                    <br>
     79                    This is usually because you have entered an incorrect API Key. Please visit the <a href="<?php echo $url ?>">Friendly Captcha settings</a> and enter a valid Sitekey and API Key.
     80                    <br><br>
     81                    <code><?php echo FriendlyCaptcha_Plugin::$instance->get_verification_failed_alert(); ?></code>
     82                </p>
     83                <a href="?frcaptcha-verification-failed-dismissed" class="notice-dismiss" style="text-decoration: none;">
     84                    <span class="screen-reader-text">Dismiss this notice.</span>
     85                </a>
     86            </div>
     87<?php
     88        }
     89
     90        add_action('admin_notices', 'frcaptcha_admin_notice__verification_failed');
    5591    }
    5692}
  • friendly-captcha/tags/1.14.0/includes/core.php

    r3080369 r3095155  
    22
    33/* Main entry point */
    4 
    5 // TODO: is this necessary? It breaks intellisense..
    6 // if ( !class_exists( 'FriendlyCaptcha_Plugin' ) ) {
    7     class FriendlyCaptcha_Plugin {
    8 
    9         /**
    10          * Singleton global instance
    11          */
    12         public static $instance;
    13         public $plugin_name;
    14 
    15         public static $version;
    16         public static $friendly_challenge_version;
    17 
    18         // Global constants
    19         public static $option_group = "frcaptcha_options";
    20         public static $option_sitekey_name = "frcaptcha_sitekey";
    21         public static $option_api_key_name = "frcaptcha_api_key";
    22         public static $option_skip_style_injection_name = "frcaptcha_skip_style_injection";
    23         public static $option_enable_mutation_observer_name = "frcaptcha_enable_mutation_observer";
    24 
    25         // Integrations
    26         public static $option_contact_form_7_integration_active_name = "frcaptcha_contact_form_7_integration_active";
    27         public static $option_f12_cf7_doubleoptin_integration_active_name = "frcaptcha_f12_cf7_doubleoptin_integration_active";
    28         public static $option_wpforms_integration_active_name = "frcaptcha_wpforms_integration_active";
    29         public static $option_gravity_forms_integration_active_name = "frcaptcha_gravity_forms_integration_active";
    30         public static $option_coblocks_integration_active_name = "frcaptcha_coblocks_integration_active";
    31         public static $option_fluentform_integration_active_name = "frcaptcha_fluentform_integration_active";
    32         public static $option_elementor_forms_integration_active_name = "frcaptcha_elementor_integration_active";
    33         public static $option_html_forms_integration_active_name = "frcaptcha_html_forms_integration_active";
    34         public static $option_forminator_integration_active_name = "frcaptcha_forminator_integration_active";
    35         public static $option_formidable_integration_active_name = "frcaptcha_formidable_integration_active";
    36         public static $option_avada_forms_integration_active_name = "frcaptcha_avada_forms_integration_active";
    37 
    38         public static $option_wp_register_integration_active_name = "frcaptcha_wp_register_integration_active";
    39         public static $option_wp_login_integration_active_name = "frcaptcha_wp_login_integration_active";
    40         public static $option_wp_reset_password_integration_active_name = "frcaptcha_wp_reset_password_integration_active";
    41         public static $option_wp_comments_integration_active_name = "frcaptcha_wp_comments_integration_active";
    42         public static $option_wp_comments_logged_in_integration_active_name = "frcaptcha_wp_comments_logged_in_integration_active";
    43 
    44         public static $option_wc_register_integration_active_name = "frcaptcha_wc_register_integration_active";
    45         public static $option_wc_login_integration_active_name = "frcaptcha_wc_login_integration_active";
    46         public static $option_wc_lost_password_integration_active_name = "frcaptcha_wc_lost_password_integration_active";
    47         public static $option_wc_checkout_integration_active_name = "frcaptcha_wc_checkout_integration_active";
    48 
    49         public static $option_um_login_integration_active_name = "frcaptcha_um_login_integration_active";
    50         public static $option_um_register_integration_active_name = "frcaptcha_um_register_integration_active";
    51         public static $option_um_reset_password_integration_active_name = "frcaptcha_um_reset_password_integration_active";
    52 
    53         public static $option_wpum_registration_integration_active_name = "frcaptcha_wpum_registration_integration_active";
    54         public static $option_wpum_login_integration_active_name = "frcaptcha_wpum_login_integration_active";
    55         public static $option_wpum_password_recovery_integration_active_name = "frcaptcha_wpum_password_recovery_integration_active";
    56 
    57         public static $option_pb_login_integration_active_name = "frcaptcha_pb_login_integration_active";
    58         public static $option_pb_register_integration_active_name = "frcaptcha_pb_register_integration_active";
    59         public static $option_pb_reset_password_integration_active_name = "frcaptcha_pb_reset_password_integration_active";
    60         public static $option_divi_integration_active_name = "frcaptcha_divi_integration_active";
    61 
    62         public static $option_widget_language_name = "frcaptcha_widget_language";
    63         public static $option_widget_dark_theme_active_name = "frcaptcha_widget_dark_theme_active";
    64 
    65         public static $option_global_puzzle_endpoint_active_name = "frcaptcha_global_endpoint_active";
    66         public static $option_eu_puzzle_endpoint_active_name = "frcaptcha_eu_endpoint_active";
    67 
    68 
    69         public function init() {
    70             if ( defined( 'FRIENDLY_CAPTCHA_VERSION' ) ) {
    71                 FriendlyCaptcha_Plugin::$version = FRIENDLY_CAPTCHA_VERSION;
    72                 FriendlyCaptcha_Plugin::$friendly_challenge_version = FRIENDLY_CAPTCHA_FRIENDLY_CHALLENGE_VERSION;
    73             } else {
    74                 FriendlyCaptcha_Plugin::$version = '0.0.0';
    75                 FriendlyCaptcha_Plugin::$friendly_challenge_version = '0.0.0';
     4class FriendlyCaptcha_Plugin
     5{
     6
     7    /**
     8     * Singleton global instance
     9     * @var FriendlyCaptcha_Plugin
     10     */
     11    public static $instance;
     12    public $plugin_name;
     13
     14    public static $version;
     15    // JavaScript client SDK for v1
     16    public static $friendly_challenge_version;
     17    // JavaScript client SDK for v2
     18    public static $friendly_captcha_sdk_version;
     19
     20    // Global constants
     21    public static $option_group = "frcaptcha_options";
     22    public static $option_sitekey_name = "frcaptcha_sitekey";
     23    public static $option_api_key_name = "frcaptcha_api_key";
     24    public static $option_skip_style_injection_name = "frcaptcha_skip_style_injection";
     25    public static $option_enable_mutation_observer_name = "frcaptcha_enable_mutation_observer";
     26    public static $option_enable_v2_name = "frcaptcha_enable_v2";
     27
     28    // Integrations
     29    public static $option_contact_form_7_integration_active_name = "frcaptcha_contact_form_7_integration_active";
     30    public static $option_f12_cf7_doubleoptin_integration_active_name = "frcaptcha_f12_cf7_doubleoptin_integration_active";
     31    public static $option_wpforms_integration_active_name = "frcaptcha_wpforms_integration_active";
     32    public static $option_gravity_forms_integration_active_name = "frcaptcha_gravity_forms_integration_active";
     33    public static $option_coblocks_integration_active_name = "frcaptcha_coblocks_integration_active";
     34    public static $option_fluentform_integration_active_name = "frcaptcha_fluentform_integration_active";
     35    public static $option_elementor_forms_integration_active_name = "frcaptcha_elementor_integration_active";
     36    public static $option_html_forms_integration_active_name = "frcaptcha_html_forms_integration_active";
     37    public static $option_forminator_integration_active_name = "frcaptcha_forminator_integration_active";
     38    public static $option_formidable_integration_active_name = "frcaptcha_formidable_integration_active";
     39    public static $option_avada_forms_integration_active_name = "frcaptcha_avada_forms_integration_active";
     40
     41    public static $option_wp_register_integration_active_name = "frcaptcha_wp_register_integration_active";
     42    public static $option_wp_login_integration_active_name = "frcaptcha_wp_login_integration_active";
     43    public static $option_wp_reset_password_integration_active_name = "frcaptcha_wp_reset_password_integration_active";
     44    public static $option_wp_comments_integration_active_name = "frcaptcha_wp_comments_integration_active";
     45    public static $option_wp_comments_logged_in_integration_active_name = "frcaptcha_wp_comments_logged_in_integration_active";
     46
     47    public static $option_wc_register_integration_active_name = "frcaptcha_wc_register_integration_active";
     48    public static $option_wc_login_integration_active_name = "frcaptcha_wc_login_integration_active";
     49    public static $option_wc_lost_password_integration_active_name = "frcaptcha_wc_lost_password_integration_active";
     50    public static $option_wc_checkout_integration_active_name = "frcaptcha_wc_checkout_integration_active";
     51
     52    public static $option_um_login_integration_active_name = "frcaptcha_um_login_integration_active";
     53    public static $option_um_register_integration_active_name = "frcaptcha_um_register_integration_active";
     54    public static $option_um_reset_password_integration_active_name = "frcaptcha_um_reset_password_integration_active";
     55
     56    public static $option_wpum_registration_integration_active_name = "frcaptcha_wpum_registration_integration_active";
     57    public static $option_wpum_login_integration_active_name = "frcaptcha_wpum_login_integration_active";
     58    public static $option_wpum_password_recovery_integration_active_name = "frcaptcha_wpum_password_recovery_integration_active";
     59
     60    public static $option_pb_login_integration_active_name = "frcaptcha_pb_login_integration_active";
     61    public static $option_pb_register_integration_active_name = "frcaptcha_pb_register_integration_active";
     62    public static $option_pb_reset_password_integration_active_name = "frcaptcha_pb_reset_password_integration_active";
     63    public static $option_divi_integration_active_name = "frcaptcha_divi_integration_active";
     64
     65    public static $option_widget_language_name = "frcaptcha_widget_language";
     66    public static $option_widget_dark_theme_active_name = "frcaptcha_widget_dark_theme_active";
     67
     68    public static $option_global_puzzle_endpoint_active_name = "frcaptcha_global_endpoint_active";
     69    public static $option_eu_puzzle_endpoint_active_name = "frcaptcha_eu_endpoint_active";
     70
     71    public static $option_verification_failed_alert_name = "frcaptcha_verification_failed_alert";
     72
     73    public function init()
     74    {
     75        if (defined('FRIENDLY_CAPTCHA_VERSION')) {
     76            FriendlyCaptcha_Plugin::$version = FRIENDLY_CAPTCHA_VERSION;
     77            FriendlyCaptcha_Plugin::$friendly_challenge_version = FRIENDLY_CAPTCHA_FRIENDLY_CHALLENGE_VERSION;
     78            FriendlyCaptcha_Plugin::$friendly_captcha_sdk_version = FRIENDLY_CAPTCHA_FRIENDLY_CAPTCHA_SDK_VERSION;
     79        } else {
     80            FriendlyCaptcha_Plugin::$version = '0.0.0';
     81            FriendlyCaptcha_Plugin::$friendly_challenge_version = '0.0.0';
     82            FriendlyCaptcha_Plugin::$friendly_captcha_sdk_version = '0.0.0';
     83        }
     84        $this->plugin_name = 'friendly-captcha';
     85
     86        FriendlyCaptcha_Plugin::$instance = $this;
     87    }
     88
     89    public static function default_error_user_message()
     90    {
     91        /* translators: this is the main error message shown to the user when the captcha failed or wasn't completed. */
     92        return __("Anti-robot verification failed, please try again.", "frcaptcha");
     93    }
     94
     95    /**
     96     * When both the sitekey and the apikey are set, we can consider the plugin configured.
     97     */
     98    public function is_configured()
     99    {
     100        return $this->get_sitekey() !== null && $this->get_sitekey() !== "" && $this->get_api_key() !== null && $this->get_api_key() !== "";
     101    }
     102
     103    public function get_sitekey()
     104    {
     105        return trim(get_option(FriendlyCaptcha_Plugin::$option_sitekey_name));
     106    }
     107
     108    public function get_api_key()
     109    {
     110        return trim(get_option(FriendlyCaptcha_Plugin::$option_api_key_name));
     111    }
     112
     113    public function get_skip_style_injection()
     114    {
     115        return get_option(FriendlyCaptcha_Plugin::$option_skip_style_injection_name) == 1;
     116    }
     117
     118    public function get_enable_mutation_observer()
     119    {
     120        return get_option(FriendlyCaptcha_Plugin::$option_enable_mutation_observer_name) == 1;
     121    }
     122
     123    public function get_enable_v2()
     124    {
     125        return get_option(FriendlyCaptcha_Plugin::$option_enable_v2_name) == 1;
     126    }
     127
     128    public function get_solution_field_name()
     129    {
     130        if ($this->get_enable_v2()) {
     131            return "frc-captcha-response";
     132        } else {
     133            return "frc-captcha-solution";
     134        }
     135    }
     136
     137    public function get_contact_form_7_active()
     138    {
     139        return get_option(FriendlyCaptcha_Plugin::$option_contact_form_7_integration_active_name) == 1;
     140    }
     141
     142    public function get_f12_cf7_doubleoptin_active()
     143    {
     144        return get_option(FriendlyCaptcha_Plugin::$option_f12_cf7_doubleoptin_integration_active_name) == 1;
     145    }
     146
     147    public function get_wpforms_active()
     148    {
     149        return get_option(FriendlyCaptcha_Plugin::$option_wpforms_integration_active_name) == 1;
     150    }
     151
     152    public function get_gravity_forms_active()
     153    {
     154        return get_option(FriendlyCaptcha_Plugin::$option_gravity_forms_integration_active_name) == 1;
     155    }
     156
     157    public function get_coblocks_active()
     158    {
     159        return get_option(FriendlyCaptcha_Plugin::$option_coblocks_integration_active_name) == 1;
     160    }
     161
     162    public function get_fluentform_active()
     163    {
     164        return get_option(FriendlyCaptcha_Plugin::$option_fluentform_integration_active_name) == 1;
     165    }
     166
     167    public function get_elementor_active()
     168    {
     169        return get_option(FriendlyCaptcha_Plugin::$option_elementor_forms_integration_active_name) == 1;
     170    }
     171
     172    public function get_html_forms_active()
     173    {
     174        return get_option(FriendlyCaptcha_Plugin::$option_html_forms_integration_active_name) == 1;
     175    }
     176
     177    public function get_forminator_active()
     178    {
     179        return get_option(FriendlyCaptcha_Plugin::$option_forminator_integration_active_name) == 1;
     180    }
     181
     182    public function get_formidable_active()
     183    {
     184        return get_option(FriendlyCaptcha_Plugin::$option_formidable_integration_active_name) == 1;
     185    }
     186
     187    public function get_avada_forms_active()
     188    {
     189        return get_option(FriendlyCaptcha_Plugin::$option_avada_forms_integration_active_name) == 1;
     190    }
     191
     192    public function get_wp_register_active()
     193    {
     194        return get_option(FriendlyCaptcha_Plugin::$option_wp_register_integration_active_name) == 1;
     195    }
     196
     197    public function get_wp_login_active()
     198    {
     199        return get_option(FriendlyCaptcha_Plugin::$option_wp_login_integration_active_name) == 1;
     200    }
     201
     202    public function get_wp_reset_password_active()
     203    {
     204        return get_option(FriendlyCaptcha_Plugin::$option_wp_reset_password_integration_active_name) == 1;
     205    }
     206
     207    public function get_wp_comments_active()
     208    {
     209        return get_option(FriendlyCaptcha_Plugin::$option_wp_comments_integration_active_name) == 1;
     210    }
     211
     212    public function get_wp_comments_logged_in_active()
     213    {
     214        return get_option(FriendlyCaptcha_Plugin::$option_wp_comments_logged_in_integration_active_name) == 1;
     215    }
     216
     217    public function get_wc_login_active()
     218    {
     219        return get_option(FriendlyCaptcha_Plugin::$option_wc_login_integration_active_name) == 1;
     220    }
     221
     222    public function get_wc_register_active()
     223    {
     224        return get_option(FriendlyCaptcha_Plugin::$option_wc_register_integration_active_name) == 1;
     225    }
     226
     227    public function get_wc_lost_password_active()
     228    {
     229        return get_option(FriendlyCaptcha_Plugin::$option_wc_lost_password_integration_active_name) == 1;
     230    }
     231
     232    public function get_wc_checkout_active()
     233    {
     234        return get_option(FriendlyCaptcha_Plugin::$option_wc_checkout_integration_active_name) == 1;
     235    }
     236
     237    public function get_um_login_active()
     238    {
     239        return get_option(FriendlyCaptcha_Plugin::$option_um_login_integration_active_name) == 1;
     240    }
     241
     242    public function get_um_register_active()
     243    {
     244        return get_option(FriendlyCaptcha_Plugin::$option_um_register_integration_active_name) == 1;
     245    }
     246
     247    public function get_um_reset_password_active()
     248    {
     249        return get_option(FriendlyCaptcha_Plugin::$option_um_reset_password_integration_active_name) == 1;
     250    }
     251
     252    public function get_wpum_login_active()
     253    {
     254        return get_option(FriendlyCaptcha_Plugin::$option_wpum_login_integration_active_name) == 1;
     255    }
     256
     257    public function get_wpum_registration_active()
     258    {
     259        return get_option(FriendlyCaptcha_Plugin::$option_wpum_registration_integration_active_name) == 1;
     260    }
     261
     262    public function get_wpum_password_recovery_active()
     263    {
     264        return get_option(FriendlyCaptcha_Plugin::$option_wpum_password_recovery_integration_active_name) == 1;
     265    }
     266
     267    public function get_pb_login_active()
     268    {
     269        return get_option(FriendlyCaptcha_Plugin::$option_pb_login_integration_active_name) == 1;
     270    }
     271
     272    public function get_pb_register_active()
     273    {
     274        return get_option(FriendlyCaptcha_Plugin::$option_pb_register_integration_active_name) == 1;
     275    }
     276
     277    public function get_pb_reset_password_active()
     278    {
     279        return get_option(FriendlyCaptcha_Plugin::$option_pb_reset_password_integration_active_name) == 1;
     280    }
     281
     282
     283    public function get_divi_active()
     284    {
     285        return get_option(FriendlyCaptcha_Plugin::$option_divi_integration_active_name) == 1;
     286    }
     287
     288    /* Widget options */
     289
     290    public function get_widget_language()
     291    {
     292        $lang = get_option(FriendlyCaptcha_Plugin::$option_widget_language_name);
     293        $lang = empty($lang) ? "automatic" : $lang; // Default to automatic
     294        if ($lang == "automatic") {
     295            $lang = substr(get_locale(), 0, 2);
     296            if (!array_key_exists($lang, FRIENDLY_CAPTCHA_SUPPORTED_LANGUAGES)) {
     297                $lang = "en"; // Fallback to en
    76298            }
    77             $this->plugin_name = 'friendly-captcha';
    78 
    79             FriendlyCaptcha_Plugin::$instance = $this;
    80299        }
    81 
    82         public static function default_error_user_message() {
    83             /* translators: this is the main error message shown to the user when the captcha failed or wasn't completed. */
    84             return __("Anti-robot verification failed, please try again.", "frcaptcha");
    85         }
    86 
    87         /**
    88          * When both the sitekey and the apikey are set, we can consider the plugin configured.
    89          */
    90         public function is_configured() {
    91             return $this->get_sitekey() !== null && $this->get_sitekey() !== "" && $this->get_api_key() !== null && $this->get_api_key() !== "";
    92         }
    93 
    94         public function get_sitekey() {
    95             return trim(get_option(FriendlyCaptcha_Plugin::$option_sitekey_name));
    96         }
    97 
    98         public function get_api_key() {
    99             return trim(get_option(FriendlyCaptcha_Plugin::$option_api_key_name));
    100         }
    101 
    102         public function get_skip_style_injection() {
    103             return get_option(FriendlyCaptcha_Plugin::$option_skip_style_injection_name) == 1;
    104         }
    105 
    106         public function get_enable_mutation_observer() {
    107             return get_option(FriendlyCaptcha_Plugin::$option_enable_mutation_observer_name) == 1;
    108         }
    109 
    110         public function get_contact_form_7_active() {
    111             return get_option(FriendlyCaptcha_Plugin::$option_contact_form_7_integration_active_name) == 1;
    112         }
    113 
    114         public function get_f12_cf7_doubleoptin_active() {
    115             return get_option(FriendlyCaptcha_Plugin::$option_f12_cf7_doubleoptin_integration_active_name) == 1;
    116         }
    117 
    118         public function get_wpforms_active() {
    119             return get_option(FriendlyCaptcha_Plugin::$option_wpforms_integration_active_name) == 1;
    120         }
    121 
    122         public function get_gravity_forms_active() {
    123             return get_option(FriendlyCaptcha_Plugin::$option_gravity_forms_integration_active_name) == 1;
    124         }
    125 
    126         public function get_coblocks_active() {
    127             return get_option(FriendlyCaptcha_Plugin::$option_coblocks_integration_active_name) == 1;
    128         }
    129 
    130         public function get_fluentform_active() {
    131             return get_option(FriendlyCaptcha_Plugin::$option_fluentform_integration_active_name) == 1;
    132         }
    133 
    134         public function get_elementor_active() {
    135             return get_option(FriendlyCaptcha_Plugin::$option_elementor_forms_integration_active_name) == 1;
    136         }
    137 
    138         public function get_html_forms_active() {
    139             return get_option(FriendlyCaptcha_Plugin::$option_html_forms_integration_active_name) == 1;
    140         }
    141 
    142         public function get_forminator_active() {
    143             return get_option(FriendlyCaptcha_Plugin::$option_forminator_integration_active_name) == 1;
    144         }
    145 
    146         public function get_formidable_active() {
    147             return get_option(FriendlyCaptcha_Plugin::$option_formidable_integration_active_name) == 1;
    148         }
    149 
    150         public function get_avada_forms_active() {
    151             return get_option(FriendlyCaptcha_Plugin::$option_avada_forms_integration_active_name) == 1;
    152         }
    153 
    154         public function get_wp_register_active() {
    155             return get_option(FriendlyCaptcha_Plugin::$option_wp_register_integration_active_name) == 1;
    156         }
    157 
    158         public function get_wp_login_active() {
    159             return get_option(FriendlyCaptcha_Plugin::$option_wp_login_integration_active_name) == 1;
    160         }
    161 
    162         public function get_wp_reset_password_active() {
    163             return get_option(FriendlyCaptcha_Plugin::$option_wp_reset_password_integration_active_name) == 1;
    164         }
    165 
    166         public function get_wp_comments_active() {
    167             return get_option(FriendlyCaptcha_Plugin::$option_wp_comments_integration_active_name) == 1;
    168         }
    169 
    170         public function get_wp_comments_logged_in_active() {
    171             return get_option(FriendlyCaptcha_Plugin::$option_wp_comments_logged_in_integration_active_name) == 1;
    172         }
    173 
    174         public function get_wc_login_active() {
    175             return get_option(FriendlyCaptcha_Plugin::$option_wc_login_integration_active_name) == 1;
    176         }
    177 
    178         public function get_wc_register_active() {
    179             return get_option(FriendlyCaptcha_Plugin::$option_wc_register_integration_active_name) == 1;
    180         }
    181 
    182         public function get_wc_lost_password_active() {
    183             return get_option(FriendlyCaptcha_Plugin::$option_wc_lost_password_integration_active_name) == 1;
    184         }
    185 
    186         public function get_wc_checkout_active() {
    187             return get_option(FriendlyCaptcha_Plugin::$option_wc_checkout_integration_active_name) == 1;
    188         }
    189 
    190         public function get_um_login_active() {
    191             return get_option(FriendlyCaptcha_Plugin::$option_um_login_integration_active_name) == 1;
    192         }
    193 
    194         public function get_um_register_active() {
    195             return get_option(FriendlyCaptcha_Plugin::$option_um_register_integration_active_name) == 1;
    196         }
    197 
    198         public function get_um_reset_password_active() {
    199             return get_option(FriendlyCaptcha_Plugin::$option_um_reset_password_integration_active_name) == 1;
    200         }
    201 
    202         public function get_wpum_login_active() {
    203             return get_option(FriendlyCaptcha_Plugin::$option_wpum_login_integration_active_name) == 1;
    204         }
    205 
    206         public function get_wpum_registration_active() {
    207             return get_option(FriendlyCaptcha_Plugin::$option_wpum_registration_integration_active_name) == 1;
    208         }
    209 
    210         public function get_wpum_password_recovery_active() {
    211             return get_option(FriendlyCaptcha_Plugin::$option_wpum_password_recovery_integration_active_name) == 1;
    212         }
    213 
    214         public function get_pb_login_active() {
    215             return get_option(FriendlyCaptcha_Plugin::$option_pb_login_integration_active_name) == 1;
    216         }
    217 
    218         public function get_pb_register_active() {
    219             return get_option(FriendlyCaptcha_Plugin::$option_pb_register_integration_active_name) == 1;
    220         }
    221 
    222         public function get_pb_reset_password_active() {
    223             return get_option(FriendlyCaptcha_Plugin::$option_pb_reset_password_integration_active_name) == 1;
    224         }
    225 
    226         public function get_divi_active() {
    227             return get_option(FriendlyCaptcha_Plugin::$option_divi_integration_active_name) == 1;
    228         }
    229 
    230 
    231         /* Widget options */
    232 
    233         public function get_widget_language() {
    234             $lang = get_option(FriendlyCaptcha_Plugin::$option_widget_language_name);
    235             $lang = empty($lang) ? "automatic" : $lang; // Default to automatic
    236             if ( $lang == "automatic" ) {
    237                 $lang = substr(get_locale(), 0, 2);
    238                 if ( ! array_key_exists($lang, FRIENDLY_CAPTCHA_SUPPORTED_LANGUAGES) ) {
    239                     $lang = "en"; // Fallback to en
    240                 }
    241             }
    242             return $lang;
    243         }
    244 
    245         public function get_widget_dark_theme_active() {
    246             return get_option(FriendlyCaptcha_Plugin::$option_widget_dark_theme_active_name) == 1;
    247         }
    248 
    249         /* Endpoint settings */
    250 
    251         public function get_eu_puzzle_endpoint_active() {
    252             return get_option(FriendlyCaptcha_Plugin::$option_eu_puzzle_endpoint_active_name) == 1;
    253         }
    254 
    255         public function get_global_puzzle_endpoint_active() {
    256             $eu_active = $this->get_eu_puzzle_endpoint_active();
    257             if (!$eu_active) return true; // At least one must be enabled.
    258 
    259             return get_option(FriendlyCaptcha_Plugin::$option_global_puzzle_endpoint_active_name) == 1;
    260         }
    261     }
    262 
    263     // This creates the singleton instance
    264     if ( !isset(FriendlyCaptcha_Plugin::$instance)) {
    265         $frcaptcha_plugin_instance = new FriendlyCaptcha_Plugin();
    266         $frcaptcha_plugin_instance->init();
    267     }
    268 
    269     // These only contain pure functions
    270     require plugin_dir_path( __FILE__ ) . 'helpers.php';
    271     require plugin_dir_path( __FILE__ ) . 'verification.php';
    272 
    273     // Register widget routines
    274     require plugin_dir_path( __FILE__ ) . '../public/widgets.php';
    275 
    276     // Set up the admin pages & settings
    277     require plugin_dir_path( __FILE__ ) . 'admin.php';
    278     require plugin_dir_path( __FILE__ ) . 'settings.php';
    279 
    280     if (FriendlyCaptcha_Plugin::$instance->get_contact_form_7_active()) {
    281         require plugin_dir_path( __FILE__ ) . '../modules/contact-form-7/contact-form-7.php';
    282     }
    283 
    284     if (FriendlyCaptcha_Plugin::$instance->get_wpforms_active()) {
    285         require plugin_dir_path( __FILE__ ) . '../modules/wpforms/wpforms.php';
    286     }
    287 
    288     if (FriendlyCaptcha_Plugin::$instance->get_gravity_forms_active()) {
    289         require plugin_dir_path( __FILE__ ) . '../modules/gravityforms/gravityforms.php';
    290     }
    291 
    292     if (FriendlyCaptcha_Plugin::$instance->get_coblocks_active()) {
    293         require plugin_dir_path( __FILE__ ) . '../modules/coblocks/coblocks.php';
    294     }
    295 
    296     if (FriendlyCaptcha_Plugin::$instance->get_fluentform_active()) {
    297         require plugin_dir_path( __FILE__ ) . '../modules/fluentform/fluentform.php';
    298     }
    299 
    300     if (FriendlyCaptcha_Plugin::$instance->get_elementor_active()) {
    301         require plugin_dir_path( __FILE__ ) . '../modules/elementor/elementor.php';
    302     }
    303 
    304     if (FriendlyCaptcha_Plugin::$instance->get_html_forms_active()) {
    305         require plugin_dir_path( __FILE__ ) . '../modules/html-forms/html-forms.php';
    306     }
    307 
    308     if (FriendlyCaptcha_Plugin::$instance->get_forminator_active()) {
    309         require plugin_dir_path( __FILE__ ) . '../modules/forminator/forminator.php';
    310     }
    311 
    312     if (FriendlyCaptcha_Plugin::$instance->get_formidable_active()) {
    313         require plugin_dir_path( __FILE__ ) . '../modules/formidable/formidable.php';
    314     }
    315 
    316     if (FriendlyCaptcha_Plugin::$instance->get_avada_forms_active()) {
    317         require plugin_dir_path( __FILE__ ) . '../modules/avada-forms/avada-forms.php';
    318     }
    319 
    320     if (FriendlyCaptcha_Plugin::$instance->get_wp_register_active()) {
    321         require plugin_dir_path( __FILE__ ) . '../modules/wordpress/wordpress_register.php';
    322     }
    323 
    324     if (FriendlyCaptcha_Plugin::$instance->get_wp_login_active()) {
    325         require plugin_dir_path( __FILE__ ) . '../modules/wordpress/wordpress_login.php';
    326     }
    327 
    328     if (FriendlyCaptcha_Plugin::$instance->get_wp_reset_password_active()) {
    329         require plugin_dir_path( __FILE__ ) . '../modules/wordpress/wordpress_reset_password.php';
    330     }
    331 
    332     if (FriendlyCaptcha_Plugin::$instance->get_wp_comments_active()) {
    333         require plugin_dir_path( __FILE__ ) . '../modules/wordpress/wordpress_comments.php';
    334     }
    335 
    336     if (FriendlyCaptcha_Plugin::$instance->get_wc_login_active()) {
    337         require plugin_dir_path( __FILE__ ) . '../modules/woocommerce/woocommerce_login.php';
    338     }
    339 
    340     if (FriendlyCaptcha_Plugin::$instance->get_wc_register_active()) {
    341         require plugin_dir_path( __FILE__ ) . '../modules/woocommerce/woocommerce_register.php';
    342     }
    343 
    344     if (FriendlyCaptcha_Plugin::$instance->get_wc_lost_password_active()) {
    345         require plugin_dir_path( __FILE__ ) . '../modules/woocommerce/woocommerce_lost_password.php';
    346     }
    347 
    348     if (FriendlyCaptcha_Plugin::$instance->get_wc_checkout_active()) {
    349         require plugin_dir_path( __FILE__ ) . '../modules/woocommerce/woocommerce_checkout.php';
    350     }
    351 
    352     if (FriendlyCaptcha_Plugin::$instance->get_um_login_active()) {
    353         require plugin_dir_path( __FILE__ ) . '../modules/ultimate-member/ultimate-member_login.php';
    354     }
    355 
    356     if (FriendlyCaptcha_Plugin::$instance->get_um_register_active()) {
    357         require plugin_dir_path( __FILE__ ) . '../modules/ultimate-member/ultimate-member_register.php';
    358     }
    359 
    360     if (FriendlyCaptcha_Plugin::$instance->get_um_reset_password_active()) {
    361         require plugin_dir_path( __FILE__ ) . '../modules/ultimate-member/ultimate-member_reset_password.php';
    362     }
    363 
    364     if (FriendlyCaptcha_Plugin::$instance->get_wpum_login_active()) {
    365         require plugin_dir_path( __FILE__ ) . '../modules/wpum/wpum_login.php';
    366         require_once plugin_dir_path( __FILE__ ) . '../modules/wpum/wpum_validate.php';
    367     }
    368 
    369     if (FriendlyCaptcha_Plugin::$instance->get_wpum_registration_active()) {
    370         require plugin_dir_path( __FILE__ ) . '../modules/wpum/wpum_registration.php';
    371         require_once plugin_dir_path( __FILE__ ) . '../modules/wpum/wpum_validate.php';
    372     }
    373 
    374     if (FriendlyCaptcha_Plugin::$instance->get_wpum_password_recovery_active()) {
    375         require plugin_dir_path( __FILE__ ) . '../modules/wpum/wpum_password-recovery.php';
    376         require_once plugin_dir_path( __FILE__ ) . '../modules/wpum/wpum_validate.php';
    377     }
    378 
    379     if (FriendlyCaptcha_Plugin::$instance->get_pb_login_active()) {
    380         require plugin_dir_path( __FILE__ ) . '../modules/profile-builder/profile_builder_login.php';
    381     }
    382 
    383     if (FriendlyCaptcha_Plugin::$instance->get_pb_register_active()) {
    384         require plugin_dir_path( __FILE__ ) . '../modules/profile-builder/profile_builder_register.php';
    385     }
    386 
    387     if (FriendlyCaptcha_Plugin::$instance->get_pb_reset_password_active()) {
    388         require plugin_dir_path(__FILE__) . '../modules/profile-builder/profile_builder_reset_password.php';
    389     }
    390 
    391     if (FriendlyCaptcha_Plugin::$instance->get_divi_active()) {
    392         require plugin_dir_path( __FILE__ ) . '../modules/divi/divi.php';
    393     }
    394 // }
     300        return $lang;
     301    }
     302
     303    public function get_widget_dark_theme_active()
     304    {
     305        return get_option(FriendlyCaptcha_Plugin::$option_widget_dark_theme_active_name) == 1;
     306    }
     307
     308    /* Endpoint settings */
     309
     310    public function get_eu_puzzle_endpoint_active()
     311    {
     312        return get_option(FriendlyCaptcha_Plugin::$option_eu_puzzle_endpoint_active_name) == 1;
     313    }
     314
     315    public function get_global_puzzle_endpoint_active()
     316    {
     317        $eu_active = $this->get_eu_puzzle_endpoint_active();
     318        if (!$eu_active) return true; // At least one must be enabled.
     319
     320        return get_option(FriendlyCaptcha_Plugin::$option_global_puzzle_endpoint_active_name) == 1;
     321    }
     322
     323    /* Verification failure alert */
     324
     325    public function show_verification_failed_alert($response)
     326    {
     327        update_option(FriendlyCaptcha_Plugin::$option_verification_failed_alert_name, $response);
     328    }
     329
     330    public function get_verification_failed_alert()
     331    {
     332        return get_option(FriendlyCaptcha_Plugin::$option_verification_failed_alert_name);
     333    }
     334
     335    public function remove_verification_failed_alert()
     336    {
     337        delete_option(FriendlyCaptcha_Plugin::$option_verification_failed_alert_name);
     338    }
     339}
     340
     341// This creates the singleton instance
     342if (!isset(FriendlyCaptcha_Plugin::$instance)) {
     343    $frcaptcha_plugin_instance = new FriendlyCaptcha_Plugin();
     344    $frcaptcha_plugin_instance->init();
     345}
     346
     347// These only contain pure functions
     348require plugin_dir_path(__FILE__) . 'helpers.php';
     349require plugin_dir_path(__FILE__) . 'verification.php';
     350
     351// Register widget routines
     352require plugin_dir_path(__FILE__) . '../public/widgets.php';
     353
     354// Set up the admin pages & settings
     355require plugin_dir_path(__FILE__) . 'admin.php';
     356require plugin_dir_path(__FILE__) . 'settings.php';
     357
     358if (FriendlyCaptcha_Plugin::$instance->get_contact_form_7_active()) {
     359    require plugin_dir_path(__FILE__) . '../modules/contact-form-7/contact-form-7.php';
     360}
     361
     362if (FriendlyCaptcha_Plugin::$instance->get_wpforms_active()) {
     363    require plugin_dir_path(__FILE__) . '../modules/wpforms/wpforms.php';
     364}
     365
     366if (FriendlyCaptcha_Plugin::$instance->get_gravity_forms_active()) {
     367    require plugin_dir_path(__FILE__) . '../modules/gravityforms/gravityforms.php';
     368}
     369
     370if (FriendlyCaptcha_Plugin::$instance->get_coblocks_active()) {
     371    require plugin_dir_path(__FILE__) . '../modules/coblocks/coblocks.php';
     372}
     373
     374if (FriendlyCaptcha_Plugin::$instance->get_fluentform_active()) {
     375    require plugin_dir_path(__FILE__) . '../modules/fluentform/fluentform.php';
     376}
     377
     378if (FriendlyCaptcha_Plugin::$instance->get_elementor_active()) {
     379    require plugin_dir_path(__FILE__) . '../modules/elementor/elementor.php';
     380}
     381
     382if (FriendlyCaptcha_Plugin::$instance->get_html_forms_active()) {
     383    require plugin_dir_path(__FILE__) . '../modules/html-forms/html-forms.php';
     384}
     385
     386if (FriendlyCaptcha_Plugin::$instance->get_forminator_active()) {
     387    require plugin_dir_path(__FILE__) . '../modules/forminator/forminator.php';
     388}
     389
     390if (FriendlyCaptcha_Plugin::$instance->get_formidable_active()) {
     391    require plugin_dir_path(__FILE__) . '../modules/formidable/formidable.php';
     392}
     393
     394if (FriendlyCaptcha_Plugin::$instance->get_avada_forms_active()) {
     395    require plugin_dir_path(__FILE__) . '../modules/avada-forms/avada-forms.php';
     396}
     397
     398if (FriendlyCaptcha_Plugin::$instance->get_wp_register_active()) {
     399    require plugin_dir_path(__FILE__) . '../modules/wordpress/wordpress_register.php';
     400}
     401
     402if (FriendlyCaptcha_Plugin::$instance->get_wp_login_active()) {
     403    require plugin_dir_path(__FILE__) . '../modules/wordpress/wordpress_login.php';
     404}
     405
     406if (FriendlyCaptcha_Plugin::$instance->get_wp_reset_password_active()) {
     407    require plugin_dir_path(__FILE__) . '../modules/wordpress/wordpress_reset_password.php';
     408}
     409
     410if (FriendlyCaptcha_Plugin::$instance->get_wp_comments_active()) {
     411    require plugin_dir_path(__FILE__) . '../modules/wordpress/wordpress_comments.php';
     412}
     413
     414if (FriendlyCaptcha_Plugin::$instance->get_wc_login_active()) {
     415    require plugin_dir_path(__FILE__) . '../modules/woocommerce/woocommerce_login.php';
     416}
     417
     418if (FriendlyCaptcha_Plugin::$instance->get_wc_register_active()) {
     419    require plugin_dir_path(__FILE__) . '../modules/woocommerce/woocommerce_register.php';
     420}
     421
     422if (FriendlyCaptcha_Plugin::$instance->get_wc_lost_password_active()) {
     423    require plugin_dir_path(__FILE__) . '../modules/woocommerce/woocommerce_lost_password.php';
     424}
     425
     426if (FriendlyCaptcha_Plugin::$instance->get_wc_checkout_active()) {
     427    require plugin_dir_path(__FILE__) . '../modules/woocommerce/woocommerce_checkout.php';
     428}
     429
     430if (FriendlyCaptcha_Plugin::$instance->get_um_login_active()) {
     431    require plugin_dir_path(__FILE__) . '../modules/ultimate-member/ultimate-member_login.php';
     432}
     433
     434if (FriendlyCaptcha_Plugin::$instance->get_um_register_active()) {
     435    require plugin_dir_path(__FILE__) . '../modules/ultimate-member/ultimate-member_register.php';
     436}
     437
     438if (FriendlyCaptcha_Plugin::$instance->get_um_reset_password_active()) {
     439    require plugin_dir_path(__FILE__) . '../modules/ultimate-member/ultimate-member_reset_password.php';
     440}
     441
     442if (FriendlyCaptcha_Plugin::$instance->get_wpum_login_active()) {
     443    require plugin_dir_path(__FILE__) . '../modules/wpum/wpum_login.php';
     444    require_once plugin_dir_path(__FILE__) . '../modules/wpum/wpum_validate.php';
     445}
     446
     447if (FriendlyCaptcha_Plugin::$instance->get_wpum_registration_active()) {
     448    require plugin_dir_path(__FILE__) . '../modules/wpum/wpum_registration.php';
     449    require_once plugin_dir_path(__FILE__) . '../modules/wpum/wpum_validate.php';
     450}
     451
     452if (FriendlyCaptcha_Plugin::$instance->get_wpum_password_recovery_active()) {
     453    require plugin_dir_path(__FILE__) . '../modules/wpum/wpum_password-recovery.php';
     454    require_once plugin_dir_path(__FILE__) . '../modules/wpum/wpum_validate.php';
     455}
     456
     457if (FriendlyCaptcha_Plugin::$instance->get_pb_login_active()) {
     458    require plugin_dir_path(__FILE__) . '../modules/profile-builder/profile_builder_login.php';
     459}
     460
     461if (FriendlyCaptcha_Plugin::$instance->get_pb_register_active()) {
     462    require plugin_dir_path(__FILE__) . '../modules/profile-builder/profile_builder_register.php';
     463}
     464
     465if (FriendlyCaptcha_Plugin::$instance->get_pb_reset_password_active()) {
     466    require plugin_dir_path(__FILE__) . '../modules/profile-builder/profile_builder_reset_password.php';
     467}
     468
     469if (FriendlyCaptcha_Plugin::$instance->get_divi_active()) {
     470    require plugin_dir_path(__FILE__) . '../modules/divi/divi.php';
     471}
  • friendly-captcha/tags/1.14.0/includes/helpers.php

    r2443791 r3095155  
    11<?php
    22
    3 function frcaptcha_log_remote_request($url, $request, $response)
     3function frcaptcha_log_remote_request($url, $response)
    44{
    55    $log = sprintf(
     
    1515}
    1616
     17function frcaptcha_v2_log_verify_response($url, $status, $errorCode)
     18{
     19    $log = sprintf(
     20        /* translators: 1: response status, 2: error code, 3: error detail, 4: URL */
     21        __('Friendly Captcha: %1$s %2$s from %3$s', 'frcaptcha'),
     22        $status,
     23        $errorCode,
     24        $url
     25    );
     26
     27    trigger_error($log);
     28}
     29
    1730function frcaptcha_get_sanitized_frcaptcha_solution_from_post()
    1831{
    19     $postValue = $_POST['frc-captcha-solution'];
     32    $fieldName = FriendlyCaptcha_Plugin::$instance->get_solution_field_name();
     33
     34    $postValue = $_POST[$fieldName];
    2035    $solution = isset($postValue) ? trim(sanitize_text_field($postValue)) : '';
    2136    return $solution;
  • friendly-captcha/tags/1.14.0/includes/settings.php

    r3080369 r3095155  
    66    add_action('admin_init', 'frcaptcha_settings_init');
    77
    8     function frcaptcha_settings_init() {
     8    function frcaptcha_settings_init()
     9    {
    910        register_setting(
    1011            FriendlyCaptcha_Plugin::$option_group,
     
    2223            FriendlyCaptcha_Plugin::$option_group,
    2324            FriendlyCaptcha_Plugin::$option_enable_mutation_observer_name
     25        );
     26        register_setting(
     27            FriendlyCaptcha_Plugin::$option_group,
     28            FriendlyCaptcha_Plugin::$option_enable_v2_name
    2429        );
    2530
     
    178183        add_settings_field(
    179184            'frcaptcha_settings_sitekey_field',
    180             'Sitekey', 'frcaptcha_settings_field_callback',
     185            'Sitekey',
     186            'frcaptcha_settings_field_callback',
    181187            'friendly_captcha_admin',
    182188            'frcaptcha_general_settings_section',
     
    190196        add_settings_field(
    191197            'frcaptcha_settings_api_key_field',
    192             'API Key', 'frcaptcha_settings_field_callback',
     198            'API Key',
     199            'frcaptcha_settings_field_callback',
    193200            'friendly_captcha_admin',
    194201            'frcaptcha_general_settings_section',
     
    212219        add_settings_field(
    213220            'frcaptcha_settings_wpforms_integration_field',
    214             'WPForms', 'frcaptcha_settings_field_callback',
     221            'WPForms',
     222            'frcaptcha_settings_field_callback',
    215223            'friendly_captcha_admin',
    216224            'frcaptcha_integrations_settings_section',
     
    224232        add_settings_field(
    225233            'frcaptcha_settings_wpcf7_integration_field',
    226             'Contact Form 7', 'frcaptcha_settings_field_callback',
     234            'Contact Form 7',
     235            'frcaptcha_settings_field_callback',
    227236            'friendly_captcha_admin',
    228237            'frcaptcha_integrations_settings_section',
     
    236245        add_settings_field(
    237246            'frcaptcha_settings_f12_cf7_doubleoptin_integration_field',
    238             'CF7 Double-Opt-In', 'frcaptcha_settings_field_callback',
     247            'CF7 Double-Opt-In',
     248            'frcaptcha_settings_field_callback',
    239249            'friendly_captcha_admin',
    240250            'frcaptcha_integrations_settings_section',
     
    248258        add_settings_field(
    249259            'frcaptcha_settings_gravity_forms_integration_field',
    250             'Gravity Forms', 'frcaptcha_settings_field_callback',
     260            'Gravity Forms',
     261            'frcaptcha_settings_field_callback',
    251262            'friendly_captcha_admin',
    252263            'frcaptcha_integrations_settings_section',
     
    260271        add_settings_field(
    261272            'frcaptcha_settings_coblocks_integration_field',
    262             'CoBlocks Forms', 'frcaptcha_settings_field_callback',
     273            'CoBlocks Forms',
     274            'frcaptcha_settings_field_callback',
    263275            'friendly_captcha_admin',
    264276            'frcaptcha_integrations_settings_section',
     
    272284        add_settings_field(
    273285            'frcaptcha_settings_fluentform_integration_field',
    274             'Fluentform Forms', 'frcaptcha_settings_field_callback',
     286            'Fluentform Forms',
     287            'frcaptcha_settings_field_callback',
    275288            'friendly_captcha_admin',
    276289            'frcaptcha_integrations_settings_section',
     
    284297        add_settings_field(
    285298            'frcaptcha_settings_elementor_integration_field',
    286             'Elementor Pro Forms', 'frcaptcha_settings_field_callback',
     299            'Elementor Pro Forms',
     300            'frcaptcha_settings_field_callback',
    287301            'friendly_captcha_admin',
    288302            'frcaptcha_integrations_settings_section',
     
    296310        add_settings_field(
    297311            'frcaptcha_settings_html_forms_integration_field',
    298             'HTML Forms', 'frcaptcha_settings_field_callback',
     312            'HTML Forms',
     313            'frcaptcha_settings_field_callback',
    299314            'friendly_captcha_admin',
    300315            'frcaptcha_integrations_settings_section',
     
    308323        add_settings_field(
    309324            'frcaptcha_settings_forminator_integration_field',
    310             'Forminator', 'frcaptcha_settings_field_callback',
     325            'Forminator',
     326            'frcaptcha_settings_field_callback',
    311327            'friendly_captcha_admin',
    312328            'frcaptcha_integrations_settings_section',
     
    320336        add_settings_field(
    321337            'frcaptcha_settings_formidable_integration_field',
    322             'Formidable', 'frcaptcha_settings_field_callback',
     338            'Formidable',
     339            'frcaptcha_settings_field_callback',
    323340            'friendly_captcha_admin',
    324341            'frcaptcha_integrations_settings_section',
     
    332349        add_settings_field(
    333350            'frcaptcha_settings_avada_forms_integration_field',
    334             'Avada Form Builder', 'frcaptcha_settings_field_callback',
     351            'Avada Form Builder',
     352            'frcaptcha_settings_field_callback',
    335353            'friendly_captcha_admin',
    336354            'frcaptcha_integrations_settings_section',
     
    344362        add_settings_field(
    345363            'frcaptcha_settings_wp_register_integration_field',
    346             'WordPress Register', 'frcaptcha_settings_field_callback',
     364            'WordPress Register',
     365            'frcaptcha_settings_field_callback',
    347366            'friendly_captcha_admin',
    348367            'frcaptcha_integrations_settings_section',
     
    356375        add_settings_field(
    357376            'frcaptcha_settings_wp_login_integration_field',
    358             'WordPress Login', 'frcaptcha_settings_field_callback',
     377            'WordPress Login',
     378            'frcaptcha_settings_field_callback',
    359379            'friendly_captcha_admin',
    360380            'frcaptcha_integrations_settings_section',
     
    368388        add_settings_field(
    369389            'frcaptcha_settings_wp_reset_password_integration_field',
    370             'WordPress Reset Password', 'frcaptcha_settings_field_callback',
     390            'WordPress Reset Password',
     391            'frcaptcha_settings_field_callback',
    371392            'friendly_captcha_admin',
    372393            'frcaptcha_integrations_settings_section',
     
    380401        add_settings_field(
    381402            'frcaptcha_settings_wp_comments_integration_field',
    382             'WordPress Comments<br>(guests)', 'frcaptcha_settings_field_callback',
     403            'WordPress Comments<br>(guests)',
     404            'frcaptcha_settings_field_callback',
    383405            'friendly_captcha_admin',
    384406            'frcaptcha_integrations_settings_section',
     
    392414        add_settings_field(
    393415            'frcaptcha_settings_wp_comments_logged_in_integration_field',
    394             'WordPress Comments<br>(logged in users)', 'frcaptcha_settings_field_callback',
     416            'WordPress Comments<br>(logged in users)',
     417            'frcaptcha_settings_field_callback',
    395418            'friendly_captcha_admin',
    396419            'frcaptcha_integrations_settings_section',
     
    404427        add_settings_field(
    405428            'frcaptcha_settings_wc_register_integration_field',
    406             'WooCommerce Register', 'frcaptcha_settings_field_callback',
     429            'WooCommerce Register',
     430            'frcaptcha_settings_field_callback',
    407431            'friendly_captcha_admin',
    408432            'frcaptcha_integrations_settings_section',
     
    416440        add_settings_field(
    417441            'frcaptcha_settings_wc_login_integration_field',
    418             'WooCommerce Login', 'frcaptcha_settings_field_callback',
     442            'WooCommerce Login',
     443            'frcaptcha_settings_field_callback',
    419444            'friendly_captcha_admin',
    420445            'frcaptcha_integrations_settings_section',
     
    428453        add_settings_field(
    429454            'frcaptcha_settings_wc_lost_password_integration_field',
    430             'WooCommerce Lost Password', 'frcaptcha_settings_field_callback',
     455            'WooCommerce Lost Password',
     456            'frcaptcha_settings_field_callback',
    431457            'friendly_captcha_admin',
    432458            'frcaptcha_integrations_settings_section',
     
    440466        add_settings_field(
    441467            'frcaptcha_settings_wc_checkout_integration_field',
    442             'WooCommerce Checkout', 'frcaptcha_settings_field_callback',
     468            'WooCommerce Checkout',
     469            'frcaptcha_settings_field_callback',
    443470            'friendly_captcha_admin',
    444471            'frcaptcha_integrations_settings_section',
     
    452479        add_settings_field(
    453480            'frcaptcha_settings_um_login_integration_field',
    454             'Ultimate Member Login', 'frcaptcha_settings_field_callback',
     481            'Ultimate Member Login',
     482            'frcaptcha_settings_field_callback',
    455483            'friendly_captcha_admin',
    456484            'frcaptcha_integrations_settings_section',
     
    464492        add_settings_field(
    465493            'frcaptcha_settings_um_register_integration_field',
    466             'Ultimate Member Register', 'frcaptcha_settings_field_callback',
     494            'Ultimate Member Register',
     495            'frcaptcha_settings_field_callback',
    467496            'friendly_captcha_admin',
    468497            'frcaptcha_integrations_settings_section',
     
    476505        add_settings_field(
    477506            'frcaptcha_settings_um_reset_password_integration_field',
    478             'Ultimate Member Reset Password', 'frcaptcha_settings_field_callback',
     507            'Ultimate Member Reset Password',
     508            'frcaptcha_settings_field_callback',
    479509            'friendly_captcha_admin',
    480510            'frcaptcha_integrations_settings_section',
     
    488518        add_settings_field(
    489519            'frcaptcha_settings_wpum_registration_integration_field',
    490             'WPUM Registration', 'frcaptcha_settings_field_callback',
     520            'WPUM Registration',
     521            'frcaptcha_settings_field_callback',
    491522            'friendly_captcha_admin',
    492523            'frcaptcha_integrations_settings_section',
     
    500531        add_settings_field(
    501532            'frcaptcha_settings_wpum_login_integration_field',
    502             'WPUM Login', 'frcaptcha_settings_field_callback',
     533            'WPUM Login',
     534            'frcaptcha_settings_field_callback',
    503535            'friendly_captcha_admin',
    504536            'frcaptcha_integrations_settings_section',
     
    512544        add_settings_field(
    513545            'frcaptcha_settings_wpum_password_recovery_integration_field',
    514             'WPUM Password Recovery', 'frcaptcha_settings_field_callback',
     546            'WPUM Password Recovery',
     547            'frcaptcha_settings_field_callback',
    515548            'friendly_captcha_admin',
    516549            'frcaptcha_integrations_settings_section',
     
    524557        add_settings_field(
    525558            'frcaptcha_settings_pb_login_integration_field',
    526             'Profile Builder Login', 'frcaptcha_settings_field_callback',
     559            'Profile Builder Login',
     560            'frcaptcha_settings_field_callback',
    527561            'friendly_captcha_admin',
    528562            'frcaptcha_integrations_settings_section',
     
    536570        add_settings_field(
    537571            'frcaptcha_settings_pb_register_integration_field',
    538             'Profile Builder Register', 'frcaptcha_settings_field_callback',
     572            'Profile Builder Register',
     573            'frcaptcha_settings_field_callback',
    539574            'friendly_captcha_admin',
    540575            'frcaptcha_integrations_settings_section',
     
    548583        add_settings_field(
    549584            'frcaptcha_settings_pb_reset_password_integration_field',
    550             'Profile Builder Reset Password', 'frcaptcha_settings_field_callback',
     585            'Profile Builder Reset Password',
     586            'frcaptcha_settings_field_callback',
    551587            'friendly_captcha_admin',
    552588            'frcaptcha_integrations_settings_section',
     
    560596        add_settings_field(
    561597            'frcaptcha_settings_divi_integration_field',
    562             'Divi Theme Contact Form', 'frcaptcha_settings_field_callback',
     598            'Divi Theme Contact Form',
     599            'frcaptcha_settings_field_callback',
    563600            'friendly_captcha_admin',
    564601            'frcaptcha_integrations_settings_section',
     
    580617        );
    581618
    582         add_settings_field(
    583             'frcaptcha_settings_widget_language_field',
    584             'Widget Language',
    585             'frcaptcha_widget_language_field_callback',
    586             'friendly_captcha_admin',
    587             'frcaptcha_widget_settings_section',
    588             array(
    589                 "option_name" => FriendlyCaptcha_Plugin::$option_widget_language_name,
    590                 "description" => "Set the language for the widget. Need another language? <a href=\"https://docs.friendlycaptcha.com/#/widget_api?id=data-lang-attribute\">Help us translate</a>.",
    591             )
    592         );
     619        if (!FriendlyCaptcha_Plugin::$instance->get_enable_v2()) {
     620            add_settings_field(
     621                'frcaptcha_settings_widget_language_field',
     622                'Widget Language',
     623                'frcaptcha_widget_language_field_callback',
     624                'friendly_captcha_admin',
     625                'frcaptcha_widget_settings_section',
     626                array(
     627                    "option_name" => FriendlyCaptcha_Plugin::$option_widget_language_name,
     628                    "description" => "Set the language for the widget. Need another language? <a href=\"https://docs.friendlycaptcha.com/#/widget_api?id=data-lang-attribute\">Help us translate</a>.",
     629                )
     630            );
     631        }
    593632
    594633        add_settings_field(
    595634            'frcaptcha_settings_widget_theme_field',
    596             'Dark theme', 'frcaptcha_settings_field_callback',
     635            'Dark theme',
     636            'frcaptcha_settings_field_callback',
    597637            'friendly_captcha_admin',
    598638            'frcaptcha_widget_settings_section',
     
    604644        );
    605645
    606         add_settings_field(
    607             'frcaptcha_settings_skip_style_injection_field',
    608             'Disable Style Injection', 'frcaptcha_settings_field_callback',
    609             'friendly_captcha_admin',
    610             'frcaptcha_widget_settings_section',
    611             array(
    612                 "option_name" => FriendlyCaptcha_Plugin::$option_skip_style_injection_name,
    613                 "description" => "Don't load the CSS-Styles for the widget. Use this if you want to style the widget yourself.",
    614                 "type" => "checkbox"
    615             )
    616         );
     646        if (!FriendlyCaptcha_Plugin::$instance->get_enable_v2()) {
     647            add_settings_field(
     648                'frcaptcha_settings_skip_style_injection_field',
     649                'Disable Style Injection',
     650                'frcaptcha_settings_field_callback',
     651                'friendly_captcha_admin',
     652                'frcaptcha_widget_settings_section',
     653                array(
     654                    "option_name" => FriendlyCaptcha_Plugin::$option_skip_style_injection_name,
     655                    "description" => "Don't load the CSS-Styles for the widget. Use this if you want to style the widget yourself.",
     656                    "type" => "checkbox"
     657                )
     658            );
     659        }
    617660
    618661        add_settings_field(
    619662            'frcaptcha_settings_mutation_observer',
    620             'Dynamically Initialize', 'frcaptcha_settings_field_callback',
     663            'Dynamically Initialize',
     664            'frcaptcha_settings_field_callback',
    621665            'friendly_captcha_admin',
    622666            'frcaptcha_widget_settings_section',
     
    624668                "option_name" => FriendlyCaptcha_Plugin::$option_enable_mutation_observer_name,
    625669                "description" => "Make Friendly Captcha look for new widgets that are dynamically added to the page.<br>Enable this when you are using Friendly Captcha in a popup or a multi-step form.",
     670                "type" => "checkbox"
     671            )
     672        );
     673
     674        add_settings_field(
     675            'frcaptcha_settings_enable_v2',
     676            'Use Friendly Captcha v2',
     677            'frcaptcha_settings_field_callback',
     678            'friendly_captcha_admin',
     679            'frcaptcha_widget_settings_section',
     680            array(
     681                "option_name" => FriendlyCaptcha_Plugin::$option_enable_v2_name,
     682                "description" => " Friendly Captcha v2 is in preview and is <b>not yet intended for production use</b>. You need to enable v2 in the Friendly Captcha dashboard.",
     683                "type" => "checkbox"
     684            )
     685        );
     686
     687        add_settings_field(
     688            'frcaptcha_settings_enable_v2',
     689            'Use Friendly Captcha v2',
     690            'frcaptcha_settings_field_callback',
     691            'friendly_captcha_admin',
     692            'frcaptcha_widget_settings_section',
     693            array(
     694                "option_name" => FriendlyCaptcha_Plugin::$option_enable_v2_name,
     695                "description" => " Friendly Captcha v2 is in its alpha stage and is <b>not yet intended for production use</b>.",
    626696                "type" => "checkbox"
    627697            )
     
    641711        add_settings_field(
    642712            'frcaptcha_settings_global_endpoint_field',
    643             '🌍 Global Endpoint', 'frcaptcha_settings_field_callback',
     713            '🌍 Global Endpoint',
     714            'frcaptcha_settings_field_callback',
    644715            'friendly_captcha_admin',
    645716            'frcaptcha_endpoint_settings_section',
     
    653724        add_settings_field(
    654725            'frcaptcha_settings_eu_endpoint_field',
    655             '🇪🇺 Dedicated EU Endpoint', 'frcaptcha_settings_field_callback',
     726            '🇪🇺 Dedicated EU Endpoint',
     727            'frcaptcha_settings_field_callback',
    656728            'friendly_captcha_admin',
    657729            'frcaptcha_endpoint_settings_section',
  • friendly-captcha/tags/1.14.0/includes/verification.php

    r2851826 r3095155  
    11<?php
    22
     3use FriendlyCaptcha\SDK\{Client, ClientConfig};
    34
    4 function frcaptcha_verify_captcha_solution($solution, $sitekey, $api_key) {
    5         $endpoint = 'https://api.friendlycaptcha.com/api/v1/siteverify';
     5function frcaptcha_verify_captcha_solution($solution, $sitekey, $api_key)
     6{
     7    if (FriendlyCaptcha_Plugin::$instance->get_enable_v2()) {
     8        return frcaptcha_v2_verify_captcha_solution($solution, $sitekey, $api_key);
     9    } else {
     10        return frcaptcha_v1_verify_captcha_solution($solution, $sitekey, $api_key);
     11    }
     12}
    613
    7         $response_body = array(
    8             'secret' => $api_key,
    9             'sitekey' => $sitekey,
    10             'solution' => $solution,
     14function frcaptcha_v1_verify_captcha_solution($solution, $sitekey, $api_key)
     15{
     16    $endpoint = 'https://api.friendlycaptcha.com/api/v1/siteverify';
     17
     18    $request_body = array(
     19        'secret' => $api_key,
     20        'sitekey' => $sitekey,
     21        'solution' => $solution,
     22    );
     23
     24    $request = array(
     25        'body' => $request_body,
     26    );
     27
     28    $response = wp_remote_post(esc_url_raw($endpoint), $request);
     29    $status = wp_remote_retrieve_response_code($response);
     30
     31    // Useful for debugging
     32    // $body = json_encode($request_body);
     33    // trigger_error($body);
     34
     35    $raw_response_body = wp_remote_retrieve_body($response);
     36    $response_body = json_decode($raw_response_body, true);
     37
     38    if (200 != $status) {
     39        if (WP_DEBUG) {
     40            frcaptcha_log_remote_request($endpoint, $response);
     41        }
     42
     43        FriendlyCaptcha_Plugin::$instance->show_verification_failed_alert($raw_response_body);
     44
     45        // Better safe than sorry, if the request is non-200 we can not verify the response
     46        // Either the user's credentials are wrong (e.g. wrong sitekey, api key) or the friendly
     47        // captcha servers are unresponsive.
     48
     49        return array(
     50            "success" => true,
     51            "status" => $status,
     52            "errors" => array()
    1153        );
     54    }
    1255
    13         $body = json_encode($response_body);
    14         $request = array(
    15             'body' => $response_body,
    16         );
     56    $success = isset($response_body['success'])
     57        ? $response_body['success']
     58        : false;
    1759
    18         $response = wp_remote_post( esc_url_raw( $endpoint ), $request );
    19         $status = wp_remote_retrieve_response_code( $response );
     60    $errorCodes = isset($response_body['errors'])
     61        ? $response_body['errors']
     62        : array();
    2063
    21         // Useful for debugging
    22         // trigger_error($body);
    2364
    24         $response_body = wp_remote_retrieve_body( $response );
    25         $response_body = json_decode( $response_body, true );
     65    return array(
     66        "success" => $success,
     67        "status" => $status,
     68        "error_codes" => $errorCodes
     69    );
     70}
    2671
    27         if ( 200 != $status ) {
    28             if ( WP_DEBUG ) {
    29                 frcaptcha_log_remote_request( $endpoint, $request, $response );
    30                 // error_log("The body was " . $body);
    31             }
    32             // Better safe than sorry, if the request is non-200 we can not verify the response
    33             // Either the user's credentials are wrong (e.g. wrong sitekey, api key) or the friendly
    34             // captcha servers are unresponsive.
    35            
    36             // TODO notify site admin somehow
    37             return array(
    38                 "success" => true,
    39                 "status" => $status,
    40                 "errors" => array(),
    41                 "response_body" => $response_body
     72function frcaptcha_v2_verify_captcha_solution($solution, $sitekey, $api_key)
     73{
     74    $config = new ClientConfig();
     75    $config->setAPIKey($api_key)->setSitekey($sitekey);
     76    if (FriendlyCaptcha_Plugin::$instance->get_eu_puzzle_endpoint_active()) {
     77        $config->setSiteverifyEndpoint("eu");
     78    }
     79
     80    $captchaClient = new Client($config);
     81
     82    $result = $captchaClient->verifyCaptchaResponse($solution);
     83
     84    if (!$result->wasAbleToVerify()) {
     85        if (WP_DEBUG) {
     86            frcaptcha_v2_log_verify_response(
     87                $config->siteverifyEndpoint,
     88                $result->status,
     89                $result->response->error->error_code
    4290            );
    4391        }
    4492
    45         $success = isset( $response_body['success'] )
    46             ? $response_body['success']
    47             : false;
     93        $raw_response = json_encode($result->response);
     94        FriendlyCaptcha_Plugin::$instance->show_verification_failed_alert($raw_response);
    4895
    49         $errorCodes = isset( $response_body['errors'] )
    50             ? $response_body['errors']
    51             : array();
     96        // Better safe than sorry, when we can not verify the response
     97        // Either the user's credentials are wrong (e.g. wrong sitekey, api key) or the friendly
     98        // captcha servers are unresponsive.
    5299
     100        return array(
     101            "success" => true,
     102            "status" => $result->status,
     103            "errors" => array()
     104        );
     105    }
    53106
    54         return array(
    55             "success" => $success,
    56             "status" => $status,
    57             "error_codes" => $errorCodes,
    58             "response_body" => $response_body
    59         );
     107    $errorCodes = $result->getErrorCode() ? [$result->getErrorCode()] : [];
     108    return array(
     109        "success" => $result->shouldAccept(),
     110        "status" => $result->status,
     111        "error_codes" => $errorCodes
     112    );
    60113}
  • friendly-captcha/tags/1.14.0/modules/avada-forms/avada-forms.php

    r2937557 r3095155  
    11<?php
    22
    3 add_action( 'fusion_element_button_content', 'add_friendly_captcha', 10, 2 );
    4 add_filter( 'fusion_form_demo_mode', 'verify_friendly_captcha' );
     3add_action('fusion_element_button_content', 'add_friendly_captcha', 10, 2);
     4add_filter('fusion_form_demo_mode', 'verify_friendly_captcha');
    55
    6 function add_friendly_captcha( $html, $args ) {
    7     if ( false === strpos( $html, '<button type="submit"' ) ) {
     6function add_friendly_captcha($html, $args)
     7{
     8    if (false === strpos($html, '<button type="submit"')) {
    89        return $html;
    910    }
     
    2122}
    2223
    23 function verify_friendly_captcha( $demo_mode ) {
     24function verify_friendly_captcha($demo_mode)
     25{
    2426    $plugin = FriendlyCaptcha_Plugin::$instance;
    2527
     
    3032    // This is a modified version of frcaptcha_get_sanitized_frcaptcha_solution_from_post which looks for the solution in the formData key
    3133    $form_data = $_POST['formData'];
    32     $form_data = wp_parse_args( str_replace( '&amp;', '&', $form_data ) );
     34    $form_data = wp_parse_args(str_replace('&amp;', '&', $form_data));
    3335
    34     $post_value = $form_data['frc-captcha-solution'];
    35     $solution = isset($post_value) ? trim(sanitize_text_field($post_value)) : '';
     36    $field_name = FriendlyCaptcha_Plugin::$instance->get_solution_field_name();
     37    $post_value = $form_data[$field_name];
     38    $solution = isset($post_value) ? trim(sanitize_text_field($post_value)) : '';
    3639
    37     if ( empty( $solution ) ) {
     40    if (empty($solution)) {
    3841        $message = FriendlyCaptcha_Plugin::default_error_user_message() . __(" (captcha missing)", "frcaptcha");
    39         die( wp_json_encode( [ 'status' => 'error', 'info' => [ 'friendly_captcha' => $message ] ] ) );
     42        die(wp_json_encode(['status' => 'error', 'info' => ['friendly_captcha' => $message]]));
    4043    }
    4144
    4245    $verification = frcaptcha_verify_captcha_solution($solution, $plugin->get_sitekey(), $plugin->get_api_key());
    4346
    44     if ( !$verification["success"] ) {
     47    if (!$verification["success"]) {
    4548        $message = FriendlyCaptcha_Plugin::default_error_user_message();
    46         die( wp_json_encode( [ 'status' => 'error', 'info' => [ 'friendly_captcha' => $message ] ] ) );
     49        die(wp_json_encode(['status' => 'error', 'info' => ['friendly_captcha' => $message]]));
    4750    }
    4851
  • friendly-captcha/tags/1.14.0/modules/coblocks/coblocks.php

    r2673817 r3095155  
    2424
    2525        add_action('enqueue_block_editor_assets', array($instance, 'frcaptcha_coblocks_enqueue_block_editor_assets'));
    26 
    2726    }
    2827
     
    3534    public function frcaptcha_coblocks_enqueue_block_editor_assets()
    3635    {
    37         wp_enqueue_script('frcaptcha_coblocks_load_addon', plugin_dir_url(__FILE__) . '/script.js',
     36        wp_enqueue_script(
     37            'frcaptcha_coblocks_load_addon',
     38            plugin_dir_url(__FILE__) . '/script.js',
    3839            array('wp-blocks', 'wp-editor', 'wp-element', 'wp-i18n'),
    3940            filemtime(plugin_dir_path(__FILE__) . 'script.js')
     
    5859        }
    5960
    60         $errorPrefix = '<strong>' . __( 'Error', 'wp-captcha' ) . '</strong> : ';
     61        $errorPrefix = '<strong>' . __('Error', 'wp-captcha') . '</strong> : ';
    6162        $solution = frcaptcha_get_sanitized_frcaptcha_solution_from_post();
    6263
    63         if (empty( $solution )) {
     64        if (empty($solution)) {
    6465            wp_die($errorPrefix . FriendlyCaptcha_Plugin::default_error_user_message() . __(" (captcha missing)", "frcaptcha"));
    6566        }
     
    7071        }
    7172
    72         unset($_POST['frc-captcha-solution']); // suppress the solution in email message
     73        $fieldName = FriendlyCaptcha_Plugin::$instance->get_solution_field_name();
     74        unset($_POST[$fieldName]); // suppress the solution in email message
    7375    }
    7476}
    75 
    76 
    77 
    78 
    79 
    80 
    81 
  • friendly-captcha/tags/1.14.0/modules/contact-form-7/script.js

    r3045871 r3095155  
    11(function () {
    22  var resetFriendlyCaptchaWidget = function () {
    3     window.friendlyChallenge.autoWidget.reset();
     3    if (window.friendlyChallenge) {
     4      window.friendlyChallenge.autoWidget.reset();
     5    }
     6    if (window.frcaptcha) {
     7      window.frcaptcha.widgets.forEach(function(w) { w.reset() });
     8    }
    49  };
    510  document.addEventListener("DOMContentLoaded", function (event) {
  • friendly-captcha/tags/1.14.0/modules/divi/divi.php

    r3080369 r3095155  
    2626    }
    2727
    28     public static function enable($_names_by_slug) {
     28    public static function enable($_names_by_slug)
     29    {
    2930        $plugin = FriendlyCaptcha_Plugin::$instance;
    3031
     
    5253
    5354        return $value;
    54 
    5555    }
    5656
     
    6767        }
    6868
    69         $output = str_replace(self::INSERT_BEFORE,
     69        $output = str_replace(
     70            self::INSERT_BEFORE,
    7071            frcaptcha_generate_widget_tag_from_plugin(FriendlyCaptcha_Plugin::$instance) . self::INSERT_BEFORE,
    7172            $output
     
    8283    public static function fakeToken()
    8384    {
    84         if (isset($_POST['frc-captcha-solution'])) {
    85             $_POST['token'] = $_POST['frc-captcha-solution'];
     85        $fieldName = FriendlyCaptcha_Plugin::$instance->get_solution_field_name();
     86        if (isset($_POST[$fieldName])) {
     87            $_POST['token'] = $_POST[$fieldName];
    8688        }
    8789    }
  • friendly-captcha/tags/1.14.0/modules/elementor/script.js

    r3045871 r3095155  
    1111    }
    1212
    13     const widget = element.friendlyChallengeWidget;
    14     if (!widget) {
    15       return;
    16     }
    17 
    1813    setTimeout(() => {
    1914      // We reset the widget after a short delay to give the form time to grab the solution and submit it
    2015      // This is a workaround for the fact that the form submit event is fired before the solution value is grabbed
    2116      // 1 second is really conservative as this is not affected by network speed or anything like that
    22       widget.reset();
     17      if (element.friendlyChallengeWidget) {
     18        element.friendlyChallengeWidget.reset();
     19      } else if (element.frcWidget) {
     20        element.frcWidget.reset();
     21      }
    2322    }, 1000);
    2423  });
  • friendly-captcha/tags/1.14.0/modules/fluentform/fluentform.php

    r2709857 r3095155  
    11<?php
    22
    3 add_action( 'fluentform_render_item_submit_button', 'frcaptcha_fluentform_show_widget', 10, 0 );
     3add_action('fluentform_render_item_submit_button', 'frcaptcha_fluentform_show_widget', 10, 0);
    44
    5 function frcaptcha_fluentform_show_widget() {
     5function frcaptcha_fluentform_show_widget()
     6{
    67    $plugin = FriendlyCaptcha_Plugin::$instance;
    78    if (!$plugin->is_configured() or !$plugin->get_fluentform_active()) {
     
    1718}
    1819
    19 add_filter( 'fluentform_before_insert_submission', 'frcaptcha_fluentform_validate', 20, 3 );   
     20add_filter('fluentform_before_insert_submission', 'frcaptcha_fluentform_validate', 20, 3);
    2021
    21 function frcaptcha_fluentform_validate($insert_data, $data, $form) {
     22function frcaptcha_fluentform_validate($insert_data, $data, $form)
     23{
    2224
    2325    $plugin = FriendlyCaptcha_Plugin::$instance;
     
    2628    }
    2729
    28     $solution = $data['frc-captcha-solution'];
     30    $fieldName = FriendlyCaptcha_Plugin::$instance->get_solution_field_name();
     31    $solution = $data[$fieldName];
    2932
    30     if ( empty( $solution ) ) {
     33    if (empty($solution)) {
    3134        $error_message = FriendlyCaptcha_Plugin::default_error_user_message() . __(" (captcha missing)", "frcaptcha");
    3235        wp_send_json(
    3336            [
    3437                'errors' => [
    35                     'g-recaptcha-response' => [ $error_message ],
     38                    'g-recaptcha-response' => [$error_message],
    3639                ],
    3740            ],
     
    4750            [
    4851                'errors' => [
    49                     'g-recaptcha-response' => [ $error_message ],
     52                    'g-recaptcha-response' => [$error_message],
    5053                ],
    5154            ],
  • friendly-captcha/tags/1.14.0/modules/wpforms/script.js

    r3045871 r3095155  
    77
    88    elements.each((_, e) => {
    9       const widget = e.friendlyChallengeWidget;
    10       console.log(widget);
    11       if (!widget) {
    12         return;
     9      if (e.friendlyChallengeWidget) {
     10        e.friendlyChallengeWidget.reset();
     11      } else if (e.frcWidget) {
     12        e.frcWidget.reset();
    1313      }
    14 
    15       widget.reset();
    1614    });
    1715  }
  • friendly-captcha/tags/1.14.0/public/mutation-observer.js

    r3080369 r3095155  
    88  }
    99
    10   function setupCaptchaElements(node) {
    11     if (!window.friendlyChallenge) {
    12       // The friendly-challenge library has not been loaded yet
    13       return;
    14     }
    15 
     10  function setupV1CaptchaElements(node) {
    1611    let autoWidget = window.friendlyChallenge.autoWidget;
    1712
     
    2924  }
    3025
     26  function setupV2CaptchaElements(node) {
     27    const elements = findCaptchaElements(node);
     28    window.frcaptcha.attach(elements);
     29  }
     30
    3131  const observer = new MutationObserver((mutationList) => {
    3232    for (let m = 0; m < mutationList.length; m++) {
     
    3434
    3535      const nodes = mutation.addedNodes;
    36 
    3736      for (let n = 0; n < nodes.length; n++) {
    38         setupCaptchaElements(nodes[n]);
     37        if (window.friendlyChallenge) {
     38          setupV1CaptchaElements(nodes[n]);
     39        } else if (window.frcaptcha) {
     40          setupV2CaptchaElements(nodes[n]);
     41        }
    3942      }
    4043    }
    4144  });
    4245
    43   function init()  {
     46  function init() {
    4447    // Start observing the document body for changes
    4548    observer.observe(document.body, {
     
    4750      childList: true,
    4851      subtree: true,
    49   })};
     52    });
     53  }
    5054
    5155  init();
  • friendly-captcha/tags/1.14.0/public/widgets.php

    r3080369 r3095155  
    11<?php
    22
    3 function frcaptcha_enqueue_widget_scripts($forceMutationObserver = false) {
     3function frcaptcha_enqueue_widget_scripts($forceMutationObserver = false)
     4{
    45    $plugin = FriendlyCaptcha_Plugin::$instance;
    56
    6     if ( !$plugin->is_configured() ) {
     7    if (!$plugin->is_configured()) {
    78        return;
    89    }
    910
     11    if (FriendlyCaptcha_Plugin::$instance->get_enable_v2()) {
     12        return frcaptcha_v2_enqueue_widget_scripts();
     13    } else {
     14        return frcaptcha_v1_enqueue_widget_scripts();
     15    }
     16
     17    frcaptcha_mutation_observer_scripts($plugin, $forceMutationObserver);
     18}
     19
     20function frcaptcha_v1_enqueue_widget_scripts()
     21{
    1022    $version = FriendlyCaptcha_Plugin::$friendly_challenge_version;
    1123
    1224    /* Modern browsers will load this smaller bundle */
    13     wp_enqueue_script( 'friendly-captcha-widget-module',
    14         plugin_dir_url( __FILE__ ) . 'vendor/widget.module.min.js',
     25    wp_enqueue_script(
     26        'friendly-captcha-widget-module',
     27        plugin_dir_url(__FILE__) . 'vendor/v1/widget.module.min.js',
    1528        array(),
    1629        $version,
     
    1932
    2033    /* Fallback for (very) old browsers */
    21     wp_enqueue_script( 'friendly-captcha-widget-fallback',
    22         plugin_dir_url( __FILE__ ) . 'vendor/widget.polyfilled.min.js',
    23         array(),
    24         $version,
    25         true
    26     );
    27 
    28     if ( $forceMutationObserver || $plugin->get_enable_mutation_observer() ) {
    29         wp_enqueue_script( 'friendly-captcha-mutation-observer',
    30             plugin_dir_url( __FILE__ ) . 'mutation-observer.js',
     34    wp_enqueue_script(
     35        'friendly-captcha-widget-fallback',
     36        plugin_dir_url(__FILE__) . 'vendor/v1/widget.min.js',
     37        array(),
     38        $version,
     39        true
     40    );
     41}
     42
     43function frcaptcha_v2_enqueue_widget_scripts()
     44{
     45    $version = FriendlyCaptcha_Plugin::$friendly_captcha_sdk_version;
     46
     47    /* Modern browsers will load this smaller bundle */
     48    wp_enqueue_script(
     49        'friendly-captcha-widget-module',
     50        plugin_dir_url(__FILE__) . 'vendor/v2/site.min.js',
     51        array(),
     52        $version,
     53        true
     54    );
     55
     56    /* Fallback for (very) old browsers */
     57    wp_enqueue_script(
     58        'friendly-captcha-widget-fallback',
     59        plugin_dir_url(__FILE__) . 'vendor/v2/site.compat.min.js',
     60        array(),
     61        $version,
     62        true
     63    );
     64}
     65
     66function frcaptcha_mutation_observer_scripts($plugin, $forceMutationObserver)
     67{
     68    $version = FriendlyCaptcha_Plugin::$version;
     69
     70    if ($forceMutationObserver || $plugin->get_enable_mutation_observer()) {
     71        wp_enqueue_script(
     72            'friendly-captcha-mutation-observer',
     73            plugin_dir_url(__FILE__) . 'mutation-observer.js',
    3174            array(),
    3275            $version,
     
    3982 * Useful if for some reason wp_enqueue_script doesn't work (as seems to be the case with WPForms?!)
    4083 */
    41 function frcaptcha_echo_script_tags() {
     84function frcaptcha_echo_script_tags()
     85{
    4286    $plugin = FriendlyCaptcha_Plugin::$instance;
    4387
    44     if ( !$plugin->is_configured() ) {
     88    if (!$plugin->is_configured()) {
    4589        return;
    4690    }
    4791
     92    if ($plugin->get_enable_v2()) {
     93        return frcaptcha_v2_echo_script_tags();
     94    } else {
     95        return frcaptcha_v1_echo_script_tags();
     96    }
     97}
     98
     99function frcaptcha_v1_echo_script_tags()
     100{
    48101    $version = FriendlyCaptcha_Plugin::$friendly_challenge_version;
    49102
    50     echo '<script async defer type="module" src="'. plugin_dir_url( __FILE__ ) . 'vendor/widget.module.min.js?ver=' . $version . '"></script>';
    51     echo '<script async defer nomodule src="'. plugin_dir_url( __FILE__ ) . 'vendor/widget.polyfilled.min.js?ver=' . $version . '"></script>';
    52 }
    53 
    54 add_filter( 'script_loader_tag', 'frcaptcha_transform_friendly_captcha_script_tags', 10, 3 );
    55 
    56 function frcaptcha_transform_friendly_captcha_script_tags( $tag, $handle, $src )
    57 {
    58     if ( 'friendly-captcha-widget-module' == $handle) {
    59         return str_replace( '<script', '<script async defer type="module"', $tag );
    60     }
    61     if ( 'friendly-captcha-widget-fallback' == $handle) {
    62         return str_replace( '<script', '<script async defer nomodule', $tag );
    63     }
    64     if ( 'friendly-captcha-mutation-observer' == $handle) {
    65         return str_replace( '<script', '<script async defer', $tag );
    66     }
    67 
    68     return $tag;
    69 }
    70 
    71 function frcaptcha_generate_widget_tag_from_plugin($plugin) {
    72     if (!$plugin->is_configured()) {
    73         return "";
    74     }
    75 
    76     $sitekey = $plugin->get_sitekey();
    77     $lang = $plugin->get_widget_language();
     103    echo '<script async defer type="module" src="' . plugin_dir_url(__FILE__) . 'vendor/v1/widget.module.min.js?ver=' . $version . '"></script>';
     104    echo '<script async defer nomodule src="' . plugin_dir_url(__FILE__) . 'vendor/v1/widget.min.js?ver=' . $version . '"></script>';
     105}
     106
     107
     108function frcaptcha_v2_echo_script_tags()
     109{
     110    $version = FriendlyCaptcha_Plugin::$friendly_captcha_sdk_version;
     111
     112    echo '<script async defer type="module" src="' . plugin_dir_url(__FILE__) . 'vendor/v2/site.min.js?ver=' . $version . '"></script>';
     113    echo '<script async defer nomodule src="' . plugin_dir_url(__FILE__) . 'vendor/v2/site.compat.min.js?ver=' . $version . '"></script>';
     114}
     115
     116add_filter('script_loader_tag', 'frcaptcha_transform_friendly_captcha_script_tags', 10, 3);
     117
     118function frcaptcha_transform_friendly_captcha_script_tags($tag, $handle, $src)
     119{
     120    if ('friendly-captcha-widget-module' == $handle) {
     121        return str_replace('<script', '<script async defer type="module"', $tag);
     122    }
     123    if ('friendly-captcha-widget-fallback' == $handle) {
     124        return str_replace('<script', '<script async defer nomodule', $tag);
     125    }
     126    if ('friendly-captcha-mutation-observer' == $handle) {
     127        return str_replace('<script', '<script async defer', $tag);
     128    }
     129
     130    return $tag;
     131}
     132
     133function frcaptcha_generate_widget_tag_from_plugin($plugin)
     134{
     135    if (!$plugin->is_configured()) {
     136        return "";
     137    }
     138
     139    if ($plugin->get_enable_v2()) {
     140        return frcaptcha_v2_generate_widget_tag_from_plugin($plugin);
     141    } else {
     142        return frcaptcha_v1_generate_widget_tag_from_plugin($plugin);
     143    }
     144}
     145
     146function frcaptcha_v1_generate_widget_tag_from_plugin($plugin)
     147{
     148    $sitekey = $plugin->get_sitekey();
     149    $lang = $plugin->get_widget_language();
    78150
    79151    $extra_attributes = "";
     
    92164        '%s%s',
    93165        frcaptcha_generate_skip_style_injection_tag($plugin),
    94         frcaptcha_generate_widget_tag($sitekey, $lang, $extra_attributes, $theme)
    95     );
    96 }
    97 
    98 function frcaptcha_generate_widget_tag($sitekey, $language, $extra_attributes = "", $theme = "") {
    99     return sprintf(
     166        frcaptcha_v1_generate_widget_tag($sitekey, $lang, $extra_attributes, $theme)
     167    );
     168}
     169
     170function frcaptcha_v2_generate_widget_tag_from_plugin($plugin)
     171{
     172    $sitekey = $plugin->get_sitekey();
     173
     174    $extra_attributes = "";
     175    $eu = $plugin->get_eu_puzzle_endpoint_active();
     176
     177    if ($eu) {
     178        $extra_attributes = "data-api-endpoint=\"eu\"";
     179    }
     180
     181    $theme = $plugin->get_widget_dark_theme_active() ? "dark" : "light";
     182
     183    return sprintf(
     184        '%s%s',
     185        frcaptcha_generate_skip_style_injection_tag($plugin),
     186        frcaptcha_v2_generate_widget_tag($sitekey, $extra_attributes, $theme)
     187    );
     188}
     189
     190function frcaptcha_v1_generate_widget_tag($sitekey, $language, $extra_attributes = "", $theme = "")
     191{
     192    return sprintf(
    100193        '<div class="frc-captcha %s" data-sitekey="%s" data-lang="%s" %s></div>
    101194        <noscript>You need to enable Javascript for the anti-spam check.</noscript>',
    102     esc_html($theme),
    103     esc_html($sitekey),
    104     esc_html($language),
    105     $extra_attributes);
     195        esc_html($theme),
     196        esc_html($sitekey),
     197        esc_html($language),
     198        $extra_attributes
     199    );
     200}
     201
     202function frcaptcha_v2_generate_widget_tag($sitekey, $extra_attributes = "", $theme = "light")
     203{
     204    return sprintf(
     205        '<div class="frc-captcha" data-sitekey="%s" data-theme="%s" %s></div>
     206        <noscript>You need to enable Javascript for the anti-spam check.</noscript>',
     207        esc_html($sitekey),
     208        esc_html($theme),
     209        $extra_attributes
     210    );
    106211}
    107212
    108213$frcaptcha_skip_style_injection_tag_injected = false;
    109214
    110 function frcaptcha_generate_skip_style_injection_tag($plugin) {
     215function frcaptcha_generate_skip_style_injection_tag($plugin)
     216{
     217    global $frcaptcha_skip_style_injection_tag_injected;
     218
    111219    if (!$plugin->get_skip_style_injection()) {
    112220        return '';
     
    121229    return '<div id="frc-style"></div>';
    122230}
    123 
    124 function frcaptcha_generate_extra_widget_attributes($plugin) {
    125 }
  • friendly-captcha/tags/1.14.0/readme.txt

    r3080369 r3095155  
    33Tags: captcha, antispam, spam, contact form, recaptcha, friendly-captcha, block spam, anti-spam, comments, elementor
    44Requires at least: 5.0
    5 Tested up to: 6.4
     5Tested up to: 6.5
    66Requires PHP: 7.3
    7 Stable tag: 1.13.0
     7Stable tag: 1.14.0
    88License: GPL v2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html 
     
    9797== Changelog ==
    9898
     99= 1.14.0 =
     100
     101* Add support for Friendly Captcha v2 (preview)
     102* Show an admin notice when verification has failed
     103
    99104= 1.13.0 =
    100105
  • friendly-captcha/trunk/friendly-captcha.php

    r3080369 r3095155  
    44 * Plugin Name: Friendly Captcha for WordPress
    55 * Description: Protect WordPress website forms from spam and abuse with Friendly Captcha, a privacy-first anti-bot solution.
    6  * Version: 1.13.0
     6 * Version: 1.14.0
    77 * Requires at least: 5.0
    88 * Requires PHP: 7.3
     
    2020}
    2121
    22 define('FRIENDLY_CAPTCHA_VERSION', '1.13.0');
     22define('FRIENDLY_CAPTCHA_VERSION', '1.14.0');
    2323define('FRIENDLY_CAPTCHA_FRIENDLY_CHALLENGE_VERSION', '0.9.12');
     24define('FRIENDLY_CAPTCHA_FRIENDLY_CAPTCHA_SDK_VERSION', '0.1.7');
    2425define('FRIENDLY_CAPTCHA_SUPPORTED_LANGUAGES', [
    2526    "en" => "English",
     
    6667}
    6768
     69require plugin_dir_path(__FILE__) . 'vendor/autoload.php';
    6870require plugin_dir_path(__FILE__) . 'includes/core.php';
  • friendly-captcha/trunk/includes/admin.php

    r2889247 r3095155  
    11<?php
    22
    3 require plugin_dir_path( __FILE__ ) . '../admin/options.php';
     3require plugin_dir_path(__FILE__) . '../admin/options.php';
    44
    55if (is_admin()) {
    6     add_action( 'admin_menu', 'frcaptcha_options_page' );
     6    add_action('admin_menu', 'frcaptcha_options_page');
    77
    88    // Add link to settings page in the navbar
    9     function frcaptcha_options_page() {
     9    function frcaptcha_options_page()
     10    {
    1011        add_options_page(
    1112            'Friendly Captcha',
     
    1920
    2021    // Add link to settings in the plugin list
    21     add_filter( 'plugin_action_links_friendly-captcha/friendly-captcha.php', 'frcaptcha_settings_link' );
    22     function frcaptcha_settings_link( $links ) {
    23         $url = esc_url( add_query_arg(
     22    add_filter('plugin_action_links_friendly-captcha/friendly-captcha.php', 'frcaptcha_settings_link');
     23    function frcaptcha_settings_link($links)
     24    {
     25        $url = esc_url(add_query_arg(
    2426            'page',
    2527            'friendly_captcha_admin',
    2628            get_admin_url() . 'options-general.php'
    27         ) );
    28         $settings_link = "<a href='$url'>" . __( 'Settings' ) . '</a>';
    29        
     29        ));
     30        $settings_link = "<a href='$url'>" . __('Settings') . '</a>';
     31
    3032        array_push(
    3133            $links,
     
    3638
    3739    if (!FriendlyCaptcha_Plugin::$instance->is_configured()) {
    38         function frcaptcha_admin_notice__not_configured() {
    39             $url = esc_url( add_query_arg(
     40        function frcaptcha_admin_notice__not_configured()
     41        {
     42            $url = esc_url(add_query_arg(
    4043                'page',
    4144                'friendly_captcha_admin',
    4245                get_admin_url() . 'options-general.php'
    43             ) );
     46            ));
    4447
    45             ?>
     48?>
    4649            <div class="notice notice-error is-dismissible">
    4750                <p>
    48                     <b>Friendly Captcha is not configured yet!</b>
    49                     Visit the <a href="<?php echo $url ?>">Friendly Captcha settings</a> and enter a valid Sitekey and API Key to complete the setup.</p>
     51                    <b>Friendly Captcha is not configured yet!</b>
     52                    Visit the <a href="<?php echo $url ?>">Friendly Captcha settings</a> and enter a valid Sitekey and API Key to complete the setup.
     53                </p>
    5054            </div>
    51             <?php
     55        <?php
    5256        }
    5357
    54         add_action( 'admin_notices', 'frcaptcha_admin_notice__not_configured' );
     58        add_action('admin_notices', 'frcaptcha_admin_notice__not_configured');
     59    }
     60
     61    if (isset($_GET['frcaptcha-verification-failed-dismissed'])) {
     62        FriendlyCaptcha_Plugin::$instance->remove_verification_failed_alert();
     63    }
     64
     65    if (FriendlyCaptcha_Plugin::$instance->get_verification_failed_alert() != false) {
     66        function frcaptcha_admin_notice__verification_failed()
     67        {
     68            $url = esc_url(add_query_arg(
     69                'page',
     70                'friendly_captcha_admin',
     71                get_admin_url() . 'options-general.php'
     72            ));
     73
     74        ?>
     75            <div class="notice notice-error is-dismissible">
     76                <p>
     77                    <b>Friendly Captcha verification has failed!</b>
     78                    <br>
     79                    This is usually because you have entered an incorrect API Key. Please visit the <a href="<?php echo $url ?>">Friendly Captcha settings</a> and enter a valid Sitekey and API Key.
     80                    <br><br>
     81                    <code><?php echo FriendlyCaptcha_Plugin::$instance->get_verification_failed_alert(); ?></code>
     82                </p>
     83                <a href="?frcaptcha-verification-failed-dismissed" class="notice-dismiss" style="text-decoration: none;">
     84                    <span class="screen-reader-text">Dismiss this notice.</span>
     85                </a>
     86            </div>
     87<?php
     88        }
     89
     90        add_action('admin_notices', 'frcaptcha_admin_notice__verification_failed');
    5591    }
    5692}
  • friendly-captcha/trunk/includes/core.php

    r3080369 r3095155  
    22
    33/* Main entry point */
    4 
    5 // TODO: is this necessary? It breaks intellisense..
    6 // if ( !class_exists( 'FriendlyCaptcha_Plugin' ) ) {
    7     class FriendlyCaptcha_Plugin {
    8 
    9         /**
    10          * Singleton global instance
    11          */
    12         public static $instance;
    13         public $plugin_name;
    14 
    15         public static $version;
    16         public static $friendly_challenge_version;
    17 
    18         // Global constants
    19         public static $option_group = "frcaptcha_options";
    20         public static $option_sitekey_name = "frcaptcha_sitekey";
    21         public static $option_api_key_name = "frcaptcha_api_key";
    22         public static $option_skip_style_injection_name = "frcaptcha_skip_style_injection";
    23         public static $option_enable_mutation_observer_name = "frcaptcha_enable_mutation_observer";
    24 
    25         // Integrations
    26         public static $option_contact_form_7_integration_active_name = "frcaptcha_contact_form_7_integration_active";
    27         public static $option_f12_cf7_doubleoptin_integration_active_name = "frcaptcha_f12_cf7_doubleoptin_integration_active";
    28         public static $option_wpforms_integration_active_name = "frcaptcha_wpforms_integration_active";
    29         public static $option_gravity_forms_integration_active_name = "frcaptcha_gravity_forms_integration_active";
    30         public static $option_coblocks_integration_active_name = "frcaptcha_coblocks_integration_active";
    31         public static $option_fluentform_integration_active_name = "frcaptcha_fluentform_integration_active";
    32         public static $option_elementor_forms_integration_active_name = "frcaptcha_elementor_integration_active";
    33         public static $option_html_forms_integration_active_name = "frcaptcha_html_forms_integration_active";
    34         public static $option_forminator_integration_active_name = "frcaptcha_forminator_integration_active";
    35         public static $option_formidable_integration_active_name = "frcaptcha_formidable_integration_active";
    36         public static $option_avada_forms_integration_active_name = "frcaptcha_avada_forms_integration_active";
    37 
    38         public static $option_wp_register_integration_active_name = "frcaptcha_wp_register_integration_active";
    39         public static $option_wp_login_integration_active_name = "frcaptcha_wp_login_integration_active";
    40         public static $option_wp_reset_password_integration_active_name = "frcaptcha_wp_reset_password_integration_active";
    41         public static $option_wp_comments_integration_active_name = "frcaptcha_wp_comments_integration_active";
    42         public static $option_wp_comments_logged_in_integration_active_name = "frcaptcha_wp_comments_logged_in_integration_active";
    43 
    44         public static $option_wc_register_integration_active_name = "frcaptcha_wc_register_integration_active";
    45         public static $option_wc_login_integration_active_name = "frcaptcha_wc_login_integration_active";
    46         public static $option_wc_lost_password_integration_active_name = "frcaptcha_wc_lost_password_integration_active";
    47         public static $option_wc_checkout_integration_active_name = "frcaptcha_wc_checkout_integration_active";
    48 
    49         public static $option_um_login_integration_active_name = "frcaptcha_um_login_integration_active";
    50         public static $option_um_register_integration_active_name = "frcaptcha_um_register_integration_active";
    51         public static $option_um_reset_password_integration_active_name = "frcaptcha_um_reset_password_integration_active";
    52 
    53         public static $option_wpum_registration_integration_active_name = "frcaptcha_wpum_registration_integration_active";
    54         public static $option_wpum_login_integration_active_name = "frcaptcha_wpum_login_integration_active";
    55         public static $option_wpum_password_recovery_integration_active_name = "frcaptcha_wpum_password_recovery_integration_active";
    56 
    57         public static $option_pb_login_integration_active_name = "frcaptcha_pb_login_integration_active";
    58         public static $option_pb_register_integration_active_name = "frcaptcha_pb_register_integration_active";
    59         public static $option_pb_reset_password_integration_active_name = "frcaptcha_pb_reset_password_integration_active";
    60         public static $option_divi_integration_active_name = "frcaptcha_divi_integration_active";
    61 
    62         public static $option_widget_language_name = "frcaptcha_widget_language";
    63         public static $option_widget_dark_theme_active_name = "frcaptcha_widget_dark_theme_active";
    64 
    65         public static $option_global_puzzle_endpoint_active_name = "frcaptcha_global_endpoint_active";
    66         public static $option_eu_puzzle_endpoint_active_name = "frcaptcha_eu_endpoint_active";
    67 
    68 
    69         public function init() {
    70             if ( defined( 'FRIENDLY_CAPTCHA_VERSION' ) ) {
    71                 FriendlyCaptcha_Plugin::$version = FRIENDLY_CAPTCHA_VERSION;
    72                 FriendlyCaptcha_Plugin::$friendly_challenge_version = FRIENDLY_CAPTCHA_FRIENDLY_CHALLENGE_VERSION;
    73             } else {
    74                 FriendlyCaptcha_Plugin::$version = '0.0.0';
    75                 FriendlyCaptcha_Plugin::$friendly_challenge_version = '0.0.0';
     4class FriendlyCaptcha_Plugin
     5{
     6
     7    /**
     8     * Singleton global instance
     9     * @var FriendlyCaptcha_Plugin
     10     */
     11    public static $instance;
     12    public $plugin_name;
     13
     14    public static $version;
     15    // JavaScript client SDK for v1
     16    public static $friendly_challenge_version;
     17    // JavaScript client SDK for v2
     18    public static $friendly_captcha_sdk_version;
     19
     20    // Global constants
     21    public static $option_group = "frcaptcha_options";
     22    public static $option_sitekey_name = "frcaptcha_sitekey";
     23    public static $option_api_key_name = "frcaptcha_api_key";
     24    public static $option_skip_style_injection_name = "frcaptcha_skip_style_injection";
     25    public static $option_enable_mutation_observer_name = "frcaptcha_enable_mutation_observer";
     26    public static $option_enable_v2_name = "frcaptcha_enable_v2";
     27
     28    // Integrations
     29    public static $option_contact_form_7_integration_active_name = "frcaptcha_contact_form_7_integration_active";
     30    public static $option_f12_cf7_doubleoptin_integration_active_name = "frcaptcha_f12_cf7_doubleoptin_integration_active";
     31    public static $option_wpforms_integration_active_name = "frcaptcha_wpforms_integration_active";
     32    public static $option_gravity_forms_integration_active_name = "frcaptcha_gravity_forms_integration_active";
     33    public static $option_coblocks_integration_active_name = "frcaptcha_coblocks_integration_active";
     34    public static $option_fluentform_integration_active_name = "frcaptcha_fluentform_integration_active";
     35    public static $option_elementor_forms_integration_active_name = "frcaptcha_elementor_integration_active";
     36    public static $option_html_forms_integration_active_name = "frcaptcha_html_forms_integration_active";
     37    public static $option_forminator_integration_active_name = "frcaptcha_forminator_integration_active";
     38    public static $option_formidable_integration_active_name = "frcaptcha_formidable_integration_active";
     39    public static $option_avada_forms_integration_active_name = "frcaptcha_avada_forms_integration_active";
     40
     41    public static $option_wp_register_integration_active_name = "frcaptcha_wp_register_integration_active";
     42    public static $option_wp_login_integration_active_name = "frcaptcha_wp_login_integration_active";
     43    public static $option_wp_reset_password_integration_active_name = "frcaptcha_wp_reset_password_integration_active";
     44    public static $option_wp_comments_integration_active_name = "frcaptcha_wp_comments_integration_active";
     45    public static $option_wp_comments_logged_in_integration_active_name = "frcaptcha_wp_comments_logged_in_integration_active";
     46
     47    public static $option_wc_register_integration_active_name = "frcaptcha_wc_register_integration_active";
     48    public static $option_wc_login_integration_active_name = "frcaptcha_wc_login_integration_active";
     49    public static $option_wc_lost_password_integration_active_name = "frcaptcha_wc_lost_password_integration_active";
     50    public static $option_wc_checkout_integration_active_name = "frcaptcha_wc_checkout_integration_active";
     51
     52    public static $option_um_login_integration_active_name = "frcaptcha_um_login_integration_active";
     53    public static $option_um_register_integration_active_name = "frcaptcha_um_register_integration_active";
     54    public static $option_um_reset_password_integration_active_name = "frcaptcha_um_reset_password_integration_active";
     55
     56    public static $option_wpum_registration_integration_active_name = "frcaptcha_wpum_registration_integration_active";
     57    public static $option_wpum_login_integration_active_name = "frcaptcha_wpum_login_integration_active";
     58    public static $option_wpum_password_recovery_integration_active_name = "frcaptcha_wpum_password_recovery_integration_active";
     59
     60    public static $option_pb_login_integration_active_name = "frcaptcha_pb_login_integration_active";
     61    public static $option_pb_register_integration_active_name = "frcaptcha_pb_register_integration_active";
     62    public static $option_pb_reset_password_integration_active_name = "frcaptcha_pb_reset_password_integration_active";
     63    public static $option_divi_integration_active_name = "frcaptcha_divi_integration_active";
     64
     65    public static $option_widget_language_name = "frcaptcha_widget_language";
     66    public static $option_widget_dark_theme_active_name = "frcaptcha_widget_dark_theme_active";
     67
     68    public static $option_global_puzzle_endpoint_active_name = "frcaptcha_global_endpoint_active";
     69    public static $option_eu_puzzle_endpoint_active_name = "frcaptcha_eu_endpoint_active";
     70
     71    public static $option_verification_failed_alert_name = "frcaptcha_verification_failed_alert";
     72
     73    public function init()
     74    {
     75        if (defined('FRIENDLY_CAPTCHA_VERSION')) {
     76            FriendlyCaptcha_Plugin::$version = FRIENDLY_CAPTCHA_VERSION;
     77            FriendlyCaptcha_Plugin::$friendly_challenge_version = FRIENDLY_CAPTCHA_FRIENDLY_CHALLENGE_VERSION;
     78            FriendlyCaptcha_Plugin::$friendly_captcha_sdk_version = FRIENDLY_CAPTCHA_FRIENDLY_CAPTCHA_SDK_VERSION;
     79        } else {
     80            FriendlyCaptcha_Plugin::$version = '0.0.0';
     81            FriendlyCaptcha_Plugin::$friendly_challenge_version = '0.0.0';
     82            FriendlyCaptcha_Plugin::$friendly_captcha_sdk_version = '0.0.0';
     83        }
     84        $this->plugin_name = 'friendly-captcha';
     85
     86        FriendlyCaptcha_Plugin::$instance = $this;
     87    }
     88
     89    public static function default_error_user_message()
     90    {
     91        /* translators: this is the main error message shown to the user when the captcha failed or wasn't completed. */
     92        return __("Anti-robot verification failed, please try again.", "frcaptcha");
     93    }
     94
     95    /**
     96     * When both the sitekey and the apikey are set, we can consider the plugin configured.
     97     */
     98    public function is_configured()
     99    {
     100        return $this->get_sitekey() !== null && $this->get_sitekey() !== "" && $this->get_api_key() !== null && $this->get_api_key() !== "";
     101    }
     102
     103    public function get_sitekey()
     104    {
     105        return trim(get_option(FriendlyCaptcha_Plugin::$option_sitekey_name));
     106    }
     107
     108    public function get_api_key()
     109    {
     110        return trim(get_option(FriendlyCaptcha_Plugin::$option_api_key_name));
     111    }
     112
     113    public function get_skip_style_injection()
     114    {
     115        return get_option(FriendlyCaptcha_Plugin::$option_skip_style_injection_name) == 1;
     116    }
     117
     118    public function get_enable_mutation_observer()
     119    {
     120        return get_option(FriendlyCaptcha_Plugin::$option_enable_mutation_observer_name) == 1;
     121    }
     122
     123    public function get_enable_v2()
     124    {
     125        return get_option(FriendlyCaptcha_Plugin::$option_enable_v2_name) == 1;
     126    }
     127
     128    public function get_solution_field_name()
     129    {
     130        if ($this->get_enable_v2()) {
     131            return "frc-captcha-response";
     132        } else {
     133            return "frc-captcha-solution";
     134        }
     135    }
     136
     137    public function get_contact_form_7_active()
     138    {
     139        return get_option(FriendlyCaptcha_Plugin::$option_contact_form_7_integration_active_name) == 1;
     140    }
     141
     142    public function get_f12_cf7_doubleoptin_active()
     143    {
     144        return get_option(FriendlyCaptcha_Plugin::$option_f12_cf7_doubleoptin_integration_active_name) == 1;
     145    }
     146
     147    public function get_wpforms_active()
     148    {
     149        return get_option(FriendlyCaptcha_Plugin::$option_wpforms_integration_active_name) == 1;
     150    }
     151
     152    public function get_gravity_forms_active()
     153    {
     154        return get_option(FriendlyCaptcha_Plugin::$option_gravity_forms_integration_active_name) == 1;
     155    }
     156
     157    public function get_coblocks_active()
     158    {
     159        return get_option(FriendlyCaptcha_Plugin::$option_coblocks_integration_active_name) == 1;
     160    }
     161
     162    public function get_fluentform_active()
     163    {
     164        return get_option(FriendlyCaptcha_Plugin::$option_fluentform_integration_active_name) == 1;
     165    }
     166
     167    public function get_elementor_active()
     168    {
     169        return get_option(FriendlyCaptcha_Plugin::$option_elementor_forms_integration_active_name) == 1;
     170    }
     171
     172    public function get_html_forms_active()
     173    {
     174        return get_option(FriendlyCaptcha_Plugin::$option_html_forms_integration_active_name) == 1;
     175    }
     176
     177    public function get_forminator_active()
     178    {
     179        return get_option(FriendlyCaptcha_Plugin::$option_forminator_integration_active_name) == 1;
     180    }
     181
     182    public function get_formidable_active()
     183    {
     184        return get_option(FriendlyCaptcha_Plugin::$option_formidable_integration_active_name) == 1;
     185    }
     186
     187    public function get_avada_forms_active()
     188    {
     189        return get_option(FriendlyCaptcha_Plugin::$option_avada_forms_integration_active_name) == 1;
     190    }
     191
     192    public function get_wp_register_active()
     193    {
     194        return get_option(FriendlyCaptcha_Plugin::$option_wp_register_integration_active_name) == 1;
     195    }
     196
     197    public function get_wp_login_active()
     198    {
     199        return get_option(FriendlyCaptcha_Plugin::$option_wp_login_integration_active_name) == 1;
     200    }
     201
     202    public function get_wp_reset_password_active()
     203    {
     204        return get_option(FriendlyCaptcha_Plugin::$option_wp_reset_password_integration_active_name) == 1;
     205    }
     206
     207    public function get_wp_comments_active()
     208    {
     209        return get_option(FriendlyCaptcha_Plugin::$option_wp_comments_integration_active_name) == 1;
     210    }
     211
     212    public function get_wp_comments_logged_in_active()
     213    {
     214        return get_option(FriendlyCaptcha_Plugin::$option_wp_comments_logged_in_integration_active_name) == 1;
     215    }
     216
     217    public function get_wc_login_active()
     218    {
     219        return get_option(FriendlyCaptcha_Plugin::$option_wc_login_integration_active_name) == 1;
     220    }
     221
     222    public function get_wc_register_active()
     223    {
     224        return get_option(FriendlyCaptcha_Plugin::$option_wc_register_integration_active_name) == 1;
     225    }
     226
     227    public function get_wc_lost_password_active()
     228    {
     229        return get_option(FriendlyCaptcha_Plugin::$option_wc_lost_password_integration_active_name) == 1;
     230    }
     231
     232    public function get_wc_checkout_active()
     233    {
     234        return get_option(FriendlyCaptcha_Plugin::$option_wc_checkout_integration_active_name) == 1;
     235    }
     236
     237    public function get_um_login_active()
     238    {
     239        return get_option(FriendlyCaptcha_Plugin::$option_um_login_integration_active_name) == 1;
     240    }
     241
     242    public function get_um_register_active()
     243    {
     244        return get_option(FriendlyCaptcha_Plugin::$option_um_register_integration_active_name) == 1;
     245    }
     246
     247    public function get_um_reset_password_active()
     248    {
     249        return get_option(FriendlyCaptcha_Plugin::$option_um_reset_password_integration_active_name) == 1;
     250    }
     251
     252    public function get_wpum_login_active()
     253    {
     254        return get_option(FriendlyCaptcha_Plugin::$option_wpum_login_integration_active_name) == 1;
     255    }
     256
     257    public function get_wpum_registration_active()
     258    {
     259        return get_option(FriendlyCaptcha_Plugin::$option_wpum_registration_integration_active_name) == 1;
     260    }
     261
     262    public function get_wpum_password_recovery_active()
     263    {
     264        return get_option(FriendlyCaptcha_Plugin::$option_wpum_password_recovery_integration_active_name) == 1;
     265    }
     266
     267    public function get_pb_login_active()
     268    {
     269        return get_option(FriendlyCaptcha_Plugin::$option_pb_login_integration_active_name) == 1;
     270    }
     271
     272    public function get_pb_register_active()
     273    {
     274        return get_option(FriendlyCaptcha_Plugin::$option_pb_register_integration_active_name) == 1;
     275    }
     276
     277    public function get_pb_reset_password_active()
     278    {
     279        return get_option(FriendlyCaptcha_Plugin::$option_pb_reset_password_integration_active_name) == 1;
     280    }
     281
     282
     283    public function get_divi_active()
     284    {
     285        return get_option(FriendlyCaptcha_Plugin::$option_divi_integration_active_name) == 1;
     286    }
     287
     288    /* Widget options */
     289
     290    public function get_widget_language()
     291    {
     292        $lang = get_option(FriendlyCaptcha_Plugin::$option_widget_language_name);
     293        $lang = empty($lang) ? "automatic" : $lang; // Default to automatic
     294        if ($lang == "automatic") {
     295            $lang = substr(get_locale(), 0, 2);
     296            if (!array_key_exists($lang, FRIENDLY_CAPTCHA_SUPPORTED_LANGUAGES)) {
     297                $lang = "en"; // Fallback to en
    76298            }
    77             $this->plugin_name = 'friendly-captcha';
    78 
    79             FriendlyCaptcha_Plugin::$instance = $this;
    80299        }
    81 
    82         public static function default_error_user_message() {
    83             /* translators: this is the main error message shown to the user when the captcha failed or wasn't completed. */
    84             return __("Anti-robot verification failed, please try again.", "frcaptcha");
    85         }
    86 
    87         /**
    88          * When both the sitekey and the apikey are set, we can consider the plugin configured.
    89          */
    90         public function is_configured() {
    91             return $this->get_sitekey() !== null && $this->get_sitekey() !== "" && $this->get_api_key() !== null && $this->get_api_key() !== "";
    92         }
    93 
    94         public function get_sitekey() {
    95             return trim(get_option(FriendlyCaptcha_Plugin::$option_sitekey_name));
    96         }
    97 
    98         public function get_api_key() {
    99             return trim(get_option(FriendlyCaptcha_Plugin::$option_api_key_name));
    100         }
    101 
    102         public function get_skip_style_injection() {
    103             return get_option(FriendlyCaptcha_Plugin::$option_skip_style_injection_name) == 1;
    104         }
    105 
    106         public function get_enable_mutation_observer() {
    107             return get_option(FriendlyCaptcha_Plugin::$option_enable_mutation_observer_name) == 1;
    108         }
    109 
    110         public function get_contact_form_7_active() {
    111             return get_option(FriendlyCaptcha_Plugin::$option_contact_form_7_integration_active_name) == 1;
    112         }
    113 
    114         public function get_f12_cf7_doubleoptin_active() {
    115             return get_option(FriendlyCaptcha_Plugin::$option_f12_cf7_doubleoptin_integration_active_name) == 1;
    116         }
    117 
    118         public function get_wpforms_active() {
    119             return get_option(FriendlyCaptcha_Plugin::$option_wpforms_integration_active_name) == 1;
    120         }
    121 
    122         public function get_gravity_forms_active() {
    123             return get_option(FriendlyCaptcha_Plugin::$option_gravity_forms_integration_active_name) == 1;
    124         }
    125 
    126         public function get_coblocks_active() {
    127             return get_option(FriendlyCaptcha_Plugin::$option_coblocks_integration_active_name) == 1;
    128         }
    129 
    130         public function get_fluentform_active() {
    131             return get_option(FriendlyCaptcha_Plugin::$option_fluentform_integration_active_name) == 1;
    132         }
    133 
    134         public function get_elementor_active() {
    135             return get_option(FriendlyCaptcha_Plugin::$option_elementor_forms_integration_active_name) == 1;
    136         }
    137 
    138         public function get_html_forms_active() {
    139             return get_option(FriendlyCaptcha_Plugin::$option_html_forms_integration_active_name) == 1;
    140         }
    141 
    142         public function get_forminator_active() {
    143             return get_option(FriendlyCaptcha_Plugin::$option_forminator_integration_active_name) == 1;
    144         }
    145 
    146         public function get_formidable_active() {
    147             return get_option(FriendlyCaptcha_Plugin::$option_formidable_integration_active_name) == 1;
    148         }
    149 
    150         public function get_avada_forms_active() {
    151             return get_option(FriendlyCaptcha_Plugin::$option_avada_forms_integration_active_name) == 1;
    152         }
    153 
    154         public function get_wp_register_active() {
    155             return get_option(FriendlyCaptcha_Plugin::$option_wp_register_integration_active_name) == 1;
    156         }
    157 
    158         public function get_wp_login_active() {
    159             return get_option(FriendlyCaptcha_Plugin::$option_wp_login_integration_active_name) == 1;
    160         }
    161 
    162         public function get_wp_reset_password_active() {
    163             return get_option(FriendlyCaptcha_Plugin::$option_wp_reset_password_integration_active_name) == 1;
    164         }
    165 
    166         public function get_wp_comments_active() {
    167             return get_option(FriendlyCaptcha_Plugin::$option_wp_comments_integration_active_name) == 1;
    168         }
    169 
    170         public function get_wp_comments_logged_in_active() {
    171             return get_option(FriendlyCaptcha_Plugin::$option_wp_comments_logged_in_integration_active_name) == 1;
    172         }
    173 
    174         public function get_wc_login_active() {
    175             return get_option(FriendlyCaptcha_Plugin::$option_wc_login_integration_active_name) == 1;
    176         }
    177 
    178         public function get_wc_register_active() {
    179             return get_option(FriendlyCaptcha_Plugin::$option_wc_register_integration_active_name) == 1;
    180         }
    181 
    182         public function get_wc_lost_password_active() {
    183             return get_option(FriendlyCaptcha_Plugin::$option_wc_lost_password_integration_active_name) == 1;
    184         }
    185 
    186         public function get_wc_checkout_active() {
    187             return get_option(FriendlyCaptcha_Plugin::$option_wc_checkout_integration_active_name) == 1;
    188         }
    189 
    190         public function get_um_login_active() {
    191             return get_option(FriendlyCaptcha_Plugin::$option_um_login_integration_active_name) == 1;
    192         }
    193 
    194         public function get_um_register_active() {
    195             return get_option(FriendlyCaptcha_Plugin::$option_um_register_integration_active_name) == 1;
    196         }
    197 
    198         public function get_um_reset_password_active() {
    199             return get_option(FriendlyCaptcha_Plugin::$option_um_reset_password_integration_active_name) == 1;
    200         }
    201 
    202         public function get_wpum_login_active() {
    203             return get_option(FriendlyCaptcha_Plugin::$option_wpum_login_integration_active_name) == 1;
    204         }
    205 
    206         public function get_wpum_registration_active() {
    207             return get_option(FriendlyCaptcha_Plugin::$option_wpum_registration_integration_active_name) == 1;
    208         }
    209 
    210         public function get_wpum_password_recovery_active() {
    211             return get_option(FriendlyCaptcha_Plugin::$option_wpum_password_recovery_integration_active_name) == 1;
    212         }
    213 
    214         public function get_pb_login_active() {
    215             return get_option(FriendlyCaptcha_Plugin::$option_pb_login_integration_active_name) == 1;
    216         }
    217 
    218         public function get_pb_register_active() {
    219             return get_option(FriendlyCaptcha_Plugin::$option_pb_register_integration_active_name) == 1;
    220         }
    221 
    222         public function get_pb_reset_password_active() {
    223             return get_option(FriendlyCaptcha_Plugin::$option_pb_reset_password_integration_active_name) == 1;
    224         }
    225 
    226         public function get_divi_active() {
    227             return get_option(FriendlyCaptcha_Plugin::$option_divi_integration_active_name) == 1;
    228         }
    229 
    230 
    231         /* Widget options */
    232 
    233         public function get_widget_language() {
    234             $lang = get_option(FriendlyCaptcha_Plugin::$option_widget_language_name);
    235             $lang = empty($lang) ? "automatic" : $lang; // Default to automatic
    236             if ( $lang == "automatic" ) {
    237                 $lang = substr(get_locale(), 0, 2);
    238                 if ( ! array_key_exists($lang, FRIENDLY_CAPTCHA_SUPPORTED_LANGUAGES) ) {
    239                     $lang = "en"; // Fallback to en
    240                 }
    241             }
    242             return $lang;
    243         }
    244 
    245         public function get_widget_dark_theme_active() {
    246             return get_option(FriendlyCaptcha_Plugin::$option_widget_dark_theme_active_name) == 1;
    247         }
    248 
    249         /* Endpoint settings */
    250 
    251         public function get_eu_puzzle_endpoint_active() {
    252             return get_option(FriendlyCaptcha_Plugin::$option_eu_puzzle_endpoint_active_name) == 1;
    253         }
    254 
    255         public function get_global_puzzle_endpoint_active() {
    256             $eu_active = $this->get_eu_puzzle_endpoint_active();
    257             if (!$eu_active) return true; // At least one must be enabled.
    258 
    259             return get_option(FriendlyCaptcha_Plugin::$option_global_puzzle_endpoint_active_name) == 1;
    260         }
    261     }
    262 
    263     // This creates the singleton instance
    264     if ( !isset(FriendlyCaptcha_Plugin::$instance)) {
    265         $frcaptcha_plugin_instance = new FriendlyCaptcha_Plugin();
    266         $frcaptcha_plugin_instance->init();
    267     }
    268 
    269     // These only contain pure functions
    270     require plugin_dir_path( __FILE__ ) . 'helpers.php';
    271     require plugin_dir_path( __FILE__ ) . 'verification.php';
    272 
    273     // Register widget routines
    274     require plugin_dir_path( __FILE__ ) . '../public/widgets.php';
    275 
    276     // Set up the admin pages & settings
    277     require plugin_dir_path( __FILE__ ) . 'admin.php';
    278     require plugin_dir_path( __FILE__ ) . 'settings.php';
    279 
    280     if (FriendlyCaptcha_Plugin::$instance->get_contact_form_7_active()) {
    281         require plugin_dir_path( __FILE__ ) . '../modules/contact-form-7/contact-form-7.php';
    282     }
    283 
    284     if (FriendlyCaptcha_Plugin::$instance->get_wpforms_active()) {
    285         require plugin_dir_path( __FILE__ ) . '../modules/wpforms/wpforms.php';
    286     }
    287 
    288     if (FriendlyCaptcha_Plugin::$instance->get_gravity_forms_active()) {
    289         require plugin_dir_path( __FILE__ ) . '../modules/gravityforms/gravityforms.php';
    290     }
    291 
    292     if (FriendlyCaptcha_Plugin::$instance->get_coblocks_active()) {
    293         require plugin_dir_path( __FILE__ ) . '../modules/coblocks/coblocks.php';
    294     }
    295 
    296     if (FriendlyCaptcha_Plugin::$instance->get_fluentform_active()) {
    297         require plugin_dir_path( __FILE__ ) . '../modules/fluentform/fluentform.php';
    298     }
    299 
    300     if (FriendlyCaptcha_Plugin::$instance->get_elementor_active()) {
    301         require plugin_dir_path( __FILE__ ) . '../modules/elementor/elementor.php';
    302     }
    303 
    304     if (FriendlyCaptcha_Plugin::$instance->get_html_forms_active()) {
    305         require plugin_dir_path( __FILE__ ) . '../modules/html-forms/html-forms.php';
    306     }
    307 
    308     if (FriendlyCaptcha_Plugin::$instance->get_forminator_active()) {
    309         require plugin_dir_path( __FILE__ ) . '../modules/forminator/forminator.php';
    310     }
    311 
    312     if (FriendlyCaptcha_Plugin::$instance->get_formidable_active()) {
    313         require plugin_dir_path( __FILE__ ) . '../modules/formidable/formidable.php';
    314     }
    315 
    316     if (FriendlyCaptcha_Plugin::$instance->get_avada_forms_active()) {
    317         require plugin_dir_path( __FILE__ ) . '../modules/avada-forms/avada-forms.php';
    318     }
    319 
    320     if (FriendlyCaptcha_Plugin::$instance->get_wp_register_active()) {
    321         require plugin_dir_path( __FILE__ ) . '../modules/wordpress/wordpress_register.php';
    322     }
    323 
    324     if (FriendlyCaptcha_Plugin::$instance->get_wp_login_active()) {
    325         require plugin_dir_path( __FILE__ ) . '../modules/wordpress/wordpress_login.php';
    326     }
    327 
    328     if (FriendlyCaptcha_Plugin::$instance->get_wp_reset_password_active()) {
    329         require plugin_dir_path( __FILE__ ) . '../modules/wordpress/wordpress_reset_password.php';
    330     }
    331 
    332     if (FriendlyCaptcha_Plugin::$instance->get_wp_comments_active()) {
    333         require plugin_dir_path( __FILE__ ) . '../modules/wordpress/wordpress_comments.php';
    334     }
    335 
    336     if (FriendlyCaptcha_Plugin::$instance->get_wc_login_active()) {
    337         require plugin_dir_path( __FILE__ ) . '../modules/woocommerce/woocommerce_login.php';
    338     }
    339 
    340     if (FriendlyCaptcha_Plugin::$instance->get_wc_register_active()) {
    341         require plugin_dir_path( __FILE__ ) . '../modules/woocommerce/woocommerce_register.php';
    342     }
    343 
    344     if (FriendlyCaptcha_Plugin::$instance->get_wc_lost_password_active()) {
    345         require plugin_dir_path( __FILE__ ) . '../modules/woocommerce/woocommerce_lost_password.php';
    346     }
    347 
    348     if (FriendlyCaptcha_Plugin::$instance->get_wc_checkout_active()) {
    349         require plugin_dir_path( __FILE__ ) . '../modules/woocommerce/woocommerce_checkout.php';
    350     }
    351 
    352     if (FriendlyCaptcha_Plugin::$instance->get_um_login_active()) {
    353         require plugin_dir_path( __FILE__ ) . '../modules/ultimate-member/ultimate-member_login.php';
    354     }
    355 
    356     if (FriendlyCaptcha_Plugin::$instance->get_um_register_active()) {
    357         require plugin_dir_path( __FILE__ ) . '../modules/ultimate-member/ultimate-member_register.php';
    358     }
    359 
    360     if (FriendlyCaptcha_Plugin::$instance->get_um_reset_password_active()) {
    361         require plugin_dir_path( __FILE__ ) . '../modules/ultimate-member/ultimate-member_reset_password.php';
    362     }
    363 
    364     if (FriendlyCaptcha_Plugin::$instance->get_wpum_login_active()) {
    365         require plugin_dir_path( __FILE__ ) . '../modules/wpum/wpum_login.php';
    366         require_once plugin_dir_path( __FILE__ ) . '../modules/wpum/wpum_validate.php';
    367     }
    368 
    369     if (FriendlyCaptcha_Plugin::$instance->get_wpum_registration_active()) {
    370         require plugin_dir_path( __FILE__ ) . '../modules/wpum/wpum_registration.php';
    371         require_once plugin_dir_path( __FILE__ ) . '../modules/wpum/wpum_validate.php';
    372     }
    373 
    374     if (FriendlyCaptcha_Plugin::$instance->get_wpum_password_recovery_active()) {
    375         require plugin_dir_path( __FILE__ ) . '../modules/wpum/wpum_password-recovery.php';
    376         require_once plugin_dir_path( __FILE__ ) . '../modules/wpum/wpum_validate.php';
    377     }
    378 
    379     if (FriendlyCaptcha_Plugin::$instance->get_pb_login_active()) {
    380         require plugin_dir_path( __FILE__ ) . '../modules/profile-builder/profile_builder_login.php';
    381     }
    382 
    383     if (FriendlyCaptcha_Plugin::$instance->get_pb_register_active()) {
    384         require plugin_dir_path( __FILE__ ) . '../modules/profile-builder/profile_builder_register.php';
    385     }
    386 
    387     if (FriendlyCaptcha_Plugin::$instance->get_pb_reset_password_active()) {
    388         require plugin_dir_path(__FILE__) . '../modules/profile-builder/profile_builder_reset_password.php';
    389     }
    390 
    391     if (FriendlyCaptcha_Plugin::$instance->get_divi_active()) {
    392         require plugin_dir_path( __FILE__ ) . '../modules/divi/divi.php';
    393     }
    394 // }
     300        return $lang;
     301    }
     302
     303    public function get_widget_dark_theme_active()
     304    {
     305        return get_option(FriendlyCaptcha_Plugin::$option_widget_dark_theme_active_name) == 1;
     306    }
     307
     308    /* Endpoint settings */
     309
     310    public function get_eu_puzzle_endpoint_active()
     311    {
     312        return get_option(FriendlyCaptcha_Plugin::$option_eu_puzzle_endpoint_active_name) == 1;
     313    }
     314
     315    public function get_global_puzzle_endpoint_active()
     316    {
     317        $eu_active = $this->get_eu_puzzle_endpoint_active();
     318        if (!$eu_active) return true; // At least one must be enabled.
     319
     320        return get_option(FriendlyCaptcha_Plugin::$option_global_puzzle_endpoint_active_name) == 1;
     321    }
     322
     323    /* Verification failure alert */
     324
     325    public function show_verification_failed_alert($response)
     326    {
     327        update_option(FriendlyCaptcha_Plugin::$option_verification_failed_alert_name, $response);
     328    }
     329
     330    public function get_verification_failed_alert()
     331    {
     332        return get_option(FriendlyCaptcha_Plugin::$option_verification_failed_alert_name);
     333    }
     334
     335    public function remove_verification_failed_alert()
     336    {
     337        delete_option(FriendlyCaptcha_Plugin::$option_verification_failed_alert_name);
     338    }
     339}
     340
     341// This creates the singleton instance
     342if (!isset(FriendlyCaptcha_Plugin::$instance)) {
     343    $frcaptcha_plugin_instance = new FriendlyCaptcha_Plugin();
     344    $frcaptcha_plugin_instance->init();
     345}
     346
     347// These only contain pure functions
     348require plugin_dir_path(__FILE__) . 'helpers.php';
     349require plugin_dir_path(__FILE__) . 'verification.php';
     350
     351// Register widget routines
     352require plugin_dir_path(__FILE__) . '../public/widgets.php';
     353
     354// Set up the admin pages & settings
     355require plugin_dir_path(__FILE__) . 'admin.php';
     356require plugin_dir_path(__FILE__) . 'settings.php';
     357
     358if (FriendlyCaptcha_Plugin::$instance->get_contact_form_7_active()) {
     359    require plugin_dir_path(__FILE__) . '../modules/contact-form-7/contact-form-7.php';
     360}
     361
     362if (FriendlyCaptcha_Plugin::$instance->get_wpforms_active()) {
     363    require plugin_dir_path(__FILE__) . '../modules/wpforms/wpforms.php';
     364}
     365
     366if (FriendlyCaptcha_Plugin::$instance->get_gravity_forms_active()) {
     367    require plugin_dir_path(__FILE__) . '../modules/gravityforms/gravityforms.php';
     368}
     369
     370if (FriendlyCaptcha_Plugin::$instance->get_coblocks_active()) {
     371    require plugin_dir_path(__FILE__) . '../modules/coblocks/coblocks.php';
     372}
     373
     374if (FriendlyCaptcha_Plugin::$instance->get_fluentform_active()) {
     375    require plugin_dir_path(__FILE__) . '../modules/fluentform/fluentform.php';
     376}
     377
     378if (FriendlyCaptcha_Plugin::$instance->get_elementor_active()) {
     379    require plugin_dir_path(__FILE__) . '../modules/elementor/elementor.php';
     380}
     381
     382if (FriendlyCaptcha_Plugin::$instance->get_html_forms_active()) {
     383    require plugin_dir_path(__FILE__) . '../modules/html-forms/html-forms.php';
     384}
     385
     386if (FriendlyCaptcha_Plugin::$instance->get_forminator_active()) {
     387    require plugin_dir_path(__FILE__) . '../modules/forminator/forminator.php';
     388}
     389
     390if (FriendlyCaptcha_Plugin::$instance->get_formidable_active()) {
     391    require plugin_dir_path(__FILE__) . '../modules/formidable/formidable.php';
     392}
     393
     394if (FriendlyCaptcha_Plugin::$instance->get_avada_forms_active()) {
     395    require plugin_dir_path(__FILE__) . '../modules/avada-forms/avada-forms.php';
     396}
     397
     398if (FriendlyCaptcha_Plugin::$instance->get_wp_register_active()) {
     399    require plugin_dir_path(__FILE__) . '../modules/wordpress/wordpress_register.php';
     400}
     401
     402if (FriendlyCaptcha_Plugin::$instance->get_wp_login_active()) {
     403    require plugin_dir_path(__FILE__) . '../modules/wordpress/wordpress_login.php';
     404}
     405
     406if (FriendlyCaptcha_Plugin::$instance->get_wp_reset_password_active()) {
     407    require plugin_dir_path(__FILE__) . '../modules/wordpress/wordpress_reset_password.php';
     408}
     409
     410if (FriendlyCaptcha_Plugin::$instance->get_wp_comments_active()) {
     411    require plugin_dir_path(__FILE__) . '../modules/wordpress/wordpress_comments.php';
     412}
     413
     414if (FriendlyCaptcha_Plugin::$instance->get_wc_login_active()) {
     415    require plugin_dir_path(__FILE__) . '../modules/woocommerce/woocommerce_login.php';
     416}
     417
     418if (FriendlyCaptcha_Plugin::$instance->get_wc_register_active()) {
     419    require plugin_dir_path(__FILE__) . '../modules/woocommerce/woocommerce_register.php';
     420}
     421
     422if (FriendlyCaptcha_Plugin::$instance->get_wc_lost_password_active()) {
     423    require plugin_dir_path(__FILE__) . '../modules/woocommerce/woocommerce_lost_password.php';
     424}
     425
     426if (FriendlyCaptcha_Plugin::$instance->get_wc_checkout_active()) {
     427    require plugin_dir_path(__FILE__) . '../modules/woocommerce/woocommerce_checkout.php';
     428}
     429
     430if (FriendlyCaptcha_Plugin::$instance->get_um_login_active()) {
     431    require plugin_dir_path(__FILE__) . '../modules/ultimate-member/ultimate-member_login.php';
     432}
     433
     434if (FriendlyCaptcha_Plugin::$instance->get_um_register_active()) {
     435    require plugin_dir_path(__FILE__) . '../modules/ultimate-member/ultimate-member_register.php';
     436}
     437
     438if (FriendlyCaptcha_Plugin::$instance->get_um_reset_password_active()) {
     439    require plugin_dir_path(__FILE__) . '../modules/ultimate-member/ultimate-member_reset_password.php';
     440}
     441
     442if (FriendlyCaptcha_Plugin::$instance->get_wpum_login_active()) {
     443    require plugin_dir_path(__FILE__) . '../modules/wpum/wpum_login.php';
     444    require_once plugin_dir_path(__FILE__) . '../modules/wpum/wpum_validate.php';
     445}
     446
     447if (FriendlyCaptcha_Plugin::$instance->get_wpum_registration_active()) {
     448    require plugin_dir_path(__FILE__) . '../modules/wpum/wpum_registration.php';
     449    require_once plugin_dir_path(__FILE__) . '../modules/wpum/wpum_validate.php';
     450}
     451
     452if (FriendlyCaptcha_Plugin::$instance->get_wpum_password_recovery_active()) {
     453    require plugin_dir_path(__FILE__) . '../modules/wpum/wpum_password-recovery.php';
     454    require_once plugin_dir_path(__FILE__) . '../modules/wpum/wpum_validate.php';
     455}
     456
     457if (FriendlyCaptcha_Plugin::$instance->get_pb_login_active()) {
     458    require plugin_dir_path(__FILE__) . '../modules/profile-builder/profile_builder_login.php';
     459}
     460
     461if (FriendlyCaptcha_Plugin::$instance->get_pb_register_active()) {
     462    require plugin_dir_path(__FILE__) . '../modules/profile-builder/profile_builder_register.php';
     463}
     464
     465if (FriendlyCaptcha_Plugin::$instance->get_pb_reset_password_active()) {
     466    require plugin_dir_path(__FILE__) . '../modules/profile-builder/profile_builder_reset_password.php';
     467}
     468
     469if (FriendlyCaptcha_Plugin::$instance->get_divi_active()) {
     470    require plugin_dir_path(__FILE__) . '../modules/divi/divi.php';
     471}
  • friendly-captcha/trunk/includes/helpers.php

    r2443791 r3095155  
    11<?php
    22
    3 function frcaptcha_log_remote_request($url, $request, $response)
     3function frcaptcha_log_remote_request($url, $response)
    44{
    55    $log = sprintf(
     
    1515}
    1616
     17function frcaptcha_v2_log_verify_response($url, $status, $errorCode)
     18{
     19    $log = sprintf(
     20        /* translators: 1: response status, 2: error code, 3: error detail, 4: URL */
     21        __('Friendly Captcha: %1$s %2$s from %3$s', 'frcaptcha'),
     22        $status,
     23        $errorCode,
     24        $url
     25    );
     26
     27    trigger_error($log);
     28}
     29
    1730function frcaptcha_get_sanitized_frcaptcha_solution_from_post()
    1831{
    19     $postValue = $_POST['frc-captcha-solution'];
     32    $fieldName = FriendlyCaptcha_Plugin::$instance->get_solution_field_name();
     33
     34    $postValue = $_POST[$fieldName];
    2035    $solution = isset($postValue) ? trim(sanitize_text_field($postValue)) : '';
    2136    return $solution;
  • friendly-captcha/trunk/includes/settings.php

    r3080369 r3095155  
    66    add_action('admin_init', 'frcaptcha_settings_init');
    77
    8     function frcaptcha_settings_init() {
     8    function frcaptcha_settings_init()
     9    {
    910        register_setting(
    1011            FriendlyCaptcha_Plugin::$option_group,
     
    2223            FriendlyCaptcha_Plugin::$option_group,
    2324            FriendlyCaptcha_Plugin::$option_enable_mutation_observer_name
     25        );
     26        register_setting(
     27            FriendlyCaptcha_Plugin::$option_group,
     28            FriendlyCaptcha_Plugin::$option_enable_v2_name
    2429        );
    2530
     
    178183        add_settings_field(
    179184            'frcaptcha_settings_sitekey_field',
    180             'Sitekey', 'frcaptcha_settings_field_callback',
     185            'Sitekey',
     186            'frcaptcha_settings_field_callback',
    181187            'friendly_captcha_admin',
    182188            'frcaptcha_general_settings_section',
     
    190196        add_settings_field(
    191197            'frcaptcha_settings_api_key_field',
    192             'API Key', 'frcaptcha_settings_field_callback',
     198            'API Key',
     199            'frcaptcha_settings_field_callback',
    193200            'friendly_captcha_admin',
    194201            'frcaptcha_general_settings_section',
     
    212219        add_settings_field(
    213220            'frcaptcha_settings_wpforms_integration_field',
    214             'WPForms', 'frcaptcha_settings_field_callback',
     221            'WPForms',
     222            'frcaptcha_settings_field_callback',
    215223            'friendly_captcha_admin',
    216224            'frcaptcha_integrations_settings_section',
     
    224232        add_settings_field(
    225233            'frcaptcha_settings_wpcf7_integration_field',
    226             'Contact Form 7', 'frcaptcha_settings_field_callback',
     234            'Contact Form 7',
     235            'frcaptcha_settings_field_callback',
    227236            'friendly_captcha_admin',
    228237            'frcaptcha_integrations_settings_section',
     
    236245        add_settings_field(
    237246            'frcaptcha_settings_f12_cf7_doubleoptin_integration_field',
    238             'CF7 Double-Opt-In', 'frcaptcha_settings_field_callback',
     247            'CF7 Double-Opt-In',
     248            'frcaptcha_settings_field_callback',
    239249            'friendly_captcha_admin',
    240250            'frcaptcha_integrations_settings_section',
     
    248258        add_settings_field(
    249259            'frcaptcha_settings_gravity_forms_integration_field',
    250             'Gravity Forms', 'frcaptcha_settings_field_callback',
     260            'Gravity Forms',
     261            'frcaptcha_settings_field_callback',
    251262            'friendly_captcha_admin',
    252263            'frcaptcha_integrations_settings_section',
     
    260271        add_settings_field(
    261272            'frcaptcha_settings_coblocks_integration_field',
    262             'CoBlocks Forms', 'frcaptcha_settings_field_callback',
     273            'CoBlocks Forms',
     274            'frcaptcha_settings_field_callback',
    263275            'friendly_captcha_admin',
    264276            'frcaptcha_integrations_settings_section',
     
    272284        add_settings_field(
    273285            'frcaptcha_settings_fluentform_integration_field',
    274             'Fluentform Forms', 'frcaptcha_settings_field_callback',
     286            'Fluentform Forms',
     287            'frcaptcha_settings_field_callback',
    275288            'friendly_captcha_admin',
    276289            'frcaptcha_integrations_settings_section',
     
    284297        add_settings_field(
    285298            'frcaptcha_settings_elementor_integration_field',
    286             'Elementor Pro Forms', 'frcaptcha_settings_field_callback',
     299            'Elementor Pro Forms',
     300            'frcaptcha_settings_field_callback',
    287301            'friendly_captcha_admin',
    288302            'frcaptcha_integrations_settings_section',
     
    296310        add_settings_field(
    297311            'frcaptcha_settings_html_forms_integration_field',
    298             'HTML Forms', 'frcaptcha_settings_field_callback',
     312            'HTML Forms',
     313            'frcaptcha_settings_field_callback',
    299314            'friendly_captcha_admin',
    300315            'frcaptcha_integrations_settings_section',
     
    308323        add_settings_field(
    309324            'frcaptcha_settings_forminator_integration_field',
    310             'Forminator', 'frcaptcha_settings_field_callback',
     325            'Forminator',
     326            'frcaptcha_settings_field_callback',
    311327            'friendly_captcha_admin',
    312328            'frcaptcha_integrations_settings_section',
     
    320336        add_settings_field(
    321337            'frcaptcha_settings_formidable_integration_field',
    322             'Formidable', 'frcaptcha_settings_field_callback',
     338            'Formidable',
     339            'frcaptcha_settings_field_callback',
    323340            'friendly_captcha_admin',
    324341            'frcaptcha_integrations_settings_section',
     
    332349        add_settings_field(
    333350            'frcaptcha_settings_avada_forms_integration_field',
    334             'Avada Form Builder', 'frcaptcha_settings_field_callback',
     351            'Avada Form Builder',
     352            'frcaptcha_settings_field_callback',
    335353            'friendly_captcha_admin',
    336354            'frcaptcha_integrations_settings_section',
     
    344362        add_settings_field(
    345363            'frcaptcha_settings_wp_register_integration_field',
    346             'WordPress Register', 'frcaptcha_settings_field_callback',
     364            'WordPress Register',
     365            'frcaptcha_settings_field_callback',
    347366            'friendly_captcha_admin',
    348367            'frcaptcha_integrations_settings_section',
     
    356375        add_settings_field(
    357376            'frcaptcha_settings_wp_login_integration_field',
    358             'WordPress Login', 'frcaptcha_settings_field_callback',
     377            'WordPress Login',
     378            'frcaptcha_settings_field_callback',
    359379            'friendly_captcha_admin',
    360380            'frcaptcha_integrations_settings_section',
     
    368388        add_settings_field(
    369389            'frcaptcha_settings_wp_reset_password_integration_field',
    370             'WordPress Reset Password', 'frcaptcha_settings_field_callback',
     390            'WordPress Reset Password',
     391            'frcaptcha_settings_field_callback',
    371392            'friendly_captcha_admin',
    372393            'frcaptcha_integrations_settings_section',
     
    380401        add_settings_field(
    381402            'frcaptcha_settings_wp_comments_integration_field',
    382             'WordPress Comments<br>(guests)', 'frcaptcha_settings_field_callback',
     403            'WordPress Comments<br>(guests)',
     404            'frcaptcha_settings_field_callback',
    383405            'friendly_captcha_admin',
    384406            'frcaptcha_integrations_settings_section',
     
    392414        add_settings_field(
    393415            'frcaptcha_settings_wp_comments_logged_in_integration_field',
    394             'WordPress Comments<br>(logged in users)', 'frcaptcha_settings_field_callback',
     416            'WordPress Comments<br>(logged in users)',
     417            'frcaptcha_settings_field_callback',
    395418            'friendly_captcha_admin',
    396419            'frcaptcha_integrations_settings_section',
     
    404427        add_settings_field(
    405428            'frcaptcha_settings_wc_register_integration_field',
    406             'WooCommerce Register', 'frcaptcha_settings_field_callback',
     429            'WooCommerce Register',
     430            'frcaptcha_settings_field_callback',
    407431            'friendly_captcha_admin',
    408432            'frcaptcha_integrations_settings_section',
     
    416440        add_settings_field(
    417441            'frcaptcha_settings_wc_login_integration_field',
    418             'WooCommerce Login', 'frcaptcha_settings_field_callback',
     442            'WooCommerce Login',
     443            'frcaptcha_settings_field_callback',
    419444            'friendly_captcha_admin',
    420445            'frcaptcha_integrations_settings_section',
     
    428453        add_settings_field(
    429454            'frcaptcha_settings_wc_lost_password_integration_field',
    430             'WooCommerce Lost Password', 'frcaptcha_settings_field_callback',
     455            'WooCommerce Lost Password',
     456            'frcaptcha_settings_field_callback',
    431457            'friendly_captcha_admin',
    432458            'frcaptcha_integrations_settings_section',
     
    440466        add_settings_field(
    441467            'frcaptcha_settings_wc_checkout_integration_field',
    442             'WooCommerce Checkout', 'frcaptcha_settings_field_callback',
     468            'WooCommerce Checkout',
     469            'frcaptcha_settings_field_callback',
    443470            'friendly_captcha_admin',
    444471            'frcaptcha_integrations_settings_section',
     
    452479        add_settings_field(
    453480            'frcaptcha_settings_um_login_integration_field',
    454             'Ultimate Member Login', 'frcaptcha_settings_field_callback',
     481            'Ultimate Member Login',
     482            'frcaptcha_settings_field_callback',
    455483            'friendly_captcha_admin',
    456484            'frcaptcha_integrations_settings_section',
     
    464492        add_settings_field(
    465493            'frcaptcha_settings_um_register_integration_field',
    466             'Ultimate Member Register', 'frcaptcha_settings_field_callback',
     494            'Ultimate Member Register',
     495            'frcaptcha_settings_field_callback',
    467496            'friendly_captcha_admin',
    468497            'frcaptcha_integrations_settings_section',
     
    476505        add_settings_field(
    477506            'frcaptcha_settings_um_reset_password_integration_field',
    478             'Ultimate Member Reset Password', 'frcaptcha_settings_field_callback',
     507            'Ultimate Member Reset Password',
     508            'frcaptcha_settings_field_callback',
    479509            'friendly_captcha_admin',
    480510            'frcaptcha_integrations_settings_section',
     
    488518        add_settings_field(
    489519            'frcaptcha_settings_wpum_registration_integration_field',
    490             'WPUM Registration', 'frcaptcha_settings_field_callback',
     520            'WPUM Registration',
     521            'frcaptcha_settings_field_callback',
    491522            'friendly_captcha_admin',
    492523            'frcaptcha_integrations_settings_section',
     
    500531        add_settings_field(
    501532            'frcaptcha_settings_wpum_login_integration_field',
    502             'WPUM Login', 'frcaptcha_settings_field_callback',
     533            'WPUM Login',
     534            'frcaptcha_settings_field_callback',
    503535            'friendly_captcha_admin',
    504536            'frcaptcha_integrations_settings_section',
     
    512544        add_settings_field(
    513545            'frcaptcha_settings_wpum_password_recovery_integration_field',
    514             'WPUM Password Recovery', 'frcaptcha_settings_field_callback',
     546            'WPUM Password Recovery',
     547            'frcaptcha_settings_field_callback',
    515548            'friendly_captcha_admin',
    516549            'frcaptcha_integrations_settings_section',
     
    524557        add_settings_field(
    525558            'frcaptcha_settings_pb_login_integration_field',
    526             'Profile Builder Login', 'frcaptcha_settings_field_callback',
     559            'Profile Builder Login',
     560            'frcaptcha_settings_field_callback',
    527561            'friendly_captcha_admin',
    528562            'frcaptcha_integrations_settings_section',
     
    536570        add_settings_field(
    537571            'frcaptcha_settings_pb_register_integration_field',
    538             'Profile Builder Register', 'frcaptcha_settings_field_callback',
     572            'Profile Builder Register',
     573            'frcaptcha_settings_field_callback',
    539574            'friendly_captcha_admin',
    540575            'frcaptcha_integrations_settings_section',
     
    548583        add_settings_field(
    549584            'frcaptcha_settings_pb_reset_password_integration_field',
    550             'Profile Builder Reset Password', 'frcaptcha_settings_field_callback',
     585            'Profile Builder Reset Password',
     586            'frcaptcha_settings_field_callback',
    551587            'friendly_captcha_admin',
    552588            'frcaptcha_integrations_settings_section',
     
    560596        add_settings_field(
    561597            'frcaptcha_settings_divi_integration_field',
    562             'Divi Theme Contact Form', 'frcaptcha_settings_field_callback',
     598            'Divi Theme Contact Form',
     599            'frcaptcha_settings_field_callback',
    563600            'friendly_captcha_admin',
    564601            'frcaptcha_integrations_settings_section',
     
    580617        );
    581618
    582         add_settings_field(
    583             'frcaptcha_settings_widget_language_field',
    584             'Widget Language',
    585             'frcaptcha_widget_language_field_callback',
    586             'friendly_captcha_admin',
    587             'frcaptcha_widget_settings_section',
    588             array(
    589                 "option_name" => FriendlyCaptcha_Plugin::$option_widget_language_name,
    590                 "description" => "Set the language for the widget. Need another language? <a href=\"https://docs.friendlycaptcha.com/#/widget_api?id=data-lang-attribute\">Help us translate</a>.",
    591             )
    592         );
     619        if (!FriendlyCaptcha_Plugin::$instance->get_enable_v2()) {
     620            add_settings_field(
     621                'frcaptcha_settings_widget_language_field',
     622                'Widget Language',
     623                'frcaptcha_widget_language_field_callback',
     624                'friendly_captcha_admin',
     625                'frcaptcha_widget_settings_section',
     626                array(
     627                    "option_name" => FriendlyCaptcha_Plugin::$option_widget_language_name,
     628                    "description" => "Set the language for the widget. Need another language? <a href=\"https://docs.friendlycaptcha.com/#/widget_api?id=data-lang-attribute\">Help us translate</a>.",
     629                )
     630            );
     631        }
    593632
    594633        add_settings_field(
    595634            'frcaptcha_settings_widget_theme_field',
    596             'Dark theme', 'frcaptcha_settings_field_callback',
     635            'Dark theme',
     636            'frcaptcha_settings_field_callback',
    597637            'friendly_captcha_admin',
    598638            'frcaptcha_widget_settings_section',
     
    604644        );
    605645
    606         add_settings_field(
    607             'frcaptcha_settings_skip_style_injection_field',
    608             'Disable Style Injection', 'frcaptcha_settings_field_callback',
    609             'friendly_captcha_admin',
    610             'frcaptcha_widget_settings_section',
    611             array(
    612                 "option_name" => FriendlyCaptcha_Plugin::$option_skip_style_injection_name,
    613                 "description" => "Don't load the CSS-Styles for the widget. Use this if you want to style the widget yourself.",
    614                 "type" => "checkbox"
    615             )
    616         );
     646        if (!FriendlyCaptcha_Plugin::$instance->get_enable_v2()) {
     647            add_settings_field(
     648                'frcaptcha_settings_skip_style_injection_field',
     649                'Disable Style Injection',
     650                'frcaptcha_settings_field_callback',
     651                'friendly_captcha_admin',
     652                'frcaptcha_widget_settings_section',
     653                array(
     654                    "option_name" => FriendlyCaptcha_Plugin::$option_skip_style_injection_name,
     655                    "description" => "Don't load the CSS-Styles for the widget. Use this if you want to style the widget yourself.",
     656                    "type" => "checkbox"
     657                )
     658            );
     659        }
    617660
    618661        add_settings_field(
    619662            'frcaptcha_settings_mutation_observer',
    620             'Dynamically Initialize', 'frcaptcha_settings_field_callback',
     663            'Dynamically Initialize',
     664            'frcaptcha_settings_field_callback',
    621665            'friendly_captcha_admin',
    622666            'frcaptcha_widget_settings_section',
     
    624668                "option_name" => FriendlyCaptcha_Plugin::$option_enable_mutation_observer_name,
    625669                "description" => "Make Friendly Captcha look for new widgets that are dynamically added to the page.<br>Enable this when you are using Friendly Captcha in a popup or a multi-step form.",
     670                "type" => "checkbox"
     671            )
     672        );
     673
     674        add_settings_field(
     675            'frcaptcha_settings_enable_v2',
     676            'Use Friendly Captcha v2',
     677            'frcaptcha_settings_field_callback',
     678            'friendly_captcha_admin',
     679            'frcaptcha_widget_settings_section',
     680            array(
     681                "option_name" => FriendlyCaptcha_Plugin::$option_enable_v2_name,
     682                "description" => " Friendly Captcha v2 is in preview and is <b>not yet intended for production use</b>. You need to enable v2 in the Friendly Captcha dashboard.",
     683                "type" => "checkbox"
     684            )
     685        );
     686
     687        add_settings_field(
     688            'frcaptcha_settings_enable_v2',
     689            'Use Friendly Captcha v2',
     690            'frcaptcha_settings_field_callback',
     691            'friendly_captcha_admin',
     692            'frcaptcha_widget_settings_section',
     693            array(
     694                "option_name" => FriendlyCaptcha_Plugin::$option_enable_v2_name,
     695                "description" => " Friendly Captcha v2 is in its alpha stage and is <b>not yet intended for production use</b>.",
    626696                "type" => "checkbox"
    627697            )
     
    641711        add_settings_field(
    642712            'frcaptcha_settings_global_endpoint_field',
    643             '🌍 Global Endpoint', 'frcaptcha_settings_field_callback',
     713            '🌍 Global Endpoint',
     714            'frcaptcha_settings_field_callback',
    644715            'friendly_captcha_admin',
    645716            'frcaptcha_endpoint_settings_section',
     
    653724        add_settings_field(
    654725            'frcaptcha_settings_eu_endpoint_field',
    655             '🇪🇺 Dedicated EU Endpoint', 'frcaptcha_settings_field_callback',
     726            '🇪🇺 Dedicated EU Endpoint',
     727            'frcaptcha_settings_field_callback',
    656728            'friendly_captcha_admin',
    657729            'frcaptcha_endpoint_settings_section',
  • friendly-captcha/trunk/includes/verification.php

    r2851826 r3095155  
    11<?php
    22
     3use FriendlyCaptcha\SDK\{Client, ClientConfig};
    34
    4 function frcaptcha_verify_captcha_solution($solution, $sitekey, $api_key) {
    5         $endpoint = 'https://api.friendlycaptcha.com/api/v1/siteverify';
     5function frcaptcha_verify_captcha_solution($solution, $sitekey, $api_key)
     6{
     7    if (FriendlyCaptcha_Plugin::$instance->get_enable_v2()) {
     8        return frcaptcha_v2_verify_captcha_solution($solution, $sitekey, $api_key);
     9    } else {
     10        return frcaptcha_v1_verify_captcha_solution($solution, $sitekey, $api_key);
     11    }
     12}
    613
    7         $response_body = array(
    8             'secret' => $api_key,
    9             'sitekey' => $sitekey,
    10             'solution' => $solution,
     14function frcaptcha_v1_verify_captcha_solution($solution, $sitekey, $api_key)
     15{
     16    $endpoint = 'https://api.friendlycaptcha.com/api/v1/siteverify';
     17
     18    $request_body = array(
     19        'secret' => $api_key,
     20        'sitekey' => $sitekey,
     21        'solution' => $solution,
     22    );
     23
     24    $request = array(
     25        'body' => $request_body,
     26    );
     27
     28    $response = wp_remote_post(esc_url_raw($endpoint), $request);
     29    $status = wp_remote_retrieve_response_code($response);
     30
     31    // Useful for debugging
     32    // $body = json_encode($request_body);
     33    // trigger_error($body);
     34
     35    $raw_response_body = wp_remote_retrieve_body($response);
     36    $response_body = json_decode($raw_response_body, true);
     37
     38    if (200 != $status) {
     39        if (WP_DEBUG) {
     40            frcaptcha_log_remote_request($endpoint, $response);
     41        }
     42
     43        FriendlyCaptcha_Plugin::$instance->show_verification_failed_alert($raw_response_body);
     44
     45        // Better safe than sorry, if the request is non-200 we can not verify the response
     46        // Either the user's credentials are wrong (e.g. wrong sitekey, api key) or the friendly
     47        // captcha servers are unresponsive.
     48
     49        return array(
     50            "success" => true,
     51            "status" => $status,
     52            "errors" => array()
    1153        );
     54    }
    1255
    13         $body = json_encode($response_body);
    14         $request = array(
    15             'body' => $response_body,
    16         );
     56    $success = isset($response_body['success'])
     57        ? $response_body['success']
     58        : false;
    1759
    18         $response = wp_remote_post( esc_url_raw( $endpoint ), $request );
    19         $status = wp_remote_retrieve_response_code( $response );
     60    $errorCodes = isset($response_body['errors'])
     61        ? $response_body['errors']
     62        : array();
    2063
    21         // Useful for debugging
    22         // trigger_error($body);
    2364
    24         $response_body = wp_remote_retrieve_body( $response );
    25         $response_body = json_decode( $response_body, true );
     65    return array(
     66        "success" => $success,
     67        "status" => $status,
     68        "error_codes" => $errorCodes
     69    );
     70}
    2671
    27         if ( 200 != $status ) {
    28             if ( WP_DEBUG ) {
    29                 frcaptcha_log_remote_request( $endpoint, $request, $response );
    30                 // error_log("The body was " . $body);
    31             }
    32             // Better safe than sorry, if the request is non-200 we can not verify the response
    33             // Either the user's credentials are wrong (e.g. wrong sitekey, api key) or the friendly
    34             // captcha servers are unresponsive.
    35            
    36             // TODO notify site admin somehow
    37             return array(
    38                 "success" => true,
    39                 "status" => $status,
    40                 "errors" => array(),
    41                 "response_body" => $response_body
     72function frcaptcha_v2_verify_captcha_solution($solution, $sitekey, $api_key)
     73{
     74    $config = new ClientConfig();
     75    $config->setAPIKey($api_key)->setSitekey($sitekey);
     76    if (FriendlyCaptcha_Plugin::$instance->get_eu_puzzle_endpoint_active()) {
     77        $config->setSiteverifyEndpoint("eu");
     78    }
     79
     80    $captchaClient = new Client($config);
     81
     82    $result = $captchaClient->verifyCaptchaResponse($solution);
     83
     84    if (!$result->wasAbleToVerify()) {
     85        if (WP_DEBUG) {
     86            frcaptcha_v2_log_verify_response(
     87                $config->siteverifyEndpoint,
     88                $result->status,
     89                $result->response->error->error_code
    4290            );
    4391        }
    4492
    45         $success = isset( $response_body['success'] )
    46             ? $response_body['success']
    47             : false;
     93        $raw_response = json_encode($result->response);
     94        FriendlyCaptcha_Plugin::$instance->show_verification_failed_alert($raw_response);
    4895
    49         $errorCodes = isset( $response_body['errors'] )
    50             ? $response_body['errors']
    51             : array();
     96        // Better safe than sorry, when we can not verify the response
     97        // Either the user's credentials are wrong (e.g. wrong sitekey, api key) or the friendly
     98        // captcha servers are unresponsive.
    5299
     100        return array(
     101            "success" => true,
     102            "status" => $result->status,
     103            "errors" => array()
     104        );
     105    }
    53106
    54         return array(
    55             "success" => $success,
    56             "status" => $status,
    57             "error_codes" => $errorCodes,
    58             "response_body" => $response_body
    59         );
     107    $errorCodes = $result->getErrorCode() ? [$result->getErrorCode()] : [];
     108    return array(
     109        "success" => $result->shouldAccept(),
     110        "status" => $result->status,
     111        "error_codes" => $errorCodes
     112    );
    60113}
  • friendly-captcha/trunk/modules/avada-forms/avada-forms.php

    r2937557 r3095155  
    11<?php
    22
    3 add_action( 'fusion_element_button_content', 'add_friendly_captcha', 10, 2 );
    4 add_filter( 'fusion_form_demo_mode', 'verify_friendly_captcha' );
     3add_action('fusion_element_button_content', 'add_friendly_captcha', 10, 2);
     4add_filter('fusion_form_demo_mode', 'verify_friendly_captcha');
    55
    6 function add_friendly_captcha( $html, $args ) {
    7     if ( false === strpos( $html, '<button type="submit"' ) ) {
     6function add_friendly_captcha($html, $args)
     7{
     8    if (false === strpos($html, '<button type="submit"')) {
    89        return $html;
    910    }
     
    2122}
    2223
    23 function verify_friendly_captcha( $demo_mode ) {
     24function verify_friendly_captcha($demo_mode)
     25{
    2426    $plugin = FriendlyCaptcha_Plugin::$instance;
    2527
     
    3032    // This is a modified version of frcaptcha_get_sanitized_frcaptcha_solution_from_post which looks for the solution in the formData key
    3133    $form_data = $_POST['formData'];
    32     $form_data = wp_parse_args( str_replace( '&amp;', '&', $form_data ) );
     34    $form_data = wp_parse_args(str_replace('&amp;', '&', $form_data));
    3335
    34     $post_value = $form_data['frc-captcha-solution'];
    35     $solution = isset($post_value) ? trim(sanitize_text_field($post_value)) : '';
     36    $field_name = FriendlyCaptcha_Plugin::$instance->get_solution_field_name();
     37    $post_value = $form_data[$field_name];
     38    $solution = isset($post_value) ? trim(sanitize_text_field($post_value)) : '';
    3639
    37     if ( empty( $solution ) ) {
     40    if (empty($solution)) {
    3841        $message = FriendlyCaptcha_Plugin::default_error_user_message() . __(" (captcha missing)", "frcaptcha");
    39         die( wp_json_encode( [ 'status' => 'error', 'info' => [ 'friendly_captcha' => $message ] ] ) );
     42        die(wp_json_encode(['status' => 'error', 'info' => ['friendly_captcha' => $message]]));
    4043    }
    4144
    4245    $verification = frcaptcha_verify_captcha_solution($solution, $plugin->get_sitekey(), $plugin->get_api_key());
    4346
    44     if ( !$verification["success"] ) {
     47    if (!$verification["success"]) {
    4548        $message = FriendlyCaptcha_Plugin::default_error_user_message();
    46         die( wp_json_encode( [ 'status' => 'error', 'info' => [ 'friendly_captcha' => $message ] ] ) );
     49        die(wp_json_encode(['status' => 'error', 'info' => ['friendly_captcha' => $message]]));
    4750    }
    4851
  • friendly-captcha/trunk/modules/coblocks/coblocks.php

    r2673817 r3095155  
    2424
    2525        add_action('enqueue_block_editor_assets', array($instance, 'frcaptcha_coblocks_enqueue_block_editor_assets'));
    26 
    2726    }
    2827
     
    3534    public function frcaptcha_coblocks_enqueue_block_editor_assets()
    3635    {
    37         wp_enqueue_script('frcaptcha_coblocks_load_addon', plugin_dir_url(__FILE__) . '/script.js',
     36        wp_enqueue_script(
     37            'frcaptcha_coblocks_load_addon',
     38            plugin_dir_url(__FILE__) . '/script.js',
    3839            array('wp-blocks', 'wp-editor', 'wp-element', 'wp-i18n'),
    3940            filemtime(plugin_dir_path(__FILE__) . 'script.js')
     
    5859        }
    5960
    60         $errorPrefix = '<strong>' . __( 'Error', 'wp-captcha' ) . '</strong> : ';
     61        $errorPrefix = '<strong>' . __('Error', 'wp-captcha') . '</strong> : ';
    6162        $solution = frcaptcha_get_sanitized_frcaptcha_solution_from_post();
    6263
    63         if (empty( $solution )) {
     64        if (empty($solution)) {
    6465            wp_die($errorPrefix . FriendlyCaptcha_Plugin::default_error_user_message() . __(" (captcha missing)", "frcaptcha"));
    6566        }
     
    7071        }
    7172
    72         unset($_POST['frc-captcha-solution']); // suppress the solution in email message
     73        $fieldName = FriendlyCaptcha_Plugin::$instance->get_solution_field_name();
     74        unset($_POST[$fieldName]); // suppress the solution in email message
    7375    }
    7476}
    75 
    76 
    77 
    78 
    79 
    80 
    81 
  • friendly-captcha/trunk/modules/contact-form-7/script.js

    r3045871 r3095155  
    11(function () {
    22  var resetFriendlyCaptchaWidget = function () {
    3     window.friendlyChallenge.autoWidget.reset();
     3    if (window.friendlyChallenge) {
     4      window.friendlyChallenge.autoWidget.reset();
     5    }
     6    if (window.frcaptcha) {
     7      window.frcaptcha.widgets.forEach(function(w) { w.reset() });
     8    }
    49  };
    510  document.addEventListener("DOMContentLoaded", function (event) {
  • friendly-captcha/trunk/modules/divi/divi.php

    r3080369 r3095155  
    2626    }
    2727
    28     public static function enable($_names_by_slug) {
     28    public static function enable($_names_by_slug)
     29    {
    2930        $plugin = FriendlyCaptcha_Plugin::$instance;
    3031
     
    5253
    5354        return $value;
    54 
    5555    }
    5656
     
    6767        }
    6868
    69         $output = str_replace(self::INSERT_BEFORE,
     69        $output = str_replace(
     70            self::INSERT_BEFORE,
    7071            frcaptcha_generate_widget_tag_from_plugin(FriendlyCaptcha_Plugin::$instance) . self::INSERT_BEFORE,
    7172            $output
     
    8283    public static function fakeToken()
    8384    {
    84         if (isset($_POST['frc-captcha-solution'])) {
    85             $_POST['token'] = $_POST['frc-captcha-solution'];
     85        $fieldName = FriendlyCaptcha_Plugin::$instance->get_solution_field_name();
     86        if (isset($_POST[$fieldName])) {
     87            $_POST['token'] = $_POST[$fieldName];
    8688        }
    8789    }
  • friendly-captcha/trunk/modules/elementor/script.js

    r3045871 r3095155  
    1111    }
    1212
    13     const widget = element.friendlyChallengeWidget;
    14     if (!widget) {
    15       return;
    16     }
    17 
    1813    setTimeout(() => {
    1914      // We reset the widget after a short delay to give the form time to grab the solution and submit it
    2015      // This is a workaround for the fact that the form submit event is fired before the solution value is grabbed
    2116      // 1 second is really conservative as this is not affected by network speed or anything like that
    22       widget.reset();
     17      if (element.friendlyChallengeWidget) {
     18        element.friendlyChallengeWidget.reset();
     19      } else if (element.frcWidget) {
     20        element.frcWidget.reset();
     21      }
    2322    }, 1000);
    2423  });
  • friendly-captcha/trunk/modules/fluentform/fluentform.php

    r2709857 r3095155  
    11<?php
    22
    3 add_action( 'fluentform_render_item_submit_button', 'frcaptcha_fluentform_show_widget', 10, 0 );
     3add_action('fluentform_render_item_submit_button', 'frcaptcha_fluentform_show_widget', 10, 0);
    44
    5 function frcaptcha_fluentform_show_widget() {
     5function frcaptcha_fluentform_show_widget()
     6{
    67    $plugin = FriendlyCaptcha_Plugin::$instance;
    78    if (!$plugin->is_configured() or !$plugin->get_fluentform_active()) {
     
    1718}
    1819
    19 add_filter( 'fluentform_before_insert_submission', 'frcaptcha_fluentform_validate', 20, 3 );   
     20add_filter('fluentform_before_insert_submission', 'frcaptcha_fluentform_validate', 20, 3);
    2021
    21 function frcaptcha_fluentform_validate($insert_data, $data, $form) {
     22function frcaptcha_fluentform_validate($insert_data, $data, $form)
     23{
    2224
    2325    $plugin = FriendlyCaptcha_Plugin::$instance;
     
    2628    }
    2729
    28     $solution = $data['frc-captcha-solution'];
     30    $fieldName = FriendlyCaptcha_Plugin::$instance->get_solution_field_name();
     31    $solution = $data[$fieldName];
    2932
    30     if ( empty( $solution ) ) {
     33    if (empty($solution)) {
    3134        $error_message = FriendlyCaptcha_Plugin::default_error_user_message() . __(" (captcha missing)", "frcaptcha");
    3235        wp_send_json(
    3336            [
    3437                'errors' => [
    35                     'g-recaptcha-response' => [ $error_message ],
     38                    'g-recaptcha-response' => [$error_message],
    3639                ],
    3740            ],
     
    4750            [
    4851                'errors' => [
    49                     'g-recaptcha-response' => [ $error_message ],
     52                    'g-recaptcha-response' => [$error_message],
    5053                ],
    5154            ],
  • friendly-captcha/trunk/modules/wpforms/script.js

    r3045871 r3095155  
    77
    88    elements.each((_, e) => {
    9       const widget = e.friendlyChallengeWidget;
    10       console.log(widget);
    11       if (!widget) {
    12         return;
     9      if (e.friendlyChallengeWidget) {
     10        e.friendlyChallengeWidget.reset();
     11      } else if (e.frcWidget) {
     12        e.frcWidget.reset();
    1313      }
    14 
    15       widget.reset();
    1614    });
    1715  }
  • friendly-captcha/trunk/public/mutation-observer.js

    r3080369 r3095155  
    88  }
    99
    10   function setupCaptchaElements(node) {
    11     if (!window.friendlyChallenge) {
    12       // The friendly-challenge library has not been loaded yet
    13       return;
    14     }
    15 
     10  function setupV1CaptchaElements(node) {
    1611    let autoWidget = window.friendlyChallenge.autoWidget;
    1712
     
    2924  }
    3025
     26  function setupV2CaptchaElements(node) {
     27    const elements = findCaptchaElements(node);
     28    window.frcaptcha.attach(elements);
     29  }
     30
    3131  const observer = new MutationObserver((mutationList) => {
    3232    for (let m = 0; m < mutationList.length; m++) {
     
    3434
    3535      const nodes = mutation.addedNodes;
    36 
    3736      for (let n = 0; n < nodes.length; n++) {
    38         setupCaptchaElements(nodes[n]);
     37        if (window.friendlyChallenge) {
     38          setupV1CaptchaElements(nodes[n]);
     39        } else if (window.frcaptcha) {
     40          setupV2CaptchaElements(nodes[n]);
     41        }
    3942      }
    4043    }
    4144  });
    4245
    43   function init()  {
     46  function init() {
    4447    // Start observing the document body for changes
    4548    observer.observe(document.body, {
     
    4750      childList: true,
    4851      subtree: true,
    49   })};
     52    });
     53  }
    5054
    5155  init();
  • friendly-captcha/trunk/public/widgets.php

    r3080369 r3095155  
    11<?php
    22
    3 function frcaptcha_enqueue_widget_scripts($forceMutationObserver = false) {
     3function frcaptcha_enqueue_widget_scripts($forceMutationObserver = false)
     4{
    45    $plugin = FriendlyCaptcha_Plugin::$instance;
    56
    6     if ( !$plugin->is_configured() ) {
     7    if (!$plugin->is_configured()) {
    78        return;
    89    }
    910
     11    if (FriendlyCaptcha_Plugin::$instance->get_enable_v2()) {
     12        return frcaptcha_v2_enqueue_widget_scripts();
     13    } else {
     14        return frcaptcha_v1_enqueue_widget_scripts();
     15    }
     16
     17    frcaptcha_mutation_observer_scripts($plugin, $forceMutationObserver);
     18}
     19
     20function frcaptcha_v1_enqueue_widget_scripts()
     21{
    1022    $version = FriendlyCaptcha_Plugin::$friendly_challenge_version;
    1123
    1224    /* Modern browsers will load this smaller bundle */
    13     wp_enqueue_script( 'friendly-captcha-widget-module',
    14         plugin_dir_url( __FILE__ ) . 'vendor/widget.module.min.js',
     25    wp_enqueue_script(
     26        'friendly-captcha-widget-module',
     27        plugin_dir_url(__FILE__) . 'vendor/v1/widget.module.min.js',
    1528        array(),
    1629        $version,
     
    1932
    2033    /* Fallback for (very) old browsers */
    21     wp_enqueue_script( 'friendly-captcha-widget-fallback',
    22         plugin_dir_url( __FILE__ ) . 'vendor/widget.polyfilled.min.js',
    23         array(),
    24         $version,
    25         true
    26     );
    27 
    28     if ( $forceMutationObserver || $plugin->get_enable_mutation_observer() ) {
    29         wp_enqueue_script( 'friendly-captcha-mutation-observer',
    30             plugin_dir_url( __FILE__ ) . 'mutation-observer.js',
     34    wp_enqueue_script(
     35        'friendly-captcha-widget-fallback',
     36        plugin_dir_url(__FILE__) . 'vendor/v1/widget.min.js',
     37        array(),
     38        $version,
     39        true
     40    );
     41}
     42
     43function frcaptcha_v2_enqueue_widget_scripts()
     44{
     45    $version = FriendlyCaptcha_Plugin::$friendly_captcha_sdk_version;
     46
     47    /* Modern browsers will load this smaller bundle */
     48    wp_enqueue_script(
     49        'friendly-captcha-widget-module',
     50        plugin_dir_url(__FILE__) . 'vendor/v2/site.min.js',
     51        array(),
     52        $version,
     53        true
     54    );
     55
     56    /* Fallback for (very) old browsers */
     57    wp_enqueue_script(
     58        'friendly-captcha-widget-fallback',
     59        plugin_dir_url(__FILE__) . 'vendor/v2/site.compat.min.js',
     60        array(),
     61        $version,
     62        true
     63    );
     64}
     65
     66function frcaptcha_mutation_observer_scripts($plugin, $forceMutationObserver)
     67{
     68    $version = FriendlyCaptcha_Plugin::$version;
     69
     70    if ($forceMutationObserver || $plugin->get_enable_mutation_observer()) {
     71        wp_enqueue_script(
     72            'friendly-captcha-mutation-observer',
     73            plugin_dir_url(__FILE__) . 'mutation-observer.js',
    3174            array(),
    3275            $version,
     
    3982 * Useful if for some reason wp_enqueue_script doesn't work (as seems to be the case with WPForms?!)
    4083 */
    41 function frcaptcha_echo_script_tags() {
     84function frcaptcha_echo_script_tags()
     85{
    4286    $plugin = FriendlyCaptcha_Plugin::$instance;
    4387
    44     if ( !$plugin->is_configured() ) {
     88    if (!$plugin->is_configured()) {
    4589        return;
    4690    }
    4791
     92    if ($plugin->get_enable_v2()) {
     93        return frcaptcha_v2_echo_script_tags();
     94    } else {
     95        return frcaptcha_v1_echo_script_tags();
     96    }
     97}
     98
     99function frcaptcha_v1_echo_script_tags()
     100{
    48101    $version = FriendlyCaptcha_Plugin::$friendly_challenge_version;
    49102
    50     echo '<script async defer type="module" src="'. plugin_dir_url( __FILE__ ) . 'vendor/widget.module.min.js?ver=' . $version . '"></script>';
    51     echo '<script async defer nomodule src="'. plugin_dir_url( __FILE__ ) . 'vendor/widget.polyfilled.min.js?ver=' . $version . '"></script>';
    52 }
    53 
    54 add_filter( 'script_loader_tag', 'frcaptcha_transform_friendly_captcha_script_tags', 10, 3 );
    55 
    56 function frcaptcha_transform_friendly_captcha_script_tags( $tag, $handle, $src )
    57 {
    58     if ( 'friendly-captcha-widget-module' == $handle) {
    59         return str_replace( '<script', '<script async defer type="module"', $tag );
    60     }
    61     if ( 'friendly-captcha-widget-fallback' == $handle) {
    62         return str_replace( '<script', '<script async defer nomodule', $tag );
    63     }
    64     if ( 'friendly-captcha-mutation-observer' == $handle) {
    65         return str_replace( '<script', '<script async defer', $tag );
    66     }
    67 
    68     return $tag;
    69 }
    70 
    71 function frcaptcha_generate_widget_tag_from_plugin($plugin) {
    72     if (!$plugin->is_configured()) {
    73         return "";
    74     }
    75 
    76     $sitekey = $plugin->get_sitekey();
    77     $lang = $plugin->get_widget_language();
     103    echo '<script async defer type="module" src="' . plugin_dir_url(__FILE__) . 'vendor/v1/widget.module.min.js?ver=' . $version . '"></script>';
     104    echo '<script async defer nomodule src="' . plugin_dir_url(__FILE__) . 'vendor/v1/widget.min.js?ver=' . $version . '"></script>';
     105}
     106
     107
     108function frcaptcha_v2_echo_script_tags()
     109{
     110    $version = FriendlyCaptcha_Plugin::$friendly_captcha_sdk_version;
     111
     112    echo '<script async defer type="module" src="' . plugin_dir_url(__FILE__) . 'vendor/v2/site.min.js?ver=' . $version . '"></script>';
     113    echo '<script async defer nomodule src="' . plugin_dir_url(__FILE__) . 'vendor/v2/site.compat.min.js?ver=' . $version . '"></script>';
     114}
     115
     116add_filter('script_loader_tag', 'frcaptcha_transform_friendly_captcha_script_tags', 10, 3);
     117
     118function frcaptcha_transform_friendly_captcha_script_tags($tag, $handle, $src)
     119{
     120    if ('friendly-captcha-widget-module' == $handle) {
     121        return str_replace('<script', '<script async defer type="module"', $tag);
     122    }
     123    if ('friendly-captcha-widget-fallback' == $handle) {
     124        return str_replace('<script', '<script async defer nomodule', $tag);
     125    }
     126    if ('friendly-captcha-mutation-observer' == $handle) {
     127        return str_replace('<script', '<script async defer', $tag);
     128    }
     129
     130    return $tag;
     131}
     132
     133function frcaptcha_generate_widget_tag_from_plugin($plugin)
     134{
     135    if (!$plugin->is_configured()) {
     136        return "";
     137    }
     138
     139    if ($plugin->get_enable_v2()) {
     140        return frcaptcha_v2_generate_widget_tag_from_plugin($plugin);
     141    } else {
     142        return frcaptcha_v1_generate_widget_tag_from_plugin($plugin);
     143    }
     144}
     145
     146function frcaptcha_v1_generate_widget_tag_from_plugin($plugin)
     147{
     148    $sitekey = $plugin->get_sitekey();
     149    $lang = $plugin->get_widget_language();
    78150
    79151    $extra_attributes = "";
     
    92164        '%s%s',
    93165        frcaptcha_generate_skip_style_injection_tag($plugin),
    94         frcaptcha_generate_widget_tag($sitekey, $lang, $extra_attributes, $theme)
    95     );
    96 }
    97 
    98 function frcaptcha_generate_widget_tag($sitekey, $language, $extra_attributes = "", $theme = "") {
    99     return sprintf(
     166        frcaptcha_v1_generate_widget_tag($sitekey, $lang, $extra_attributes, $theme)
     167    );
     168}
     169
     170function frcaptcha_v2_generate_widget_tag_from_plugin($plugin)
     171{
     172    $sitekey = $plugin->get_sitekey();
     173
     174    $extra_attributes = "";
     175    $eu = $plugin->get_eu_puzzle_endpoint_active();
     176
     177    if ($eu) {
     178        $extra_attributes = "data-api-endpoint=\"eu\"";
     179    }
     180
     181    $theme = $plugin->get_widget_dark_theme_active() ? "dark" : "light";
     182
     183    return sprintf(
     184        '%s%s',
     185        frcaptcha_generate_skip_style_injection_tag($plugin),
     186        frcaptcha_v2_generate_widget_tag($sitekey, $extra_attributes, $theme)
     187    );
     188}
     189
     190function frcaptcha_v1_generate_widget_tag($sitekey, $language, $extra_attributes = "", $theme = "")
     191{
     192    return sprintf(
    100193        '<div class="frc-captcha %s" data-sitekey="%s" data-lang="%s" %s></div>
    101194        <noscript>You need to enable Javascript for the anti-spam check.</noscript>',
    102     esc_html($theme),
    103     esc_html($sitekey),
    104     esc_html($language),
    105     $extra_attributes);
     195        esc_html($theme),
     196        esc_html($sitekey),
     197        esc_html($language),
     198        $extra_attributes
     199    );
     200}
     201
     202function frcaptcha_v2_generate_widget_tag($sitekey, $extra_attributes = "", $theme = "light")
     203{
     204    return sprintf(
     205        '<div class="frc-captcha" data-sitekey="%s" data-theme="%s" %s></div>
     206        <noscript>You need to enable Javascript for the anti-spam check.</noscript>',
     207        esc_html($sitekey),
     208        esc_html($theme),
     209        $extra_attributes
     210    );
    106211}
    107212
    108213$frcaptcha_skip_style_injection_tag_injected = false;
    109214
    110 function frcaptcha_generate_skip_style_injection_tag($plugin) {
     215function frcaptcha_generate_skip_style_injection_tag($plugin)
     216{
     217    global $frcaptcha_skip_style_injection_tag_injected;
     218
    111219    if (!$plugin->get_skip_style_injection()) {
    112220        return '';
     
    121229    return '<div id="frc-style"></div>';
    122230}
    123 
    124 function frcaptcha_generate_extra_widget_attributes($plugin) {
    125 }
  • friendly-captcha/trunk/readme.txt

    r3080369 r3095155  
    33Tags: captcha, antispam, spam, contact form, recaptcha, friendly-captcha, block spam, anti-spam, comments, elementor
    44Requires at least: 5.0
    5 Tested up to: 6.4
     5Tested up to: 6.5
    66Requires PHP: 7.3
    7 Stable tag: 1.13.0
     7Stable tag: 1.14.0
    88License: GPL v2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html 
     
    9797== Changelog ==
    9898
     99= 1.14.0 =
     100
     101* Add support for Friendly Captcha v2 (preview)
     102* Show an admin notice when verification has failed
     103
    99104= 1.13.0 =
    100105
Note: See TracChangeset for help on using the changeset viewer.