File "really-simple-captcha.php"
Full path: /home/kosmetik/public_html/wp-content/plugins/contact-form-7/modules/really-simple-captcha.php
File
size: 17.13 B
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?php
add_action('wpcf7_init', 'wpcf7_add_form_tag_captcha', 10, 0);
function wpcf7_add_form_tag_captcha()
{
wpcf7_add_form_tag('captchac', 'wpcf7_captchac_form_tag_handler', array('name-attr' => true, 'zero-controls-container' => true, 'not-for-mail' => true));
wpcf7_add_form_tag('captchar', 'wpcf7_captchar_form_tag_handler', array('name-attr' => true, 'do-not-store' => true, 'not-for-mail' => true));
}
function wpcf7_captchac_form_tag_handler($tag)
{
if (!class_exists('ReallySimpleCaptcha')) {
$error = sprintf(esc_html(__("To use CAPTCHA, you need %s plugin installed.", 'contact-form-7')), wpcf7_link('https://wordpress.org/plugins/really-simple-captcha/', 'Really Simple CAPTCHA'));
return sprintf('<em>%s</em>', $error);
}
if (empty($tag->name)) {
return '';
}
$class = wpcf7_form_controls_class($tag->type);
$class .= ' wpcf7-captcha-' . $tag->name;
$atts = array();
$atts['class'] = $tag->get_class_option($class);
$atts['id'] = $tag->get_id_option();
$op = array('img_size' => array(72, 24), 'base' => array(6, 18), 'font_size' => 14, 'font_char_width' => 15);
$op = array_merge($op, wpcf7_captchac_options($tag->options));
if (!($filename = wpcf7_generate_captcha($op))) {
return '';
}
if (!empty($op['img_size'])) {
if (isset($op['img_size'][0])) {
$atts['width'] = $op['img_size'][0];
}
if (isset($op['img_size'][1])) {
$atts['height'] = $op['img_size'][1];
}
}
$atts['alt'] = 'captcha';
$atts['src'] = wpcf7_captcha_url($filename);
$atts = wpcf7_format_atts($atts);
$prefix = substr($filename, 0, strrpos($filename, '.'));
$html = sprintf('<input type="hidden" name="_wpcf7_captcha_challenge_%1$s" value="%2$s" /><img %3$s />', $tag->name, esc_attr($prefix), $atts);
return $html;
}
function wpcf7_captchar_form_tag_handler($tag)
{
if (empty($tag->name)) {
return '';
}
$validation_error = wpcf7_get_validation_error($tag->name);
$class = wpcf7_form_controls_class($tag->type);
if ($validation_error) {
$class .= ' wpcf7-not-valid';
}
$atts = array();
$atts['size'] = $tag->get_size_option('40');
$atts['maxlength'] = $tag->get_maxlength_option();
$atts['minlength'] = $tag->get_minlength_option();
if ($atts['maxlength'] and $atts['minlength'] and $atts['maxlength'] < $atts['minlength']) {
unset($atts['maxlength'], $atts['minlength']);
}
$atts['class'] = $tag->get_class_option($class);
$atts['id'] = $tag->get_id_option();
$atts['tabindex'] = $tag->get_option('tabindex', 'signed_int', true);
$atts['autocomplete'] = 'off';
if ($validation_error) {
$atts['aria-invalid'] = 'true';
$atts['aria-describedby'] = wpcf7_get_validation_error_reference($tag->name);
} else {
$atts['aria-invalid'] = 'false';
}
$value = (string) reset($tag->values);
if (wpcf7_is_posted()) {
$value = '';
}
if ($tag->has_option('placeholder') or $tag->has_option('watermark')) {
$atts['placeholder'] = $value;
$value = '';
}
$atts['value'] = $value;
$atts['type'] = 'text';
$atts['name'] = $tag->name;
$atts = wpcf7_format_atts($atts);
$html = sprintf('<span class="wpcf7-form-control-wrap %1$s"><input %2$s />%3$s</span>', sanitize_html_class($tag->name), $atts, $validation_error);
return $html;
}
add_filter('wpcf7_validate_captchar', 'wpcf7_captcha_validation_filter', 10, 2);
function wpcf7_captcha_validation_filter($result, $tag)
{
$type = $tag->type;
$name = $tag->name;
$captchac = '_wpcf7_captcha_challenge_' . $name;
$prefix = isset($_POST[$captchac]) ? (string) $_POST[$captchac] : '';
$response = isset($_POST[$name]) ? (string) $_POST[$name] : '';
$response = wpcf7_canonicalize($response);
if (0 === strlen($prefix) or !wpcf7_check_captcha($prefix, $response)) {
$result->invalidate($tag, wpcf7_get_message('captcha_not_match'));
}
if (0 !== strlen($prefix)) {
wpcf7_remove_captcha($prefix);
}
return $result;
}
add_filter('wpcf7_refill_response', 'wpcf7_captcha_ajax_refill', 10, 1);
add_filter('wpcf7_feedback_response', 'wpcf7_captcha_ajax_refill', 10, 1);
function wpcf7_captcha_ajax_refill($items)
{
if (!is_array($items)) {
return $items;
}
$tags = wpcf7_scan_form_tags(array('type' => 'captchac'));
if (empty($tags)) {
return $items;
}
$refill = array();
foreach ($tags as $tag) {
$name = $tag->name;
$options = $tag->options;
if (empty($name)) {
continue;
}
$op = wpcf7_captchac_options($options);
if ($filename = wpcf7_generate_captcha($op)) {
$captcha_url = wpcf7_captcha_url($filename);
$refill[$name] = $captcha_url;
}
}
if (!empty($refill)) {
$items['captcha'] = $refill;
}
return $items;
}
add_filter('wpcf7_messages', 'wpcf7_captcha_messages', 10, 1);
function wpcf7_captcha_messages($messages)
{
$messages = array_merge($messages, array('captcha_not_match' => array('description' => __("The code that sender entered does not match the CAPTCHA", 'contact-form-7'), 'default' => __('Your entered code is incorrect.', 'contact-form-7'))));
return $messages;
}
add_action('wpcf7_admin_init', 'wpcf7_add_tag_generator_captcha', 46, 0);
function wpcf7_add_tag_generator_captcha()
{
if (!wpcf7_use_really_simple_captcha()) {
return;
}
$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->add('captcha', __('CAPTCHA (Really Simple CAPTCHA)', 'contact-form-7'), 'wpcf7_tag_generator_captcha');
}
function wpcf7_tag_generator_captcha($contact_form, $args = '')
{
$args = wp_parse_args($args, array());
if (!class_exists('ReallySimpleCaptcha')) {
?>
<div class="control-box">
<fieldset>
<legend><?php
echo sprintf(esc_html(__("To use CAPTCHA, you first need to install and activate %s plugin.", 'contact-form-7')), wpcf7_link('https://wordpress.org/plugins/really-simple-captcha/', 'Really Simple CAPTCHA'));
?></legend>
</fieldset>
</div>
<?php
return;
}
$description = __("Generate form-tags for a CAPTCHA image and corresponding response input field. For more details, see %s.", 'contact-form-7');
$desc_link = wpcf7_link(__('https://contactform7.com/captcha/', 'contact-form-7'), __('CAPTCHA', 'contact-form-7'));
?>
<div class="control-box">
<fieldset>
<legend><?php
echo sprintf(esc_html($description), $desc_link);
?></legend>
<table class="form-table">
<tbody>
<tr>
<th scope="row"><label for="<?php
echo esc_attr($args['content'] . '-name');
?>"><?php
echo esc_html(__('Name', 'contact-form-7'));
?></label></th>
<td><input type="text" name="name" class="tg-name oneline" id="<?php
echo esc_attr($args['content'] . '-name');
?>" /></td>
</tr>
</tbody>
</table>
<table class="form-table scope captchac">
<caption><?php
echo esc_html(__("Image settings", 'contact-form-7'));
?></caption>
<tbody>
<tr>
<th scope="row"><label for="<?php
echo esc_attr($args['content'] . '-captchac-id');
?>"><?php
echo esc_html(__('Id attribute', 'contact-form-7'));
?></label></th>
<td><input type="text" name="id" class="idvalue oneline option" id="<?php
echo esc_attr($args['content'] . '-captchac-id');
?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php
echo esc_attr($args['content'] . '-captchac-class');
?>"><?php
echo esc_html(__('Class attribute', 'contact-form-7'));
?></label></th>
<td><input type="text" name="class" class="classvalue oneline option" id="<?php
echo esc_attr($args['content'] . '-captchac-class');
?>" /></td>
</tr>
</tbody>
</table>
<table class="form-table scope captchar">
<caption><?php
echo esc_html(__("Input field settings", 'contact-form-7'));
?></caption>
<tbody>
<tr>
<th scope="row"><label for="<?php
echo esc_attr($args['content'] . '-captchar-id');
?>"><?php
echo esc_html(__('Id attribute', 'contact-form-7'));
?></label></th>
<td><input type="text" name="id" class="idvalue oneline option" id="<?php
echo esc_attr($args['content'] . '-captchar-id');
?>" /></td>
</tr>
<tr>
<th scope="row"><label for="<?php
echo esc_attr($args['content'] . '-captchar-class');
?>"><?php
echo esc_html(__('Class attribute', 'contact-form-7'));
?></label></th>
<td><input type="text" name="class" class="classvalue oneline option" id="<?php
echo esc_attr($args['content'] . '-captchar-class');
?>" /></td>
</tr>
</tbody>
</table>
</fieldset>
</div>
<div class="insert-box">
<input type="text" name="captcha" class="tag code" readonly="readonly" onfocus="this.select()" />
<div class="submitbox">
<input type="button" class="button button-primary insert-tag" value="<?php
echo esc_attr(__('Insert Tag', 'contact-form-7'));
?>" />
</div>
</div>
<?php
}
add_action('wpcf7_admin_warnings', 'wpcf7_captcha_display_warning_message', 10, 3);
function wpcf7_captcha_display_warning_message($page, $action, $object)
{
if ($object instanceof WPCF7_ContactForm) {
$contact_form = $object;
} else {
return;
}
$has_tags = (bool) $contact_form->scan_form_tags(array('type' => array('captchac')));
if (!$has_tags) {
return;
}
if (!class_exists('ReallySimpleCaptcha')) {
return;
}
$uploads_dir = wpcf7_captcha_tmp_dir();
wpcf7_init_captcha();
if (!is_dir($uploads_dir) or !wp_is_writable($uploads_dir)) {
$message = sprintf(__('This contact form contains CAPTCHA fields, but the temporary folder for the files (%s) does not exist or is not writable. You can create the folder or change its permission manually.', 'contact-form-7'), $uploads_dir);
echo '<div class="notice notice-warning"><p>' . esc_html($message) . '</p></div>';
}
if (!function_exists('imagecreatetruecolor') or !function_exists('imagettftext')) {
$message = __("This contact form contains CAPTCHA fields, but the necessary libraries (GD and FreeType) are not available on your server.", 'contact-form-7');
echo '<div class="notice notice-warning"><p>' . esc_html($message) . '</p></div>';
}
}
function wpcf7_init_captcha()
{
static $captcha = null;
if ($captcha) {
return $captcha;
}
if (class_exists('ReallySimpleCaptcha')) {
$captcha = new ReallySimpleCaptcha();
} else {
return false;
}
$dir = trailingslashit(wpcf7_captcha_tmp_dir());
$captcha->tmp_dir = $dir;
if (is_callable(array($captcha, 'make_tmp_dir'))) {
$result = $captcha->make_tmp_dir();
if (!$result) {
return false;
}
return $captcha;
}
if (wp_mkdir_p($dir)) {
$htaccess_file = path_join($dir, '.htaccess');
if (file_exists($htaccess_file)) {
return $captcha;
}
if ($handle = fopen($htaccess_file, 'w')) {
fwrite($handle, 'Order deny,allow' . "\n");
fwrite($handle, 'Deny from all' . "\n");
fwrite($handle, '<Files ~ "^[0-9A-Za-z]+\\.(jpeg|gif|png)$">' . "\n");
fwrite($handle, ' Allow from all' . "\n");
fwrite($handle, '</Files>' . "\n");
fclose($handle);
}
} else {
return false;
}
return $captcha;
}
function wpcf7_captcha_tmp_dir()
{
if (defined('WPCF7_CAPTCHA_TMP_DIR')) {
$dir = path_join(WP_CONTENT_DIR, WPCF7_CAPTCHA_TMP_DIR);
wp_mkdir_p($dir);
if (wpcf7_is_file_path_in_content_dir($dir)) {
return $dir;
}
}
$dir = path_join(wpcf7_upload_dir('dir'), 'wpcf7_captcha');
wp_mkdir_p($dir);
return $dir;
}
function wpcf7_captcha_tmp_url()
{
if (defined('WPCF7_CAPTCHA_TMP_URL')) {
return WPCF7_CAPTCHA_TMP_URL;
} else {
return path_join(wpcf7_upload_dir('url'), 'wpcf7_captcha');
}
}
function wpcf7_captcha_url($filename)
{
$url = path_join(wpcf7_captcha_tmp_url(), $filename);
if (is_ssl() and 'http:' == substr($url, 0, 5)) {
$url = 'https:' . substr($url, 5);
}
return apply_filters('wpcf7_captcha_url', esc_url_raw($url));
}
function wpcf7_generate_captcha($options = null)
{
if (!($captcha = wpcf7_init_captcha())) {
return false;
}
if (!is_dir($captcha->tmp_dir) or !wp_is_writable($captcha->tmp_dir)) {
return false;
}
$img_type = imagetypes();
if ($img_type & IMG_PNG) {
$captcha->img_type = 'png';
} elseif ($img_type & IMG_GIF) {
$captcha->img_type = 'gif';
} elseif ($img_type & IMG_JPG) {
$captcha->img_type = 'jpeg';
} else {
return false;
}
if (is_array($options)) {
if (isset($options['img_size'])) {
$captcha->img_size = $options['img_size'];
}
if (isset($options['base'])) {
$captcha->base = $options['base'];
}
if (isset($options['font_size'])) {
$captcha->font_size = $options['font_size'];
}
if (isset($options['font_char_width'])) {
$captcha->font_char_width = $options['font_char_width'];
}
if (isset($options['fg'])) {
$captcha->fg = $options['fg'];
}
if (isset($options['bg'])) {
$captcha->bg = $options['bg'];
}
}
$prefix = wp_rand();
$captcha_word = $captcha->generate_random_word();
return $captcha->generate_image($prefix, $captcha_word);
}
function wpcf7_check_captcha($prefix, $response)
{
if (!($captcha = wpcf7_init_captcha())) {
return false;
}
return $captcha->check($prefix, $response);
}
function wpcf7_remove_captcha($prefix)
{
if (!($captcha = wpcf7_init_captcha())) {
return false;
}
if (preg_match('/[^0-9]/', $prefix)) {
return false;
}
$captcha->remove($prefix);
}
add_action('template_redirect', 'wpcf7_cleanup_captcha_files', 20, 0);
function wpcf7_cleanup_captcha_files()
{
if (!($captcha = wpcf7_init_captcha())) {
return false;
}
if (is_callable(array($captcha, 'cleanup'))) {
return $captcha->cleanup();
}
$dir = trailingslashit(wpcf7_captcha_tmp_dir());
if (!is_dir($dir) or !is_readable($dir) or !wp_is_writable($dir)) {
return false;
}
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle))) {
if (!preg_match('/^[0-9]+\\.(php|txt|png|gif|jpeg)$/', $file)) {
continue;
}
$stat = stat(path_join($dir, $file));
if ($stat['mtime'] + HOUR_IN_SECONDS < time()) {
@unlink(path_join($dir, $file));
}
}
closedir($handle);
}
}
function wpcf7_captchac_options($options)
{
if (!is_array($options)) {
return array();
}
$op = array();
$image_size_array = preg_grep('%^size:[smlSML]$%', $options);
if ($image_size = array_shift($image_size_array)) {
preg_match('%^size:([smlSML])$%', $image_size, $is_matches);
switch (strtolower($is_matches[1])) {
case 's':
$op['img_size'] = array(60, 20);
$op['base'] = array(6, 15);
$op['font_size'] = 11;
$op['font_char_width'] = 13;
break;
case 'l':
$op['img_size'] = array(84, 28);
$op['base'] = array(6, 20);
$op['font_size'] = 17;
$op['font_char_width'] = 19;
break;
case 'm':
default:
$op['img_size'] = array(72, 24);
$op['base'] = array(6, 18);
$op['font_size'] = 14;
$op['font_char_width'] = 15;
}
}
$fg_color_array = preg_grep('%^fg:#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$%', $options);
if ($fg_color = array_shift($fg_color_array)) {
preg_match('%^fg:#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$%', $fg_color, $fc_matches);
if (3 == strlen($fc_matches[1])) {
$r = substr($fc_matches[1], 0, 1);
$g = substr($fc_matches[1], 1, 1);
$b = substr($fc_matches[1], 2, 1);
$op['fg'] = array(hexdec($r . $r), hexdec($g . $g), hexdec($b . $b));
} elseif (6 == strlen($fc_matches[1])) {
$r = substr($fc_matches[1], 0, 2);
$g = substr($fc_matches[1], 2, 2);
$b = substr($fc_matches[1], 4, 2);
$op['fg'] = array(hexdec($r), hexdec($g), hexdec($b));
}
}
$bg_color_array = preg_grep('%^bg:#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$%', $options);
if ($bg_color = array_shift($bg_color_array)) {
preg_match('%^bg:#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$%', $bg_color, $bc_matches);
if (3 == strlen($bc_matches[1])) {
$r = substr($bc_matches[1], 0, 1);
$g = substr($bc_matches[1], 1, 1);
$b = substr($bc_matches[1], 2, 1);
$op['bg'] = array(hexdec($r . $r), hexdec($g . $g), hexdec($b . $b));
} elseif (6 == strlen($bc_matches[1])) {
$r = substr($bc_matches[1], 0, 2);
$g = substr($bc_matches[1], 2, 2);
$b = substr($bc_matches[1], 4, 2);
$op['bg'] = array(hexdec($r), hexdec($g), hexdec($b));
}
}
return $op;
}