WPBruiser {no- Captcha anti-Spam} - Version 3.1.40

Version Description

Fixes - Ajax call javascript error

Download this release

Release Info

Developer mihche
Plugin Icon 128x128 WPBruiser {no- Captcha anti-Spam}
Version 3.1.40
Comparing to
See all releases

Code changes from version 3.1.38 to 3.1.40

assets/public/scripts/gdbc-client-new.js.php CHANGED
@@ -1,33 +1,13 @@
1
  <?php
2
- /*
3
- * Copyright (C) 2018 Mihai Chelaru
4
- *
5
- * This program is free software; you can redistribute it and/or
6
- * modify it under the terms of the GNU General Public License
7
- * as published by the Free Software Foundation; either version 2
8
- * of the License, or (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program; if not, write to the Free Software
17
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
- */
19
 
20
  defined( 'ABSPATH' ) || exit;
21
 
22
- function gdbcRewriteNoCacheHeaders($arrHeaders)
23
- {
24
  $arrHeaders['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
25
  $arrHeaders['Content-Type'] = 'application/javascript; charset=utf-8';
26
 
27
  return $arrHeaders;
28
- }
29
-
30
- add_filter('nocache_headers', 'gdbcRewriteNoCacheHeaders', 1);
31
 
32
  nocache_headers();
33
 
@@ -101,31 +81,62 @@ $hiddenInputName = $settingsModuleInstance->getOption(GdbcSettingsAdminModule::O
101
  requestObj.send(serializeObject(ajaxData));
102
 
103
  requestObj.onreadystatechange = function () {
104
- if (4 === requestObj.readyState && 200 === requestObj.status){
 
105
  try
106
  {
107
  var rs = JSON.parse(requestObj.responseText);
108
- if(rs.data !== 'undefined')
109
- for(var p in rs.data){
110
- if(p=='token'){
111
- formFieldElm.value = rs.data[p];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  }
113
- else {
114
- var value = '', arrValues = rs.data[p].split('|');
115
- for (var i = 0; i < arrValues.length; ++i) {
116
- if (browserInfo.hasOwnProperty(arrValues[i]))
117
- value += browserInfo[arrValues[i]];
118
- }
119
-
120
- var elm = document.createElement("input");elm.name = p;elm.value=value;elm.type='hidden';formElement.appendChild(elm);
121
-
122
- if((' ' + formElement.className + ' ').indexOf(' mailpoet_form ') > -1){
123
- elm.name = 'data[' + p + ']';formFieldElm.name = 'data[' + formFieldElm.name + ']';
124
- }
125
 
 
 
 
 
 
126
  }
127
  }
128
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
129
  }
130
  catch(e){console.log(e.message);}
131
  }
@@ -134,6 +145,8 @@ $hiddenInputName = $settingsModuleInstance->getOption(GdbcSettingsAdminModule::O
134
 
135
  init();
136
 
 
 
137
  function serializeObject(obj) {
138
  var str = [];
139
  for(var p in obj)
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
  defined( 'ABSPATH' ) || exit;
4
 
5
+ add_filter('nocache_headers', function($arrHeaders){
 
6
  $arrHeaders['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
7
  $arrHeaders['Content-Type'] = 'application/javascript; charset=utf-8';
8
 
9
  return $arrHeaders;
10
+ }, 1);
 
 
11
 
12
  nocache_headers();
13
 
81
  requestObj.send(serializeObject(ajaxData));
82
 
83
  requestObj.onreadystatechange = function () {
84
+ if (4 === requestObj.readyState && 200 === requestObj.status)
85
+ {
86
  try
87
  {
88
  var rs = JSON.parse(requestObj.responseText);
89
+ if(rs.data === 'undefined')
90
+ return;
91
+
92
+ var tokens = {};
93
+
94
+ for(var p in rs.data)
95
+ {
96
+ if(p=='token')
97
+ {
98
+ formFieldElm.value = rs.data[p];
99
+ tokens[formFieldElm.name] = null;
100
+ }
101
+ else
102
+ {
103
+ var value = '', arrValues = rs.data[p].split('|');
104
+ for (var i = 0; i < arrValues.length; ++i) {
105
+ if (browserInfo.hasOwnProperty(arrValues[i]))
106
+ value += browserInfo[arrValues[i]];
107
  }
 
 
 
 
 
 
 
 
 
 
 
 
108
 
109
+ var elm = document.createElement("input");elm.name = p;elm.value=value;elm.type='hidden';formElement.appendChild(elm);
110
+ tokens[elm.name] = null;
111
+
112
+ if((' ' + formElement.className + ' ').indexOf(' mailpoet_form ') > -1){
113
+ elm.name = 'data[' + p + ']';formFieldElm.name = 'data[' + formFieldElm.name + ']';
114
  }
115
  }
116
+ }
117
+
118
+ window.jQuery && jQuery.ajaxPrefilter(function( options, originalOptions, jqXHR ) {
119
+
120
+ if(!formElement.querySelector('.nf-element'))
121
+ return;
122
+ console.log(options);console.log(originalOptions);
123
+
124
+ if( !isObject(options) || !isObject(originalOptions) || !('data' in originalOptions) || !isObject(originalOptions.data))
125
+ return;
126
+
127
+ if( !('action' in originalOptions.data) || originalOptions.data.action !== 'nf_ajax_submit')
128
+ return;
129
+
130
+ for(var token in tokens){
131
+ tokens[token] = formElement.querySelector('input[name="'+token+'"]');
132
+ tokens[token] && (tokens[token] = tokens[token].value );
133
+ }
134
+
135
+ options.data = jQuery.param(jQuery.extend(originalOptions.data||{}, tokens));
136
+
137
+ });
138
+
139
+
140
  }
141
  catch(e){console.log(e.message);}
142
  }
145
 
146
  init();
147
 
148
+ function isObject(a) {return (!!a) && (a.constructor === Object);}
149
+
150
  function serializeObject(obj) {
151
  var str = [];
152
  for(var p in obj)
assets/public/scripts/gdbc-client.js.php CHANGED
@@ -1,84 +1,172 @@
1
  <?php
2
- /*
3
- * Copyright (C) 2014 Mihai Chelaru
4
- *
5
- * This program is free software; you can redistribute it and/or
6
- * modify it under the terms of the GNU General Public License
7
- * as published by the Free Software Foundation; either version 2
8
- * of the License, or (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program; if not, write to the Free Software
17
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
- */
19
 
20
  defined( 'ABSPATH' ) || exit;
21
 
22
- function gdbcRewriteNoCacheHeaders($arrHeaders)
23
- {
24
  $arrHeaders['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
25
  $arrHeaders['Content-Type'] = 'application/javascript; charset=utf-8';
26
-
27
  return $arrHeaders;
 
 
 
 
 
 
28
  }
29
 
30
- add_filter('nocache_headers', 'gdbcRewriteNoCacheHeaders', 1);
 
 
 
 
 
 
31
 
32
- nocache_headers();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
 
35
- ?>
36
-
37
- (function($) {
38
- $.GdbcClient = function(el, options) {
39
- var gdbcClient = this, defaults = {};
40
- gdbcClient.settings = {};
41
- var init = function() {
42
- gdbcClient.settings = $.extend({}, defaults, options);
43
- };
44
-
45
- gdbcClient.requestTokens = function() {
46
- $('form input[name=' + Gdbc.formFieldName + ']').each(function(){
47
- requestTokenValue($(this));
48
- });
49
- };
50
-
51
- var requestTokenValue = function(elm) {
52
- var ajaxData = {};
53
-
54
- ajaxData[Gdbc.formFieldName] = '<?php echo GdbcAjaxController::getAjaxNonce(); ?>';
55
- ajaxData['action'] = '<?php echo GdbcAjaxController::ACTION_RETRIEVE_TOKEN ?>';
56
- ajaxData['requestTime'] = (new Date()).getTime();
57
- ajaxData['browserInfo'] = JSON.stringify(Gdbc.browserInfo);
58
- $.ajax({
59
- type : "post",
60
- cache: false,
61
- dataType : "json",
62
- url : Gdbc.ajaxUrl + '?t=' + ajaxData['requestTime'],
63
- data : ajaxData,
64
- success: function(response){
65
- $.each(response.data, function(prop, val){
66
- if(prop === 'token'){
67
- elm.val(val);return;
68
- }
69
-
70
- var value = '', arrValues = val.split('|');
71
- for(var i=0; i<arrValues.length; ++i) {
72
- if (Gdbc.browserInfo.hasOwnProperty(arrValues[i]))
73
- value += Gdbc.browserInfo[arrValues[i]];
74
- }
75
- $('<input>').prop({type:'hidden',name:prop,value:value}).appendTo(elm.closest('form'));
76
- });
77
- }
78
- });
79
- };
80
- init();
81
- }
82
- })(jQuery);
83
-
84
- jQuery(document).ready(function($){(new $.GdbcClient()).requestTokens();});
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
  defined( 'ABSPATH' ) || exit;
4
 
5
+ add_filter('nocache_headers', function($arrHeaders){
 
6
  $arrHeaders['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
7
  $arrHeaders['Content-Type'] = 'application/javascript; charset=utf-8';
8
+
9
  return $arrHeaders;
10
+ }, 1);
11
+
12
+ nocache_headers();
13
+
14
+ if(null === ($settingsModuleInstance = GdbcModulesController::getPublicModuleInstance(GdbcModulesController::MODULE_SETTINGS))){
15
+ exit;
16
  }
17
 
18
+ $arrPlaceHolders = array(
19
+ '__INPUT_NAME__' => $settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_HIDDEN_INPUT_NAME),
20
+ '__AJAX_URL__' => MchGdbcWpUtils::getAjaxUrl(),
21
+ '__AJAX_NONCE__' => GdbcAjaxController::getAjaxNonce(),
22
+ '__AJAX_ACTION__' => GdbcAjaxController::ACTION_RETRIEVE_TOKEN,
23
+
24
+ );
25
 
26
+ $scriptOutput = <<<Output
27
+ (function() {'use strict';
28
+ if (!Array.isArray){Array.isArray = function(arg){return Object.prototype.toString.call(arg) === '[object Array]';};}
29
+ if (!String.prototype.trim){String.prototype.trim = function () {return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');};}
30
+
31
+ var WPBruiserClient = function(){
32
+ var browserInfo = new Array();
33
+ function init(){
34
+ var w=window,d=document,e=0,f=0;e|=w.ActiveXObject?1:0;e|=w.opera?2:0;e|=w.chrome?4:0;
35
+ e|='getBoxObjectFor' in d || 'mozInnerScreenX' in w?8:0;e|=('WebKitCSSMatrix' in w||'WebKitPoint' in w||'webkitStorageInfo' in w||'webkitURL' in w)?16:0;
36
+ e|=(e&16&&({}.toString).toString().indexOf("\\n")===-1)?32:0;f|='sandbox' in d.createElement('iframe')?1:0;f|='WebSocket' in w?2:0;
37
+ f|=w.Worker?4:0;f|=w.applicationCache?8:0;f|=w.history && history.pushState?16:0;f|=d.documentElement.webkitRequestFullScreen?32:0;f|='FileReader' in w?64:0;
38
+
39
+ var ua = navigator.userAgent.toLowerCase();
40
+ var regex = /compatible; ([\w.+]+)[ \/]([\w.+]*)|([\w .+]+)[: \/]([\w.+]+)|([\w.+]+)/g;
41
+ var match = regex.exec(ua);
42
+ browserInfo = {screenWidth:screen.width,screenHeight:screen.height,engine:e,features:f};
43
+ while (match !== null) {
44
+ var prop = {};
45
+ if (match[1]) {
46
+ prop.type = match[1];
47
+ prop.version = match[2];
48
+ } else if (match[3]) {
49
+ prop.type = match[3];
50
+ prop.version = match[4];
51
+ } else {
52
+ prop.type = match[5];
53
+ }
54
+ prop.type = (prop.type).trim().replace('.','').replace(' ','_');
55
+ var value = prop.version ? prop.version : true;
56
+ if (browserInfo[prop.type]) {
57
+ !Array.isArray(browserInfo[prop.type])?browserInfo[prop.type]=new Array(browserInfo[prop.type]):'';
58
+ browserInfo[prop.type].push(value);
59
+ }
60
+ else browserInfo[prop.type] = value;
61
+ match = regex.exec(ua);
62
+ }
63
+ };
64
+
65
+
66
+ var requestTokens = function(){for(var i = 0; i < document.forms.length; ++i){retrieveToken(document.forms[i]);}};
67
+
68
+ function retrieveToken(formElement){
69
+
70
+ var requestObj = (window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"));
71
+
72
+ var formFieldElm = formElement.querySelector('input[name="__INPUT_NAME__"]');
73
+ if(!requestObj || !formFieldElm) return;
74
+ var ajaxData = [];
75
+
76
+ ajaxData['__INPUT_NAME__'] = '__AJAX_NONCE__';
77
+ ajaxData['action'] = '__AJAX_ACTION__';
78
+ ajaxData['requestTime'] = (new Date()).getTime();
79
+ ajaxData['browserInfo'] = JSON.stringify(browserInfo);
80
+
81
+ requestObj.open('POST', '__AJAX_URL__', true);
82
+ requestObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
83
+ requestObj.setRequestHeader("X-Requested-With", "XMLHttpRequest");
84
+ requestObj.setRequestHeader('Accept',"application/json, text/javascript, */*; q=0.01");
85
+ requestObj.send(serializeObject(ajaxData));
86
+
87
+ requestObj.onreadystatechange = function () {
88
+ if (4 === requestObj.readyState && 200 === requestObj.status)
89
+ {
90
+ try
91
+ {
92
+ var rs = JSON.parse(requestObj.responseText);
93
+ if(rs.data === 'undefined')
94
+ return;
95
+
96
+ var tokens = {};
97
+
98
+ for(var p in rs.data)
99
+ {
100
+ if(p=='token')
101
+ {
102
+ formFieldElm.value = rs.data[p];
103
+ tokens[formFieldElm.name] = null;
104
+ }
105
+ else
106
+ {
107
+ var value = '', arrValues = rs.data[p].split('|');
108
+ for (var i = 0; i < arrValues.length; ++i) {
109
+ if (browserInfo.hasOwnProperty(arrValues[i]))
110
+ value += browserInfo[arrValues[i]];
111
+ }
112
+
113
+ var elm = document.createElement("input");elm.name = p;elm.value=value;elm.type='hidden';formElement.appendChild(elm);
114
+ tokens[elm.name] = null;
115
+
116
+ if((' ' + formElement.className + ' ').indexOf(' mailpoet_form ') > -1){
117
+ elm.name = 'data[' + p + ']';formFieldElm.name = 'data[' + formFieldElm.name + ']';
118
+ }
119
+ }
120
+ }
121
+
122
+ window.jQuery && jQuery.ajaxPrefilter(function( options, originalOptions, jqXHR ) {
123
+
124
+ if( ! ('action' in originalOptions.data) || originalOptions.data.action !== 'nf_ajax_submit')
125
+ return;
126
+
127
+ for(var token in tokens){
128
+ tokens[token] = formElement.querySelector('input[name="'+token+'"]');
129
+ tokens[token] && (tokens[token] = tokens[token].value );
130
+ }
131
+
132
+ options.data = jQuery.param(jQuery.extend(originalOptions.data||{}, tokens));
133
+
134
+ });
135
+
136
+
137
+
138
+ }
139
+ catch(e){console.log(e.message);}
140
+ }
141
+ }
142
+ }
143
+
144
+ init();
145
+
146
+ function serializeObject(obj) {
147
+ var str = [];
148
+ for(var p in obj)
149
+ if (obj.hasOwnProperty(p)) {
150
+ str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
151
+ }
152
+ return str.join("&");
153
+ }
154
+ return {requestTokens : requestTokens};
155
+ }
156
+
157
+ window.WPBruiserClient = new WPBruiserClient();window.WPBruiserClient.requestTokens();
158
+
159
+ })();
160
+ Output;
161
+
162
+
163
+ /**
164
+ * compressed javascript https://jscompress.com/
165
+ */
166
+ //$scriptOutput = <<<Output
167
+ //!function(){"use strict";Array.isArray||(Array.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")});window.WPBruiserClient=new function(){var p=new Array;function t(s){var c=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP"),u=s.querySelector('input[name="__INPUT_NAME__"]');if(c&&u){var e=[];e['__INPUT_NAME__']="__AJAX_NONCE__",e.action="__AJAX_ACTION__",e.requestTime=(new Date).getTime(),e.browserInfo=JSON.stringify(p),c.open("POST","__AJAX_URL__",!0),c.setRequestHeader("Content-type","application/x-www-form-urlencoded; charset=UTF-8"),c.setRequestHeader("X-Requested-With","XMLHttpRequest"),c.setRequestHeader("Accept","application/json, text/javascript, */*; q=0.01"),c.send(function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.join("&")}(e)),c.onreadystatechange=function(){if(4===c.readyState&&200===c.status)try{var e=JSON.parse(c.responseText);if("undefined"===e.data)return;var a={};for(var t in e.data)if("token"==t)u.value=e.data[t],a[u.name]=null;else{for(var n="",r=e.data[t].split("|"),i=0;i<r.length;++i)p.hasOwnProperty(r[i])&&(n+=p[r[i]]);var o=document.createElement("input");o.name=t,o.value=n,o.type="hidden",s.appendChild(o),a[o.name]=null,-1<(" "+s.className+" ").indexOf(" mailpoet_form ")&&(o.name="data["+t+"]",u.name="data["+u.name+"]")}window.jQuery&&jQuery.ajaxPrefilter(function(e,t,n){if("action"in t.data&&"nf_ajax_submit"===t.data.action){for(var r in a)a[r]=s.querySelector('input[name="'+r+'"]'),a[r]&&(a[r]=a[r].value);e.data=jQuery.param(jQuery.extend(t.data||{},a))}})}catch(e){console.log(e.message)}}}}return function(){var e=window,t=document,n=0,r=0;n|=e.ActiveXObject?1:0,n|=e.opera?2:0,n|=e.chrome?4:0,n|="getBoxObjectFor"in t||"mozInnerScreenX"in e?8:0,n|="WebKitCSSMatrix"in e||"WebKitPoint"in e||"webkitStorageInfo"in e||"webkitURL"in e?16:0,n|=16&n&&-1==={}.toString.toString().indexOf("\\n")?32:0,r|="sandbox"in t.createElement("iframe")?1:0,r|="WebSocket"in e?2:0,r|=e.Worker?4:0,r|=e.applicationCache?8:0,r|=e.history&&history.pushState?16:0,r|=t.documentElement.webkitRequestFullScreen?32:0,r|="FileReader"in e?64:0;var a=navigator.userAgent.toLowerCase(),i=/compatible; ([\w.+]+)[ \/]([\w.+]*)|([\w .+]+)[: \/]([\w.+]+)|([\w.+]+)/g,o=i.exec(a);for(p={screenWidth:screen.width,screenHeight:screen.height,engine:n,features:r};null!==o;){var s={};o[1]?(s.type=o[1],s.version=o[2]):o[3]?(s.type=o[3],s.version=o[4]):s.type=o[5],s.type=s.type.trim().replace(".","").replace(" ","_");var c=!s.version||s.version;p[s.type]?(Array.isArray(p[s.type])||(p[s.type]=new Array(p[s.type])),p[s.type].push(c)):p[s.type]=c,o=i.exec(a)}}(),{requestTokens:function(){for(var e=0;e<document.forms.length;++e)t(document.forms[e])}}},window.WPBruiserClient.requestTokens()}();
168
+ //Output;
169
+
170
+ echo str_replace(array_keys($arrPlaceHolders), $arrPlaceHolders, $scriptOutput);
171
 
172
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
goodbye-captcha.php CHANGED
@@ -10,7 +10,7 @@
10
  * Plugin Name: WPBruiser
11
  * Plugin URI: http://www.wpbruiser.com
12
  * Description: An extremely powerful anti-spam plugin that blocks spambots without annoying captcha images.
13
- * Version: 3.1.38
14
  * Author: Mihai Chelaru
15
  * Author URI: http://www.wpbruiser.com
16
  * Text Domain: wp-bruiser
@@ -18,13 +18,12 @@
18
  */
19
 
20
 
21
-
22
  if(!class_exists('GoodByeCaptcha', false))
23
  {
24
  class GoodByeCaptcha
25
  {
26
 
27
- CONST PLUGIN_VERSION = '3.1.38';
28
  CONST PLUGIN_SLUG = 'wp-bruiser';
29
  CONST PLUGIN_NAME = 'WPBruiser';
30
  CONST PLUGIN_SITE_URL = 'https://www.wpbruiser.com';
10
  * Plugin Name: WPBruiser
11
  * Plugin URI: http://www.wpbruiser.com
12
  * Description: An extremely powerful anti-spam plugin that blocks spambots without annoying captcha images.
13
+ * Version: 3.1.40
14
  * Author: Mihai Chelaru
15
  * Author URI: http://www.wpbruiser.com
16
  * Text Domain: wp-bruiser
18
  */
19
 
20
 
 
21
  if(!class_exists('GoodByeCaptcha', false))
22
  {
23
  class GoodByeCaptcha
24
  {
25
 
26
+ CONST PLUGIN_VERSION = '3.1.40';
27
  CONST PLUGIN_SLUG = 'wp-bruiser';
28
  CONST PLUGIN_NAME = 'WPBruiser';
29
  CONST PLUGIN_SITE_URL = 'https://www.wpbruiser.com';
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_i
4
  Tags: captcha, antispam, anti-spam, spam, mailpoet, antispambot, brute force, comment spam, jetpack contact form, contact form 7, ninja forms, formidable forms, wp bruiser
5
  Requires at least: 4.0
6
  Tested up to: 5.4
7
- Stable tag: 3.1.38
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -222,6 +222,16 @@ Studies shown that visual CAPTCHAs take around 5-10 seconds to complete and audi
222
 
223
  == Changelog ==
224
 
 
 
 
 
 
 
 
 
 
 
225
  = 3.1.38 =
226
  **Fixes**
227
  - Compatibility with Mailchimp for WordPress
4
  Tags: captcha, antispam, anti-spam, spam, mailpoet, antispambot, brute force, comment spam, jetpack contact form, contact form 7, ninja forms, formidable forms, wp bruiser
5
  Requires at least: 4.0
6
  Tested up to: 5.4
7
+ Stable tag: 3.1.40
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
222
 
223
  == Changelog ==
224
 
225
+ = 3.1.40 =
226
+ **Fixes**
227
+ - Ajax call javascript error
228
+
229
+ = 3.1.39 =
230
+ - Refreshed Country IPs
231
+ - Refreshed WebAttackers IPs
232
+ - Refreshed Proxy IPs
233
+ - Refreshed Incapsula, Amazon and Cloudflare trusted IPs ranges
234
+
235
  = 3.1.38 =
236
  **Fixes**
237
  - Compatibility with Mailchimp for WordPress