Spam protection, AntiSpam, FireWall by CleanTalk - Version 2.21

Version Description

2013-11-13 = * Changed: WordPress blacklists settings get priority over plugin's antispam settings * Changed: Disabled management approval comments for regular commentators of the blog. Automatically approved for publication only the comments of the new blog authors. * Changed: Removed form submit time test. Imporved JavaScript spam test. * Changed: PHP code optimizations

Download this release

Release Info

Developer shagimuratov
Plugin Icon 128x128 Spam protection, AntiSpam, FireWall by CleanTalk
Version 2.21
Comparing to
See all releases

Code changes from version 2.19 to 2.21

Files changed (4) hide show
  1. cleantalk.class.php +1 -1
  2. cleantalk.php +89 -68
  3. i18n/cleantalk-ru_RU.mo +0 -0
  4. readme.txt +16 -5
cleantalk.class.php CHANGED
@@ -151,7 +151,7 @@ class CleantalkResponse {
151
 
152
  $this->errstr = preg_replace("/.+(\*\*\*.+\*\*\*).+/", "$1", $this->errstr);
153
  // Разбираем ответ с клинтолка
154
- $this->stop_words = isset($obj->stop_words) ? $obj->stop_words : null;
155
  $this->comment = isset($obj->comment) ? utf8_decode($obj->comment) : null;
156
  $this->blacklisted = (isset($obj->blacklisted)) ? $obj->blacklisted : null;
157
  $this->allow = (isset($obj->allow)) ? $obj->allow : 0;
151
 
152
  $this->errstr = preg_replace("/.+(\*\*\*.+\*\*\*).+/", "$1", $this->errstr);
153
  // Разбираем ответ с клинтолка
154
+ $this->stop_words = isset($obj->stop_words) ? utf8_decode($obj->stop_words) : null;
155
  $this->comment = isset($obj->comment) ? utf8_decode($obj->comment) : null;
156
  $this->blacklisted = (isset($obj->blacklisted)) ? $obj->blacklisted : null;
157
  $this->allow = (isset($obj->allow)) ? $obj->allow : 0;
cleantalk.php CHANGED
@@ -3,16 +3,15 @@
3
  Plugin Name: Anti-spam by CleanTalk
4
  Plugin URI: http://cleantalk.org/wordpress
5
  Description: Invisible antispam for comments, registrations and feedbacks. The plugin doesn't use CAPTCHA, Q&A, math or quiz to stop spam bots.
6
- Version: 2.19
7
  Author: СleanTalk <welcome@cleantalk.ru>
8
  Author URI: http://cleantalk.org
9
  */
10
 
11
- $ct_agent_version = 'wordpress-219';
12
  $ct_checkjs_frm = 'ct_checkjs_frm';
13
  $ct_checkjs_register_form = 'ct_checkjs_register_form';
14
 
15
- add_action('init', 'ct_init_locale');
16
  add_action('comment_form', 'ct_add_hidden_fields');
17
  add_action('parse_request', 'ct_set_session');
18
  add_action('admin_notices', 'admin_notice_message');
@@ -24,7 +23,7 @@ add_action('register_form','ct_register_form');
24
  add_filter('registration_errors', 'ct_registration_errors', 10, 3);
25
 
26
  if (is_admin()) {
27
- add_action('admin_init', 'ct_admin_init');
28
  add_action('admin_menu', 'ct_admin_add_page');
29
  add_action('admin_enqueue_scripts', 'ct_enqueue_scripts');
30
  add_action('comment_unapproved_to_approved', 'ct_comment_approved'); // param - comment object
@@ -89,6 +88,7 @@ function ct_hash($new_hash = '') {
89
  * @return string comment_content w\o cleantalk resume
90
  */
91
  function ct_feedback($hash, $message, $allow) {
 
92
  require_once('cleantalk.class.php');
93
  $options = ct_get_options();
94
 
@@ -121,8 +121,8 @@ function ct_feedback($hash, $message, $allow) {
121
  * @return bool
122
  */
123
  function ct_send_feedback($feedback_request = null) {
124
-
125
- if (empty($feedback_request) && isset($_SESSION['feedback_request']) && preg_match("/^[a-z0-9\;\:]+$/", $_SESSION['feedback_request'])) {
126
  $feedback_request = $_SESSION['feedback_request'];
127
  unset($_SESSION['feedback_request']);
128
  }
@@ -165,10 +165,19 @@ function ct_send_feedback($feedback_request = null) {
165
  */
166
  function ct_init_locale() {
167
  load_plugin_textdomain('cleantalk', false, basename(dirname(__FILE__)) . '/i18n');
 
 
 
 
 
 
 
168
  if(!session_id()) {
169
  session_name('cleantalksession');
170
- session_start();
171
  }
 
 
172
  }
173
 
174
  /**
@@ -207,7 +216,6 @@ function ct_set_session() {
207
  // this action is called AFTER wp-comments-post.php executing and AFTER ct_check calling so we can create new session value here
208
  // it can be any action between init and send_headers, see http://codex.wordpress.org/Plugin_API/Action_Reference
209
 
210
- $_SESSION['formtime'] = time();
211
  }
212
 
213
  /**
@@ -268,12 +276,7 @@ function ct_frm_validate_entry ($errors, $values) {
268
  return false;
269
  }
270
 
271
- $checkjs = 0;
272
- if (isset($_POST[$ct_checkjs_frm])) {
273
- if($_POST[$ct_checkjs_frm] == ct_get_checkjs_value()) {
274
- $checkjs = 1;
275
- }
276
- }
277
 
278
  require_once('cleantalk.class.php');
279
 
@@ -351,12 +354,26 @@ function ct_check($comment) {
351
  // this action is called by wp-comments-post.php
352
  // after processing WP makes redirect to post page with comment's form by GET request (see above)
353
  global $wpdb, $current_user, $comment_post_id, $ct_agent_version;
354
-
355
  $options = ct_get_options();
356
  if (ct_is_user_enable() === false || $options['comments_test'] == 0) {
357
  return $comment;
358
  }
359
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
360
  $wp_host = null;
361
  if (preg_match("@^(?:https?://)([^/:]+)@i", get_permalink($comment['comment_post_ID']), $matches))
362
  $wp_host = $matches[1];
@@ -374,20 +391,7 @@ function ct_check($comment) {
374
 
375
  $post = get_post($comment_post_id);
376
 
377
- $checkjs = null;
378
- if (!isset($_POST['ct_checkjs'])) {
379
- $checkjs = null;
380
- } elseif($_POST['ct_checkjs'] == ct_get_checkjs_value()) {
381
- $checkjs = 1;
382
- } elseif ($_POST['ct_checkjs'] !== 0) {
383
- $checkjs = 0;
384
- }
385
-
386
- if (array_key_exists('formtime', $_SESSION)) {
387
- $submit_time = time() - (int) $_SESSION['formtime'];
388
- } else {
389
- $submit_time = null;
390
- }
391
 
392
  $example = null;
393
  if (function_exists('json_encode')) {
@@ -450,7 +454,6 @@ function ct_check($comment) {
450
  $ct_request->sender_ip = $ct->ct_session_ip($_SERVER['REMOTE_ADDR']);
451
  $ct_request->agent = $ct_agent_version;
452
  $ct_request->sender_info = $user_info;
453
- $ct_request->submit_time = $submit_time;
454
  $ct_request->js_on = $checkjs;
455
  $ct_request->post_info = $post_info;
456
 
@@ -469,32 +472,63 @@ function ct_check($comment) {
469
  $err_text = '<center><b style="color: #49C73B;">Clean</b><b style="color: #349ebf;">Talk.</b> ' . __('Spam protection', 'cleantalk') . "</center><br><br>\n" . $ct_result->comment;
470
  $err_text .= '<script>setTimeout("history.back()", 5000);</script>';
471
  wp_die($err_text, 'Blacklisted', array('back_link' => true));
472
- } else {
473
- ct_hash($ct_result->id);
474
- if ($ct_result->allow == 1 && $options['autoPubRevelantMess'] == 1) {
475
- add_filter('pre_comment_approved', 'ct_set_approved');
476
- } elseif($ct_result->allow == 0) {
477
- if (!empty($ct_result->stop_words)) {
478
- global $ct_stop_words;
479
- $ct_stop_words = $ct_result->stop_words;
480
- add_action('comment_post', 'ct_mark_red', 11, 2);
 
 
 
 
 
 
 
 
 
 
 
 
481
  }
482
- $comment['comment_content'] = $ct->addCleantalkComment($comment['comment_content'], $ct_result->comment);
483
- if ($ct_result->spam == 1) {
484
- add_filter('pre_comment_approved', 'ct_set_comment_spam');
485
- global $ct_comment;
486
- $ct_comment = $ct_result->comment;
487
- add_action('comment_post', 'ct_die', 12, 2);
488
- } else {
 
489
  add_filter('pre_comment_approved', 'ct_set_not_approved');
490
  }
 
 
491
  }
492
-
493
- add_action('comment_post', 'ct_set_meta', 10, 2);
494
  }
 
495
  return $comment;
496
  }
497
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
498
  /**
499
  * Get post url
500
  * @param int $comment_id
@@ -519,18 +553,6 @@ function ct_post_url($comment_id = null, $comment_post_id) {
519
  return $post_url;
520
  }
521
 
522
- /**
523
- * Set die page with Cleantalk comment.
524
- * @global type $ct_comment
525
- $err_text = '<center><b style="color: #49C73B;">Clean</b><b style="color: #349ebf;">Talk.</b> ' . __('Spam protection', 'cleantalk') . "</center><br><br>\n" . $ct_comment;
526
- * @param type $comment_status
527
- */
528
- function ct_die($comment_id, $comment_status) {
529
- global $ct_comment;
530
- $err_text = '<center><b style="color: #49C73B;">Clean</b><b style="color: #349ebf;">Talk.</b> ' . __('Spam protection', 'cleantalk') . "</center><br><br>\n" . $ct_comment;
531
- $err_text .= '<script>setTimeout("history.back()", 5000);</script>';
532
- wp_die($err_text, 'Blacklisted', array('back_link' => true));
533
- }
534
  /**
535
  * Public filter 'pre_comment_approved' - Mark comment unapproved always
536
  * @return int Zero
@@ -777,7 +799,6 @@ function delete_spam_comments() {
777
  }
778
  }
779
 
780
-
781
  return null;
782
  }
783
 
@@ -805,12 +826,8 @@ function ct_registration_errors($errors, $sanitized_user_login, $user_email) {
805
  return $errors;
806
  }
807
 
808
- $checkjs = 0;
809
- if (isset($_POST[$ct_checkjs_register_form])) {
810
- if($_POST[$ct_checkjs_register_form] == ct_get_checkjs_value()) {
811
- $checkjs = 1;
812
- }
813
- }
814
  require_once('cleantalk.class.php');
815
 
816
  $blog_lang = substr(get_locale(), 0, 2);
@@ -883,6 +900,10 @@ function ct_admin_add_page() {
883
  * Admin action 'admin_init' - Add the admin settings and such
884
  */
885
  function ct_admin_init() {
 
 
 
 
886
  register_setting('cleantalk_settings', 'cleantalk_settings', 'ct_settings_validate');
887
  add_settings_section('cleantalk_settings_main', __('Main settings', 'cleantalk'), 'ct_section_settings_main', 'cleantalk');
888
  add_settings_section('cleantalk_settings_anti_spam', __('Anti-spam settings', 'cleantalk'), 'ct_section_settings_anti_spam', 'cleantalk');
@@ -920,7 +941,7 @@ function ct_input_autoPubRevelantMess () {
920
  echo "<input type='radio' id='cleantalk_autoPubRevelantMess1' name='cleantalk_settings[autoPubRevelantMess]' value='1' " . ($value == '1' ? 'checked' : '') . " /><label for='cleantalk_autoPubRevelantMess1'> " . __('Yes') . "</label>";
921
  echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
922
  echo "<input type='radio' id='cleantalk_autoPubRevelantMess0' name='cleantalk_settings[autoPubRevelantMess]' value='0' " . ($value == '0' ? 'checked' : '') . " /><label for='cleantalk_autoPubRevelantMess0'> " . __('No') . "</label>";
923
- admin_addDescriptionsFields(__('Relevant (not spam) comments will be automatic published at the blog', 'cleantalk'));
924
  }
925
  /**
926
  * @author Artem Leontiev
3
  Plugin Name: Anti-spam by CleanTalk
4
  Plugin URI: http://cleantalk.org/wordpress
5
  Description: Invisible antispam for comments, registrations and feedbacks. The plugin doesn't use CAPTCHA, Q&A, math or quiz to stop spam bots.
6
+ Version: 2.21
7
  Author: СleanTalk <welcome@cleantalk.ru>
8
  Author URI: http://cleantalk.org
9
  */
10
 
11
+ $ct_agent_version = 'wordpress-221';
12
  $ct_checkjs_frm = 'ct_checkjs_frm';
13
  $ct_checkjs_register_form = 'ct_checkjs_register_form';
14
 
 
15
  add_action('comment_form', 'ct_add_hidden_fields');
16
  add_action('parse_request', 'ct_set_session');
17
  add_action('admin_notices', 'admin_notice_message');
23
  add_filter('registration_errors', 'ct_registration_errors', 10, 3);
24
 
25
  if (is_admin()) {
26
+ add_action('admin_init', 'ct_admin_init', 1);
27
  add_action('admin_menu', 'ct_admin_add_page');
28
  add_action('admin_enqueue_scripts', 'ct_enqueue_scripts');
29
  add_action('comment_unapproved_to_approved', 'ct_comment_approved'); // param - comment object
88
  * @return string comment_content w\o cleantalk resume
89
  */
90
  function ct_feedback($hash, $message, $allow) {
91
+
92
  require_once('cleantalk.class.php');
93
  $options = ct_get_options();
94
 
121
  * @return bool
122
  */
123
  function ct_send_feedback($feedback_request = null) {
124
+
125
+ if (empty($feedback_request) && isset($_SESSION['feedback_request']) && preg_match("/^[a-z0-9\;\:]+$/", $_SESSION['feedback_request'])) {
126
  $feedback_request = $_SESSION['feedback_request'];
127
  unset($_SESSION['feedback_request']);
128
  }
165
  */
166
  function ct_init_locale() {
167
  load_plugin_textdomain('cleantalk', false, basename(dirname(__FILE__)) . '/i18n');
168
+ }
169
+
170
+ /**
171
+ * Session init
172
+ * @return null;
173
+ */
174
+ function ct_init_session() {
175
  if(!session_id()) {
176
  session_name('cleantalksession');
177
+ @session_start();
178
  }
179
+
180
+ return null;
181
  }
182
 
183
  /**
216
  // this action is called AFTER wp-comments-post.php executing and AFTER ct_check calling so we can create new session value here
217
  // it can be any action between init and send_headers, see http://codex.wordpress.org/Plugin_API/Action_Reference
218
 
 
219
  }
220
 
221
  /**
276
  return false;
277
  }
278
 
279
+ $checkjs = js_test($ct_checkjs_frm);
 
 
 
 
 
280
 
281
  require_once('cleantalk.class.php');
282
 
354
  // this action is called by wp-comments-post.php
355
  // after processing WP makes redirect to post page with comment's form by GET request (see above)
356
  global $wpdb, $current_user, $comment_post_id, $ct_agent_version;
357
+
358
  $options = ct_get_options();
359
  if (ct_is_user_enable() === false || $options['comments_test'] == 0) {
360
  return $comment;
361
  }
362
 
363
+ $local_blacklists = wp_blacklist_check(
364
+ $comment['comment_author'],
365
+ $comment['comment_author_email'],
366
+ $comment['comment_author_url'],
367
+ $comment['comment_content'],
368
+ @$_SERVER['REMOTE_ADDR'],
369
+ @$_SERVER['HTTP_USER_AGENT']
370
+ );
371
+
372
+ // Go out if author in local blacklists
373
+ if ($local_blacklists === true) {
374
+ return $comment;
375
+ }
376
+
377
  $wp_host = null;
378
  if (preg_match("@^(?:https?://)([^/:]+)@i", get_permalink($comment['comment_post_ID']), $matches))
379
  $wp_host = $matches[1];
391
 
392
  $post = get_post($comment_post_id);
393
 
394
+ $checkjs = js_test('ct_checkjs');
 
 
 
 
 
 
 
 
 
 
 
 
 
395
 
396
  $example = null;
397
  if (function_exists('json_encode')) {
454
  $ct_request->sender_ip = $ct->ct_session_ip($_SERVER['REMOTE_ADDR']);
455
  $ct_request->agent = $ct_agent_version;
456
  $ct_request->sender_info = $user_info;
 
457
  $ct_request->js_on = $checkjs;
458
  $ct_request->post_info = $post_info;
459
 
472
  $err_text = '<center><b style="color: #49C73B;">Clean</b><b style="color: #349ebf;">Talk.</b> ' . __('Spam protection', 'cleantalk') . "</center><br><br>\n" . $ct_result->comment;
473
  $err_text .= '<script>setTimeout("history.back()", 5000);</script>';
474
  wp_die($err_text, 'Blacklisted', array('back_link' => true));
475
+
476
+ return $comment;
477
+ }
478
+
479
+ ct_hash($ct_result->id);
480
+
481
+ if ($ct_result->spam == 1) {
482
+ $comment['comment_content'] = $ct->addCleantalkComment($comment['comment_content'], $ct_result->comment);
483
+ add_filter('pre_comment_approved', 'ct_set_comment_spam');
484
+ add_action('comment_post', 'ct_set_meta', 10, 2);
485
+ return $comment;
486
+ }
487
+
488
+ if (isset($comment['comment_author_email'])) {
489
+ $approved_comments = get_comments(array('status' => 'approve', 'count' => true, 'author_email' => $comment['comment_author_email']));
490
+
491
+ // Change comment flow only for new authors
492
+ if ((int) $approved_comments == 0) {
493
+
494
+ if ($ct_result->allow == 1 && $options['autoPubRevelantMess'] == 1) {
495
+ add_filter('pre_comment_approved', 'ct_set_approved');
496
  }
497
+ if ($ct_result->allow == 0) {
498
+ if (isset($ct_result->stop_words)) {
499
+ global $ct_stop_words;
500
+ $ct_stop_words = $ct_result->stop_words;
501
+ add_action('comment_post', 'ct_mark_red', 11, 2);
502
+ }
503
+
504
+ $comment['comment_content'] = $ct->addCleantalkComment($comment['comment_content'], $ct_result->comment);
505
  add_filter('pre_comment_approved', 'ct_set_not_approved');
506
  }
507
+
508
+ add_action('comment_post', 'ct_set_meta', 10, 2);
509
  }
 
 
510
  }
511
+
512
  return $comment;
513
  }
514
 
515
+ /**
516
+ *
517
+ *
518
+ */
519
+ function js_test($field_name = 'ct_checkjs') {
520
+ $checkjs = null;
521
+ if (isset($_POST[$field_name])) {
522
+ if($_POST[$field_name] == ct_get_checkjs_value()) {
523
+ $checkjs = 1;
524
+ } else {
525
+ $checkjs = 0;
526
+ }
527
+ }
528
+
529
+ return $checkjs;
530
+ }
531
+
532
  /**
533
  * Get post url
534
  * @param int $comment_id
553
  return $post_url;
554
  }
555
 
 
 
 
 
 
 
 
 
 
 
 
 
556
  /**
557
  * Public filter 'pre_comment_approved' - Mark comment unapproved always
558
  * @return int Zero
799
  }
800
  }
801
 
 
802
  return null;
803
  }
804
 
826
  return $errors;
827
  }
828
 
829
+ $checkjs = js_test($ct_checkjs_register_form);
830
+
 
 
 
 
831
  require_once('cleantalk.class.php');
832
 
833
  $blog_lang = substr(get_locale(), 0, 2);
900
  * Admin action 'admin_init' - Add the admin settings and such
901
  */
902
  function ct_admin_init() {
903
+ ct_init_locale();
904
+
905
+ ct_init_session();
906
+
907
  register_setting('cleantalk_settings', 'cleantalk_settings', 'ct_settings_validate');
908
  add_settings_section('cleantalk_settings_main', __('Main settings', 'cleantalk'), 'ct_section_settings_main', 'cleantalk');
909
  add_settings_section('cleantalk_settings_anti_spam', __('Anti-spam settings', 'cleantalk'), 'ct_section_settings_anti_spam', 'cleantalk');
941
  echo "<input type='radio' id='cleantalk_autoPubRevelantMess1' name='cleantalk_settings[autoPubRevelantMess]' value='1' " . ($value == '1' ? 'checked' : '') . " /><label for='cleantalk_autoPubRevelantMess1'> " . __('Yes') . "</label>";
942
  echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
943
  echo "<input type='radio' id='cleantalk_autoPubRevelantMess0' name='cleantalk_settings[autoPubRevelantMess]' value='0' " . ($value == '0' ? 'checked' : '') . " /><label for='cleantalk_autoPubRevelantMess0'> " . __('No') . "</label>";
944
+ admin_addDescriptionsFields(__('Relevant (not spam) comments from new authors will be automatic published at the blog', 'cleantalk'));
945
  }
946
  /**
947
  * @author Artem Leontiev
i18n/cleantalk-ru_RU.mo CHANGED
Binary file
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: znaeff, shagimuratov
3
  Tags: spam, antispam, anti-spam, spambot, spam-bot, stop spam, spammers, spamfree, captcha, capcha, captha, catcha, recaptcha, comment, comments, math, cloud, blacklist, puzzle, wpmu, network, multisite, akismet, спам, 垃圾邮件, correo no deseado, forms, formidable forms, feedback, registration
4
  Requires at least: 3.0
5
  Tested up to: 3.7.1
6
- Stable tag: 2.19
7
  License: GPLv2
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
@@ -13,15 +13,15 @@ Invisible anti-spam without CAPTCHA. No spam in the comments, registration and f
13
 
14
  1. Stops spam bots in the comments.
15
  1. Stops spam bots in the registration.
16
- 1. Stops spam bots at the feedback forms.
17
  1. Invisible spam protection for visitors.
18
  1. Anti-spam without CAPTCHA, math, puzzles or Q&A.
19
 
20
  Plugin filters spam bots in the comments, spam moves to trash. The plugin is not visible for visitors and administrators of a blog. The plugin doesn't use CAPTCHA, Q&A, puzzles or math to stop spammers. It's simple and clever antispam for your blog.
21
 
22
- Also every new comment plugin compares with post and previous comments. If the relevance of the comment is good enough it gets approval at the blog without manual approval. This feature works for English, Russian laguages.
23
 
24
- The plugin is a client application for anti-spam cloud service <a href="http://cleantalk.org" target="_blank">cleantalk.org</a>. CleanTalk.org daily prevents from spam 3 000 blogs, blocks up to 300 000 spam bots attacks and approves up to 2 000 not spam comments.
25
 
26
  The plugin is WordPress MultiUser (WPMU or WordPress network) compatible. Each blog in multisite environment has individual anitspam options for spam bots protection.
27
 
@@ -31,7 +31,7 @@ The plugin is WordPress MultiUser (WPMU or WordPress network) compatible. Each b
31
  * Antispam protection for <a href="http://wordpress.org/plugins/formidable/" target="_blank">Formiadble forms</a>.
32
 
33
  = Requirements =
34
- WordPress 3.0 at least. PHP 4, 5 with CURL or file_get_contents() function and enabled 'allow_url_fopen' setting.
35
 
36
  == Installation ==
37
 
@@ -87,6 +87,12 @@ Use other antispam plugins not necessarily, because CleanTalk stops 99.99% of sp
87
 
88
  == Changelog ==
89
 
 
 
 
 
 
 
90
  = 2.19 2013-11-08 =
91
  * New: Antispam protection from spam bots at the registration form
92
  * Changed: Russian localization for admin panel
@@ -203,6 +209,11 @@ Use other antispam plugins not necessarily, because CleanTalk stops 99.99% of sp
203
  * First version
204
 
205
  == Upgrade Notice ==
 
 
 
 
 
206
  = 2.19 2013-11-08 =
207
  * New: Antispam protection from spam bots at the registration form
208
  * Changed: Russian localization for admin panel
3
  Tags: spam, antispam, anti-spam, spambot, spam-bot, stop spam, spammers, spamfree, captcha, capcha, captha, catcha, recaptcha, comment, comments, math, cloud, blacklist, puzzle, wpmu, network, multisite, akismet, спам, 垃圾邮件, correo no deseado, forms, formidable forms, feedback, registration
4
  Requires at least: 3.0
5
  Tested up to: 3.7.1
6
+ Stable tag: 2.21
7
  License: GPLv2
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
13
 
14
  1. Stops spam bots in the comments.
15
  1. Stops spam bots in the registration.
16
+ 1. Stops spam bots at the Formiadble forms.
17
  1. Invisible spam protection for visitors.
18
  1. Anti-spam without CAPTCHA, math, puzzles or Q&A.
19
 
20
  Plugin filters spam bots in the comments, spam moves to trash. The plugin is not visible for visitors and administrators of a blog. The plugin doesn't use CAPTCHA, Q&A, puzzles or math to stop spammers. It's simple and clever antispam for your blog.
21
 
22
+ Also every comment from a new author plugin compares with post and previous comments. If the relevance of the comment is good enough it gets approval at the blog without manual approval.
23
 
24
+ The plugin is a client application for anti-spam cloud service <a href="http://cleantalk.org" target="_blank">cleantalk.org</a>. CleanTalk.org daily prevents from spam 4 500 blogs, blocks up to 400 000 spam bots attacks and approves up to 2 000 not spam comments.
25
 
26
  The plugin is WordPress MultiUser (WPMU or WordPress network) compatible. Each blog in multisite environment has individual anitspam options for spam bots protection.
27
 
31
  * Antispam protection for <a href="http://wordpress.org/plugins/formidable/" target="_blank">Formiadble forms</a>.
32
 
33
  = Requirements =
34
+ WordPress 3.0 at least. PHP 4, 5 with CURL or file_get_contents() function and enabled 'allow_url_fopen' setting. <a href="http://cleantalk.org/register?platform=wordpress">Sign up</a> to get an Access key.
35
 
36
  == Installation ==
37
 
87
 
88
  == Changelog ==
89
 
90
+ = 2.21 2013-11-13 =
91
+ * Changed: WordPress blacklists settings get priority over plugin's antispam settings
92
+ * Changed: Disabled management approval comments for regular commentators of the blog. Automatically approved for publication only the comments of the new blog authors.
93
+ * Changed: Removed form submit time test. Imporved JavaScript spam test.
94
+ * Changed: PHP code optimizations
95
+
96
  = 2.19 2013-11-08 =
97
  * New: Antispam protection from spam bots at the registration form
98
  * Changed: Russian localization for admin panel
209
  * First version
210
 
211
  == Upgrade Notice ==
212
+ = 2.21 2013-11-13 =
213
+ * Changed: WordPress blacklists settings get priority over plugin's antispam settings
214
+ * Changed: Disabled management approval comments for regular commentators of the blog. Automatically approved for publication only the comments of the new blog authors.
215
+ * Changed: PHP code optimizations
216
+
217
  = 2.19 2013-11-08 =
218
  * New: Antispam protection from spam bots at the registration form
219
  * Changed: Russian localization for admin panel