Spam protection, AntiSpam, FireWall by CleanTalk - Version 5.45.2

Version Description

August 4 2016 = * Added Anti-Spam protection for Quick Event Manager. * Improved bulk spam test for users. Now the plugin does not mark as Spam user, if the user IP address has spam activity more than 30 days ago. * Fixed bulk spam test for comments. Previous version had a conflict between spam history for IP and Email. * Minor fix function to get the API key.

Download this release

Release Info

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

Code changes from version 5.45.1 to 5.45.2

cleantalk.php CHANGED
@@ -3,12 +3,12 @@
3
  Plugin Name: Spam Protection by CleanTalk
4
  Plugin URI: http://cleantalk.org
5
  Description: Max power, all-in-one, captcha less, premium anti-spam plugin. No comment spam, no registration spam, no contact spam, protects any WordPress forms. Formerly Anti-Spam by CleanTalk.
6
- Version: 5.45.1
7
  Author: СleanTalk <welcome@cleantalk.org>
8
  Author URI: http://cleantalk.org
9
  */
10
- $cleantalk_plugin_version='5.45.1';
11
- $ct_agent_version = 'wordpress-5451';
12
  $cleantalk_executed=false;
13
  $ct_sfw_updated = false;
14
 
3
  Plugin Name: Spam Protection by CleanTalk
4
  Plugin URI: http://cleantalk.org
5
  Description: Max power, all-in-one, captcha less, premium anti-spam plugin. No comment spam, no registration spam, no contact spam, protects any WordPress forms. Formerly Anti-Spam by CleanTalk.
6
+ Version: 5.45.2
7
  Author: СleanTalk <welcome@cleantalk.org>
8
  Author URI: http://cleantalk.org
9
  */
10
+ $cleantalk_plugin_version='5.45.2';
11
+ $ct_agent_version = 'wordpress-5452';
12
  $cleantalk_executed=false;
13
  $ct_sfw_updated = false;
14
 
inc/cleantalk-admin.php CHANGED
@@ -4,6 +4,9 @@ $ct_plugin_basename = 'cleantalk-spam-protect/cleantalk.php';
4
  $ct_options=ct_get_options();
5
  $ct_data=ct_get_data();
6
 
 
 
 
7
  add_filter( 'activity_box_end', 'cleantalk_custom_glance_items', 10, 1 );
8
  function cleantalk_custom_glance_items( )
9
  {
4
  $ct_options=ct_get_options();
5
  $ct_data=ct_get_data();
6
 
7
+ // How many days we use an IP to detect spam.
8
+ $ct_ip_penalty_days = 30;
9
+
10
  add_filter( 'activity_box_end', 'cleantalk_custom_glance_items', 10, 1 );
11
  function cleantalk_custom_glance_items( )
12
  {
inc/cleantalk-ajax.php CHANGED
@@ -283,7 +283,7 @@ function ct_ajax_hook()
283
  $nickname=null;
284
  $contact = true;
285
  $subject = '';
286
-
287
  //
288
  // Skip test if Custom contact forms is disabled.
289
  //
@@ -498,7 +498,18 @@ function ct_ajax_hook()
498
  print_r($output);
499
  die;
500
  }
501
- else
 
 
 
 
 
 
 
 
 
 
 
502
  {
503
  print $ct_result->comment;
504
  die();
283
  $nickname=null;
284
  $contact = true;
285
  $subject = '';
286
+
287
  //
288
  // Skip test if Custom contact forms is disabled.
289
  //
498
  print_r($output);
499
  die;
500
  }
501
+ //Quick event manager
502
+ else if($_POST['action']=='qem_validate_form'){
503
+ $errors[] = 'registration_forbidden';
504
+ $result = Array(
505
+ success => 'false',
506
+ errors => $errors,
507
+ title => $ct_result->comment
508
+ );
509
+ print json_encode($result);
510
+ die();
511
+ }
512
+ else
513
  {
514
  print $ct_result->comment;
515
  die();
inc/cleantalk-comments-checkspam.js CHANGED
@@ -88,7 +88,7 @@ function ct_send_comments()
88
  }
89
  }
