Spam protection, AntiSpam, FireWall by CleanTalk - Version 5.56

Version Description

December 19 2016 = * Integrations: MailChimp Premium, Profile Press. * Changes comments flow. * FireWall updater fix. * Users check optimization.

Download this release

Release Info

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

Code changes from version 5.55 to 5.56

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, no Captcha, 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.55
7
  Author: СleanTalk <welcome@cleantalk.org>
8
  Author URI: http://cleantalk.org
9
  */
10
- $cleantalk_plugin_version='5.55';
11
- $ct_agent_version = 'wordpress-555';
12
  $cleantalk_executed=false;
13
  $ct_sfw_updated = false;
14
 
@@ -60,6 +60,13 @@ if(!defined('CLEANTALK_PLUGIN_DIR')){
60
 
61
  $ct_data['db_refreshed'] = 1;
62
  update_option('cleantalk_data', $ct_data);
 
 
 
 
 
 
 
63
  }
64
 
65
  if(@stripos($_SERVER['REQUEST_URI'],'admin-ajax.php')!==false && sizeof($_POST)>0 && isset($_GET['action']) && $_GET['action']=='ninja_forms_ajax_submit')
@@ -148,7 +155,7 @@ if(!defined('CLEANTALK_PLUGIN_DIR')){
148
  }
149
  //cron end
150
  }
151
-
152
  if(isset($ct_options['check_external']) && @intval($ct_options['check_external']) == 1)
153
  $test_external_forms=true;
154
  else
@@ -281,6 +288,7 @@ if(!defined('CLEANTALK_PLUGIN_DIR')){
281
 
282
  // Hourly run hook
283
  add_action('ct_hourly_event_hook', 'ct_do_this_hourly');
 
284
 
285
  // Comments
286
  add_filter('preprocess_comment', 'ct_preprocess_comment', 1, 1); // param - comment data array
@@ -331,7 +339,7 @@ if (!function_exists ( 'ct_activation')) {
331
 
332
  wp_schedule_event(time(), 'hourly', 'ct_hourly_event_hook' );
333
  //wp_schedule_event(time(), 'hourly', 'ct_send_sfw_log' );
334
- wp_schedule_event(time(), 'daily', 'cleantalk_update_sfw' );
335
 
336
 
337
  cleantalk_update_sfw();
@@ -352,6 +360,7 @@ if (!function_exists ( 'ct_deactivation')) {
352
  wp_clear_scheduled_hook( 'ct_hourly_event_hook' );
353
  @wp_clear_scheduled_hook( 'ct_send_sfw_log' );
354
  wp_clear_scheduled_hook( 'cleantalk_update_sfw' );
 
355
  }
356
  }
357
 
@@ -561,7 +570,7 @@ function cleantalk_update_sfw()
561
  else
562
  $value=0;
563
 
564
- if($value==1 && ($ct_sfw_updated === false || !isset($ct_sfw_updated))){
565
 
566
  $data = Array( 'auth_key' => $ct_options['apikey'],
567
  'method_name' => '2s_blacklists_db'
@@ -585,7 +594,7 @@ function cleantalk_update_sfw()
585
 
586
  }
587
  $wpdb->query($query);
588
- $ct_sfw_updated = true;
589
  }
590
  }
591
  }
3
  Plugin Name: Spam Protection by CleanTalk
4
  Plugin URI: http://cleantalk.org
5
  Description: Max power, all-in-one, no Captcha, 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.56
7
  Author: СleanTalk <welcome@cleantalk.org>
8
  Author URI: http://cleantalk.org
9
  */
10
+ $cleantalk_plugin_version='5.56';
11
+ $ct_agent_version = 'wordpress-556';
12
  $cleantalk_executed=false;
13
  $ct_sfw_updated = false;
14
 
60
 
61
  $ct_data['db_refreshed'] = 1;
62
  update_option('cleantalk_data', $ct_data);
63
+ }else{
64
+ if($ct_data['db_refreshed'] == 1){
65
+ if (!wp_next_scheduled('cleantalk_update_sfw_hook'))
66
+ wp_schedule_event(time()+1800, 'daily', 'cleantalk_update_sfw_hook' );
67
+ $ct_data['db_refreshed'] = 2;
68
+ update_option('cleantalk_data', $ct_data);
69
+ }
70
  }
71
 
72
  if(@stripos($_SERVER['REQUEST_URI'],'admin-ajax.php')!==false && sizeof($_POST)>0 && isset($_GET['action']) && $_GET['action']=='ninja_forms_ajax_submit')
155
  }
156
  //cron end
157
  }
158
+
159
  if(isset($ct_options['check_external']) && @intval($ct_options['check_external']) == 1)
160
  $test_external_forms=true;
161
  else
288
 
289
  // Hourly run hook
290
  add_action('ct_hourly_event_hook', 'ct_do_this_hourly');
291
+ add_action('cleantalk_update_sfw_hook', 'cleantalk_update_sfw');
292
 
293
  // Comments
294
  add_filter('preprocess_comment', 'ct_preprocess_comment', 1, 1); // param - comment data array
339
 
340
  wp_schedule_event(time(), 'hourly', 'ct_hourly_event_hook' );
341
  //wp_schedule_event(time(), 'hourly', 'ct_send_sfw_log' );
342
+ wp_schedule_event(time(), 'daily', 'cleantalk_update_sfw_hook' );
343
 
344
 
345
  cleantalk_update_sfw();
360
  wp_clear_scheduled_hook( 'ct_hourly_event_hook' );
361
  @wp_clear_scheduled_hook( 'ct_send_sfw_log' );
362
  wp_clear_scheduled_hook( 'cleantalk_update_sfw' );
363
+ wp_clear_scheduled_hook( 'cleantalk_update_sfw_hook' );
364
  }
365
  }
366
 
570
  else
571
  $value=0;
572
 
573
+ if($value==1 && ($ct_sfw_updated === false || !isset($ct_sfw_updated))){
574
 
575
  $data = Array( 'auth_key' => $ct_options['apikey'],
576
  'method_name' => '2s_blacklists_db'
594
 
595
  }
596
  $wpdb->query($query);
597
+ $ct_sfw_updated = true;
598
  }
599
  }
600
  }
