Spam protection, AntiSpam, FireWall by CleanTalk - Version 5.89

Version Description

February 21 2018 = * Improved spam filtration quality. * Improved compatibility. * Public widget: Styles and referral link added. * Dashboard widget: revised and fixed. * Minor fixes.

Download this release

Release Info

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

Code changes from version 5.88 to 5.89

cleantalk.php CHANGED
@@ -3,17 +3,17 @@
3
  Plugin Name: Anti-Spam 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.
6
- Version: 5.88
7
  Author: СleanTalk <welcome@cleantalk.org>
8
  Author URI: http://cleantalk.org
9
  */
10
 
11
- $cleantalk_plugin_version='5.88';
12
- $ct_agent_version = 'wordpress-588';
13
  $cleantalk_executed = false;
14
 
15
- define('APBCT_VERSION', '5.88');
16
- define('APBCT_AGENT', 'wordpress-588');
17
 
18
  define('CLEANTALK_REMOTE_CALL_SLEEP', 10); // Minimum time between remote call
19
 
@@ -557,12 +557,12 @@ function apbct_update(){
557
  }
558
 
559
  function cleantalk_get_brief_data(){
 
560
  $ct_options = ct_get_options();
561
  $ct_data = ct_get_data();
562
 
563
- $result = CleantalkHelper::getAntispamReportBreif($ct_options['apikey']);
564
 
565
- $ct_data['brief_data'] = $result;
566
  update_option('cleantalk_data', $ct_data);
567
 
568
  return;
3
  Plugin Name: Anti-Spam 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.
6
+ Version: 5.89
7
  Author: СleanTalk <welcome@cleantalk.org>
8
  Author URI: http://cleantalk.org
9
  */
10
 
11
+ $cleantalk_plugin_version='5.89';
12
+ $ct_agent_version = 'wordpress-589';
13
  $cleantalk_executed = false;
14
 
15
+ define('APBCT_VERSION', '5.89');
16
+ define('APBCT_AGENT', 'wordpress-589');
17
 
18
  define('CLEANTALK_REMOTE_CALL_SLEEP', 10); // Minimum time between remote call
19
 
557
  }
558
 
