Spam protection, AntiSpam, FireWall by CleanTalk - Version 5.32

Version Description

2015-11-26 = * Added improvements for manual spam detection * Fixed errors in backend * Fixed bulk users antispam checking * Added indicator for bulk spam checking * Added "Get access key automatically" button

Download this release

Release Info

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

Code changes from version 5.31 to 5.32

cleantalk.php CHANGED
@@ -3,11 +3,11 @@
3
  Plugin Name: Anti-Spam 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.
6
- Version: 5.31
7
  Author: СleanTalk <welcome@cleantalk.org>
8
  Author URI: http://cleantalk.org
9
  */
10
- $cleantalk_plugin_version='5.31';
11
  $cleantalk_executed=false;
12
 
13
  if(defined('CLEANTALK_AJAX_USE_BUFFER'))
@@ -35,6 +35,10 @@ if(!defined('CLEANTALK_PLUGIN_DIR')){
35
  require_once(CLEANTALK_PLUGIN_DIR . 'inc/cleantalk-widget.php');
36
  $ct_options=ct_get_options();
37
  $ct_data=ct_get_data();
 
 
 
 
38
 
39
  if(isset($ct_options['spam_firewall']))
40
  {
@@ -319,19 +323,40 @@ function ct_add_nocache_script_footer()
319
  print "\n<script type='text/javascript'>var ct_blog_home = '".get_home_url()."';</script>\n";
320
  print "<script async type='text/javascript' src='".plugins_url( '/inc/cleantalk_external.js' , __FILE__ )."?random=".$cleantalk_plugin_version."'></script>\n";
321
  }
 
322
  }
323
 
324
  function ct_add_nocache_script_header()
325
  {
326
- print "\n<script type='text/javascript'>\nvar ct_ajaxurl = '".admin_url('admin-ajax.php')."';\n</script>\n";
 
 
 
 
 
 
 
 
 
 
 
327
  }
328
 
329
  function ct_inject_nocache_script($html)
330
  {
331
- global $test_external_forms, $cleantalk_plugin_version;
 
 
 
 
 
 
 
 
 
332
  if(!is_admin()&&stripos($html,"</body")!==false)
333
  {
334
- //$ct_replace.="\n<script type='text/javascript'>var ajaxurl = '".admin_url('admin-ajax.php')."';</script>\n";
335
  $ct_replace="<script async type='text/javascript' src='".plugins_url( '/inc/cleantalk_nocache.js' , __FILE__ )."?random=".$cleantalk_plugin_version."'></script>\n";
336
  if($test_external_forms)
337
  {
@@ -344,7 +369,7 @@ function ct_inject_nocache_script($html)
344
  }
345
  if(!is_admin()&&preg_match("#<head[^>]*>#i",$html)==1)
346
  {
347
- $ct_replace="\n<script type='text/javascript'>\nvar ct_ajaxurl = '".admin_url('admin-ajax.php')."';\n</script>\n";
348
  $html=preg_replace("(<head[^>]*>)","$0".$ct_replace,$html,1);
349
  }
350
  return $html;
3
  Plugin Name: Anti-Spam 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.
6
+ Version: 5.32
7
  Author: СleanTalk <welcome@cleantalk.org>
8
  Author URI: http://cleantalk.org
9
  */
10
+ $cleantalk_plugin_version='5.32';
11
  $cleantalk_executed=false;
12
 
13
  if(defined('CLEANTALK_AJAX_USE_BUFFER'))
35
  require_once(CLEANTALK_PLUGIN_DIR . 'inc/cleantalk-widget.php');
36
  $ct_options=ct_get_options();
37
  $ct_data=ct_get_data();
38
+ if(@stripos($_SERVER['REQUEST_URI'],'admin-ajax.php')!==false && sizeof($_POST)>0 && isset($_GET['action']) && $_GET['action']=='ninja_forms_ajax_submit')
39
+ {
40
+ $_POST['action']='ninja_forms_ajax_submit';
41
+ }
42
 
43
  if(isset($ct_options['spam_firewall']))
44
  {
323
  print "\n<script type='text/javascript'>var ct_blog_home = '".get_home_url()."';</script>\n";
324
  print "<script async type='text/javascript' src='".plugins_url( '/inc/cleantalk_external.js' , __FILE__ )."?random=".$cleantalk_plugin_version."'></script>\n";
325
  }
326
+ //print "<script async type='text/javascript' src='".plugins_url( '/inc/cleantalk-info.js' , __FILE__ )."?random=".$cleantalk_plugin_version."'></script>\n";
327
  }
328
 
329
  function ct_add_nocache_script_header()
330
  {
331
+ global $ct_options;
332
+ $ct_options=ct_get_options();
333
+ if(substr($ct_options['apikey'],0,1)=='y')
334
+ {
335
+ $ct_info_flag="var ct_info_flag=true;\n";
336
+ }
337
+ else
338
+ {
339
+ $ct_info_flag="var ct_info_flag=false;\n";
340
+ }
341
+
342
+ print "\n<script type='text/javascript'>\nvar ct_ajaxurl = '".admin_url('admin-ajax.php')."';\n $ct_info_flag </script>\n";
343
  }
344
 
345
  function ct_inject_nocache_script($html)
346
  {
347
+ global $test_external_forms, $cleantalk_plugin_version, $ct_options;
348
+ $ct_options=ct_get_options();
349
+ if(substr($ct_options['apikey'],0,1)=='y')
350
+ {
351
+ $ct_info_flag="var ct_info_flag=true;\n";
352
+ }
353
+ else
354
+ {
355
+ $ct_info_flag="var ct_info_flag=false;\n";
356
+ }
357
  if(!is_admin()&&stripos($html,"</body")!==false)
358
  {
359
+ //$ct_replace.="\n<script type='text/javascript'>var ajaxurl = '".admin_url('admin-ajax.php')."';\n $ct_info_flag </script>\n";
360
  $ct_replace="<script async type='text/javascript' src='".plugins_url( '/inc/cleantalk_nocache.js' , __FILE__ )."?random=".$cleantalk_plugin_version."'></script>\n";
361
  if($test_external_forms)
362
  {
369
  }
370
  if(!is_admin()&&preg_match("#<head[^>]*>#i",$html)==1)
371
  {
372
+ $ct_replace="\n<script type='text/javascript'>\nvar ct_ajaxurl = '".admin_url('admin-ajax.php')."';\n $ct_info_flag </script>\n";
373
  $html=preg_replace("(<head[^>]*>)","$0".$ct_replace,$html,1);
374
  }
375
  return $html;
inc/cleantalk-admin.php CHANGED
@@ -124,8 +124,10 @@ function ct_admin_init()
124
  'checkjs' => 1
125
  ));
126
  }