90
  },
91
- timeout: 10000
92
  });
93
  }
94
  function ct_show_info()
88
  }
89
  }
90
  },
91
+ timeout: 15000
92
  });
93
  }
94
  function ct_show_info()
inc/cleantalk-comments.php CHANGED
@@ -280,11 +280,8 @@ add_action( 'wp_ajax_ajax_check_comments', 'ct_ajax_check_comments' );
280
  function ct_ajax_check_comments()
281
  {
282
  check_ajax_referer( 'ct_secret_nonce', 'security' );
283
- global $ct_options;
284
  $ct_options = ct_get_options();
285
-
286
- // How many days we use an IP to detect spam.
287
- $penalty_days = 30;
288
 
289
  $args_unchecked = array(
290
  'meta_query' => array(
@@ -316,6 +313,7 @@ function ct_ajax_check_comments()
316
  $data[]=$u[$i]->comment_author_IP;
317
  $data[]=$u[$i]->comment_author_email;
318
  }
 
319
  $data=implode(',',$data);
320
 
321
  $request=Array();
@@ -327,7 +325,7 @@ function ct_ajax_check_comments()
327
  {
328
  require_once('cleantalk.class.php');
329
  }
330
- $result=sendRawRequest($url, $request);
331
 
332
  $result=json_decode($result);
333
 
@@ -339,31 +337,29 @@ function ct_ajax_check_comments()
339
  {
340
  for($i=0;$i<sizeof($u);$i++)
341
  {
342
- $mark_spam = false;
343
- $update_time = 0;
 
344
 
345
  add_comment_meta($u[$i]->comment_ID,'ct_checked',date("Y-m-d H:m:s"),true);
346
  $uip=$u[$i]->comment_author_IP;
347
- if(empty($uip))continue;
348
  $uim=$u[$i]->comment_author_email;
349
- if(empty($uim))continue;
350
 
351
  if(isset($result->data->$uip) && $result->data->$uip->appears == 1)
352
  {
353
- $mark_spam = true;
354
- $update_time = strtotime($result->data->$uip->updated);
355
  }
356
  if(isset($result->data->$uim) && $result->data->$uim->appears==1)
357
  {
358
- $mark_spam = true;
359
- $update_time = strtotime($result->data->$uim->updated) > $update_time ? strtotime($result->data->$uim->updated) : $update_time;
360
  }
361
 
362
  // Do not use the spam records becaus it was a spammer far time ago.
363
- if (time() - $update_time > 86400 * $penalty_days) {
364
- $mark_spam = false;
365
  }
366
- if ($mark_spam) {
367
  add_comment_meta($u[$i]->comment_ID,'ct_marked_as_spam','1',true);
368
  }
369
  }
280
  function ct_ajax_check_comments()
281
  {
282
  check_ajax_referer( 'ct_secret_nonce', 'security' );
283
+ global $ct_options, $ct_ip_penalty_days;
284
  $ct_options = ct_get_options();
 
 
 
285
 
286
  $args_unchecked = array(
287
  'meta_query' => array(
313
  $data[]=$u[$i]->comment_author_IP;
314
  $data[]=$u[$i]->comment_author_email;
315
  }
316
+ $data[]='23.105.21.74';
317
  $data=implode(',',$data);
318
 
319
  $request=Array();
325
  {
326
  require_once('cleantalk.class.php');
327
  }
328
+ $result=sendRawRequest($url, $request, false, 5);
329
 
330
  $result=json_decode($result);
331
 
337
  {
338
  for($i=0;$i<sizeof($u);$i++)
339
  {
340
+ $mark_spam_ip = false;
341
+ $mark_spam_email = false;
342
+ $ip_update_time = 0;
343
 
344
  add_comment_meta($u[$i]->comment_ID,'ct_checked',date("Y-m-d H:m:s"),true);
345
  $uip=$u[$i]->comment_author_IP;
 
346
  $uim=$u[$i]->comment_author_email;
 
347
 
348
  if(isset($result->data->$uip) && $result->data->$uip->appears == 1)
349
  {
350
+ $mark_spam_ip = true;
351
+ $ip_update_time = strtotime($result->data->$uip->updated);
352
  }
353
  if(isset($result->data->$uim) && $result->data->$uim->appears==1)
354
  {
355
+ $mark_spam_email = true;
 
356
  }
357
 
358
  // Do not use the spam records becaus it was a spammer far time ago.
359
+ if (time() - $ip_update_time > 86400 * $ct_ip_penalty_days) {
360
+ $mark_spam_ip = false;
361
  }
362
+ if ($mark_spam_ip || $mark_spam_email) {
363
  add_comment_meta($u[$i]->comment_ID,'ct_marked_as_spam','1',true);
364
  }
365
  }
inc/cleantalk-users-checkspam.js CHANGED
@@ -86,7 +86,7 @@ function ct_send_users()
86
  ct_send_users();
87
  }
88
  },
89
- timeout: 10000
90
  });
91
  }
92
  function ct_show_users_info()
86
  ct_send_users();
87
  }
