false,
'invalid' => true,
'captcha_size' => true,
'default' => false,
);
}
/**
* @return array
*/
protected function new_field_settings() {
$frm_settings = FrmAppHelper::get_settings();
return array(
'invalid' => $frm_settings->re_msg,
);
}
/**
* @return array
*/
protected function extra_field_opts() {
return array(
'label' => 'none',
'captcha_size' => 'normal',
'captcha_theme' => 'light',
);
}
/**
* Remove the "for" attribute for captcha
*
* @param array $args
* @param string $html
*
* @return string
*/
protected function before_replace_html_shortcodes( $args, $html ) {
return str_replace( ' for="field_[key]"', ' for="g-recaptcha-response"', $html );
}
public function front_field_input( $args, $shortcode_atts ) {
$frm_settings = FrmAppHelper::get_settings();
if ( empty( $frm_settings->pubkey ) ) {
return '';
}
$class_prefix = $this->class_prefix();
$captcha_size = $this->captcha_size();
$allow_mutiple = $frm_settings->re_multi;
$html = '
api_url();
wp_register_script( 'recaptcha-api', $api_js_url, array( 'formidable' ), '3', true );
wp_enqueue_script( 'recaptcha-api' );
}
protected function api_url() {
$api_js_url = 'https://www.google.com/recaptcha/api.js?';
$frm_settings = FrmAppHelper::get_settings();
$allow_mutiple = $frm_settings->re_multi;
if ( $allow_mutiple ) {
$api_js_url .= '&onload=frmRecaptcha&render=explicit';
}
$lang = apply_filters( 'frm_recaptcha_lang', $frm_settings->re_lang, $this->field );
if ( ! empty( $lang ) ) {
$api_js_url .= '&hl=' . $lang;
}
return apply_filters( 'frm_recaptcha_js_url', $api_js_url );
}
protected function class_prefix() {
if ( $this->allow_multiple() ) {
$class_prefix = 'frm-';
} else {
$class_prefix = '';
}
return $class_prefix;
}
protected function allow_multiple() {
$frm_settings = FrmAppHelper::get_settings();
return $frm_settings->re_multi;
}
protected function captcha_size() {
// for reverse compatibility
$frm_settings = FrmAppHelper::get_settings();
$captcha_size = ( $this->field['captcha_size'] == 'default' ) ? 'normal' : $this->field['captcha_size'];
return ( $frm_settings->re_type == 'invisible' ) ? 'invisible' : $captcha_size;
}
/**
* @since 4.07
* @param array $args
* @return array
*/
protected function validate_against_api( $args ) {
$errors = array();
$frm_settings = FrmAppHelper::get_settings();
$resp = $this->send_api_check( $frm_settings );
$response = json_decode( wp_remote_retrieve_body( $resp ), true );
if ( isset( $response['success'] ) && ! $response['success'] ) {
// What happens when the CAPTCHA was entered incorrectly
$invalid_message = FrmField::get_option( $this->field, 'invalid' );
$errors[ 'field' . $args['id'] ] = ( $invalid_message == '' ? $frm_settings->re_msg : $invalid_message );
} elseif ( is_wp_error( $resp ) ) {
$error_string = $resp->get_error_message();
$errors[ 'field' . $args['id'] ] = __( 'There was a problem verifying your recaptcha', 'formidable' );
$errors[ 'field' . $args['id'] ] .= ' ' . $error_string;
}
return $errors;
}
/**
* @param array $args
* @return array
*/
public function validate( $args ) {
if ( ! $this->should_validate() ) {
return array();
}
if ( ! isset( $_POST['g-recaptcha-response'] ) ) {
// There was no captcha submitted.
return array( 'field' . $args['id'] => __( 'The captcha is missing from this form', 'formidable' ) );
}
return $this->validate_against_api( $args );
}
/**
* @since 4.07
* @return bool
*/
private function should_show_captcha() {
$frm_settings = FrmAppHelper::get_settings();
return ! empty( $frm_settings->pubkey );
}
protected function should_validate() {
$is_hidden_field = apply_filters( 'frm_is_field_hidden', false, $this->field, wp_unslash( $_POST ) ); // WPCS: CSRF ok.
if ( FrmAppHelper::is_admin() || $is_hidden_field ) {
return false;
}
// don't require the captcha if it shouldn't be shown
return $this->should_show_captcha();
}
protected function send_api_check( $frm_settings ) {
$arg_array = array(
'body' => array(
'secret' => $frm_settings->privkey,
'response' => FrmAppHelper::get_param( 'g-recaptcha-response', '', 'post', 'sanitize_text_field' ),
'remoteip' => FrmAppHelper::get_ip_address(),
),
);
return wp_remote_post( 'https://www.google.com/recaptcha/api/siteverify', $arg_array );
}
}