559
  function cleantalk_get_brief_data(){
560
+
561
  $ct_options = ct_get_options();
562
  $ct_data = ct_get_data();
563
 
564
+ $ct_data['brief_data'] = CleantalkHelper::getAntispamReportBreif($ct_options['apikey']);
565
 
 
566
  update_option('cleantalk_data', $ct_data);
567
 
568
  return;
inc/cleantalk-admin.php CHANGED
@@ -29,43 +29,27 @@ function ct_dashboard_statistics_widget() {
29
 
30
  // Outputs statistics widget content
31
  function ct_dashboard_statistics_widget_output( $post, $callback_args ) {
 
32
  global $ct_data, $ct_options, $current_user;
33
-
34
- if(empty($ct_data['brief_data']) || !empty($_POST['ct_brief_refresh'])){
35
-
 
 
 
 
36
  $brief_data = CleantalkHelper::getAntispamReportBreif($ct_options['apikey']);
37
-
38
  $ct_data['brief_data'] = $brief_data;
39
  update_option('cleantalk_data', $ct_data);
40
- }else{
41
- $brief_data = $ct_data['brief_data'];
42
- }
43
-
44
- if(ct_valid_key()){
45
- $ct_error = is_string($brief_data) ? true : false;
46
- $key_is_good = is_string($brief_data) && $brief_data == 'Unknown access key.' ? false : true;
47
- }else{
48
- $ct_error = true;
49
- $key_is_good = false;
50
- $brief_data = 'Unknown access key.';
51
- }
52
-
53
- if($ct_error){
54
- $tmp = array();
55
- for($i=0; $i<7; $i++)
56
- $tmp[date("Y-m-d", time()-86400*7+86400*$i)] = 0;
57
- $spam_stat = $tmp;
58
- }else{
59
- $spam_stat = $brief_data['spam_stat'];
60
  }
 
 
 
 
 
 
61
 
62
  echo "<div id='ct_widget_wrapper'>";
63
- // Parsing brief data 'spam_stat' {"yyyy-mm-dd": spam_count, "yyyy-mm-dd": spam_count} to [["yyyy-mm-dd", "spam_count"], ["yyyy-mm-dd", "spam_count"]]
64
- $to_chart = array();
65
- foreach($spam_stat as $key => $value)
66
- $to_chart[] = array($key, $value);
67
- unset($key, $value);
68
- $to_chart = json_encode($to_chart);
69
  ?>
70
  <form id='ct_refresh_form' method='POST' action='#ct_widget'>
71
  <input type='hidden' name='ct_brief_refresh' value='1'>
@@ -79,8 +63,33 @@ function ct_dashboard_statistics_widget_output( $post, $callback_args ) {
79
  </div>
80
  <h4 class='ct_widget_block_header'><?php _e('Top 5 spam IPs blocked', 'cleantalk'); ?></h4>
81
  <hr class='ct_widget_hr'>
 
 
 
 
 
 
 
 
 
82
  <?php
83
- if($key_is_good && !$ct_error){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  ?>
85
  <div class='ct_widget_block'>
86
  <table cellspacing="0">
@@ -89,62 +98,27 @@ function ct_dashboard_statistics_widget_output( $post, $callback_args ) {
89
  <th><?php _e('Country', 'cleantalk'); ?></th>
90
  <th><?php _e('Block Count', 'cleantalk'); ?></th>
91
  </tr>
92
- <?php
93
- foreach($brief_data['top5_spam_ip'] as $val){
94
- ?>
95
- <tr>
96
- <td><?php echo $val[0]; ?></td>
97
- <td><?php echo $val[1] ? "<img src='https://cleantalk.org/images/flags/".strtolower($val[1]).".png'>" : ''; ?>&nbsp;<?php
98
- echo $val[1]
99
- ? (function_exists('locale_get_display_region')
100
- ? locale_get_display_region('sl-Latn-'.$val[1].'-nedis', substr(get_locale(), 0, 2))
101
- : $val[1])
102
- : 'Unknown'; ?></td>
103
- <td style='text-align: center;'><?php echo $val[2]; ?></td>
104
- </tr>
105
- <?php
106
- }
107
- ?>
108
  </table>
109
- <?php
110
- if(!empty($ct_data['user_token'])){
111
- ?>
112
  <a target='_blank' href='https://cleantalk.org/my?user_token=<?php echo $ct_data['user_token']; ?>&cp_mode=antispam'>
113
  <input class='ct_widget_button' id='ct_widget_button_view_all' type='button' value='View all'>
114
  </a>
115
- <?php
116
- }
117
- ?>
118
  </div>
119
 
120
  <?php
121
- }else{
122
- $plugin_settings_link = (is_network_admin() ? "settings.php" : "options-general.php" )."?page=cleantalk";
123
-
124
- if(!$key_is_good){
125
- ?> <div class='ct_widget_block'>
126
- <form action='<? echo $plugin_settings_link; ?>' method='POST'>
127
- <h2 class='ct_widget_activate_header'><?php _e('Get Access key to activate Anti-Spam protection!', 'cleantalk'); ?></h2>
128
- <input class='ct_widget_button ct_widget_activate_button' type='submit' name='get_apikey_auto' value='ACTIVATE'>
129
- </form>
130
- </div>
131
- <?php
132
- }else{
133
- ?>
134
- <div class='ct_widget_block'>
135
- <h2 class='ct_widget_activate_header'><?php _e('Something went wrong! Server response is: "', 'cleantalk'); ?><u><? echo $brief_data ?></u>".</h2>
136
- <?php
137
- if(!empty($ct_data['user_token'])){
138
- ?>
139
- <h2 class='ct_widget_activate_header'><?php _e('Please, visit your dashboard.', 'cleantalk'); ?></h2>
140
- <a target='_blank' href='https://cleantalk.org/my?user_token=<?php echo $ct_data['user_token']; ?>&cp_mode=antispam'>
141
- <input class='ct_widget_button ct_widget_activate_button ct_widget_resolve_button' type='button' value='VISIT CONTROL PANEL'>
142
- </a>
143
- <?php
144
- }
145
- ?>
146
- </div>
147
- <?php }
148
  }
149
  // Notice at the bottom
150
  if(isset($current_user) && in_array('administrator', $current_user->roles)){
29
 
30
  // Outputs statistics widget content
31
  function ct_dashboard_statistics_widget_output( $post, $callback_args ) {
32
+
33
  global $ct_data, $ct_options, $current_user;
34
+
35
+ $ct_options = ct_get_options();
36
+ $ct_data = ct_get_data();
37
+
38
+ $brief_data = $ct_data['brief_data'];
39
+
40
+ if(!empty($_POST['ct_brief_refresh'])){
41
  $brief_data = CleantalkHelper::getAntispamReportBreif($ct_options['apikey']);
 
42
  $ct_data['brief_data'] = $brief_data;
43
  update_option('cleantalk_data', $ct_data);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  }
45
+ // Parsing brief data 'spam_stat' {"yyyy-mm-dd": spam_count, "yyyy-mm-dd": spam_count} to [["yyyy-mm-dd", "spam_count"], ["yyyy-mm-dd", "spam_count"]]
46
+ $to_chart = array();
47
+ foreach( $brief_data['spam_stat'] as $key => $value ){
48
+ $to_chart[] = array( $key, $value );
49
+ } unset( $key, $value );
50
+ $to_chart = json_encode( $to_chart );
51
 
52
  echo "<div id='ct_widget_wrapper'>";
 
 
 
 
 
 
53
  ?>
54
  <form id='ct_refresh_form' method='POST' action='#ct_widget'>
55
  <input type='hidden' name='ct_brief_refresh' value='1'>
63
  </div>
64
  <h4 class='ct_widget_block_header'><?php _e('Top 5 spam IPs blocked', 'cleantalk'); ?></h4>
65
  <hr class='ct_widget_hr'>
66
+ <?php
67
+ if(!ct_valid_key() || (isset($brief_data['error_no']) && $brief_data['error_no'] == 6)){
68
+ $plugin_settings_link = (is_network_admin() ? "settings.php" : "options-general.php" )."?page=cleantalk";
69
+ ?> <div class='ct_widget_block'>
70
+ <form action='<? echo $plugin_settings_link; ?>' method='POST'>
71
+ <h2 class='ct_widget_activate_header'><?php _e('Get Access key to activate Anti-Spam protection!', 'cleantalk'); ?></h2>
72
+ <input class='ct_widget_button ct_widget_activate_button' type='submit' name='get_apikey_auto' value='ACTIVATE' />
73
+ </form>
74
+ </div>
75
  <?php
76
+ }elseif(!empty($brief_data['error'])){
77
+ echo '<div class="ct_widget_block">'
78
+ .'<h2 class="ct_widget_activate_header">'
79
+ .sprintf(__('Something went wrong! Error: "%s".', 'cleantalk'), "<u>{$brief_data['error_string']}</u>")
80
+ .'</h2>';
81
+ if(!empty($ct_data['user_token'])){
82
+ echo '<h2 class="ct_widget_activate_header">'
83
+ .__('Please, visit your dashboard.', 'cleantalk')
84
+ .'</h2>'
85
+ .'<a target="_blank" href="https://cleantalk.org/my?user_token='.$ct_data['user_token'].'&cp_mode=antispam">'
86
+ .'<input class="ct_widget_button ct_widget_activate_button ct_widget_resolve_button" type="button" value="VISIT CONTROL PANEL">'
87
+ .'</a>';
88
+ }
89
+ echo '</div>';
90
+ }
91
+
92
+ if(ct_valid_key() && empty($brief_data['error'])){
93
  ?>
94
  <div class='ct_widget_block'>
95
  <table cellspacing="0">
98
  <th><?php _e('Country', 'cleantalk'); ?></th>
99
  <th><?php _e('Block Count', 'cleantalk'); ?></th>
100
  </tr>
101
+ <?php foreach($brief_data['top5_spam_ip'] as $val){ ?>
102
+ <tr>
103
+ <td><?php echo $val[0]; ?></td>
104
+ <td><?php echo $val[1] ? "<img src='https://cleantalk.org/images/flags/".strtolower($val[1]).".png'>" : ''; ?>&nbsp;<?php
105
+ echo $val[1]
106
+ ? (function_exists('locale_get_display_region')
107
+ ? locale_get_display_region('sl-Latn-'.$val[1].'-nedis', substr(get_locale(), 0, 2))
108
+ : $val[1])
109
+ : 'Unknown'; ?></td>
110
+ <td style='text-align: center;'><?php echo $val[2]; ?></td>
111
+ </tr>
112
+ <?php } ?>
 
 
 
 
113
  </table>
114
+ <?php if(!empty($ct_data['user_token'])){ ?>
 
 
115
  <a target='_blank' href='https://cleantalk.org/my?user_token=<?php echo $ct_data['user_token']; ?>&cp_mode=antispam'>
116
  <input class='ct_widget_button' id='ct_widget_button_view_all' type='button' value='View all'>
117
  </a>
118
+ <?php } ?>
 
 
119
  </div>
120
 
121
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
  }
123
  // Notice at the bottom
124
  if(isset($current_user) && in_array('administrator', $current_user->roles)){
inc/cleantalk-ajax.php CHANGED
@@ -148,10 +148,10 @@ function ct_validate_email_ajaxlogin($email=null, $is_ajax=true){
148
 
149
  if(class_exists('AjaxLogin')&&isset($_POST['action'])&&$_POST['action']=='validate_email'){
150
 
151
- $checkjs = js_test('ct_checkjs', $_POST, true);
152
  $sender_info['post_checkjs_passed'] = $checkjs;
153
  if ($checkjs === null){
154
- $checkjs = js_test('ct_checkjs', $_COOKIE, true);
155
  $sender_info['cookie_checkjs_passed'] = $checkjs;
156
  }
157
 
@@ -199,10 +199,10 @@ function ct_user_register_ajaxlogin($user_id)
199
  if(class_exists('AjaxLogin')&&isset($_POST['action'])&&$_POST['action']=='register_submit')
200
  {
201
 
202
- $checkjs = js_test('ct_checkjs', $_POST, true);
203
  $sender_info['post_checkjs_passed'] = $checkjs;
204
  if ($checkjs === null){
205
- $checkjs = js_test('ct_checkjs', $_COOKIE, true);
206
  $sender_info['cookie_checkjs_passed'] = $checkjs;
207
  }
208
 
@@ -283,7 +283,7 @@ function ct_ajax_hook($message_obj = false, $additional = false)
283
  'the_champ_user_auth', // Super Socializer
284
  );
285
 
286
- $checkjs = js_test('ct_checkjs', $_COOKIE, true);
287
  if ($checkjs && // Spammers usually fail the JS test
288
  (isset($_POST['action']) && in_array($_POST['action'], $skip_post))
289
  ) {
148
 
149
  if(class_exists('AjaxLogin')&&isset($_POST['action'])&&$_POST['action']=='validate_email'){
150
 
151
+ $checkjs = apbct_js_test('ct_checkjs', $_POST, true);
152
  $sender_info['post_checkjs_passed'] = $checkjs;
153
  if ($checkjs === null){
154
+ $checkjs = apbct_js_test('ct_checkjs', $_COOKIE, true);
155
  $sender_info['cookie_checkjs_passed'] = $checkjs;
156
  }
157
 
199
  if(class_exists('AjaxLogin')&&isset($_POST['action'])&&$_POST['action']=='register_submit')
200
  {
201
 
202
+ $checkjs = apbct_js_test('ct_checkjs', $_POST, true);
203
  $sender_info['post_checkjs_passed'] = $checkjs;
204
  if ($checkjs === null){
205
+ $checkjs = apbct_js_test('ct_checkjs', $_COOKIE, true);
206
  $sender_info['cookie_checkjs_passed'] = $checkjs;
207
  }
208
 
283
  'the_champ_user_auth', // Super Socializer
284
  );
285
 
286
+ $checkjs = apbct_js_test('ct_checkjs', $_COOKIE, true);
287
  if ($checkjs && // Spammers usually fail the JS test
288
  (isset($_POST['action']) && in_array($_POST['action'], $skip_post))
289
  ) {
inc/cleantalk-common.php CHANGED
@@ -142,7 +142,7 @@ function apbct_base_call($params = array(), $reg_flag = false){
142
  $ct_request->sender_email = !empty($params['sender_email']) ? $params['sender_email'] : null;
143
  $ct_request->sender_nickname = !empty($params['sender_nickname']) ? $params['sender_nickname'] : null;
144
  $ct_request->post_info = isset($params['post_info']) ? json_encode($params['post_info']) : null;
145
- $ct_request->js_on = isset($params['checkjs']) ? $params['checkjs'] : js_test('ct_checkjs', $_COOKIE, true);
146
  $ct_request->agent = APBCT_AGENT;
147
  $ct_request->sender_info = json_encode($sender_info);
148
  $ct_request->submit_time = apbct_get_submit_time();
@@ -241,7 +241,7 @@ function apbct_get_sender_info() {
241
  'key_press_timestamp' => !empty($_COOKIE['ct_fkp_timestamp']) ? $_COOKIE['ct_fkp_timestamp'] : null,
242
  'page_set_timestamp' => !empty($_COOKIE['ct_ps_timestamp']) ? $_COOKIE['ct_ps_timestamp'] : null,
243
  'form_visible_inputs' => !empty($_COOKIE['apbct_visible_fields_count']) ? $_COOKIE['apbct_visible_fields_count'] : null,
244
- 'apbct_visible_fields' => !empty($_COOKIE['apbct_visible_fields']) ? json_decode(stripslashes($_COOKIE['apbct_visible_fields']), true) : null,
245
  // Debug stuff
246
  'amp_detected' => $amp_detected,
247
  );
142
  $ct_request->sender_email = !empty($params['sender_email']) ? $params['sender_email'] : null;
143
  $ct_request->sender_nickname = !empty($params['sender_nickname']) ? $params['sender_nickname'] : null;
144
  $ct_request->post_info = isset($params['post_info']) ? json_encode($params['post_info']) : null;
145
+ $ct_request->js_on = isset($params['checkjs']) ? $params['checkjs'] : apbct_js_test('ct_checkjs', $_COOKIE, true);
146
  $ct_request->agent = APBCT_AGENT;
147
  $ct_request->sender_info = json_encode($sender_info);
148
  $ct_request->submit_time = apbct_get_submit_time();
241
  'key_press_timestamp' => !empty($_COOKIE['ct_fkp_timestamp']) ? $_COOKIE['ct_fkp_timestamp'] : null,
242
  'page_set_timestamp' => !empty($_COOKIE['ct_ps_timestamp']) ? $_COOKIE['ct_ps_timestamp'] : null,
243
  'form_visible_inputs' => !empty($_COOKIE['apbct_visible_fields_count']) ? $_COOKIE['apbct_visible_fields_count'] : null,
244
+ 'apbct_visible_fields' => !empty($_COOKIE['apbct_visible_fields']) ? $_COOKIE['apbct_visible_fields'] : null,
245
  // Debug stuff
246
  'amp_detected' => $amp_detected,
247
  );
inc/cleantalk-public.php CHANGED
@@ -320,9 +320,9 @@ function ct_validate_ccf_submission($value, $field_id, $required){
320
  $post_info['comment_type'] = 'feedback_custom_contact_forms';
321
  $post_info['post_url'] = $_SERVER['HTTP_REFERER'];
322
 
323
- $checkjs = !js_test('ct_checkjs', $_COOKIE, true)
324
- ? js_test('ct_checkjs', $_COOKIE, true)
325
- : js_test('ct_checkjs', $_POST, true);
326
 
327
  //Making a call
328
  $base_call_result = apbct_base_call(
@@ -368,9 +368,9 @@ function ct_woocommerce_wishlist_check($args){
368
  $post_info['comment_type'] = 'feedback';
369
  $post_info['post_url'] = $_SERVER['HTTP_REFERER'];
370
 
371
- $checkjs = !js_test('ct_checkjs', $_COOKIE, true)
372
- ? js_test('ct_checkjs', $_COOKIE, true)
373
- : js_test('ct_checkjs', $_POST, true);
374
 
375
  //Making a call
376
  $base_call_result = apbct_base_call(
@@ -452,9 +452,9 @@ function ct_bp_private_msg_check( $bp_message_obj){
452
  $post_info['comment_type'] = 'buddypress_comment';
453
  $post_info['post_url'] = $_SERVER['HTTP_REFERER'];
454
 
455
- $checkjs = !js_test('ct_checkjs', $_COOKIE, true)
456
- ? js_test('ct_checkjs', $_COOKIE, true)
457
- : js_test('ct_checkjs', $_POST, true);
458
 
459
  //Making a call
460
 
@@ -509,7 +509,7 @@ function ct_pirate_forms_check(){
509
  'sender_email' => $sender_email,
510
  'sender_nickname' => $sender_nickname,
511
  'post_info' => $post_info,
512
- 'checkjs' => js_test('ct_checkjs', $_COOKIE, true),
513
  'sender_info' => array('sender_url' => null),
514
  )
515
  );
@@ -694,9 +694,9 @@ function ct_frm_validate_entry ($errors, $values) {
694
  } unset($value);
695
  $message = array_flip($message);
696
 
697
- $checkjs = !js_test('ct_checkjs', $_COOKIE, true)
698
- ? js_test('ct_checkjs', $_COOKIE, true)
699
- : js_test('ct_checkjs', $_POST, true);
700
 
701
  $base_call_result = apbct_base_call(
702
  array(
@@ -749,9 +749,9 @@ function ct_bbp_new_pre_content ($comment) {
749
  in_array("administrator", $current_user->roles))
750
  return $comment;
751
 
752
- $checkjs = !js_test('ct_checkjs', $_COOKIE, true)
753
- ? js_test('ct_checkjs', $_COOKIE, true)
754
- : js_test('ct_checkjs', $_POST, true);
755
 
756
  $post_info['comment_type'] = 'bbpress_comment';
757
  $post_info['post_url'] = bbp_get_topic_permalink();
@@ -856,9 +856,9 @@ function ct_preprocess_comment($comment) {
856
  // Comment type
857
  $post_info['comment_type'] = empty($post_info['comment_type']) ? 'general_comment' : $post_info['comment_type'];
858
 
859
- $checkjs = !js_test('ct_checkjs', $_COOKIE, true)
860
- ? js_test('ct_checkjs', $_COOKIE, true)
861
- : js_test('ct_checkjs', $_POST, true);
862
 
863
 
864
  $example = null;
@@ -986,7 +986,7 @@ function ct_die_extended($comment_body) {
986
  * Validates JavaScript anti-spam test
987
  *
988
  */
989
- function js_test($field_name = 'ct_checkjs', $data = null, $random_key = false) {
990
  global $ct_options, $ct_data;
991
 
992
  $ct_options = ct_get_options();
@@ -1255,7 +1255,7 @@ function ct_test_message($nickname, $email, $ip, $text){
1255
  'sender_email' => $email,
1256
  'sender_nickname' => $nickname,
1257
  'post_info' => array('comment_type' => 'feedback_plugin_check'),
1258
- 'checkjs' => js_test('ct_checkjs', $_COOKIE, true),
1259
  )
1260
  );
1261
 
@@ -1277,11 +1277,11 @@ function ct_test_registration($nickname, $email, $ip){
1277
 
1278
  $ct_options = ct_get_options();
1279
 
1280
- $checkjs = js_test($ct_checkjs_register_form, $_POST, true);
1281
  $sender_info['post_checkjs_passed'] = $checkjs;
1282
  // This hack can be helpfull when plugin uses with untested themes&signups plugins.
1283
  if (!$checkjs) {
1284
- $checkjs = js_test('ct_checkjs', $_COOKIE, true);
1285
  $sender_info['cookie_checkjs_passed'] = $checkjs;
1286
  }
1287
 
@@ -1363,11 +1363,11 @@ function ct_registration_errors($errors, $sanitized_user_login = null, $user_ema
1363
  return $errors;
1364
  }
1365
 
1366
- $checkjs = js_test($ct_checkjs_register_form, $_POST, true);
1367
  $sender_info['post_checkjs_passed'] = $checkjs;
1368
  // This hack can be helpfull when plugin uses with untested themes&signups plugins.
1369
  if ($checkjs == 0) {
1370
- $checkjs = js_test('ct_checkjs', $_COOKIE, true);
1371
  $sender_info['cookie_checkjs_passed'] = $checkjs;
1372
  }
1373
 
@@ -1521,7 +1521,7 @@ function ct_contact_form_is_spam($form) {
1521
  'sender_nickname' => $sender_nickname,
1522
  'post_info' => array('comment_type' => 'feedback'),
1523
  'sender_info' => array('sender_url' => @$form['comment_author_url']),
1524
- 'checkjs' => js_test($js_field_name, $_POST, true),
1525
  )
1526
  );
1527
  $ct_result = $base_call_result['ct_result'];
@@ -1631,9 +1631,9 @@ function ct_wpcf7_spam($param) {
1631
  return $param;
1632
  }
1633
 
1634
- $checkjs = !js_test('ct_checkjs', $_COOKIE, true)
1635
- ? js_test('ct_checkjs', $_COOKIE, true)
1636
- : js_test($ct_checkjs_cf7, $_POST, true);
1637
 
1638
  $ct_temp_msg_data = ct_get_fields_any($_POST);
1639
 
@@ -1731,7 +1731,7 @@ function ct_si_contact_form_validate($form_errors = array(), $form_id_num = 0) {
1731
  'sender_email' => $sender_email,
1732
  'sender_nickname' => $sender_nickname,
1733
  'post_info' => array('comment_type' => 'feedback'),
1734
- 'checkjs' => js_test('ct_checkjs', $_POST, true),
1735
  )
1736
  );
1737
 
@@ -1831,7 +1831,7 @@ function ct_check_wplp(){
1831
  }
1832
 
1833
  /**
1834
- * Places a hidding field to Gravity.
1835
  * @return string
1836
  */
1837
  function ct_gforms_hidden_field ( $form_string, $form ) {
@@ -1899,9 +1899,9 @@ function ct_gforms_spam_test ($is_spam, $form, $entry) {
1899
  $message['subject'] = $subject;
1900
  }
1901
 
1902
- $checkjs = !js_test('ct_checkjs', $_COOKIE, true)
1903
- ? js_test('ct_checkjs', $_COOKIE, true)
1904
- : js_test('ct_checkjs', $_POST, true);
1905
 
1906
  $base_call_result = apbct_base_call(
1907
  array(
320
  $post_info['comment_type'] = 'feedback_custom_contact_forms';
321
  $post_info['post_url'] = $_SERVER['HTTP_REFERER'];
322
 
323
+ $checkjs = !apbct_js_test('ct_checkjs', $_COOKIE, true)
324
+ ? apbct_js_test('ct_checkjs', $_COOKIE, true)
325
+ : apbct_js_test('ct_checkjs', $_POST, true);
326
 
327
  //Making a call
328
  $base_call_result = apbct_base_call(
368
  $post_info['comment_type'] = 'feedback';
369
  $post_info['post_url'] = $_SERVER['HTTP_REFERER'];
370
 
371
+ $checkjs = !apbct_js_test('ct_checkjs', $_COOKIE, true)
372
+ ? apbct_js_test('ct_checkjs', $_COOKIE, true)
373
+ : apbct_js_test('ct_checkjs', $_POST, true);
374
 
375
  //Making a call
376
  $base_call_result = apbct_base_call(
452
  $post_info['comment_type'] = 'buddypress_comment';
453
  $post_info['post_url'] = $_SERVER['HTTP_REFERER'];
454
 
455
+ $checkjs = !apbct_js_test('ct_checkjs', $_COOKIE, true)
456
+ ? apbct_js_test('ct_checkjs', $_COOKIE, true)
457
+ : apbct_js_test('ct_checkjs', $_POST, true);
458
 
459
  //Making a call
460
 
509
  'sender_email' => $sender_email,
510
  'sender_nickname' => $sender_nickname,
511
  'post_info' => $post_info,
512
+ 'checkjs' => apbct_js_test('ct_checkjs', $_COOKIE, true),
513
  'sender_info' => array('sender_url' => null),
514
  )
515
  );
694
  } unset($value);
695
  $message = array_flip($message);
696
 
697
+ $checkjs = !apbct_js_test('ct_checkjs', $_COOKIE, true)
698
+ ? apbct_js_test('ct_checkjs', $_COOKIE, true)
699
+ : apbct_js_test('ct_checkjs', $_POST, true);
700
 
701
  $base_call_result = apbct_base_call(
702
  array(
749
  in_array("administrator", $current_user->roles))
750
  return $comment;
751
 
752
+ $checkjs = !apbct_js_test('ct_checkjs', $_COOKIE, true)
753
+ ? apbct_js_test('ct_checkjs', $_COOKIE, true)
754
+ : apbct_js_test('ct_checkjs', $_POST, true);
755
 
756
  $post_info['comment_type'] = 'bbpress_comment';
757
  $post_info['post_url'] = bbp_get_topic_permalink();
856
  // Comment type
857
  $post_info['comment_type'] = empty($post_info['comment_type']) ? 'general_comment' : $post_info['comment_type'];
858
 
859
+ $checkjs = !apbct_js_test('ct_checkjs', $_COOKIE, true)
860
+ ? apbct_js_test('ct_checkjs', $_COOKIE, true)
861
+ : apbct_js_test('ct_checkjs', $_POST, true);
862
 
863
 
864
  $example = null;
986
  * Validates JavaScript anti-spam test
987
  *
988
  */
989
+ function apbct_js_test($field_name = 'ct_checkjs', $data = null, $random_key = false) {
990
  global $ct_options, $ct_data;
991
 
992
  $ct_options = ct_get_options();
1255
  'sender_email' => $email,
1256
  'sender_nickname' => $nickname,
1257
  'post_info' => array('comment_type' => 'feedback_plugin_check'),
1258
+ 'checkjs' => apbct_js_test('ct_checkjs', $_COOKIE, true),
1259
  )
1260
  );
1261
 
1277
 
1278
  $ct_options = ct_get_options();
1279
 
1280
+ $checkjs = apbct_js_test($ct_checkjs_register_form, $_POST, true);
1281
  $sender_info['post_checkjs_passed'] = $checkjs;
1282
  // This hack can be helpfull when plugin uses with untested themes&signups plugins.
1283
  if (!$checkjs) {
1284
+ $checkjs = apbct_js_test('ct_checkjs', $_COOKIE, true);
1285
  $sender_info['cookie_checkjs_passed'] = $checkjs;
1286
  }
1287
 
1363
  return $errors;
1364
  }
1365
 
1366
+ $checkjs = apbct_js_test($ct_checkjs_register_form, $_POST, true);
1367
  $sender_info['post_checkjs_passed'] = $checkjs;
1368
  // This hack can be helpfull when plugin uses with untested themes&signups plugins.
1369
  if ($checkjs == 0) {
1370
+ $checkjs = apbct_js_test('ct_checkjs', $_COOKIE, true);
1371
  $sender_info['cookie_checkjs_passed'] = $checkjs;
1372
  }
1373
 
1521
  'sender_nickname' => $sender_nickname,
1522
  'post_info' => array('comment_type' => 'feedback'),
1523
  'sender_info' => array('sender_url' => @$form['comment_author_url']),
1524
+ 'checkjs' => apbct_js_test($js_field_name, $_POST, true),
1525
  )
1526
  );
1527
  $ct_result = $base_call_result['ct_result'];
1631
  return $param;
1632
  }
1633
 
1634
+ $checkjs = !apbct_js_test('ct_checkjs', $_COOKIE, true)
1635
+ ? apbct_js_test('ct_checkjs', $_COOKIE, true)
1636
+ : apbct_js_test($ct_checkjs_cf7, $_POST, true);
1637
 
1638
  $ct_temp_msg_data = ct_get_fields_any($_POST);
1639
 
1731
  'sender_email' => $sender_email,
1732
  'sender_nickname' => $sender_nickname,
1733
  'post_info' => array('comment_type' => 'feedback'),
1734
+ 'checkjs' => apbct_js_test('ct_checkjs', $_POST, true),
1735
  )
1736
  );
1737
 
1831
  }
1832
 
1833
  /**
1834
+ * Places a hidding field to Gravity forms.
1835
  * @return string
1836
  */
1837
  function ct_gforms_hidden_field ( $form_string, $form ) {
1899
  $message['subject'] = $subject;
1900
  }
1901
 
1902
+ $checkjs = apbct_js_test('ct_checkjs', $_POST, true)
1903
+ ? apbct_js_test('ct_checkjs', $_POST, true)
1904
+ : apbct_js_test('ct_checkjs', $_COOKIE, true);
1905
 
1906
  $base_call_result = apbct_base_call(
1907
  array(
inc/cleantalk-widget.php CHANGED
@@ -2,7 +2,6 @@
2
 
3
  class cleantalk_widget extends WP_Widget
4
  {
5
-
6
  function __construct()
7
  {
8
  parent::__construct(
@@ -21,52 +20,80 @@ class cleantalk_widget extends WP_Widget
21
  // This is where the action happens
22
  public function widget( $args, $instance )
23
  {
 
 
 
 
24
  $title = apply_filters( 'widget_title', $instance['title'] );
25
- // before and after widget arguments are defined by themes
26
  echo $args['before_widget'];
27
- if ( ! empty( $title ) )
28
- {
29
- echo $args['before_title'] . $title . $args['after_title'];
30
- }
31
- global $ct_data;
32
- $ct_data=ct_get_data();
33
- if(!isset($ct_data['admin_blocked']))
34
- {
35
- $blocked=0;
36
- }
37
- else
38
- {
39
- $blocked=$ct_data['admin_blocked'];
40
- }
41
  $blocked = number_format($blocked, 0, ',', ' ');
42
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  // This is where you run the code and display the output
44
- ?>
45
- <div style="width:auto;">
46
- <a href="http://cleantalk.org" target="_blank" title="" style="background: #3090C7; background-image: -moz-linear-gradient(0% 100% 90deg,#2060a7,#3090C7); background-image: -webkit-gradient(linear,0% 0,0% 100%,from(#3090C7),to(#2060A7)); border: 1px solid #33eeee; border-radius: 5px; color: #AFCA63; cursor: pointer; display: block; font-weight: normal; height: 100%; -moz-border-radius: 5px; padding: 5px 0 5px; text-align: center; text-decoration: none; -webkit-border-radius: 5px; width: 100%;"><strong style="color: #FFF;display: block;font-size: 15px; line-height: 16px; padding: 0 13px; white-space: nowrap;"><b><?php print $blocked; ?></b> spam</strong> blocked by <strong>CleanTalk</strong></a>
47
- </div>
48
- <?php
 
49
  echo $args['after_widget'];
50
  }
51
 
52
  // Widget Backend
53
  public function form( $instance )
54
  {
55
- if ( isset( $instance[ 'title' ] ) )
56
- {
57
- $title = $instance[ 'title' ];
58
- }
59
- else
60
- {
61
- $title = __( 'Spam blocked', 'cleantalk' );
62
- }
63
  // Widget admin form
64
- ?>
65
- <p>
66
- <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
67
- <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" />
68
- </p>
69
- <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  }
71
 
72
  // Updating widget replacing old instances with new
@@ -74,6 +101,8 @@ class cleantalk_widget extends WP_Widget
74
  {
75
  $instance = array();
76
  $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
 
 
77
  return $instance;
78
  }
79
  } // Class cleantalk_widget ends here
2
 
3
  class cleantalk_widget extends WP_Widget
4
  {
 
5
  function __construct()
6
  {
7
  parent::__construct(
20
  // This is where the action happens
21
  public function widget( $args, $instance )
22
  {
23
+ global $ct_data;
24
+
25
+ $ct_data = ct_get_data();
26
+
27
  $title = apply_filters( 'widget_title', $instance['title'] );
 
28
  echo $args['before_widget'];
29
+
30
+ // Showing title
31
+ if ( ! empty( $title ) ){ echo $args['before_title'] . $title . $args['after_title']; }
32
+
33
+ // Parsing incoming params
34
+ $blocked = isset( $ct_data['admin_blocked'] ) ? $ct_data['admin_blocked'] : 0;
 
 
 
 
 
 
 
 
35
  $blocked = number_format($blocked, 0, ',', ' ');
36
+
37
+ $a_style = 'cursor: pointer; display: block; padding: 5px 0 5px; text-align: center; text-decoration: none; border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; font-weight: normal; height: 100%; width: 100%; ';
38
+ $strong_style = 'display: block; font-size: 15px; line-height: 16px; padding: 0 13px; white-space: nowrap; ';
39
+
40
+ switch($instance['style']){
41
+ case 'cleantalk':
42
+ $a_style .= 'background: #3090C7; background-image: -moz-linear-gradient(0% 100% 90deg,#2060a7,#3090C7); background-image: -webkit-gradient(linear,0% 0,0% 100%,from(#3090C7),to(#2060A7)); border: 1px solid #33eeee; color: #AFCA63;';
43
+ $strong_style .= 'color: #FFF;';
44
+ break;
45
+ case 'light':
46
+ $a_style .= 'background: #fafafa; background-image: -moz-linear-gradient(0% 100% 90deg,#ddd,#fff); background-image: -webkit-gradient(linear,0% 0,0% 100%,from(#fff),to(#ddd)); border: 1px solid #ddd; color: #000;';
47
+ $strong_style .= 'color: #000;';
48
+ break;
49
+ case 'ex_light':
50
+ $a_style .= 'background: #fff; border: 1px solid #ddd; color: #777;';
51
+ $strong_style .= 'color: #555;';
52
+ break;
53
+ case 'dark':
54
+ $a_style .= 'background: #333; background-image: -moz-linear-gradient(0% 100% 90deg,#555,#000); background-image: -webkit-gradient(linear,0% 0,0% 100%,from(#000),to(#555)); border: 1px solid #999; color: #fff;';
55
+ $strong_style .= 'color: #FFF;';
56
+ break;
57
+ }
58
+
59
  // This is where you run the code and display the output
60
+ echo '<div style="width:auto;">'
61
+ .'<a href="http://cleantalk.org'.(!empty($instance['refid']) ? '?pid='.$instance['refid'] : '').'" target="_blank" title="CleanTalk\'s main page" style="'.$a_style.'">'
62
+ .'<strong style="'.$strong_style.'"><b>'.$blocked.'</b> spam</strong> blocked by <strong>CleanTalk</strong>'
63
+ .'</a>'
64
+ .'</div>';
65
+
66
  echo $args['after_widget'];
67
  }
68
 
69
  // Widget Backend
70
  public function form( $instance )
71
  {
 
 
 
 
 
 
 
 
72
  // Widget admin form
73
+
74
+ $title = isset( $instance[ 'title' ] ) ? $instance[ 'title' ] : $title = __( 'Spam blocked', 'cleantalk' );
75
+ $style = isset( $instance[ 'style' ] ) ? $instance[ 'style' ] : $style = 'ct_style';
76
+ $refid = isset( $instance[ 'refid' ] ) ? $instance[ 'refid' ] : $refid = '';
77
+ // Title field
78
+ echo '<p>'
79
+ .'<label for="' . $this->get_field_id( 'title' ) . '">' . __( 'Title:' ) . '</label>'
80
+ .'<input class="widefat" id="'.$this->get_field_id( 'title' ).'" name="'.$this->get_field_name( 'title' ).'" type="text" value="'.esc_attr( $title ).'" />'
81
+ .'</p>';
82
+ // Style
83
+ echo '<p>'
84
+ .'<label for="' . $this->get_field_id( 'style' ) . '">' . __( 'Style:' ) . '</label>'
85
+ .'<select id="'.$this->get_field_id( 'style' ).'" class="widefat" name="'.$this->get_field_name( 'style' ).'">'
86
+ .'<option '.($style == 'cleantalk' ? selected : '').' value="cleantalk">CleanTalk\'s Style</option>'
87
+ .'<option '.($style == 'light' ? selected : '').' value="light">Light</option>'
88
+ .'<option '.($style == 'ex_light' ? selected : '').' value="ex_light">Extremely Light</option>'
89
+ .'<option '.($style == 'dark' ? selected : '').' value="dark">Dark</option>'
90
+ .'</select>'
91
+ .'</p>';
92
+ // Ref ID
93
+ echo '<p>'
94
+ .'<label for="' . $this->get_field_id( 'refid' ) . '">' . __( 'Referal link ID:' ) . '</label>'
95
+ .'<input class="widefat" id="'.$this->get_field_id( 'refid' ).'" name="'.$this->get_field_name( 'refid' ).'" type="text" value="'.$refid.'" />'
96
+ .'</p>';
97
  }
98
 
99
  // Updating widget replacing old instances with new
101
  {
102
  $instance = array();
103
  $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
104
+ $instance['style'] = ( ! empty( $new_instance['style'] ) ) ? strip_tags( $new_instance['style'] ) : '';
105
+ $instance['refid'] = ( ! empty( $new_instance['refid'] ) ) ? strip_tags( $new_instance['refid'] ) : '';
106
  return $instance;
107
  }
108
  } // Class cleantalk_widget ends here
js/apbct-public.js CHANGED
@@ -83,13 +83,15 @@ apbct_attach_event_handler(window, "keydown", ctFunctionFirstKey);
83
  function apbct_ready(){
84
  ctSetCookieSec("apbct_visible_fields", 0);
85
  ctSetCookieSec("apbct_visible_fields_count", 0);
86
- setTimeout(function(){
87
- for(var i=0; i < document.forms.length; i++){
88
  var form = document.forms[i];
89
- form.onsubmit = function(){
90
- var apbct_visible_fields = "";
91
- for(var j=0, elem_count=form.elements.length; j < form.elements.length; j++){
92
- var elem = form.elements[j];
 
 
93
  if( getComputedStyle(elem).display == "none" ||
94
  getComputedStyle(elem).visibility == "hidden" ||
95
  getComputedStyle(elem).width == "0" ||
@@ -98,13 +100,16 @@ function apbct_ready(){
98
  elem.getAttribute("type") == "hidden" ||
99
  elem.getAttribute("type") == "submit"
100
  ){
101
- elem_count--;
102
  }else{
103
- apbct_visible_fields += elem.getAttribute("name") + (typeof form.elements[j+1] === "undefined" ? "" : " ");
104
  }
105
- }
106
- ctSetCookieSec("apbct_visible_fields", apbct_visible_fields);
107
- ctSetCookieSec("apbct_visible_fields_count", elem_count);
 
 
 
108
  }
109
  }
110
  }, 1000);
83
  function apbct_ready(){
84
  ctSetCookieSec("apbct_visible_fields", 0);
85
  ctSetCookieSec("apbct_visible_fields_count", 0);
86
+ setTimeout(function(){
87
+ for(var i = 0; i < document.forms.length; i++){
88
  var form = document.forms[i];
89
+ form.onsubmit_prev = form.onsubmit;
90
+ form.onsubmit = function(event){
91
+ this.visible_fields = '';
92
+ this.visible_fields_count = this.elements.length;
93
+ for(var j = 0; j < this.elements.length; j++){
94
+ var elem = this.elements[j];
95
  if( getComputedStyle(elem).display == "none" ||
96
  getComputedStyle(elem).visibility == "hidden" ||
97
  getComputedStyle(elem).width == "0" ||
100
  elem.getAttribute("type") == "hidden" ||
101
  elem.getAttribute("type") == "submit"
102
  ){
103
+ this.visible_fields_count--;
104
  }else{
105
+ this.visible_fields += (this.visible_fields == "" ? "" : " ") + elem.getAttribute("name");
106
  }
107
+ }
108
+ ctSetCookieSec("apbct_visible_fields", this.visible_fields);
109
+ ctSetCookieSec("apbct_visible_fields_count", this.visible_fields_count);
110
+ if(this.onsubmit_prev instanceof Function){
111
+ this.onsubmit_prev.call(this, event);
112
+ }
113
  }
114
  }
115
  }, 1000);
lib/CleantalkHelper.php CHANGED
@@ -308,29 +308,26 @@ class CleantalkHelper
308
  * @param integer report days
309
  * @return type
310
  */
311
- static public function getAntispamReportBreif($key='')
312
  {
313
 
314
- $url="https://api.cleantalk.org?auth_key=$key";
315
- $request=Array(
316
- 'method_name' => 'get_antispam_report_breif'
 
317
  );
318
- $result = self::sendRawRequest($url,$request);
319
-
320
- if($result === false)
321
- return "Network error. Please, check <a target='_blank' href='https://cleantalk.org/help/faq-setup#hosting'>this article</a>.";
322
-
323
- $result = !empty($result) ? json_decode($result, true) : false;
324
-
325
- if(!empty($result['error_message']))
326
- return $result['error_message'];
327
- else{
328
- $tmp = array();
329
- for($i=0; $i<7; $i++)
330
- $tmp[date("Y-m-d", time()-86400*7+86400*$i)] = 0;
331
- $result['data']['spam_stat'] = array_merge($tmp, $result['data']['spam_stat']);
332
- return $result['data'];
333
- }
334
  }
335
 
336
  static public function sendRawRequest($url,$data,$isJSON=false,$timeout=3)
308
  * @param integer report days
309
  * @return type
310
  */
311
+ static public function getAntispamReportBreif($api_key, $do_check = true)
312
  {
313
 
314
+ $request = array(
315
+ 'agent' => APBCT_AGENT,
316
+ 'method_name' => 'get_antispam_report_breif',
317
+ 'auth_key' => $api_key,
318
  );
319
+
320
+ $result = self::sendRawRequest(self::URL, $request);
321
+ $result = $do_check ? self::checkRequestResult($result, 'get_antispam_report_breif') : $result;
322
+
323
+ $tmp = array();
324
+ for( $i = 0; $i < 7; $i++ )
325
+ $tmp[ date( 'Y-m-d', time() - 86400 * 7 + 86400 * $i ) ] = 0;
326
+
327
+ $result['spam_stat'] = array_merge( $tmp, isset($result['spam_stat']) ? $result['spam_stat'] : array() );
328
+ $result['top5_spam_ip'] = isset($result['top5_spam_ip']) ? $result['top5_spam_ip'] : array();
329
+
330
+ return $result;
 
 
 
 
331
  }
332
 
333
  static public function sendRawRequest($url,$data,$isJSON=false,$timeout=3)
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: znaeff, shagimuratov, sartemd174
3
  Tags: spam, antispam, protection, comments, firewall
4
  Requires at least: 3.0
5
  Tested up to: 4.9.3
6
- Stable tag: 5.88
7
  License: GPLv2
8
 
9
  Spam protection, antispam, all-in-one, premium plugin. No spam comments & users, no spam contact form & WooCommerce spam. Forget spam.
@@ -200,6 +200,14 @@ CleanTalk has an advanced option "SpamFireWall". This option allows you to block
200
 
201
  "CleanTalk team has been developing a cloud spam protection system for five years and has created a truly reliable anti-spam service designed for you to guarantee your safety".
202
 
 
 
 
 
 
 
 
 
203
  = Translations =
204
  * Danish (da_DK)
205
  * French (fr_FR) - thanks to Gilles Santacreu <a href="http://net-ik.net">http://net-ik.net</a>
@@ -496,14 +504,24 @@ We develop plugin to do it as optimized as possible, CleanTalk doesn't downgrade
496
 
497
  == Screenshots ==
498
  1. AntiSpam settings are easy to use.
499
- 1. AntiSpam plugin rejected a spam bot at the CAPTCHA less registration form. The plugin provides explanation to visitor and websites about each rejected comment/registration or contact message.
500
- 1. Use AntiSpam analytics tool for each website in service Dashboard to have information about spam/legitimate stats.
501
- 1. Use AntiSpam log to control anti-spam plugin.
502
- 1. CleanTalk works faster than most of other anti-spam plugins.
503
- 1. The Dashboard with a map of most spam active countries per your account.
504
- 1. The plugin deletes/removes the existing spam comments and users accounts.
 
 
 
505
 
506
  == Changelog ==
 
 
 
 
 
 
 
507
  = 5.88 February 12 2018 =
508
  * Integration: ConvertPro.
509
  * Improvement: Search for visitor's names in request.
@@ -1517,6 +1535,13 @@ We develop plugin to do it as optimized as possible, CleanTalk doesn't downgrade
1517
  * First version
1518
 
1519
  == Upgrade Notice ==
 
 
 
 
 
 
 
1520
  = 5.88 February 12 2018 =
1521
  * Integration: ConvertPro.
1522
  * Improvement: Search for visitor's names in request.
3
  Tags: spam, antispam, protection, comments, firewall
4
  Requires at least: 3.0
5
  Tested up to: 4.9.3
6
+ Stable tag: 5.89
7
  License: GPLv2
8
 
9
  Spam protection, antispam, all-in-one, premium plugin. No spam comments & users, no spam contact form & WooCommerce spam. Forget spam.
200
 
201
  "CleanTalk team has been developing a cloud spam protection system for five years and has created a truly reliable anti-spam service designed for you to guarantee your safety".
202
 
203
+ = Auto-Update CleanTalk Anti-Spam =
204
+
205
+ CleanTalk Dashboard(<a href="https://cleantalk.org/my?cp_mode=antispam">https://cleantalk.org/my?cp_mode=antispam</a>) allows you to set auto-update plugin and select several websites and update the plugin at once on all sites by one click or you can setup auto-update for all websites or separate websites.
206
+
207
+ Note: there is 24 hours delay before auto-update will do. This delay allows needing to avoid any issues. All updates that made through CleanTalk Dashboard manually will do immediately.
208
+
209
+ Auto-updating system will work from CleanTalk Anti-Spam version 5.88
210
+
211
  = Translations =
212
  * Danish (da_DK)
213
  * French (fr_FR) - thanks to Gilles Santacreu <a href="http://net-ik.net">http://net-ik.net</a>
504
 
505
  == Screenshots ==
506
  1. AntiSpam settings are easy to use.
507
+ 2. AntiSpam plugin rejected a spam bot at the CAPTCHA less registration form. The plugin provides explanation to visitor and websites about each rejected comment/registration or contact message.
508
+ 3. Use AntiSpam analytics tool for each website in service Dashboard to have information about spam/legitimate stats.
509
+ 4. Use AntiSpam log to control anti-spam plugin.
510
+ 5. CleanTalk works faster than most of other anti-spam plugins.
511
+ 6. The Dashboard with a map of most spam active countries per your account.
512
+ 7. The plugin deletes/removes the existing spam comments and users accounts.
513
+ 8. CleanTalk's dashboard update link.
514
+ 9. Auto upadte confimation.
515
+ 10. Website's options.
516
 
517
  == Changelog ==
518
+ = 5.89 February 21 2018 =
519
+ * Improved spam filtration quality.
520
+ * Improved compatibility.
521
+ * Public widget: Styles and referral link added.
522
+ * Dashboard widget: revised and fixed.
523
+ * Minor fixes.
524
+
525
  = 5.88 February 12 2018 =
526
  * Integration: ConvertPro.
527
  * Improvement: Search for visitor's names in request.
1535
  * First version
1536
 
1537
  == Upgrade Notice ==
1538
+ = 5.89 February 21 2018 =
1539
+ * Improved spam filtration quality.
1540
+ * Improved compatibility.
1541
+ * Public widget: Styles and referral link added.
1542
+ * Dashboard widget: revised and fixed.
1543
+ * Minor fixes.
1544
+
1545
  = 5.88 February 12 2018 =
1546
  * Integration: ConvertPro.
1547
  * Improvement: Search for visitor's names in request.