88
  },
89
+ timeout: 15000
90
  });
91
  }
92
  function ct_show_users_info()
inc/cleantalk-users.php CHANGED
@@ -238,7 +238,7 @@ add_action( 'wp_ajax_ajax_check_users', 'ct_ajax_check_users' );
238
 
239
  function ct_ajax_check_users()
240
  {
241
- global $ct_options;
242
 
243
  check_ajax_referer('ct_secret_nonce', 'security');
244
 
@@ -278,7 +278,9 @@ function ct_ajax_check_users()
278
  } else {
279
  $u[$i]->data->user_ip = null;
280
  }
281
- $data[]=$u[$i]->data->user_email;
 
 
282
  }
283
  $data=implode(',',$data);
284
 
@@ -291,7 +293,7 @@ function ct_ajax_check_users()
291
  {
292
  require_once('cleantalk.class.php');
293
  }
294
- $result=sendRawRequest($url, $request);
295
 
296
  $result=json_decode($result);
297
 
@@ -318,14 +320,30 @@ function ct_ajax_check_users()
318
  if ($skip_user) {
319
  continue;
320
  }
 
 
 
 
321
 
322
  $uip = $u[$i]->data->user_ip;
323
  $uim = $u[$i]->data->user_email;
324
 
325
- if((isset($result->data->$uip) && $result->data->$uip->appears==1) || (isset($result->data->$uim) && $result->data->$uim->appears==1))
326
  {
327
- update_user_meta($u[$i]->ID,'ct_marked_as_spam','1',true);
 
 
 
 
 
328
  }
 
 
 
 
 
 
 
329
  }
330
  print 1;
331
  }
238
 
239
  function ct_ajax_check_users()
240
  {
241
+ global $ct_options,$ct_ip_penalty_days;
242
 
243
  check_ajax_referer('ct_secret_nonce', 'security');
244
 
278
  } else {
279
  $u[$i]->data->user_ip = null;
280
  }
281
+ if (isset($u[$i]->data->user_email) && $u[$i]->data->user_email) {
282
+ $data[]=$u[$i]->data->user_email;
283
+ }
284
  }
285
  $data=implode(',',$data);
286
 
293
  {
294
  require_once('cleantalk.class.php');
295
  }
296
+ $result=sendRawRequest($url, $request, false, 5);
297
 
298
  $result=json_decode($result);
299
 
320
  if ($skip_user) {
321
  continue;
322
  }
323
+ $mark_spam_ip = false;
324
+ $mark_spam_email = false;
325
+ $ip_update_time = 0;
326
+
327
 