inc/cleantalk-admin.php CHANGED
@@ -385,8 +385,8 @@ function ct_admin_init()
385
  add_settings_field('cleantalk_sfw_counter', "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".__('SpamFireWall counter', 'cleantalk'), 'ct_input_sfw_counter', 'cleantalk', 'cleantalk_settings_anti_spam');
386
 
387
 
388
- add_settings_field('cleantalk_spam_firewall', __('SpamFireWall', 'cleantalk'), 'ct_input_spam_firewall', 'cleantalk', 'cleantalk_settings_banner');
389
  add_settings_field('cleantalk_collect_details', __('Collect details about browsers', 'cleantalk'), 'ct_input_collect_details', 'cleantalk', 'cleantalk_settings_anti_spam');
 
390
  add_settings_field('cleantalk_show_link', __('Tell others about CleanTalk', 'cleantalk'), 'ct_input_show_link', 'cleantalk', 'cleantalk_settings_banner');
391
  }
392
  }
@@ -637,7 +637,7 @@ function ct_add_admin_menu( $wp_admin_bar ) {
637
  */
638
  function ct_section_settings_state() {
639
  global $ct_options, $ct_data;
640
-
641
  $ct_options = ct_get_options();
642
  $ct_data = ct_get_data();
643
 
385
  add_settings_field('cleantalk_sfw_counter', "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".__('SpamFireWall counter', 'cleantalk'), 'ct_input_sfw_counter', 'cleantalk', 'cleantalk_settings_anti_spam');
386
 
387
 
 
388
  add_settings_field('cleantalk_collect_details', __('Collect details about browsers', 'cleantalk'), 'ct_input_collect_details', 'cleantalk', 'cleantalk_settings_anti_spam');
389
+ add_settings_field('cleantalk_spam_firewall', __('SpamFireWall', 'cleantalk'), 'ct_input_spam_firewall', 'cleantalk', 'cleantalk_settings_anti_spam');
390
  add_settings_field('cleantalk_show_link', __('Tell others about CleanTalk', 'cleantalk'), 'ct_input_show_link', 'cleantalk', 'cleantalk_settings_banner');
391
  }
392
  }
637
  */
638
  function ct_section_settings_state() {
639
  global $ct_options, $ct_data;
640
+
641
  $ct_options = ct_get_options();
642
  $ct_data = ct_get_data();
643
 
inc/cleantalk-ajax.php CHANGED
@@ -12,6 +12,9 @@ $cleantalk_ajax_actions_to_check[] = 'amoforms_submit'; //amoForms
12
 
13
  //cleantalk_hooked_actions[] - array for POST 'actions' which were direct hooked.
14
 
 
 
 
15
  /*hooks for Usernoise Form*/
16
  add_action('un_feedback_form_body', 'ct_add_hidden_fields',1);
17
  add_filter('un_validate_feedback', 'ct_ajax_hook', 1, 2);
@@ -286,7 +289,7 @@ function ct_user_register_ajaxlogin($user_id)
286
  return $user_id;
287
  }
288
 