127
- if(isset($_POST['option_page'])&&$_POST['option_page']=='cleantalk_settings')
128
  {
 
 
129
  $ct_base_call_result = ct_base_call(array(
130
  'message' => 'This message is a test to check the connection to the CleanTalk servers. ',
131
  'example' => null,
@@ -584,11 +586,12 @@ function ct_input_apikey() {
584
  echo "<script src='".plugins_url( 'cleantalk-admin.js', __FILE__ )."'></script>\n";
585
  if (ct_valid_key($value) === false && !$is_wpmu) {
586
  echo "<script>var cleantalk_good_key=false;</script>";
587
- echo "<br /><br /><a target='__blank' class='cleantalk_manual_link' style='text-decoration:none;' href='https://cleantalk.org/register?platform=wordpress&email=".urlencode(get_option('admin_email'))."&website=".urlencode(parse_url(get_option('siteurl'),PHP_URL_HOST))."'>".__('Get the Access key', 'cleantalk')."</a>";
588
  if (function_exists('curl_init') && function_exists('json_decode')) {
589
- //echo '<br /><br /><input name="get_apikey_auto" type="submit" class="cleantalk_manual_link" value="' . __('Get access key automatically', 'cleantalk') . '" />';
590
- //admin_addDescriptionsFields(sprintf(__('Admin e-mail (%s) will be used for registration', 'cleantalk'), get_option('admin_email')));
591
- //admin_addDescriptionsFields(sprintf('<a target="__blank" style="color:#BBB;" href="https://cleantalk.org/publicoffer">%s</a>', __('License agreement', 'cleantalk')));
 
 
592
  }
593
  } else {
594
  echo "<script>var cleantalk_good_key=true;</script>";
@@ -1293,6 +1296,7 @@ function ct_update_option($option_name) {
1293
  require_once('cleantalk.class.php');
1294
  }
1295
  $result=sendRawRequest($url, $request);
 
1296
  if ($result)
1297
  {
1298
  $result = json_decode($result, true);
124
  'checkjs' => 1
125
  ));
126
  }
127
+ if(isset($_POST['option_page'])&&$_POST['option_page']=='cleantalk_settings'&&isset($_POST['cleantalk_settings']['apikey']))
128
  {
129
+ $ct_options['apikey']=$_POST['cleantalk_settings']['apikey'];
130
+ update_option('cleantalk_settings', $ct_options);
131
  $ct_base_call_result = ct_base_call(array(
132
  'message' => 'This message is a test to check the connection to the CleanTalk servers. ',
133
  'example' => null,
586
  echo "<script src='".plugins_url( 'cleantalk-admin.js', __FILE__ )."'></script>\n";
587
  if (ct_valid_key($value) === false && !$is_wpmu) {
588
  echo "<script>var cleantalk_good_key=false;</script>";
 
589
  if (function_exists('curl_init') && function_exists('json_decode')) {
590
+ echo "<a target='__blank' style='' href='https://cleantalk.org/register?platform=wordpress&email=".urlencode(get_option('admin_email'))."&website=".urlencode(parse_url(get_option('siteurl'),PHP_URL_HOST))."'>".__('Click here to get access key manually', 'cleantalk')."</a>";
591
+ echo '<br /><br /><input name="get_apikey_auto" type="submit" class="cleantalk_manual_link" value="' . __('Get access key automatically', 'cleantalk') . '" />';
592
+
593
+ admin_addDescriptionsFields(sprintf(__('Admin e-mail (%s) will be used for registration', 'cleantalk'), get_option('admin_email')));
594
+ admin_addDescriptionsFields(sprintf('<a target="__blank" style="color:#BBB;" href="https://cleantalk.org/publicoffer">%s</a>', __('License agreement', 'cleantalk')));
595
  }
596
  } else {
597
  echo "<script>var cleantalk_good_key=true;</script>";
1296
  require_once('cleantalk.class.php');
1297
  }
1298
  $result=sendRawRequest($url, $request);
1299
+
1300
  if ($result)
1301
  {
1302
  $result = json_decode($result, true);
inc/cleantalk-ajax.php CHANGED
@@ -89,6 +89,10 @@ add_action( 'wp_ajax_tmpl_submit_form_recaptcha_validation', 'ct_ajax_hook',1 )
89
  /**hooks for cm answers pro */
90
  add_action( 'template_redirect', 'ct_ajax_hook',1 );
91
 
 
 
 
 
92
  function ct_get_stats()
93
  {
94
  check_ajax_referer( 'ct_secret_nonce', 'security' );
@@ -446,6 +450,11 @@ function ct_ajax_hook()
446
  print $ct_result->comment;
447
  die();
448
  }
 
 
 
 
 
449
  }
450
  }
451
  }
89
  /**hooks for cm answers pro */
90
  add_action( 'template_redirect', 'ct_ajax_hook',1 );
91
 
92
+ /* hooks for ninja forms ajax*/
93
+ add_action( 'wp_ajax_nopriv_ninja_forms_ajax_submit', 'ct_ajax_hook',1 );
94
+ add_action( 'wp_ajax_ninja_forms_ajax_submit', 'ct_ajax_hook',1 );
95
+
96
  function ct_get_stats()
97
  {
98
  check_ajax_referer( 'ct_secret_nonce', 'security' );
450
  print $ct_result->comment;
451
  die();
452
  }
453
+ else if($_POST['action']=='ninja_forms_ajax_submit')
454
+ {
455
+ print '{"form_id":'.$_POST['_form_id'].',"errors":false,"success":{"success_msg-Success":"'.$ct_result->comment.'"}}';
456
+ die();
457
+ }
458
  }
459
  }
460
  }
inc/cleantalk-comments-checkspam.js CHANGED
@@ -183,6 +183,7 @@ jQuery("#ct_check_spam_button").click(function(){
183
  jQuery('#ct_check_comments_table').hide();
184
  jQuery('#ct_delete_all').hide();
185
  jQuery('#ct_delete_checked').hide();
 
186
  working=true;
187
  ct_show_info();
188
  });
183
  jQuery('#ct_check_comments_table').hide();
184
  jQuery('#ct_delete_all').hide();
185
  jQuery('#ct_delete_checked').hide();
186
+ jQuery('#ct_preloader').show();
187
  working=true;
188
  ct_show_info();
189
  });