328
  $uip = $u[$i]->data->user_ip;
329
  $uim = $u[$i]->data->user_email;
330
 
331
+ if(isset($result->data->$uip) && $result->data->$uip->appears == 1)
332
  {
333
+ $mark_spam_ip = true;
334
+ $ip_update_time = strtotime($result->data->$uip->updated);
335
+ }
336
+ if(isset($result->data->$uim) && $result->data->$uim->appears==1)
337
+ {
338
+ $mark_spam_email = true;
339
  }
340
+ // Do not use the spam records becaus it was a spammer far time ago.
341
+ if (time() - $ip_update_time > 86400 * $ct_ip_penalty_days) {
342
+ $mark_spam_ip = false;
343
+ }
344
+ if ($mark_spam_ip || $mark_spam_email) {
345
+ update_user_meta($u[$i]->ID,'ct_marked_as_spam','1',true);
346
+ }
347
  }
348
  print 1;
349
  }
inc/cleantalk.class.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Cleantalk base class
4
  *
5
- * @version 2.1.1
6
  * @package Cleantalk
7
  * @subpackage Base
8
  * @author Cleantalk team (welcome@cleantalk.org)
@@ -11,6 +11,31 @@
11
  * @see https://github.com/CleanTalk/php-antispam
12
  *
13
  */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
  /**
16
  * Load JSON functions if they are not exists
@@ -376,7 +401,7 @@ class Cleantalk {
376
  * Server connection timeout in seconds
377
  * @var int
378
  */
379
- private $server_timeout = 6;
380
 
381
  /**
382
  * Cleantalk server url
@@ -1050,16 +1075,19 @@ class Cleantalk {
1050
  * @return type
1051
  */
1052
 
1053
- function getAutoKey($email, $host, $platform)
1054
  {
1055
- $request=Array();
1056
- $request['method_name'] = 'get_api_key';
1057
- $request['email'] = $email;
1058
- $request['website'] = $host;
1059
- $request['platform'] = $platform;
1060
- $url='https://api.cleantalk.org';
1061
- $result=sendRawRequest($url,$request);
1062
- return $result;
 
 
 
1063
  }
1064
 
1065
  /**
@@ -1095,6 +1123,7 @@ function sendRawRequest($url,$data,$isJSON=false,$timeout=3)
1095
  if(!$isJSON)
1096
  {
1097
  $data=http_build_query($data);
 
1098
  }
1099
  else
1100
  {
@@ -1129,8 +1158,10 @@ function sendRawRequest($url,$data,$isJSON=false,$timeout=3)
1129
  {
1130
  $opts = array(
1131
  'http'=>array(
1132
- 'method'=>"POST",
1133
- 'content'=>$data)
 
 
1134
  );
1135
  $context = stream_context_create($opts);
1136
  $result = @file_get_contents($url, 0, $context);
@@ -1144,6 +1175,11 @@ if( !function_exists('apache_request_headers') )
1144
  {
1145
  $arh = array();
1146
  $rx_http = '/\AHTTP_/';
 
 
 
 
 
1147
  foreach($_SERVER as $key => $val)
1148
  {
1149
  if( preg_match($rx_http, $key) )
@@ -1159,18 +1195,29 @@ if( !function_exists('apache_request_headers') )
1159
  $arh[$arh_key] = $val;
1160
  }
1161
  }
 
 
 
 
 
1162
  return( $arh );
1163
  }
1164
  }
1165
 
1166
  function cleantalk_get_real_ip()
1167
  {
 
 
 
 
 
1168
  if ( function_exists( 'apache_request_headers' ) )
1169
  {
1170
  $headers = apache_request_headers();
1171
  }
1172
  else
1173
  {
 
1174
  $headers = $_SERVER;
1175
  }
1176
  if ( array_key_exists( 'X-Forwarded-For', $headers ) )
@@ -1187,6 +1234,11 @@ function cleantalk_get_real_ip()
1187
  {
1188
  $the_ip = filter_var( $_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 );
1189
  }
 
 
 
 
 
1190
  return $the_ip;
1191
  }
1192
 
2
  /**
3
  * Cleantalk base class
4
  *
5
+ * @version 2.1.3
6
  * @package Cleantalk
7
  * @subpackage Base
8
  * @author Cleantalk team (welcome@cleantalk.org)
11
  * @see https://github.com/CleanTalk/php-antispam
12
  *
13
  */