289
- function ct_ajax_hook($message_obj = false)
290
  {
291
  require_once(CLEANTALK_PLUGIN_DIR . 'inc/cleantalk-public.php');
292
  global $ct_agent_version, $ct_checkjs_register_form, $ct_session_request_id_label, $ct_session_register_ok_label, $bp, $ct_signup_done, $ct_formtime_label, $ct_negative_comment, $ct_options, $ct_data, $current_user;
@@ -336,7 +339,7 @@ function ct_ajax_hook($message_obj = false)
336
  {
337
  $nickname='';
338
  }
339
-
340
  //CSCF fix
341
  if(isset($_POST['action']) && $_POST['action']== 'cscf-submitform'){
342
  $ct_post_temp[] = $message_obj['comment_author'];
@@ -566,6 +569,11 @@ function ct_ajax_hook($message_obj = false)
566
  print json_encode($result);
567
  die();
568
  }
 
 
 
 
 
569
  else
570
  {
571
  print $ct_result->comment;
12
 
13
  //cleantalk_hooked_actions[] - array for POST 'actions' which were direct hooked.
14
 
15
+ /* MailChimp Premium*/
16
+ add_filter('mc4wp_form_errors', 'ct_ajax_hook', 1, 2);
17
+
18
  /*hooks for Usernoise Form*/
19
  add_action('un_feedback_form_body', 'ct_add_hidden_fields',1);
20
  add_filter('un_validate_feedback', 'ct_ajax_hook', 1, 2);
289
  return $user_id;
290
  }
291
 
292
+ function ct_ajax_hook($message_obj = false, $additional = false)
293
  {
294
  require_once(CLEANTALK_PLUGIN_DIR . 'inc/cleantalk-public.php');
295
  global $ct_agent_version, $ct_checkjs_register_form, $ct_session_request_id_label, $ct_session_register_ok_label, $bp, $ct_signup_done, $ct_formtime_label, $ct_negative_comment, $ct_options, $ct_data, $current_user;
339
  {
340
  $nickname='';
341
  }
342
+
343
  //CSCF fix
344
  if(isset($_POST['action']) && $_POST['action']== 'cscf-submitform'){
345
  $ct_post_temp[] = $message_obj['comment_author'];
569
  print json_encode($result);
570
  die();
571
  }
572
+ elseif(isset($_POST['_mc4wp_timestamp']) && isset($_POST['_mc4wp_form_id']))
573
+ {
574
+ $message_obj[] = 'ct_mc4wp_response';
575
+ return $message_obj;
576
+ }
577
  else
578
  {
579
  print $ct_result->comment;
inc/cleantalk-public.php CHANGED
@@ -9,7 +9,7 @@ function ct_init() {
9
 
10
  $ct_options = ct_get_options();
11
  $ct_data=ct_get_data();
12
-
13
  //Check internal forms with such "action" http://wordpress.loc/contact-us/some_script.php
14
  if((isset($_POST['action']) && $_POST['action'] == 'ct_check_internal') &&
15
  (isset($ct_options['check_internal']) && intval($ct_options['check_internal']))
@@ -152,6 +152,11 @@ function ct_init() {
152
  add_action('messages_message_before_save','ct_bp_private_msg_check', 1);
153
  }
154
 
 
 
 
 
 
155
  // bbPress
156
  if(class_exists('bbPress')){
157
  add_filter('bbp_new_topic_pre_title', 'ct_bbp_get_topic', 1);
@@ -197,7 +202,7 @@ function ct_init() {
197
  add_filter('gform_get_form_filter', 'ct_gforms_hidden_field', 10, 2);
198
  add_filter('gform_entry_is_spam', 'ct_gforms_spam_test', 1, 3);
199
  }
200
-
201
  //
202
  //Pirate forms
203
  //
@@ -205,7 +210,7 @@ function ct_init() {
205
  if(isset($_POST['pirate-forms-contact-name']) && $_POST['pirate-forms-contact-name'] && isset($_POST['pirate-forms-contact-email']) && $_POST['pirate-forms-contact-email'])
206
  ct_pirate_forms_check();
207
  }
208
-
209
  //
210
  // Load JS code to website footer
211
  //
@@ -233,6 +238,17 @@ function ct_init() {
233
  }
234
  }
235
 
 
 
 
 
 
 
 
 
 
 
 
236
  /*
237
  * Function to set validate fucntion for CCF form
238
  * Input - Сonsistently each form field
@@ -378,7 +394,7 @@ function ct_woocommerce_wishlist_check($args){
378
  $ct = $ct_base_call_result['ct'];
379
  $ct_result = $ct_base_call_result['ct_result'];
380
 
381
- if ($ct_result->stop_queue == 1 || $ct_result->spam == 1 || $ct_result->allow == 0)
382
  wp_die("<h1>Spam Protection by CleanTalk</h1><h2>".$ct_result->comment."</h2>", '', array('response' => 403, "back_link" => true, "text_direction" => 'ltr'));
383
  else
384
  return $args;
@@ -470,7 +486,7 @@ function ct_bp_private_msg_check( $bp_message_obj){
470
  $ct = $ct_base_call_result['ct'];
471
  $ct_result = $ct_base_call_result['ct_result'];
472
 
473
- if ($ct_result->stop_queue == 1 || $ct_result->spam == 1 || $ct_result->allow == 0)
474
  wp_die("<h1>Spam Protection by CleanTalk</h1><h2>".$ct_result->comment."</h2>", '', array('response' => 403, "back_link" => true, "text_direction" => 'ltr'));
475
  }
476
 
@@ -531,7 +547,7 @@ function ct_pirate_forms_check(){
531
  $ct = $ct_base_call_result['ct'];
532
  $ct_result = $ct_base_call_result['ct_result'];
533
 
534
- if ($ct_result->stop_queue == 1 || $ct_result->spam == 1 || $ct_result->allow == 0)
535
  wp_die("<h1>Spam Protection by CleanTalk</h1><h2>".$ct_result->comment."</h2>", '', array('response' => 403, "back_link" => true, "text_direction" => 'ltr'));
536
  }
537
 
@@ -670,34 +686,62 @@ setTimeout(function(){
670
  function ct_add_mouse_tracking($return_string = false){
671
 
672
  $js_script = '<script type="text/javascript">
673
- function ctSetCookie(c_name, value, def_value) {
674
- document.cookie = c_name + "=" + escape(value) + "; path=/";
675
  }
 
 
 
 
 
 
676
  setTimeout(function(){
677
- ctSetCookie("ct_timezone", d.getTimezoneOffset()/60, "0");
 
678
  },1000);
 
679
  //Stop observing function
680
  function ctMouseStopData(){
681
- window.removeEventListener("mousemove", func);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
682
  clearInterval(ctMouseReadInterval);
683
  clearInterval(ctMouseWriteDataInterval);
684
  }
 
685
  var d = new Date(),
686
  ctTimeMs = new Date().getTime(),
687
  ctMouseEventTimerFlag = true, //Reading interval flag
688
  ctMouseData = "[",
689
  ctMouseDataCounter = 0;
 
690
  //Reading interval
691
  var ctMouseReadInterval = setInterval(function(){
692
  ctMouseEventTimerFlag = true;
693
  }, 300);
 
694
  //Writting interval
695
  var ctMouseWriteDataInterval = setInterval(function(){
696
  var ctMouseDataToSend = ctMouseData.slice(0,-1).concat("]");
697
- ctSetCookie("ct_pointer_data", ctMouseDataToSend, "0");
698
  }, 3000);
 
699
  //Logging mouse position each 300 ms
700
- var func = function output(event){
701
  if(ctMouseEventTimerFlag == true){
702
  var mouseDate = new Date();
703
  ctMouseData += "[" + event.pageY + "," + event.pageX + "," + (mouseDate.getTime() - ctTimeMs) + "],";
@@ -707,10 +751,22 @@ function ct_add_mouse_tracking($return_string = false){
707
  ctMouseStopData();
708
  }
709
  }
710
- if(typeof window.addEventListener == "function")
711
- window.addEventListener("mousemove", func);
712
- else
713
- window.attachEvent("onmousemove", func);
 
 
 
 
 
 
 
 
 
 
 
 
714
  </script>';
715
 
716
  if($return_string)
@@ -827,7 +883,7 @@ function ct_frm_validate_entry ($errors, $values) {
827
  $ct = $ct_base_call_result['ct'];
828
  $ct_result = $ct_base_call_result['ct_result'];
829
 
830
- if ($ct_result->spam == 1) {
831
  $errors['ct_error'] = '<br /><b>' . $ct_result->comment . '</b><br /><br />';
832
  }
833
 
@@ -903,7 +959,7 @@ function ct_bbp_new_pre_content ($comment) {
903
  $ct = $ct_base_call_result['ct'];
904
  $ct_result = $ct_base_call_result['ct_result'];
905
 
906
- if ($ct_result->stop_queue == 1 || $ct_result->spam == 1 || $ct_result->allow == 0) {
907
  bbp_add_error('bbp_reply_content', $ct_result->comment);
908
  }
909
 
@@ -1072,16 +1128,21 @@ function ct_preprocess_comment($comment) {
1072
  if($ct_result->stop_queue == 1) // Terminate. Definitely spam.
1073
  wp_die($err_text, 'Blacklisted', array('back_link' => true));
1074
 
1075
- if($ct_result->spam == 0) // Don't move to spam folder. Delete.
1076
  wp_die($err_text, 'Blacklisted', array('back_link' => true));
1077
 
 
 
 
 
 
 
1078
  if($ct_result->stop_words){ // Contains stop_words. Move to pending folder.
1079
- add_filter('pre_comment_approved', 'ct_set_not_approved', 999, 2);
1080
- add_action('comment_post', 'ct_mark_red', 11, 2);
1081
- }else // stop_words == null, spam == 1, stop_queue == 0, To spam folder.
1082
- add_filter('pre_comment_approved', 'ct_set_comment_spam', 999, 2);
1083
-
1084
- add_action('comment_post', 'ct_die', 12, 2);
1085
  }
1086
 
1087
  if(isset($ct_options['remove_comments_links']) && $ct_options['remove_comments_links'] == '1'){
@@ -1264,6 +1325,13 @@ function ct_mark_red($comment_id, $comment_status) {
1264
  wp_update_comment($comment);
1265
  }
1266
 
 
 
 
 
 
 
 
1267
  /**
1268
  * Tests plugin activation status
1269
  * @return bool
@@ -1321,6 +1389,20 @@ function ct_login_message($message) {
1321
  return $message;
1322
  }
1323
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1324
  /**
1325
  * Test users registration for multisite enviroment
1326
  * @return array with errors
@@ -1466,7 +1548,7 @@ function ct_test_registration($nickname, $email, $ip){
1466
  */
1467
  function ct_registration_errors($errors, $sanitized_user_login = null, $user_email = null) {
1468
  global $ct_agent_version, $ct_checkjs_register_form, $ct_session_request_id_label, $ct_session_register_ok_label, $bp, $ct_signup_done, $ct_formtime_label, $ct_negative_comment, $ct_options, $ct_data;
1469
-
1470
  $ct_options=ct_get_options();
1471
  $ct_data=ct_get_data();
1472
 
@@ -1474,11 +1556,11 @@ function ct_registration_errors($errors, $sanitized_user_login = null, $user_ema
1474
  if (ct_is_user_enable() === false) {
1475
  return $errors;
1476
  }
1477
-
1478
  if ($ct_options['registrations_test'] == 0) {
1479
  return $errors;
1480
  }
1481
-
1482
  //
1483
  // The function already executed
1484
  // It happens when used ct_register_post();
@@ -1486,7 +1568,7 @@ function ct_registration_errors($errors, $sanitized_user_login = null, $user_ema
1486
  if ($ct_signup_done && is_object($errors) && count($errors->errors) > 0) {
1487
  return $errors;
1488
  }
1489
-
1490
  //
1491
  // BuddyPress actions
1492
  //
@@ -1527,19 +1609,19 @@ function ct_registration_errors($errors, $sanitized_user_login = null, $user_ema
1527
  }
1528
 
1529
  // Pointer data
1530
- if(isset($_COOKIE['ct_pointer_data']))
1531
- $pointer_data = json_decode ($_COOKIE['ct_pointer_data']);
1532
- else
1533
- $pointer_data = 0;
1534
-
1535
  // Timezone from JS
1536
- if(isset($_COOKIE['ct_timezone']))
1537
- $js_timezone = $_COOKIE['ct_timezone'];
1538
- else
1539
- $js_timezone = 0;
1540
 
 
 
 
 
1541
  $sender_info['mouse_cursor_positions'] = $pointer_data;
1542
  $sender_info['js_timezone'] = $js_timezone;
 
 
1543
 
1544
  $sender_info = json_encode($sender_info);
1545
  if ($sender_info === false) {
@@ -1576,7 +1658,7 @@ function ct_registration_errors($errors, $sanitized_user_login = null, $user_ema
1576
  )
1577
  );
1578
  }
1579
-
1580
  $ct_signup_done = true;
1581
 
1582
  $ct_result = ct_change_plugin_resonse($ct_result, $checkjs);
@@ -1585,7 +1667,7 @@ function ct_registration_errors($errors, $sanitized_user_login = null, $user_ema
1585
  ct_send_error_notice($ct_result->comment);
1586
  return $errors;
1587
  }
1588
-
1589
  ct_init_session();
1590
 
1591
  if ($ct_result->allow == 0) {
@@ -1710,14 +1792,14 @@ function ct_contact_form_is_spam($form) {
1710
  $ct = $ct_base_call_result['ct'];
1711
  $ct_result = $ct_base_call_result['ct_result'];
1712
 
1713
- if ($ct_result->spam == 1) {
1714
  global $ct_comment;
1715
  $ct_comment = $ct_result->comment;
1716
  ct_die(null, null);
1717
  exit;
1718
  }
1719
 
1720
- return (bool) $ct_result->spam;
1721
  }
1722
 
1723
  function ct_contact_form_is_spam_jetpack($is_spam,$form) {
@@ -1771,14 +1853,14 @@ function ct_contact_form_is_spam_jetpack($is_spam,$form) {
1771
  $ct = $ct_base_call_result['ct'];
1772
  $ct_result = $ct_base_call_result['ct_result'];
1773
 
1774
- if ($ct_result->spam == 1) {
1775
  global $ct_comment;
1776
  $ct_comment = $ct_result->comment;
1777
  ct_die(null, null);
1778
  exit;
1779
  }
1780
 
1781
- return (bool) $ct_result->spam;
1782
  }
1783
 
1784
 
@@ -1882,15 +1964,15 @@ function ct_wpcf7_spam($param) {
1882
  $ct = $ct_base_call_result['ct'];
1883
  $ct_result = $ct_base_call_result['ct_result'];
1884
 
1885
- if ($ct_result->spam == 1) {
1886
- if (WPCF7_VERSION >= '3.0.0') {
1887
- $param = true;
1888
- }else{
1889
- $param = false;
1890
- }
1891
- $ct_cf7_comment = $ct_result->comment;
1892
- add_filter('wpcf7_display_message', 'ct_wpcf7_display_message', 10, 2);
1893
-
1894
  }
1895
 
1896
  return $param;
@@ -1981,7 +2063,7 @@ function ct_si_contact_form_validate($form_errors = array(), $form_id_num = 0) {
1981
 
1982
  $cleantalk_executed = true;
1983
 
1984
- if ($ct_result->spam == 1) {
1985
  global $ct_comment;
1986
  $ct_comment = $ct_result->comment;
1987
  ct_die(null, null);
@@ -2058,7 +2140,7 @@ function ct_check_wplp(){
2058
  $ct = $ct_base_call_result['ct'];
2059
  $ct_result = $ct_base_call_result['ct_result'];
2060
 
2061
- if ($ct_result->spam == 1) {
2062
  $cleantalk_comment = $ct_result->comment;
2063
  } else {
2064
  $cleantalk_comment = 'OK';
@@ -2260,7 +2342,7 @@ function ct_s2member_registration_test() {
2260
  */
2261
  function ct_contact_form_validate () {
2262
  global $pagenow,$cleantalk_executed, $cleantalk_url_exclusions,$ct_options, $ct_data, $ct_checkjs_frm;
2263
-
2264
  $ct_options = ct_get_options();
2265
  $ct_data = ct_get_data();
2266
 
@@ -2364,8 +2446,6 @@ function ct_contact_form_validate () {
2364
  cleantalk_debug("CtContactForm", "false");
2365
  }
2366
 
2367
-
2368
-
2369
  // Skip submission if no data found
2370
  if ($sender_email===''|| !$contact_form) {
2371
  return false;
@@ -2398,7 +2478,7 @@ function ct_contact_form_validate () {
2398
  {
2399
  $_POST['TellAFriend_Link']=$tmp;
2400
  }
2401
-
2402
  $ct = $ct_base_call_result['ct'];
2403
  $ct_result = $ct_base_call_result['ct_result'];
2404
  if ($ct_result->allow == 0) {
@@ -2458,7 +2538,6 @@ function ct_contact_form_validate () {
2458
  }elseif(isset($_POST['action']) && $_POST['action'] == 'cf_process_ajax_submit'){
2459
  echo "<h3>Antispam by CleanTalk: <u>".$ct_result->comment."</u></h3>";
2460
  die();
2461
-
2462
  }else
2463
  ct_die(null, null);
2464
 
9
 
10
  $ct_options = ct_get_options();
11
  $ct_data=ct_get_data();
12
+
13
  //Check internal forms with such "action" http://wordpress.loc/contact-us/some_script.php
14
  if((isset($_POST['action']) && $_POST['action'] == 'ct_check_internal') &&
15
  (isset($ct_options['check_internal']) && intval($ct_options['check_internal']))
152
  add_action('messages_message_before_save','ct_bp_private_msg_check', 1);
153
  }
154
 
155
+ if(defined('PROFILEPRESS_SYSTEM_FILE_PATH')){
156
+ add_filter('pp_registration_validation', 'ct_registration_errors_ppress', 11, 2);
157
+ }
158
+
159
+
160
  // bbPress
161
  if(class_exists('bbPress')){
162
  add_filter('bbp_new_topic_pre_title', 'ct_bbp_get_topic', 1);
202
  add_filter('gform_get_form_filter', 'ct_gforms_hidden_field', 10, 2);
203
  add_filter('gform_entry_is_spam', 'ct_gforms_spam_test', 1, 3);
204
  }
205
+
206
  //
207
  //Pirate forms
208
  //
210
  if(isset($_POST['pirate-forms-contact-name']) && $_POST['pirate-forms-contact-name'] && isset($_POST['pirate-forms-contact-email']) && $_POST['pirate-forms-contact-email'])
211
  ct_pirate_forms_check();
212
  }
213
+
214
  //
215
  // Load JS code to website footer
216
  //
238
  }
239
  }
240
 
241
+ // MailChimp Premium for Wordpress
242
+ function ct_add_mc4wp_error_message($messages){
243
+
244
+ $messages['ct_mc4wp_response'] = array(
245
+ 'type' => 'error',
246
+ 'text' => 'Your message looks like spam.'
247
+ );
248
+ return $messages;
249
+ }
250
+ add_filter( 'mc4wp_form_messages', 'ct_add_mc4wp_error_message' );
251
+
252
  /*
253
  * Function to set validate fucntion for CCF form
254
  * Input - Сonsistently each form field
394
  $ct = $ct_base_call_result['ct'];
395
  $ct_result = $ct_base_call_result['ct_result'];
396
 
397
+ if ($ct_result->allow == 0)
398
  wp_die("<h1>Spam Protection by CleanTalk</h1><h2>".$ct_result->comment."</h2>", '', array('response' => 403, "back_link" => true, "text_direction" => 'ltr'));
399
  else
400
  return $args;
486
  $ct = $ct_base_call_result['ct'];
487
  $ct_result = $ct_base_call_result['ct_result'];
488
 
489
+ if ($ct_result->allow == 0)
490
  wp_die("<h1>Spam Protection by CleanTalk</h1><h2>".$ct_result->comment."</h2>", '', array('response' => 403, "back_link" => true, "text_direction" => 'ltr'));
491
  }
492
 
547
  $ct = $ct_base_call_result['ct'];
548
  $ct_result = $ct_base_call_result['ct_result'];
549
 
550
+ if ($ct_result->allow == 0)
551
  wp_die("<h1>Spam Protection by CleanTalk</h1><h2>".$ct_result->comment."</h2>", '', array('response' => 403, "back_link" => true, "text_direction" => 'ltr'));
552
  }
553
 
686
  function ct_add_mouse_tracking($return_string = false){
687
 
688
  $js_script = '<script type="text/javascript">
689
+ function ctSetCookie(c_name, value) {
690
+ document.cookie = c_name + "=" + escape(value) + "; path=/";
691
  }
692
+
693
+ ctSetCookie("ct_ps_timestamp", Math.floor(new Date().getTime()/1000));
694
+ ctSetCookie("ct_fkp_timestamp", "0");
695
+ ctSetCookie("ct_pointer_data", "0");
696
+ ctSetCookie("ct_timezone", "0");
697
+
698
  setTimeout(function(){
699
+ ctSetCookie("%s", "%s");
700
+ ctSetCookie("ct_timezone", d.getTimezoneOffset()/60);
701
  },1000);
702
+
703
  //Stop observing function
704
  function ctMouseStopData(){
705
+ if(typeof window.addEventListener == "function")
706
+ window.removeEventListener("mousemove", ctFunctionMouseMove);
707
+ else
708
+ window.detachEvent("onmousemove", ctFunctionMouseMove);
709
+ clearInterval(ctMouseReadInterval);
710
+ clearInterval(ctMouseWriteDataInterval);
711
+ }
712
+
713
+ //Stop key listening function
714
+ function ctKeyStopStopListening(){
715
+ if(typeof window.addEventListener == "function"){
716
+ window.removeEventListener("mousedown", ctFunctionFirstKey);
717
+ window.removeEventListener("keydown", ctFunctionFirstKey);
718
+ }else{
719
+ window.detachEvent("mousedown", ctFunctionFirstKey);
720
+ window.detachEvent("keydown", ctFunctionFirstKey);
721
+ }
722
  clearInterval(ctMouseReadInterval);
723
  clearInterval(ctMouseWriteDataInterval);
724
  }
725
+
726
  var d = new Date(),
727
  ctTimeMs = new Date().getTime(),
728
  ctMouseEventTimerFlag = true, //Reading interval flag
729
  ctMouseData = "[",
730
  ctMouseDataCounter = 0;
731
+
732
  //Reading interval
733
  var ctMouseReadInterval = setInterval(function(){
734
  ctMouseEventTimerFlag = true;
735
  }, 300);
736
+
737
  //Writting interval
738
  var ctMouseWriteDataInterval = setInterval(function(){
739
  var ctMouseDataToSend = ctMouseData.slice(0,-1).concat("]");
740
+ ctSetCookie("ct_pointer_data", ctMouseDataToSend);
741
  }, 3000);
742
+
743
  //Logging mouse position each 300 ms
744
+ var ctFunctionMouseMove = function output(event){
745
  if(ctMouseEventTimerFlag == true){
746
  var mouseDate = new Date();
747
  ctMouseData += "[" + event.pageY + "," + event.pageX + "," + (mouseDate.getTime() - ctTimeMs) + "],";
751
  ctMouseStopData();
752
  }
753
  }
754
+ //Writing first key press timestamp
755
+ var ctFunctionFirstKey = function output(event){
756
+ var KeyTimestamp = Math.floor(new Date().getTime()/1000);
757
+ ctSetCookie("ct_fkp_timestamp", KeyTimestamp);
758
+ ctKeyStopStopListening();
759
+ }
760
+
761
+ if(typeof window.addEventListener == "function"){
762
+ window.addEventListener("mousemove", ctFunctionMouseMove);
763
+ window.addEventListener("mousedown", ctFunctionFirstKey);
764
+ window.addEventListener("keydown", ctFunctionFirstKey);
765
+ }else{
766
+ window.attachEvent("onmousemove", ctFunctionMouseMove);
767
+ window.attachEvent("mousedown", ctFunctionFirstKey);
768
+ window.attachEvent("keydown", ctFunctionFirstKey);
769
+ }
770
  </script>';
771
 
772
  if($return_string)
883
  $ct = $ct_base_call_result['ct'];
884
  $ct_result = $ct_base_call_result['ct_result'];
885
 
886
+ if ($ct_result->allow == 0) {
887
  $errors['ct_error'] = '<br /><b>' . $ct_result->comment . '</b><br /><br />';
888
  }
889
 
959
  $ct = $ct_base_call_result['ct'];
960
  $ct_result = $ct_base_call_result['ct_result'];
961
 
962
+ if ($ct_result->allow == 0) {
963
  bbp_add_error('bbp_reply_content', $ct_result->comment);
964
  }
965
 
1128
  if($ct_result->stop_queue == 1) // Terminate. Definitely spam.
1129
  wp_die($err_text, 'Blacklisted', array('back_link' => true));
1130
 
1131
+ if($ct_result->spam == 3) // Don't move to spam folder. Delete.
1132
  wp_die($err_text, 'Blacklisted', array('back_link' => true));
1133
 
1134
+ if($ct_result->spam == 2)
1135
+ add_action('comment_post', 'ct_wp_trash_comment', 997, 2);
1136
+
1137
+ if($ct_result->spam == 1)
1138
+ add_filter('pre_comment_approved', 'ct_set_comment_spam', 997, 2);
1139
+
1140
  if($ct_result->stop_words){ // Contains stop_words. Move to pending folder.
1141
+ add_filter('pre_comment_approved', 'ct_set_not_approved', 998, 2);
1142
+ add_action('comment_post', 'ct_mark_red', 998, 2);
1143
+ }
1144
+
1145
+ add_action('comment_post', 'ct_die', 999, 2);
 
1146
  }
1147
 
1148
  if(isset($ct_options['remove_comments_links']) && $ct_options['remove_comments_links'] == '1'){
1325
  wp_update_comment($comment);
1326
  }
1327
 
1328
+ //
1329
+ //Send post to trash
1330
+ //
1331
+ function ct_wp_trash_comment($comment_id, $comment_status){
1332
+ wp_trash_comment($comment_id);
1333
+ }
1334
+
1335
  /**
1336
  * Tests plugin activation status
1337
  * @return bool
1389
  return $message;
1390
  }
1391
 
1392
+ /**
1393
+ * Test users registration for pPress
1394
+ * @return array with errors
1395
+ */
1396
+ function ct_registration_errors_ppress($reg_errors, $form_id) {
1397
+
1398
+ $email = $_POST['reg_email'];
1399
+ $login = $_POST['reg_username'];
1400
+
1401
+ $reg_errors = ct_registration_errors($reg_errors, $login, $email);
1402
+
1403
+ return $reg_errors;
1404
+ }
1405
+
1406
  /**
1407
  * Test users registration for multisite enviroment
1408
  * @return array with errors
1548
  */
1549
  function ct_registration_errors($errors, $sanitized_user_login = null, $user_email = null) {
1550
  global $ct_agent_version, $ct_checkjs_register_form, $ct_session_request_id_label, $ct_session_register_ok_label, $bp, $ct_signup_done, $ct_formtime_label, $ct_negative_comment, $ct_options, $ct_data;
1551
+
1552
  $ct_options=ct_get_options();
1553
  $ct_data=ct_get_data();
1554
 
1556
  if (ct_is_user_enable() === false) {
1557
  return $errors;
1558
  }
1559
+
1560
  if ($ct_options['registrations_test'] == 0) {
1561
  return $errors;
1562
  }
1563
+
1564
  //
1565
  // The function already executed
1566
  // It happens when used ct_register_post();
1568
  if ($ct_signup_done && is_object($errors) && count($errors->errors) > 0) {
1569
  return $errors;
1570
  }
1571
+
1572
  //
1573
  // BuddyPress actions
1574
  //
1609
  }
1610
 
1611
  // Pointer data
1612
+ $pointer_data = isset($_COOKIE['ct_pointer_data']) ? json_decode($_COOKIE['ct_pointer_data']) : 0;
1613
+
 
 
 
1614
  // Timezone from JS
1615
+ $js_timezone = isset($_COOKIE['ct_timezone']) ? $_COOKIE['ct_timezone'] : 0;
 
 
 
1616
 
1617
+ //First key down timestamp
1618
+ $first_key_press_timestamp = isset($_COOKIE['ct_fkp_timestamp']) ? $_COOKIE['ct_fkp_timestamp'] : 0;
1619
+ $page_set_timestamp = (isset($_COOKIE['ct_ps_timestamp']) ? $_COOKIE['ct_ps_timestamp'] : 0);
1620
+
1621
  $sender_info['mouse_cursor_positions'] = $pointer_data;
1622
  $sender_info['js_timezone'] = $js_timezone;
1623
+ $sender_info['key_press_timestamp'] = $first_key_press_timestamp;
1624
+ $sender_info['page_set_timestamp'] = $page_set_timestamp;
1625
 
1626
  $sender_info = json_encode($sender_info);
1627
  if ($sender_info === false) {
1658
  )
1659
  );
1660
  }
1661
+
1662
  $ct_signup_done = true;
1663
 
1664
  $ct_result = ct_change_plugin_resonse($ct_result, $checkjs);
1667
  ct_send_error_notice($ct_result->comment);
1668
  return $errors;
1669
  }
1670
+
1671
  ct_init_session();
1672
 
1673
  if ($ct_result->allow == 0) {
1792
  $ct = $ct_base_call_result['ct'];
1793
  $ct_result = $ct_base_call_result['ct_result'];
1794
 
1795
+ if ($ct_result->allow == 0) {
1796
  global $ct_comment;
1797
  $ct_comment = $ct_result->comment;
1798
  ct_die(null, null);
1799
  exit;
1800
  }
1801
 
1802
+ return (bool) !$ct_result->allow;
1803
  }
1804
 
1805
  function ct_contact_form_is_spam_jetpack($is_spam,$form) {
1853
  $ct = $ct_base_call_result['ct'];
1854
  $ct_result = $ct_base_call_result['ct_result'];
1855
 
1856
+ if ($ct_result->allow == 0) {
1857
  global $ct_comment;
1858
  $ct_comment = $ct_result->comment;
1859
  ct_die(null, null);
1860
  exit;
1861
  }
1862
 
1863
+ return (bool) !$ct_result->allow;
1864
  }
1865
 
1866
 
1964
  $ct = $ct_base_call_result['ct'];
1965
  $ct_result = $ct_base_call_result['ct_result'];
1966
 
1967
+ if ($ct_result->allow == 0) {
1968
+
1969
+ if (WPCF7_VERSION >= '3.0.0')
1970
+ $param = true;
1971
+ else
1972
+ $param = false;
1973
+
1974
+ $ct_cf7_comment = $ct_result->comment;
1975
+ add_filter('wpcf7_display_message', 'ct_wpcf7_display_message', 10, 2);
1976
  }
1977
 
1978
  return $param;
2063
 
2064
  $cleantalk_executed = true;
2065
 
2066
+ if ($ct_result->allow == 0) {
2067
  global $ct_comment;
2068
  $ct_comment = $ct_result->comment;
2069
  ct_die(null, null);
2140
  $ct = $ct_base_call_result['ct'];
2141
  $ct_result = $ct_base_call_result['ct_result'];
2142
 
2143
+ if ($ct_result->allow == 0) {
2144
  $cleantalk_comment = $ct_result->comment;
2145
  } else {
2146
  $cleantalk_comment = 'OK';
2342
  */
2343
  function ct_contact_form_validate () {
2344
  global $pagenow,$cleantalk_executed, $cleantalk_url_exclusions,$ct_options, $ct_data, $ct_checkjs_frm;
2345
+
2346
  $ct_options = ct_get_options();
2347
  $ct_data = ct_get_data();
2348
 
2446
  cleantalk_debug("CtContactForm", "false");
2447
  }
2448
 
 
 
2449
  // Skip submission if no data found
2450
  if ($sender_email===''|| !$contact_form) {
2451
  return false;
2478
  {
2479
  $_POST['TellAFriend_Link']=$tmp;
2480
  }
2481
+
2482
  $ct = $ct_base_call_result['ct'];
2483
  $ct_result = $ct_base_call_result['ct_result'];
2484
  if ($ct_result->allow == 0) {
2538
  }elseif(isset($_POST['action']) && $_POST['action'] == 'cf_process_ajax_submit'){
2539
  echo "<h3>Antispam by CleanTalk: <u>".$ct_result->comment."</u></h3>";
2540
  die();
 
2541
  }else
2542
  ct_die(null, null);
2543
 
inc/cleantalk-users.php CHANGED
@@ -17,12 +17,20 @@ function ct_show_users_page()
17
  <h2><?php echo $ct_plugin_name; ?></h2><br />
18
  <?php
19
  global $wpdb;
20
- $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';");
21
- $cnt_checked=$r[0]->cnt;
22
- $r=$wpdb->get_results("select count(ID) as cnt from $wpdb->users;");
23
- $cnt_all=$r[0]->cnt;
 
 
 
 
 
 
 
 
 
24
 
25
- $cnt_unchecked=$cnt_all-$cnt_checked;
26
  /*$args_spam = array(
27
  'meta_query' => array(
28
  Array(
@@ -246,18 +254,31 @@ function ct_ajax_check_users()
246
  'compare' => 'NOT EXISTS'
247
  ),
248
  ),
 
 
249
  'number' => 100
250
  );
251
 
252
- $u=get_users($args_unchecked);
253
-
254
- if(sizeof($u)>0)
255
- {
 
 
 
 
 
 
 
 
 
 
 
256
  $data=Array();
257
  for($i=0;$i<sizeof($u);$i++)
258
  {
259
  $user_meta=get_user_meta($u[$i]->ID, 'session_tokens', true);
260
-
261
  if(is_array($user_meta))
262
  {
263
  $user_meta=array_values($user_meta);
@@ -361,11 +382,19 @@ function ct_ajax_info_users($direct_call = false)
361
  }
362
 
363
  global $wpdb;
 
 
 
 
 
 
 
 
 
364
  $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';");
365
  $cnt_checked=$r[0]->cnt;
366
- $r=$wpdb->get_results("select count(ID) as cnt from $wpdb->users;");
367
- $cnt=$r[0]->cnt;
368
 
 
369
  $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);
370
  $cnt_spam1=$r[0]['cnt'];
371
 
@@ -376,9 +405,8 @@ function ct_ajax_info_users($direct_call = false)
376
  }
377
  print "<p>$backup_notice</p>";
378
 
379
- if (!$direct_call) {
380
  die();
381
- };
382
 
383
  return null;
384
  }
17
  <h2><?php echo $ct_plugin_name; ?></h2><br />
18
  <?php
19
  global $wpdb;
20
+ $r=$wpdb->get_results("
21
+ SELECT
22
+ COUNT(all_users.ID) - COUNT(meta_users.user_id) AS cnt_unchecked
23
+ FROM $wpdb->users all_users
24
+ LEFT JOIN $wpdb->usermeta meta_users
25
+ ON all_users.ID = meta_users.user_id
26
+ WHERE meta_users.meta_key='ct_checked'
27
+ OR meta_users.meta_key='ct_hash';
28
+ ");
29
+
30
+ $cnt_unchecked=$r[0]->cnt_unchecked;
31
+
32
+ echo(" cnt_unchecked $cnt_unchecked<br>");
33
 
 
34
  /*$args_spam = array(
35
  'meta_query' => array(
36
  Array(
254
  'compare' => 'NOT EXISTS'
255
  ),
256
  ),
257
+ 'orderby' => 'registered',
258
+ 'order' => 'ASC',
259
  'number' => 100
260
  );
261
 
262
+ $u = get_users($args_unchecked);
263
+
264
+ if(sizeof($u)>0){
265
+
266
+ foreach($u as $user_index => $user){
267
+
268
+ if(!isset($curr_date))
269
+ $curr_date = (substr($user->data->user_registered, 0, 9) ? substr($user->data->user_registered, 0, 9) : '');
270
+
271
+ if(substr($user->data->user_registered, 0, 9) != $curr_date)
272
+ unset($u[$user_index]);
273
+
274
+ }
275
+ unset($user_index, $user);
276
+
277
  $data=Array();
278
  for($i=0;$i<sizeof($u);$i++)
279
  {
280
  $user_meta=get_user_meta($u[$i]->ID, 'session_tokens', true);
281
+
282
  if(is_array($user_meta))
283
  {
284
  $user_meta=array_values($user_meta);
382
  }
383
 
384
  global $wpdb;
385
+ // All users
386
+ $r=$wpdb->get_results("
387
+ SELECT
388
+ COUNT(ID) AS cnt
389
+ FROM $wpdb->users
390
+ ");
391
+ $cnt = $r[0]->cnt;
392
+
393
+ // Checked
394
  $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';");
395
  $cnt_checked=$r[0]->cnt;
 
 
396
 
397
+ //Spam
398
  $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);
399
  $cnt_spam1=$r[0]['cnt'];
400
 
405
  }
406
  print "<p>$backup_notice</p>";
407
 
408
+ if (!$direct_call)
409
  die();
 
410
 
411
  return null;
412
  }
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: znaeff, shagimuratov, serge00, sartemd174
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, subscription, gravity spam, jetpack, bots, contact form 7, contact form, registrations, ninja, Fast Secure Contact, Gravity forms, formidable, mailchimp, s2member, protection, protect, email, plugin, contact, recaptcha, google captcha, google recaptcha, blacklist, prevent spam comments, wordpress, User Frontend, bulk delete, bulk remove, widget, review, firewall, 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,honeypot,puzzle,quiz,survey,poll,security, amo forms, caldera forms, visual form builder, contact form clean and simple
4
  Requires at least: 3.0
5
- Tested up to: 4.7
6
- Stable tag: 5.55
7
  License: GPLv2
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
@@ -484,6 +484,12 @@ WordPress 3.0 at least. PHP 5 with CURL or file_get_contents() function and enab
484
  1. The Dashboard with a map of most spam active countries per your account.
485
 
486
  == Changelog ==
 
 
 
 
 
 
487
  = 5.55 December 23 2016 =
488
  * Integrations: Caldera Forms, Visual Form Builder.
489
  * Fix for different 'cookies' header names.
@@ -1218,6 +1224,12 @@ WordPress 3.0 at least. PHP 5 with CURL or file_get_contents() function and enab
1218
 
1219
  == Upgrade Notice ==
1220
  == Changelog ==
 
 
 
 
 
 
1221
  = 5.55 December 23 2016 =
1222
  * Integrations: Caldera Forms, Visual Form Builder.
1223
  * Fix for different 'cookies' header names.
2
  Contributors: znaeff, shagimuratov, serge00, sartemd174
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, subscription, gravity spam, jetpack, bots, contact form 7, contact form, registrations, ninja, Fast Secure Contact, Gravity forms, formidable, mailchimp, s2member, protection, protect, email, plugin, contact, recaptcha, google captcha, google recaptcha, blacklist, prevent spam comments, wordpress, User Frontend, bulk delete, bulk remove, widget, review, firewall, 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,honeypot,puzzle,quiz,survey,poll,security, amo forms, caldera forms, visual form builder, contact form clean and simple
4
  Requires at least: 3.0
5
+ Tested up to: 4.7.1
6
+ Stable tag: 5.56
7
  License: GPLv2
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
484
  1. The Dashboard with a map of most spam active countries per your account.
485
 
486
  == Changelog ==
487
+ = 5.56 December 19 2016 =
488
+ * Integrations: MailChimp Premium, Profile Press.
489
+ * Changes comments flow.
490
+ * FireWall updater fix.
491
+ * Users check optimization.
492
+
493
  = 5.55 December 23 2016 =
494
  * Integrations: Caldera Forms, Visual Form Builder.
495
  * Fix for different 'cookies' header names.
1224
 
1225
  == Upgrade Notice ==
1226
  == Changelog ==
1227
+ = 5.56 December 19 2016 =
1228
+ * Integrations: MailChimp Premium, Profile Press.
1229
+ * Changes comments flow.
1230
+ * FireWall updater fix.
1231
+ * Users check optimization.
1232
+
1233
  = 5.55 December 23 2016 =
1234
  * Integrations: Caldera Forms, Visual Form Builder.
1235
  * Fix for different 'cookies' header names.