ldc-groupe/content/plugins/wpcf7-recaptcha/wpcf7-recaptcha.php
Vincent BRIDIER 54234d4909 - Update WP
- Update Plugins
- Update Translation
2020-07-21 16:23:51 +02:00

417 lines
No EOL
13 KiB
PHP

<?php
/**
* Plugin Name: ReCaptcha v2 for Contact Form 7
* Description: ReCaptcha v2 Fix for Contact Form 7 5.1 and later.
* Version: 1.2.7
* Author: IQComputing
* Author URI: http://www.iqcomputing.com/
* License: GPL2
* Text Domain: wpcf7-recaptcha
*/
defined( 'ABSPATH' ) or die( 'You cannot be here.' );
/**
* IQComputing Contact Form 7 reCaptcha Fix, Deity Class
*/
Class IQFix_WPCF7_Deity {
/**
* WPCF7 ReCaptcha Plugin Version
*
* @var String
*/
public static $version = '1.2.7';
/**
* Class Registration, set up necessities
*
* @return void
*/
public static function register() {
$class = new self();
$class->action_hooks();
$class->filter_hooks();
$class->include_files();
}
/**
* Really don't like dynamically assigning URLs by user saved options.
* This method will verify at every stage that the given value is either
* `google.com` or `recaptcha.net`
* Nowhere in between can this value be changed to anything but those two.
*
* @param $expectation
*
* @return $reality
*/
public static function verify_recaptcha_source( $expectation = 'google.com' ) {
$reality = ( in_array( $expectation, array( 'google.com', 'recaptcha.net' ) ) ) ? $expectation : 'google.com';
return $reality;
}
/**
* Include any necessary files
*
* @return void
*/
private function include_files() {
$selection = WPCF7::get_option( 'iqfix_recaptcha' );
$cf7_version = ( defined( 'WPCF7_VERSION' ) ) ? WPCF7_VERSION : WPCF7::get_option( 'version', '0' );
// Prevent update from v2 to v3 notice.
WPCF7::update_option( 'recaptcha_v2_v3_warning', false );
if( empty( $selection ) || version_compare( $cf7_version, '5.1', '<' ) ) {
return;
}
include_once( plugin_dir_path( __FILE__ ) . 'recaptcha-v2.php' );
if( class_exists( 'Flamingo_Contact' ) ) {
include_once( plugin_dir_path( __FILE__ ) . 'flamingo.php' ); // Flamingo updates
}
}
/**
* Save the reCaptcha settings from our options page
* @see IQFix_WPCF7_Deity::display_recaptcha_version_subpage()
*
* @return Boolean
*/
private function save_recaptcha_settings() {
// Form hasn't POSTed, return early
if( ! isset( $_POST, $_POST['iqfix_recaptcha_version'], $_POST['iqfix_wpcf7_submit'] ) ) {
return false;
}
// Ensure we have and can verify our nonce. IF not, return early
if( ! ( ! empty( $_POST['iqfix_wpcf7_nonce'] ) && wp_verify_nonce( $_POST['iqfix_wpcf7_nonce'], 'iqfix_wpcf7_vers_select' ) ) ) {
return false;
}
$selection = intval( $_POST['iqfix_recaptcha_version'] );
$source = ( isset( $_POST, $_POST['iqfix_recaptcha_source'] ) ) ? sanitize_text_field( $_POST['iqfix_recaptcha_source'] ) : 'google.com';
$source = self::verify_recaptcha_source( $source );
// Save Network Settings
if( is_network_admin() && isset( $_POST['wpcf7_recaptcha_network'] ) ) {
$sitekey = trim( $_POST['wpcf7_recaptcha_network']['sitekey'] );
$secretkey = trim( $_POST['wpcf7_recaptcha_network']['secretkey'] );
update_site_option( 'network_iqfix_recaptcha', array(
'sitekey' => $sitekey,
'secret' => $secretkey,
'iqfix_recaptcha' => $selection,
'recaptcha_source' => $source,
) );
// Save Regular WPCF7 Settings
} else {
WPCF7::update_option( 'iqfix_recaptcha', $selection );
WPCF7::update_option( 'iqfix_recaptcha_source', $source );
}
return true;
}
/**
* Add any necessary action hooks
*
* @return void
*/
private function action_hooks() {
add_action( 'admin_menu', array( $this, 'register_submenus' ) );
add_action( 'network_admin_menu', array( $this, 'register_network_submenus' ) );
}
/**
* Add any necessary filter hooks
*
* @return void
*/
private function filter_hooks() {
add_filter( 'option_wpcf7', array( $this, 'network_wpcf7_options' ), 9 );
}
/**
* Register submenus for picking ReCaptcha versions
*
* @return void
*/
public function register_submenus() {
$cf7_admin_cap = ( defined( 'WPCF7_ADMIN_READ_WRITE_CAPABILITY' ) ) ? WPCF7_ADMIN_READ_WRITE_CAPABILITY : 'publish_pages';
add_submenu_page(
'wpcf7',
esc_html__( 'reCaptcha Version', 'wpcf7-recaptcha' ),
esc_html__( 'reCaptcha Version', 'wpcf7-recaptcha' ),
$cf7_admin_cap,
'recaptcha-version',
array( $this, 'display_recaptcha_version_subpage' )
);
}
/**
* Register submenus for the Network Admin Panel
*
* @return void
*/
public function register_network_submenus() {
add_submenu_page(
'plugins.php',
esc_html__( 'WPCF7 reCaptcha Settings', 'wpcf7-recaptcha' ),
esc_html__( 'WPCF7 reCaptcha Settings', 'wpcf7-recaptcha' ),
'manage_network_plugins',
'recaptcha-version',
array( $this, 'display_recaptcha_version_subpage' )
);
}
/**
* Display reCaptcha version subpage
*
* @return void
*/
public function display_recaptcha_version_subpage() {
$updated = $this->save_recaptcha_settings();
$cf7_version = ( defined( 'WPCF7_VERSION' ) ) ? WPCF7_VERSION : WPCF7::get_option( 'version', '0' );
// Grab Network Settings
if( is_network_admin() ) {
$network_options = get_site_option( 'network_iqfix_recaptcha' );
$selection = ( ! empty( $network_options['iqfix_recaptcha'] ) ) ? $network_options['iqfix_recaptcha'] : '';
$source = ( ! empty( $network_options['recaptcha_source'] ) ) ? $network_options['recaptcha_source'] : '';
$sitekey = ( ! empty( $network_options['sitekey'] ) ) ? $network_options['sitekey'] : '';
$secretkey = ( ! empty( $network_options['secret'] ) ) ? $network_options['secret'] : '';
// Grab Site Settings
} else {
$selection = WPCF7::get_option( 'iqfix_recaptcha' );
$source = WPCF7::get_option( 'iqfix_recaptcha_source' );
}
// Show simple message
if( version_compare( $cf7_version, '5.1', '<' ) ) {
printf(
'<div class="wrap"><h1>%1$s</h1><p>%2$s</p></div>',
esc_html__( 'ReCaptcha v2 for Contact Form 7', 'wpcf7-recaptcha' ),
esc_html__( 'This version of Contact Form 7 already uses reCaptcha version 2, you do not need \'ReCaptcha v2 for Contact Form 7\' installed at this time.', 'wpcf7-recaptcha' )
);
return;
}
?>
<div class="wrap">
<style>
#iqFacebook {margin-top: 40px;}
#iqFacebook a {display: inline-block; margin-bottom: 12px;}
#iqFacebook img {display: block; max-width: 100%; height: auto;}
</style>
<?php
printf( '<h1>%1$s</h1>', esc_html__( 'ReCaptcha v2 for Contact Form 7', 'wpcf7-recaptcha' ) );
if( $updated ) {
printf(
'<div class="notice updated"><p>%1$s</p></div>',
esc_html__( 'Your reCaptcha settings have been updated.', 'wpcf7-recaptcha' )
);
}
/* translators: %s is a shortcode example wrapped in <code> tags. */
printf( '<p>%1$s</p>',
sprintf( esc_html__( 'Select the version of reCaptcha you would like to use. You will still need to use the %s shortcode tag in your Contact Form 7 forms.', 'wpcf7-recaptcha' ),
'<code>[recaptcha]</code>'
)
);
?>
<form method="post">
<?php wp_nonce_field( 'iqfix_wpcf7_vers_select', 'iqfix_wpcf7_nonce' ); ?>
<label for="iqfix_recaptcha_version"><strong><?php esc_html_e( 'Select reCaptcha Usage', 'wpcf7-recaptcha' ); ?>:</strong></label><br />
<select id="iqfix_recaptcha_version" name="iqfix_recaptcha_version">
<option value="0"><?php esc_html_e( 'Default Usage', 'wpcf7-recaptcha' ); ?></option>
<option value="2" <?php selected( $selection, 2, true ); ?>><?php esc_html_e( 'reCaptcha Version 2', 'wpcf7-recaptcha' ); ?></option>
</select>
<?php printf( '<p>%s</p>', esc_html__( 'If you\'re not sure if your country blocks Google then you may leave this as default. Otherwise, if your country blocks google.com requests then please select the suggested recaptcha.net alternative below.', 'wpcf7-recaptcha' ) ); ?>
<label for="iqfix_recaptcha_source"><strong><?php esc_html_e( 'Select reCaptcha Source', 'wpcf7-recaptcha' ); ?>:</strong></label><br />
<select id="iqfix_recaptcha_source" name="iqfix_recaptcha_source">
<option value="google.com">google.com</option>
<option value="recaptcha.net" <?php selected( $source, 'recaptcha.net', true ); ?>>recaptcha.net</option>
</select>
<?php if( is_network_admin() ) : ?>
<hr />
<h2><?php esc_html__( 'Network Wide Settings', 'wpcf7-recaptcha' ); ?></h2>
<p><strong><?php _e( 'Please read all of the below before committing to these changes.', 'wpcf7-recaptcha' ); ?></strong></p>
<p><?php _e( 'You may set Network wide API keys below. Please ensure that every network site is whitelisted in the Google API Console. ReCaptcha keys can still be set ( or unset ) on a per site basis if necessary.', 'wpcf7-recaptcha' ); ?></p>
<p><?php
/* translators: Care for HTML in string used for emphasis. */
_e( 'Do note that these keys will automatically apply to all network websites upon save <strong>if keys are not detected</strong>. If some network websites use reCaptcha v3 please <u>do not use this option</u> and set it on a per site level.', 'wpcf7-recaptcha' );
?></p>
<table class="form-table">
<tbody>
<tr>
<th><?php _e( 'Site Key', 'wpcf7-recaptcha' ); ?></th>
<td><input type="text" name="wpcf7_recaptcha_network[sitekey]" class="regular-text" value="<?php echo esc_attr( $sitekey ); ?>" /></td>
</tr>
<tr>
<th><?php _e( 'Secret Key', 'wpcf7-recaptcha' ); ?></th>
<td><input type="password" name="wpcf7_recaptcha_network[secretkey]" class="regular-text" value="<?php echo esc_attr( $secretkey ); ?>" /></td>
</tr>
</tbody>
</table>
<?php endif; ?>
<?php submit_button( esc_html__( 'Submit', 'wpcf7-recaptcha' ), 'submit', 'iqfix_wpcf7_submit' ); ?>
</form>
<div id="iqFacebook">
<?php
printf( '<a href="%1$s" target="_blank"><img src="%2$s" width="540" height="410" alt="%3$s" /></a>',
esc_url( 'https://www.facebook.com/iqcomputing' ),
plugins_url( 'assets/images/facebook-like.png', __FILE__ ),
/* translators: Image alternative tag. */
esc_attr__( 'Like IQComputing on Facebook mascot', 'wpcf7-recaptcha' )
);
printf( '<p>%1$s</p>',
esc_html__( 'Click the image above and like us on Facebook! Facebook is where you will receive the latest news on both this plugin and all future IQComputing plugins.', 'wpcf7-recaptcha' )
);
?>
</div> <!-- id="iqFacebook" -->
</div>
<?php
}
/**
* Filter Hook into WPCF7 get option
* Maybe replace it work a network option
*
* @param Mixed $value
* @param Stirng $option_name
*
* @return Mixed $value
*/
public function network_wpcf7_options( $value ) {
// If we're not on a multisite setup we can skip this filter hook
if( ! is_multisite() || empty( $value ) ) {
return $value;
}
// Allow sites to be setup regardless of network specifciations
if( is_admin()
&& isset( $_GET, $_GET['page'], $_GET['service'], $_GET['action'] )
&& 'wpcf7-integration' == $_GET['page']
&& 'recaptcha' == $_GET['service']
&& 'setup' == $_GET['action']
) {
return $value;
}
// Grab Network Option
$network_wpcf7 = get_site_option( 'network_iqfix_recaptcha' );
$network_wpcf7 = array_filter( (array)$network_wpcf7 );
// Set site keys IF there are no API keys set.
if( empty( $value['recaptcha'] ) && ! empty( $network_wpcf7['sitekey'] ) && ! empty( $network_wpcf7['secret'] ) ) {
$value['recaptcha'] = array(
$network_wpcf7['sitekey'] => $network_wpcf7['secret'],
);
}
// Set IQFix reCaptcha
if( ! isset( $value['iqfix_recaptcha'] ) && ! empty( $network_wpcf7['iqfix_recaptcha'] ) ) {
$value['iqfix_recaptcha'] = $network_wpcf7['iqfix_recaptcha'];
}
// Set IQFix reCaptcha Source
if( ! isset( $value['iqfix_recaptcha_source'] ) && ! empty( $network_wpcf7['recaptcha_source'] ) ) {
$value['iqfix_recaptcha_source'] = $network_wpcf7['recaptcha_source'];
}
return $value;
}
} // END Class IQFix_WPCF7_Deity
/**
* Initialize Class
*
* @return void
*/
function iqfix_wpcf7_deity_init() {
if( class_exists( 'WPCF7' ) ) {
IQFix_WPCF7_Deity::register();
}
}
add_action( 'plugins_loaded', 'iqfix_wpcf7_deity_init' );
/**
* Remove upgrade notice from v2 to v3
* Prevent api keys from being reset.
*
* @return void
*/
function iqfix_wpcf7_upgrade_recaptcha_v2_v3_removal() {
remove_action( 'wpcf7_upgrade', 'wpcf7_upgrade_recaptcha_v2_v3', 10 );
}
add_action( 'admin_init', 'iqfix_wpcf7_upgrade_recaptcha_v2_v3_removal', 9 );