14
+
15
+ /**
16
+ * Creating apache_request_headers() if not exists
17
+ */
18
+ if( !function_exists('apache_request_headers') ) {
19
+ function apache_request_headers() {
20
+ $arh = array();
21
+ $rx_http = '/\AHTTP_/';
22
+ foreach($_SERVER as $key => $val) {
23
+ if( preg_match($rx_http, $key) ) {
24
+ $arh_key = preg_replace($rx_http, '', $key);
25
+ $rx_matches = array();
26
+ // do some nasty string manipulations to restore the original letter case
27
+ // this should work in most cases
28
+ $rx_matches = explode('_', $arh_key);
29
+ if( count($rx_matches) > 0 and strlen($arh_key) > 2 ) {
30
+ foreach($rx_matches as $ak_key => $ak_val) $rx_matches[$ak_key] = ucfirst($ak_val);
31
+ $arh_key = implode('-', $rx_matches);
32
+ }
33
+ $arh[$arh_key] = $val;
34
+ }
35
+ }
36
+ return( $arh );
37
+ }
38
+ }
39
 
40
  /**
41
  * Load JSON functions if they are not exists
401
  * Server connection timeout in seconds
402
  * @var int
403
  */
404
+ private $server_timeout = 15;
405
 
406
  /**
407
  * Cleantalk server url
1075
  * @return type
1076
  */
1077
 
1078
+ if(!function_exists('getAutoKey'))
1079
  {
1080
+ function getAutoKey($email, $host, $platform)
1081
+ {
1082
+ $request=Array();
1083
+ $request['method_name'] = 'get_api_key';
1084
+ $request['email'] = $email;
1085
+ $request['website'] = $host;
1086
+ $request['platform'] = $platform;
1087
+ $url='https://api.cleantalk.org';
1088
+ $result=sendRawRequest($url,$request);
1089
+ return $result;
1090
+ }
1091
  }
1092
 