inc/cleantalk-comments.php CHANGED
@@ -17,6 +17,7 @@ function ct_show_checkspam_page()
17
  <h2><?php _e("Anti-spam by CleanTalk", 'cleantalk'); ?></h2><br />
18
 
19
  <h3 id="ct_checking_status" style="text-align:center;width:90%;"></h3>
 
20
  <?php
21
  $args_spam = array(
22
  'meta_query' => array(
@@ -277,6 +278,7 @@ function ct_ajax_check_comments()
277
 
278
  $u=get_comments($args_unchecked);
279
  $u=array_slice($u,0,500);
 
280
  if(sizeof($u)>0)
281
  {
282
  //print_r($u);
@@ -299,7 +301,6 @@ function ct_ajax_check_comments()
299
  );
300
 
301
  $context = stream_context_create($opts);
302
-
303
  $result = @file_get_contents("https://api.cleantalk.org/?method_name=spam_check&auth_key=".$ct_options['apikey'], 0, $context);
304
  $result=json_decode($result);
305
  if(isset($result->error_message))
@@ -315,7 +316,7 @@ function ct_ajax_check_comments()
315
  if(empty($uip))continue;
316
  $uim=$u[$i]->comment_author_email;
317
  if(empty($uim))continue;
318
- if($result->data->$uip->appears==1||$result->data->$uim->appears==1)
319
  {
320
  add_comment_meta($u[$i]->comment_ID,'ct_marked_as_spam','1',true);
321
  }
17
  <h2><?php _e("Anti-spam by CleanTalk", 'cleantalk'); ?></h2><br />
18
 
19
  <h3 id="ct_checking_status" style="text-align:center;width:90%;"></h3>
20
+ <div style="text-align:center;width:100%;display:none;" id="ct_preloader"><img border=0 src="<?php print plugin_dir_url(__FILE__); ?>images/preloader.gif" /></div>
21
  <?php
22
  $args_spam = array(
23
  'meta_query' => array(
278
 
279
  $u=get_comments($args_unchecked);
280
  $u=array_slice($u,0,500);
281
+ //$u=array_values($u);
282
  if(sizeof($u)>0)
283
  {
284
  //print_r($u);
301
  );
302
 
303
  $context = stream_context_create($opts);
 
304
  $result = @file_get_contents("https://api.cleantalk.org/?method_name=spam_check&auth_key=".$ct_options['apikey'], 0, $context);
305
  $result=json_decode($result);
306
  if(isset($result->error_message))
316
  if(empty($uip))continue;
317
  $uim=$u[$i]->comment_author_email;
318
  if(empty($uim))continue;
319
+ if(isset($result->data->$uip) && $result->data->$uip->appears==1 || isset($result->data->$uim) && $result->data->$uim->appears==1)
320
  {
321
  add_comment_meta($u[$i]->comment_ID,'ct_marked_as_spam','1',true);
322
  }
inc/cleantalk-common.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- $ct_agent_version = 'wordpress-531';
4
  $ct_plugin_name = 'Anti-spam by CleanTalk';
5
  $ct_checkjs_frm = 'ct_checkjs_frm';
6
  $ct_checkjs_register_form = 'ct_checkjs_register_form';
@@ -143,6 +143,7 @@ function ct_base_call($params = array()) {
143
  if (array_key_exists('sender_info', $params)) {
144
  $sender_info = array_merge($sender_info, (array) $params['sender_info']);
145
  }
 
146
  $sender_info = json_encode($sender_info);
147
  if ($sender_info === false)
148
  $sender_info = '';
@@ -187,7 +188,7 @@ function ct_base_call($params = array()) {
187
  );
188
  }
189
 
190
- if($ct_result->errno != 0)
191
  {
192
  if($params['checkjs']!=1)
193
  {
@@ -277,6 +278,12 @@ function get_sender_info() {
277
  'ssl_on' => $ct_options['ssl_on'],
278
  );*/
279
  $options2server=$ct_options;
 
 
 
 
 
 
280
 
281
  return $sender_info = array(
282
  'page_url' => htmlspecialchars(@$_SERVER['SERVER_NAME'].@$_SERVER['REQUEST_URI']),
@@ -290,6 +297,7 @@ function get_sender_info() {
290
  'checkjs_data_cookies' => $checkjs_data_cookies,
291
  'ct_options' => json_encode($options2server),
292
  'fields_number' => sizeof($_POST),
 
293
  );
294
  }
295
 
1
  <?php
2
 
3
+ $ct_agent_version = 'wordpress-532';
4
  $ct_plugin_name = 'Anti-spam by CleanTalk';
5
  $ct_checkjs_frm = 'ct_checkjs_frm';
6
  $ct_checkjs_register_form = 'ct_checkjs_register_form';
143
  if (array_key_exists('sender_info', $params)) {
144
  $sender_info = array_merge($sender_info, (array) $params['sender_info']);
145
  }
146
+
147
  $sender_info = json_encode($sender_info);
148
  if ($sender_info === false)
149
  $sender_info = '';
188
  );
189
  }
190
 
191
+ if(@intval($ct_result->errno) != 0)
192
  {
193
  if($params['checkjs']!=1)
194
  {
278
  'ssl_on' => $ct_options['ssl_on'],
279
  );*/
280
  $options2server=$ct_options;
281
+ $js_info='';
282
+ if(isset($_COOKIE['ct_user_info']))
283
+ {
284
+ $js_info=stripslashes(rawurldecode($_COOKIE['ct_user_info']));
285
+ $js_info=mb_convert_encoding($js_info, "UTF-8", "Windows-1252");
286
+ }
287
 
288
  return $sender_info = array(
289
  'page_url' => htmlspecialchars(@$_SERVER['SERVER_NAME'].@$_SERVER['REQUEST_URI']),
297
  'checkjs_data_cookies' => $checkjs_data_cookies,
298
  'ct_options' => json_encode($options2server),
299
  'fields_number' => sizeof($_POST),
300
+ 'js_info' => $js_info,
301
  );
302
  }
303
 
inc/cleantalk-public.php CHANGED
@@ -979,6 +979,7 @@ function ct_test_registration($nickname, $email, $ip){
979
  if ($sender_info === false) {
980
  $sender_info= '';
981
  }
 
982
 
983
  require_once('cleantalk.class.php');
984
  $config = get_option('cleantalk_server');
@@ -1117,7 +1118,7 @@ function ct_registration_errors($errors, $sanitized_user_login = null, $user_ema
1117
  )
1118
  );
1119
  }
1120
-
1121
  $ct_signup_done = true;
1122
 
1123
  if ($ct_result->errno != 0 && $ct_options['notice_api_errors']) {
@@ -1469,6 +1470,7 @@ function ct_si_contact_form_validate($form_errors = array(), $form_id_num = 0) {
1469
 
1470
  if ($ct_options['contact_forms_test'] == 0)
1471
  return $form_errors;
 
1472
 
1473
  $checkjs = js_test('ct_checkjs', $_POST, true);
1474
 
@@ -1492,6 +1494,7 @@ function ct_si_contact_form_validate($form_errors = array(), $form_id_num = 0) {
1492
 
1493
  if (isset($_POST['message']))
1494
  $message = $_POST['message'];
 
1495
 
1496
  $ct_base_call_result = ct_base_call(array(
1497
  'message' => $subject . "\n\n" . $message,
@@ -1728,7 +1731,8 @@ function ct_contact_form_validate () {
1728
  isset($_POST['bbp_topic_content']) ||
1729
  isset($_POST['bbp_reply_content']) ||
1730
  isset($_COOKIE[LOGGED_IN_COOKIE]) ||
1731
- isset($_POST['fscf_submitted'])
 
1732
  ) {
1733
  return null;
1734
  }
@@ -1891,7 +1895,8 @@ function ct_contact_form_validate_postdata () {
1891
  @intval($ct_options['general_contact_forms_test'])==0 ||
1892
  isset($_POST['bbp_topic_content']) ||
1893
  isset($_POST['bbp_reply_content']) ||
1894
- isset($_POST['fscf_submitted'])
 
1895
  ) {
1896
  return null;
1897
  }
979
  if ($sender_info === false) {
980
  $sender_info= '';
981
  }
982
+
983
 
984
  require_once('cleantalk.class.php');
985
  $config = get_option('cleantalk_server');
1118
  )
1119
  );
1120
  }
1121
+
1122
  $ct_signup_done = true;
1123
 
1124
  if ($ct_result->errno != 0 && $ct_options['notice_api_errors']) {
1470
 
1471
  if ($ct_options['contact_forms_test'] == 0)
1472
  return $form_errors;
1473
+ $sender_info='';
1474
 
1475
  $checkjs = js_test('ct_checkjs', $_POST, true);
1476
 
1494
 
1495
  if (isset($_POST['message']))
1496
  $message = $_POST['message'];
1497
+
1498
 
1499
  $ct_base_call_result = ct_base_call(array(
1500
  'message' => $subject . "\n\n" . $message,
1731
  isset($_POST['bbp_topic_content']) ||
1732
  isset($_POST['bbp_reply_content']) ||
1733
  isset($_COOKIE[LOGGED_IN_COOKIE]) ||
1734
+ isset($_POST['fscf_submitted']) ||
1735
+ strpos($_SERVER['REQUEST_URI'],'/wc-api/')!==false
1736
  ) {
1737
  return null;
1738
  }
1895
  @intval($ct_options['general_contact_forms_test'])==0 ||
1896
  isset($_POST['bbp_topic_content']) ||
1897
  isset($_POST['bbp_reply_content']) ||
1898
+ isset($_POST['fscf_submitted']) ||
1899
+ strpos($_SERVER['REQUEST_URI'],'/wc-api/')!==false
1900
  ) {
1901
  return null;
1902
  }
inc/cleantalk-users-checkspam.js CHANGED
@@ -212,6 +212,7 @@ jQuery("#ct_check_users_button").click(function(){
212
  jQuery('#ct_check_users_table').hide();
213
  jQuery('#ct_delete_all_users').hide();
214
  jQuery('#ct_delete_checked_users').hide();
 
215
  working=true;
216
  ct_show_users_info();
217
  });
212
  jQuery('#ct_check_users_table').hide();
213
  jQuery('#ct_delete_all_users').hide();
214
  jQuery('#ct_delete_checked_users').hide();
215
+ jQuery('#ct_preloader').show();
216
  working=true;
217
  ct_show_users_info();
218
  });
inc/cleantalk-users.php CHANGED
@@ -1,5 +1,4 @@
1
  <?php
2
-
3
  add_action('admin_menu', 'ct_add_users_menu');
4
 
5
  function ct_add_users_menu()
@@ -16,7 +15,7 @@ function ct_show_users_page()
16
  <div class="wrap">
17
  <h2><?php _e("Anti-spam by CleanTalk", 'cleantalk'); ?></h2><br />
18
  <?php
19
- $args_unchecked = array(
20
  'meta_query' => array(
21
  'relation' => 'AND',
22
  Array(
@@ -30,28 +29,25 @@ function ct_show_users_page()
30
  'compare' => 'NOT EXISTS'
31
  )
32
  )
33
- );
34
- $cnt_unchecked=sizeof(get_users($args_unchecked));
35
- $args_spam = array(
 
 
 
 
 
 
36
  'meta_query' => array(
37
  Array(
38
  'key' => 'ct_marked_as_spam',
39
  'compare' => 'EXISTS'
40
  )
41
  )
42
- );
43
- $cnt_spam=sizeof(get_users($args_spam));
44
- //if($cnt_unchecked>0)
45
- {
46
- ?>
47
- </div>
48
- <?php
49
- }
50
- ?>
51
- <?php
52
- //print '<button class="button" id="ct_insert_users">Insert users</button><br />';
53
  ?>
54
-
55
  <div id="ct_working_message" style="margin:auto;padding:3px;width:70%;border:2px dotted gray;display:none;background:#ffff99;">
56
  <?php _e("Please wait for a while. CleanTalk is checking all users via blacklist database at cleantalk.org. You will have option to delete found spam users after plugin finish.", 'cleantalk'); ?>
57
  </div>
@@ -63,18 +59,8 @@ function ct_show_users_page()
63
  ?>
64
  </div>
65
  <h3 id="ct_checking_users_status" style="text-align:center;width:90%;"></h3>
 
66
  <?php
67
- $args_spam = array(
68
- 'meta_query' => array(
69
- Array(
70
- 'key' => 'ct_marked_as_spam',
71
- 'compare' => 'EXISTS'
72
- )
73
- )
74
- );
75
- $cnt_spam=sizeof(get_users($args_spam));
76
-
77
-
78
  $page=1;
79
  if(isset($_GET['spam_page']))
80
  {
@@ -93,7 +79,7 @@ function ct_show_users_page()
93
  );
94
 
95
  $c_spam=get_users($args_spam);
96
- if($cnt_spam>0)
97
  {
98
  ?>
99
  <table class="widefat fixed comments" id="ct_check_users_table">
@@ -168,25 +154,14 @@ function ct_show_users_page()
168
  </tr>
169
  <?php
170
  }
171
- $args_spam = array(
172
- 'meta_query' => array(
173
- Array(
174
- 'key' => 'ct_marked_as_spam',
175
- 'value' => '1',
176
- 'compare' => 'NUMERIC'
177
- )
178
-
179
- )
180
- );
181
- $cnt_spam=sizeof(get_users($args_spam));
182
- if($cnt_spam>30)
183
  {
184
  ?>
185
  <tr class="comment even thread-even depth-1 approved">
186
  <td colspan="4">
187
  <?php
188
 
189
- $pages=ceil(intval($cnt_spam)/30);
190
  for($i=1;$i<=$pages;$i++)
191
  {
192
  if($i==$page)
@@ -214,7 +189,7 @@ function ct_show_users_page()
214
  <br /><br />
215
  <div id="ct_info_message"><?php _e("Anti-spam by CleanTalk will check all users against blacklists database and show you senders that have spam activity on other websites. Just click 'Find spam users' to start.", 'cleantalk'); ?>
216
  <?php
217
- if($cnt_spam>0)
218
  {
219
  print "<br />
220
  There is some differencies between blacklists database and our API mechanisms. Blacklists shows all history of spam activity, but our API (that used in spam checking) used another parameters, too: last day of activity, number of spam attacks during last days etc. This mechanisms help us to reduce number of false positivitie. So, there is nothing strange, if some emails/IPs will be not found by this checking.<br /><br />";
@@ -295,7 +270,7 @@ function ct_ajax_check_users()
295
  }
296
  else
297
  {
298
- $data[]='127.0.0.1';
299
  }
300
  $data[]=$u[$i]->data->user_email;
301
  }
@@ -336,12 +311,12 @@ function ct_ajax_check_users()
336
  {
337
  $uip='127.0.0.1';
338
  }
339
- //if($uip=='127.0.0.1')continue;
340
  $uim=$u[$i]->data->user_email;
341
  if(empty($uim))continue;
342
 
343
  //print "uip: $uip, uim: $uim\n";
344
- if($result->data->$uip->appears==1||$result->data->$uim->appears==1)
345
  {
346
  update_user_meta($u[$i]->ID,'ct_marked_as_spam','1',true);
347
  }
@@ -361,42 +336,18 @@ add_action( 'wp_ajax_ajax_info_users', 'ct_ajax_info_users' );
361
  function ct_ajax_info_users()
362
  {
363
  check_ajax_referer( 'ct_secret_nonce', 'security' );
364
- $cnt=sizeof(get_users());
365
-
366
- $args_spam = array(
367
- 'meta_query' => array(
368
- Array(
369
- 'key' => 'ct_marked_as_spam',
370
- //'value' => '1',
371
- 'compare' => 'NUMERIC'
372
- )
373
- )
374
- );
375
-
376
- $cnt_spam=sizeof(get_users($args_spam));
377
-
378
- $args_checked1=array(
379
- 'meta_query' => array(
380
- Array(
381
- 'key' => 'ct_hash',
382
- 'compare' => 'EXISTS'
383
- )
384
- )
385
- );
386
- $args_checked2=array(
387
- 'meta_query' => array(
388
- Array(
389
- 'key' => 'ct_checked',
390
- 'compare' => 'EXISTS'
391
- )
392
- )
393
- );
394
-
395
- $cnt_checked1=sizeof(get_users($args_checked1));
396
- $cnt_checked2=sizeof(get_users($args_checked2));
397
- $cnt_checked=$cnt_checked1+$cnt_checked2;
398
 
399
- printf (__("Total users %s, checked %s, found %s spam users.", 'cleantalk'), $cnt, $cnt_checked, $cnt_spam);
400
  die();
401
  }
402
 
@@ -483,5 +434,5 @@ function ct_ajax_clear_users()
483
  global $wpdb;
484
  $wpdb->query("delete from $wpdb->usermeta where meta_key='ct_hash' or meta_key='ct_checked' or meta_key='ct_marked_as_spam';");
485
  die();
486
- }
487
  ?>
1
  <?php
 
2
  add_action('admin_menu', 'ct_add_users_menu');
3
 
4
  function ct_add_users_menu()
15
  <div class="wrap">
16
  <h2><?php _e("Anti-spam by CleanTalk", 'cleantalk'); ?></h2><br />
17
  <?php
18
+ /*$args_unchecked = array(
19
  'meta_query' => array(
20
  'relation' => 'AND',
21
  Array(
29
  'compare' => 'NOT EXISTS'
30
  )
31
  )
32
+ );*/
33
+ global $wpdb;
34
+ $r=$wpdb->get_results("select distinct count($wpdb->users.ID) as cnt from $wpdb->users inner join $wpdb->usermeta on $wpdb->users.ID=$wpdb->usermeta.user_id where $wpdb->usermeta.meta_key='ct_checked' or $wpdb->usermeta.meta_key='ct_hash';");
35
+ $cnt_checked=$r[0]->cnt;
36
+ $r=$wpdb->get_results("select count(ID) as cnt from $wpdb->users;");
37
+ $cnt_all=$r[0]->cnt;
38
+
39
+ $cnt_unchecked=$cnt_all-$cnt_checked;
40
+ /*$args_spam = array(
41
  'meta_query' => array(
42
  Array(
43
  'key' => 'ct_marked_as_spam',
44
  'compare' => 'EXISTS'
45
  )
46
  )
47
+ );*/
48
+ $r=$wpdb->get_results("select distinct count($wpdb->users.ID) as cnt from $wpdb->users inner join $wpdb->usermeta on $wpdb->users.ID=$wpdb->usermeta.user_id where $wpdb->usermeta.meta_key='ct_marked_as_spam';", ARRAY_A);
49
+ $cnt_spam1=$r[0]['cnt'];
 
 
 
 
 
 
 
 
50
  ?>
 
51
  <div id="ct_working_message" style="margin:auto;padding:3px;width:70%;border:2px dotted gray;display:none;background:#ffff99;">
52
  <?php _e("Please wait for a while. CleanTalk is checking all users via blacklist database at cleantalk.org. You will have option to delete found spam users after plugin finish.", 'cleantalk'); ?>
53
  </div>
59
  ?>
60
  </div>
61
  <h3 id="ct_checking_users_status" style="text-align:center;width:90%;"></h3>
62
+ <div style="text-align:center;width:100%;display:none;" id="ct_preloader"><img border=0 src="<?php print plugin_dir_url(__FILE__); ?>images/preloader.gif" /></div>
63
  <?php
 
 
 
 
 
 
 
 
 
 
 
64
  $page=1;
65
  if(isset($_GET['spam_page']))
66
  {
79
  );
80
 
81
  $c_spam=get_users($args_spam);
82
+ if($cnt_spam1>0)
83
  {
84
  ?>
85
  <table class="widefat fixed comments" id="ct_check_users_table">
154
  </tr>
155
  <?php
156
  }
157
+ if($cnt_spam1>30)
 
 
 
 
 
 
 
 
 
 
 
158
  {
159
  ?>
160
  <tr class="comment even thread-even depth-1 approved">
161
  <td colspan="4">
162
  <?php
163
 
164
+ $pages=ceil(intval($cnt_spam1)/30);
165
  for($i=1;$i<=$pages;$i++)
166
  {
167
  if($i==$page)
189
  <br /><br />
190
  <div id="ct_info_message"><?php _e("Anti-spam by CleanTalk will check all users against blacklists database and show you senders that have spam activity on other websites. Just click 'Find spam users' to start.", 'cleantalk'); ?>
191
  <?php
192
+ if($cnt_spam1>0)
193
  {
194
  print "<br />
195
  There is some differencies between blacklists database and our API mechanisms. Blacklists shows all history of spam activity, but our API (that used in spam checking) used another parameters, too: last day of activity, number of spam attacks during last days etc. This mechanisms help us to reduce number of false positivitie. So, there is nothing strange, if some emails/IPs will be not found by this checking.<br /><br />";
270
  }
271
  else
272
  {
273
+ $data[]='8.8.8.8';
274
  }
275
  $data[]=$u[$i]->data->user_email;
276
  }
311
  {
312
  $uip='127.0.0.1';
313
  }
314
+ if($uip=='127.0.0.1')continue;
315
  $uim=$u[$i]->data->user_email;
316
  if(empty($uim))continue;
317
 
318
  //print "uip: $uip, uim: $uim\n";
319
+ if(isset($result->data->$uip) && $result->data->$uip->appears==1 || isset($result->data->$uim) && $result->data->$uim->appears==1)
320
  {
321
  update_user_meta($u[$i]->ID,'ct_marked_as_spam','1',true);
322
  }
336
  function ct_ajax_info_users()
337
  {
338
  check_ajax_referer( 'ct_secret_nonce', 'security' );
339
+ global $wpdb;
340
+ $r=$wpdb->get_results("select distinct count($wpdb->users.ID) as cnt from $wpdb->users inner join $wpdb->usermeta on $wpdb->users.ID=$wpdb->usermeta.user_id where $wpdb->usermeta.meta_key='ct_checked' or $wpdb->usermeta.meta_key='ct_hash';");
341
+ $cnt_checked=$r[0]->cnt;
342
+ $r=$wpdb->get_results("select count(ID) as cnt from $wpdb->users;");
343
+ $cnt=$r[0]->cnt;
344
+
345
+ $cnt_unchecked=$cnt_all-$cnt_checked;
346
+
347
+ $r=$wpdb->get_results("select distinct count($wpdb->users.ID) as cnt from $wpdb->users inner join $wpdb->usermeta on $wpdb->users.ID=$wpdb->usermeta.user_id where $wpdb->usermeta.meta_key='ct_marked_as_spam';", ARRAY_A);
348
+ $cnt_spam1=$r[0]['cnt'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
349
 
350
+ printf (__("Total users %s, checked %s, found %s spam users.", 'cleantalk'), $cnt, $cnt_checked, $cnt_spam1);
351
  die();
352
  }
353
 
434
  global $wpdb;
435
  $wpdb->query("delete from $wpdb->usermeta where meta_key='ct_hash' or meta_key='ct_checked' or meta_key='ct_marked_as_spam';");
436
  die();
437
+ }
438
  ?>
inc/cleantalk_nocache.js CHANGED
@@ -130,4 +130,80 @@ if(ct_nocache_executed==undefined)
130
  //alert('set!');
131
  sendRequest(ct_ajaxurl+'?'+Math.random(),ct_callback,'action=ct_get_cookie');
132
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  }
130
  //alert('set!');
131
  sendRequest(ct_ajaxurl+'?'+Math.random(),ct_callback,'action=ct_get_cookie');
132
  }
133
+
134
+ if(ct_info_flag)
135
+ {
136
+
137
+ var cleantalk_user_info={};
138
+
139
+ var cleantalk_screen_info={};
140
+ for(var prop in screen)
141
+ {
142
+ if (navigator[prop] instanceof Object || screen[prop]==='') continue
143
+ cleantalk_screen_info[prop]=screen[prop];
144
+ }
145
+
146
+ cleantalk_user_info.screen=cleantalk_screen_info;
147
+
148
+ var cleantalk_plugins=Array();
149
+ var prev
150
+ var cnt=0;
151
+ for(var i=0;i<navigator.plugins.length;i++)
152
+ {
153
+ var plugin = navigator.plugins[i];
154
+ var plugin = plugin.name+" "+(plugin.version || '')
155
+ if (prev == plugin ) continue;
156
+ cleantalk_plugins[cnt]=plugin;
157
+ cnt++;
158
+ prev = plugin
159
+ }
160
+ cleantalk_user_info.plugins=cleantalk_plugins;
161
+
162
+ cleantalk_user_info.timezone_offset = -new Date().getTimezoneOffset()/60;
163
+ cleantalk_user_info.datetime = Math.round((new Date().getTime())/1000);
164
+
165
+ cleantalk_user_info.browser_x=document.documentElement.clientWidth;
166
+ cleantalk_user_info.browser_y=document.documentElement.clientHeight;
167
+
168
+ var ua = navigator.userAgent.toLowerCase();
169
+ var flashInstalled = 0;
170
+ if (typeof(navigator.plugins)!="undefined"&&typeof(navigator.plugins["Shockwave Flash"])=="object")
171
+ {
172
+ flashInstalled = 1;
173
+ }
174
+ else if (typeof window.ActiveXObject != "undefined")
175
+ {
176
+ try
177
+ {
178
+ if (new ActiveXObject("ShockwaveFlash.ShockwaveFlash"))
179
+ {
180
+ flashInstalled = 1;
181
+ }
182
+ } catch(e) {};
183
+ };
184
+
185
+ cleantalk_user_info.is_flash=flashInstalled;
186
+
187
+ isVisitedMain=-1;
188
+ if(location.href=='http://'+location.hostname+'/' || location.href=='https://'+location.hostname+'/')
189
+ {
190
+ isVisitedMain=1;
191
+ setTimeout(function() { document.cookie = "ct_visited_main = 1; path = /;"}, 500);
192
+ }
193
+
194
+
195
+ ct_visited_main = ct_getCookie('ct_visited_main');
196
+ if(ct_visited_main==undefined && isVisitedMain==-1)
197
+ {
198
+ isVisitedMain=0;
199
+ }
200
+ else
201
+ {
202
+ isVisitedMain=1;
203
+ }
204
+
205
+ cleantalk_user_info.is_main=isVisitedMain;
206
+
207
+ setTimeout(function() { document.cookie = "ct_user_info = "+escape(JSON.stringify(cleantalk_user_info))+"; path = /;"}, 500);
208
+ }
209
  }
inc/images/preloader.gif ADDED
Binary file
readme.txt CHANGED
@@ -1,9 +1,9 @@
1
  === Anti-Spam by CleanTalk - No Captcha, no comments & registrations spam ===
2
  Contributors: znaeff, shagimuratov, vlad-cleantalk
3
- Tags: anti-spam, antispam, bbpress, buddypress, captcha, capcha, captha, catcha, cf7 spam, comments, contact form spam, signup, spam, 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, math, security, login, blacklist, cache, prevent, wordpress, User Frontend, bulk delete, bulk remove, cloudflare, widget, review, auth forms, firewall, ddos, cleantalk, mailpoet
4
  Requires at least: 3.0
5
- Tested up to: 4.3
6
- Stable tag: 5.31
7
  License: GPLv2
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
@@ -30,7 +30,7 @@ No CAPTCHA, no questions, no counting animals, no puzzles, no math and no spam b
30
  Supports native WordPress, JetPack comments and any other comments plugins. Plugin moves spam comments to SPAM folder or set option to silent ban spam comments.
31
 
32
  = Spam bots registrations filter =
33
- Filers spam bots on registrations forms WordPress, BuddyPress, bbPress, S2Member, WooCommerce and any other registrations plugins.
34
 
35
  = Protection against contact forms spam =
36
  Plugin is tested and ready to protect against spam emails via Formidable forms, Contact form 7, JetPack Contact form, Fast Secure Contact form, Ninja forms, Landing pages, Gravity forms and any themes/custom contact forms.
@@ -96,7 +96,7 @@ We have developed antispam for WordPress that would provide **maximum protection
96
 
97
  The anti-spam method offered by CleanTalk allows to switch from the methods that trouble the communication (CAPTCHA, question-answer etc.) to a more convenient one.
98
 
99
- CleanTalk is premium anti-spam service for WordPress, please look at the <a href="http://cleantalk.org/price">pricing</a>. The plugin works with cloud anti spam service CleanTalk. We try to provide anti-spam service at the highest level and we can not afford to offer a free version of our service, as this will immediately affect the quality of providing anti-spam protection. Paying for a year of anti-spam service, you save a lot more and get:
100
 
101
  * Up to 99.998% protection against spam bots.
102
  * Time and resources saving.
@@ -215,7 +215,7 @@ The plugin has several options to detect spam bots and humans. If you just post
215
  The comments will be passed, becuase the plugin detect sender as a human. So, use special email *stop_email@example.com* to test anti-spam or wait a few days to see how the plugin works.
216
 
217
  = Is it free or paid? =
218
- The plugin is free. But the plugin uses paid cloud service CleanTalk to filter spam bots. You have to register an account and purchase 1 year anti-spam license with 60 days to get money back.
219
 
220
  = Can I use CleanTalk with cache plugins? =
221
  Anti-spam by CleanTalk doesn't use static HTML code into templates, so all anti-spam functions works correctly with any WordPress cache plugins.
@@ -264,7 +264,7 @@ Yes, you can. Add in your wp-config.php file, before defining database constants
264
 
265
  $cleantalk_key_exclusions = Array('key1', 'key2', 'key3');
266
 
267
- Now, all fields in your submissions with keys named 'key1', 'key2' or 'key3' will be excluded from spam checking.
268
 
269
  = How to test Spam FireWall? =
270
  Use special IP 10.10.10.10 in URL to test Spam FireWall. For example,
@@ -374,10 +374,17 @@ WordPress 3.0 at least. PHP 5 with CURL or file_get_contents() function and enab
374
  1. CleanTalk works faster than most of the other anti-spam plugins.
375
 
376
  == Changelog ==
 
 
 
 
 
 
 
377
  = 5.31 2015-11-11 =
378
  * Improved backend performance
379
  * Fixed counter of approved/blocked spam attacks
380
- * Fixed Spam Firewall logging
381
 
382
  = 5.30 2015-11-05 =
383
  * Improved anti-spam checking
@@ -397,7 +404,7 @@ WordPress 3.0 at least. PHP 5 with CURL or file_get_contents() function and enab
397
  = 5.28 2015-10-16 =
398
  * Fixed errors in anti-spam checking
399
  * Restored options for spam checking registrations and cpmmon contact forms
400
- * Improved antispam defence
401
  * Fixed problems with AJAX functionality in MailPoet, WooCommerce and other AJAX plugins
402
 
403
  = 5.27 2015-10-13 =
@@ -872,6 +879,13 @@ WordPress 3.0 at least. PHP 5 with CURL or file_get_contents() function and enab
872
  * First version
873
 
874
  == Upgrade Notice ==
 
 
 
 
 
 
 
875
  = 5.31 2015-11-11 =
876
  * Improved backend performance
877
  * Fixed counter of approved/blocked spam attacks
1
  === Anti-Spam by CleanTalk - No Captcha, no comments & registrations spam ===
2
  Contributors: znaeff, shagimuratov, vlad-cleantalk
3
+ Tags: anti-spam, antispam, bbpress, buddypress, captcha, capcha, captha, catcha, cf7 spam, comments, contact form spam, signup, spam, 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, math, security, login, blacklist, cache, prevent, 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
4
  Requires at least: 3.0
5
+ Tested up to: 4.4
6
+ Stable tag: 5.32
7
  License: GPLv2
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
30
  Supports native WordPress, JetPack comments and any other comments plugins. Plugin moves spam comments to SPAM folder or set option to silent ban spam comments.
31
 
32
  = Spam bots registrations filter =
33
+ Filers spam bots on registrations forms WordPress, BuddyPress, bbPress, S2Member, WooCommerce, Profile builder and any other registrations plugins.
34
 
35
  = Protection against contact forms spam =
36
  Plugin is tested and ready to protect against spam emails via Formidable forms, Contact form 7, JetPack Contact form, Fast Secure Contact form, Ninja forms, Landing pages, Gravity forms and any themes/custom contact forms.
96
 
97
  The anti-spam method offered by CleanTalk allows to switch from the methods that trouble the communication (CAPTCHA, question-answer etc.) to a more convenient one.
98
 
99
+ CleanTalk is premium anti-spam service for WordPress, please look at the <a href="http://cleantalk.org/price">pricing</a>. The plugin works with cloud anti spam service CleanTalk. CleanTalk has free trial. We try to provide anti-spam service at the highest level and we can not afford to offer a free version of our service, as this will immediately affect the quality of providing anti-spam protection. Paying for a year of anti-spam service, you save a lot more and get:
100
 
101
  * Up to 99.998% protection against spam bots.
102
  * Time and resources saving.
215
  The comments will be passed, becuase the plugin detect sender as a human. So, use special email *stop_email@example.com* to test anti-spam or wait a few days to see how the plugin works.
216
 
217
  = Is it free or paid? =
218
+ The plugin is free. But the plugin uses CleanTalk cloud service to filter spam bots. You have to register an account and you have free trial to test anti-spam for comments, registrations, bookings, contacts or orders. When the trial (on CleanTalk account) is finished, you can renew the subscription for 1 year or deactivate anti-spam plugin.
219
 
220
  = Can I use CleanTalk with cache plugins? =
221
  Anti-spam by CleanTalk doesn't use static HTML code into templates, so all anti-spam functions works correctly with any WordPress cache plugins.
264
 
265
  $cleantalk_key_exclusions = Array('key1', 'key2', 'key3');
266
 
267
+ Now all fields in your submissions with keys named 'key1', 'key2' or 'key3' will be excluded from spam checking.
268
 
269
  = How to test Spam FireWall? =
270
  Use special IP 10.10.10.10 in URL to test Spam FireWall. For example,
374
  1. CleanTalk works faster than most of the other anti-spam plugins.
375
 
376
  == Changelog ==
377
+ = 5.32 2015-11-26 =
378
+ * Added improvements for manual spam detection
379
+ * Fixed errors in backend
380
+ * Fixed bulk users antispam checking
381
+ * Added indicator for bulk spam checking
382
+ * Added "Get access key automatically" button
383
+
384
  = 5.31 2015-11-11 =
385
  * Improved backend performance
386
  * Fixed counter of approved/blocked spam attacks
387
+ * Fixed Spam FireWall logging
388
 
389
  = 5.30 2015-11-05 =
390
  * Improved anti-spam checking
404
  = 5.28 2015-10-16 =
405
  * Fixed errors in anti-spam checking
406
  * Restored options for spam checking registrations and cpmmon contact forms
407
+ * Improved spam protection
408
  * Fixed problems with AJAX functionality in MailPoet, WooCommerce and other AJAX plugins
409
 
410
  = 5.27 2015-10-13 =
879
  * First version
880
 
881
  == Upgrade Notice ==
882
+ = 5.32 2015-11-26 =
883
+ * Added improvements for manual spam detection
884
+ * Fixed errors in backend
885
+ * Fixed bulk users antispam checking
886
+ * Added indicator for bulk spam checking
887
+ * Added "Get access key automatically" feature
888
+
889
  = 5.31 2015-11-11 =
890
  * Improved backend performance
891
  * Fixed counter of approved/blocked spam attacks