1093
  /**
1123
  if(!$isJSON)
1124
  {
1125
  $data=http_build_query($data);
1126
+ $data=str_replace("&amp;", "&", $data);
1127
  }
1128
  else
1129
  {
1158
  {
1159
  $opts = array(
1160
  'http'=>array(
1161
+ 'method' => "POST",
1162
+ 'timeout'=> $timeout,
1163
+ 'content' => $data
1164
+ )
1165
  );
1166
  $context = stream_context_create($opts);
1167
  $result = @file_get_contents($url, 0, $context);
1175
  {
1176
  $arh = array();
1177
  $rx_http = '/\AHTTP_/';
1178
+ if(defined('IN_PHPBB'))
1179
+ {
1180
+ global $request;
1181
+ $request->enable_super_globals();
1182
+ }
1183
  foreach($_SERVER as $key => $val)
1184
  {
1185
  if( preg_match($rx_http, $key) )
1195
  $arh[$arh_key] = $val;
1196
  }
1197
  }
1198
+ if(defined('IN_PHPBB'))
1199
+ {
1200
+ global $request;
1201
+ $request->disable_super_globals();
1202
+ }
1203
  return( $arh );
1204
  }
1205
  }
1206
 
1207
  function cleantalk_get_real_ip()
1208
  {
1209
+ if(defined('IN_PHPBB'))
1210
+ {
1211
+ global $request;
1212
+ $request->enable_super_globals();
1213
+ }
1214
  if ( function_exists( 'apache_request_headers' ) )
1215
  {
1216
  $headers = apache_request_headers();
1217
  }
1218
  else
1219
  {
1220
+
1221
  $headers = $_SERVER;
1222
  }
1223
  if ( array_key_exists( 'X-Forwarded-For', $headers ) )
1234
  {
1235
  $the_ip = filter_var( $_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 );
1236
  }
1237
+ if(defined('IN_PHPBB'))
1238
+ {
1239
+ global $request;
1240
+ $request->disable_super_globals();
1241
+ }
1242
  return $the_ip;
1243
  }
1244
 
readme.txt CHANGED
@@ -1,9 +1,9 @@
1
- === Spam Protection by CleanTalk ===
2
  Contributors: znaeff, shagimuratov, serge00
3
  Tags: spam, anti-spam, antispam, anti spam, bbpress, buddypress, captcha, capcha, captha, catcha, cf7 spam, comments, contact form spam, signup, spammers, spammy, woocommerce, wordpress spam, booking, order, subscription, gravity spam, jetpack, bots, contact form 7, contact form, registrations, ninja, Fast Secure Contact, Gravity forms, formidable, mailchimp, s2member, protection, protect, email, akismet, plugin, contact, recaptcha, google captcha, google recaptcha, math, security, login, blacklist, prevent spam comments, wordpress, User Frontend, bulk delete, bulk remove, cloudflare, widget, review, auth forms, firewall, ddos, cleantalk, mailpoet, profile builder, comment spam, registration spam, spam comments, comment moderation, spam bots, block spam, signup spam, spam blocker, spam filter, user registration spam,pingback,trackback, anti-spam plugin, varnish, amp, spam free, userpro
4
  Requires at least: 3.0
5
  Tested up to: 4.6
6
- Stable tag: 5.45.1
7
  License: GPLv2
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
@@ -22,13 +22,13 @@ No CAPTCHA, no questions, no animal counting, no puzzles, no math and no spam bo
22
  1. Stops spam in widgets.
23
  1. Checks the existing comments for spam.
24
 
25
- = FREE TRIAL THEN $8 PER YEAR =
26
- CleanTalk is a free plugin which work with the premium Cloud Anti-Spam service cleantalk.org. This plugin as a service https://en.wikipedia.org/wiki/Software_as_a_service.
27
-
28
  = Public reviews =
29
  > Using CleanTalk on WPLift was a great test as we receive huge amounts of spam.
30
  > *Oliver Dale, <a href="http://wplift.com/wordpress-anti-spam-plugin" target="_blank">WPLift.com</a>.*
31
 
 
 
 
32
  = Anti-Spam protection for comments =
33
  Supports native WordPress, JetPack comments and any other comment plugins. The plugin moves spam comments to SPAM folder or you can set the option to ban spam comments silently. You can also enable the option in the plugin settings to auto-delete comments from SPAM folder.
34
 
@@ -472,9 +472,15 @@ WordPress 3.0 at least. PHP 5 with CURL or file_get_contents() function and enab
472
  1. CleanTalk works faster than most of other anti-spam plugins.
473
 
474
  == Changelog ==
 
 
 
 
 
 
475
  = 5.45.1 July 26 2016 =
476
  * Fixed issue with missed spam messages, subscriptions.
477
- * Improved bulk spam test for comments. Now the plugin will not mark as Spam comments, if a comment sender (IP address) has spam activity more then 30 days ago.
478
 
479
  = 5.45 July 21 2016 =
480
  * Optimized bulk spam comments deletion.
@@ -1099,6 +1105,12 @@ WordPress 3.0 at least. PHP 5 with CURL or file_get_contents() function and enab
1099
  * First version
1100
 
1101
  == Upgrade Notice ==
 
 
 
 
 
 
1102
  = 5.45.1 July 26 2016 =
1103
  * Fixed issue with missed spam messages, subscriptions.
1104
  * Improved bulk spam test for comments. Now the plugin will not mark as Spam comments, if a comment sender (IP address) has spam activity more then 30 days ago.
1
+ === Spam Protection by CleanTalk (no Captcha Anti-Spam) ===
2
  Contributors: znaeff, shagimuratov, serge00
3
  Tags: spam, anti-spam, antispam, anti spam, bbpress, buddypress, captcha, capcha, captha, catcha, cf7 spam, comments, contact form spam, signup, spammers, spammy, woocommerce, wordpress spam, booking, order, subscription, gravity spam, jetpack, bots, contact form 7, contact form, registrations, ninja, Fast Secure Contact, Gravity forms, formidable, mailchimp, s2member, protection, protect, email, akismet, plugin, contact, recaptcha, google captcha, google recaptcha, math, security, login, blacklist, prevent spam comments, wordpress, User Frontend, bulk delete, bulk remove, cloudflare, widget, review, auth forms, firewall, ddos, cleantalk, mailpoet, profile builder, comment spam, registration spam, spam comments, comment moderation, spam bots, block spam, signup spam, spam blocker, spam filter, user registration spam,pingback,trackback, anti-spam plugin, varnish, amp, spam free, userpro
4
  Requires at least: 3.0
5
  Tested up to: 4.6
6
+ Stable tag: 5.45.2
7
  License: GPLv2
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
22
  1. Stops spam in widgets.
23
  1. Checks the existing comments for spam.
24
 
 
 
 
25
  = Public reviews =
26
  > Using CleanTalk on WPLift was a great test as we receive huge amounts of spam.
27
  > *Oliver Dale, <a href="http://wplift.com/wordpress-anti-spam-plugin" target="_blank">WPLift.com</a>.*
28
 
29
+ = FREE TRIAL THEN $8 PER YEAR =
30
+ > CleanTalk is a free plugin which work with the premium Cloud Anti-Spam service cleantalk.org. This plugin as a service https://en.wikipedia.org/wiki/Software_as_a_service.
31
+
32
  = Anti-Spam protection for comments =
33
  Supports native WordPress, JetPack comments and any other comment plugins. The plugin moves spam comments to SPAM folder or you can set the option to ban spam comments silently. You can also enable the option in the plugin settings to auto-delete comments from SPAM folder.
34
 
472
  1. CleanTalk works faster than most of other anti-spam plugins.
473
 
474
  == Changelog ==
475
+ = 5.45.2 August 4 2016 =
476
+ * Added Anti-Spam protection for Quick Event Manager.
477
+ * Improved bulk spam test for users. Now the plugin does not mark as Spam user, if the user IP address has spam activity more than 30 days ago.
478
+ * Fixed bulk spam test for comments. Previous version had a conflict between spam history for IP and Email.
479
+ * Minor fix function to get the API key.
480
+
481
  = 5.45.1 July 26 2016 =
482
  * Fixed issue with missed spam messages, subscriptions.
483
+ * Improved bulk spam test for comments. Now the plugin will not mark as Spam comments, if a comment sender (IP address) has spam activity more than 30 days ago.
484
 
485
  = 5.45 July 21 2016 =
486
  * Optimized bulk spam comments deletion.
1105
  * First version
1106
 
1107
  == Upgrade Notice ==
1108
+ = 5.45.2 August 4 2016 =
1109
+ * Added Anti-Spam protection for Quick Event Manager.
1110
+ * Improved bulk spam test for users. Now the plugin does not mark as Spam user, if the user IP address has spam activity more then 30 days ago.
1111
+ * Fixed bulk spam test for comments. Previous version had a conflict between spam history for IP and Email.
1112
+ * Minor fix function to get the API key.
1113
+
1114
  = 5.45.1 July 26 2016 =
1115
  * Fixed issue with missed spam messages, subscriptions.
1116
  * Improved bulk spam test for comments. Now the plugin will not mark as Spam comments, if a comment sender (IP address) has spam activity more then 30 days ago.