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

Version Description

Fixes - Compatibility with MailChimp for WP version 4.0.4 and up.

Download this release

Release Info

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

Code changes from version 3.0.15 to 3.1.1

engine/GdbcModulesController.php CHANGED
@@ -452,7 +452,7 @@ final class GdbcModulesController
452
  case self::MODULE_GRAVITY_FORMS : return 'Gravity Forms';
453
  case self::MODULE_JETPACK_CONTACT_FORM : return 'Jetpack Contact Form';
454
  case self::MODULE_MAIL_CHIMP_FOR_WP : return 'MailChimp for WP';
455
- case self::MODULE_MAIL_POET : return 'Mail Poet';
456
  case self::MODULE_NINJA_FORMS : return 'Ninja Forms';
457
  case self::MODULE_PLANSO_FORMS : return 'Planso Forms';
458
  case self::MODULE_SEAMLESS_DONATIONS : return 'Seamless Donations';
452
  case self::MODULE_GRAVITY_FORMS : return 'Gravity Forms';
453
  case self::MODULE_JETPACK_CONTACT_FORM : return 'Jetpack Contact Form';
454
  case self::MODULE_MAIL_CHIMP_FOR_WP : return 'MailChimp for WP';
455
+ case self::MODULE_MAIL_POET : return 'MailPoet';
456
  case self::MODULE_NINJA_FORMS : return 'Ninja Forms';
457
  case self::MODULE_PLANSO_FORMS : return 'Planso Forms';
458
  case self::MODULE_SEAMLESS_DONATIONS : return 'Seamless Donations';
engine/modules/mc-for-wp/GdbcMailChimpForWpPublicModule.php CHANGED
@@ -26,7 +26,8 @@ class GdbcMailChimpForWpPublicModule extends GdbcBasePublicModule
26
 
27
  parent::__construct();
28
 
29
- if(!GoodByeCaptchaUtils::isMailChimpForWPActivated())
 
30
  return;
31
 
32
  add_filter('mc4wp_form_before_fields', array($this, 'getTokenFieldHtml'));
@@ -41,71 +42,73 @@ class GdbcMailChimpForWpPublicModule extends GdbcBasePublicModule
41
 
42
  public function validateSubscriptionRequest($arrErrors, $mcForm)
43
  {
44
- if( ! is_a($mcForm, 'MC4WP_Form') )
45
  return $arrErrors;
46
 
47
  !is_array($arrErrors) ? $arrErrors = array() : null;
48
 
49
- $arrFormProperties = get_object_vars($mcForm);
50
- if( !isset($arrFormProperties['data']) || empty($mcForm->data))
51
- return $arrErrors;
 
 
 
52
 
53
  $arrCapturedData = array();
54
- foreach((array)$mcForm->data as $fieldName => $fieldValue)
55
  {
56
  if(is_scalar($fieldValue))
57
  {
58
  $arrCapturedData[$fieldName] = $fieldValue;
59
  continue;
60
  }
61
- if(strtolower($fieldName) === 'address')
62
- {
63
- if(is_array($fieldValue))
64
- {
65
- $fieldValue = array_merge(array('addr1' => '','city' => '','state' => '', 'zip' => ''), $fieldValue );
66
- }
67
- elseif(is_string($fieldValue))
68
- {
69
- $arrAddress = explode(',', $fieldValue);
70
- $fieldValue = array(
71
- 'addr1' => isset($arrAddress[0]) ? $arrAddress[0] : null,
72
- 'city' => isset($arrAddress[1]) ? $arrAddress[1] : null,
73
- 'state' => isset($arrAddress[2]) ? $arrAddress[2] : null,
74
- 'zip' => isset($arrAddress[3]) ? $arrAddress[3] : null,
75
- );
76
- $fieldValue = array_filter($fieldValue);
77
- }
78
-
79
- $arrCapturedData[$fieldName] = (array)$fieldValue;
80
- continue;
81
- }
82
-
83
- if(strtolower($fieldName) === 'groupings' && is_array($fieldValue))
84
- {
85
- foreach($fieldValue as $groupId => &$groupData)
86
- {
87
- if(!is_string($groupData))
88
- continue;
89
-
90
- $groupData = explode(',', sanitize_text_field($groupData));
91
- }
92
-
93
- $arrCapturedData[$fieldName] = (array)$fieldValue;
94
- }
95
  }
96
 
97
  $this->getAttemptEntity()->Notes = $arrCapturedData;
98
 
99
- if( ! GdbcRequestController::isValid($this->getAttemptEntity()) )
100
  $arrErrors[] = 'spam';
 
101
 
102
  return $arrErrors;
103
 
104
  }
105
 
106
 
107
-
108
-
109
  public function validateOldSubscriptionRequest($isRequestValid, $submittedData)
110
  {
111
  $submittedData = array_change_key_case((array)$submittedData, CASE_UPPER);
@@ -127,6 +130,7 @@ class GdbcMailChimpForWpPublicModule extends GdbcBasePublicModule
127
  $arrCapturedData[$fieldName] = $fieldValue;
128
  continue;
129
  }
 
130
  if(strtolower($fieldName) === 'address')
131
  {
132
  if(is_array($fieldValue))
@@ -165,7 +169,7 @@ class GdbcMailChimpForWpPublicModule extends GdbcBasePublicModule
165
 
166
  $this->getAttemptEntity()->Notes = $arrCapturedData;
167
 
168
- return GdbcRequestController::isValid($this->getAttemptEntity());
169
 
170
  }
171
 
26
 
27
  parent::__construct();
28
 
29
+ //!GoodByeCaptchaUtils::isMailChimpForWPActivated() ||
30
+ if(!$this->getOption(GdbcMailChimpForWpAdminModule::OPTION_MODULE_MAIL_CHIMP_FOR_WP))
31
  return;
32
 
33
  add_filter('mc4wp_form_before_fields', array($this, 'getTokenFieldHtml'));
42
 
43
  public function validateSubscriptionRequest($arrErrors, $mcForm)
44
  {
45
+ if( ! is_object($mcForm) )
46
  return $arrErrors;
47
 
48
  !is_array($arrErrors) ? $arrErrors = array() : null;
49
 
50
+ $mcForm->submittedData = !empty($mcForm->data) ? $mcForm->data : array();
51
+
52
+ if(empty($mcForm->submittedData)){
53
+ $mcForm->submittedData = @$mcForm->get_data();
54
+ }
55
+
56
 
57
  $arrCapturedData = array();
58
+ foreach((array)$mcForm->submittedData as $fieldName => $fieldValue)
59
  {
60
  if(is_scalar($fieldValue))
61
  {
62
  $arrCapturedData[$fieldName] = $fieldValue;
63
  continue;
64
  }
65
+ // if(strtolower($fieldName) === 'address')
66
+ // {
67
+ // if(is_array($fieldValue))
68
+ // {
69
+ // $fieldValue = array_merge(array('addr1' => '','city' => '','state' => '', 'zip' => ''), $fieldValue );
70
+ // }
71
+ // elseif(is_string($fieldValue))
72
+ // {
73
+ // $arrAddress = explode(',', $fieldValue);
74
+ // $fieldValue = array(
75
+ // 'addr1' => isset($arrAddress[0]) ? $arrAddress[0] : null,
76
+ // 'city' => isset($arrAddress[1]) ? $arrAddress[1] : null,
77
+ // 'state' => isset($arrAddress[2]) ? $arrAddress[2] : null,
78
+ // 'zip' => isset($arrAddress[3]) ? $arrAddress[3] : null,
79
+ // );
80
+ // $fieldValue = array_filter($fieldValue);
81
+ // }
82
+ //
83
+ // $arrCapturedData[$fieldName] = (array)$fieldValue;
84
+ // continue;
85
+ // }
86
+ //
87
+ // if(strtoupper($fieldName) === 'INTERESTS' && is_array($fieldValue))
88
+ // {
89
+ // foreach($fieldValue as $groupId => &$groupData)
90
+ // {
91
+ // if(!is_string($groupData))
92
+ // continue;
93
+ //
94
+ // $groupData = explode(',', sanitize_text_field($groupData));
95
+ // }
96
+ //
97
+ // $arrCapturedData[$fieldName] = (array)$fieldValue;
98
+ // }
99
  }
100
 
101
  $this->getAttemptEntity()->Notes = $arrCapturedData;
102
 
103
+ if( ! GdbcRequestController::isValid($this->getAttemptEntity()) ) {
104
  $arrErrors[] = 'spam';
105
+ }
106
 
107
  return $arrErrors;
108
 
109
  }
110
 
111
 
 
 
112
  public function validateOldSubscriptionRequest($isRequestValid, $submittedData)
113
  {
114
  $submittedData = array_change_key_case((array)$submittedData, CASE_UPPER);
130
  $arrCapturedData[$fieldName] = $fieldValue;
131
  continue;
132
  }
133
+
134
  if(strtolower($fieldName) === 'address')
135
  {
136
  if(is_array($fieldValue))
169
 
170
  $this->getAttemptEntity()->Notes = $arrCapturedData;
171
 
172
+ return GdbcRequestController::isValid($this->getAttemptEntity()) ? array() : 'spam';
173
 
174
  }
175
 
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.0.15
14
  * Author: Mihai Chelaru
15
  * Author URI: http://www.wpbruiser.com
16
  * Text Domain: wp-bruiser
@@ -23,7 +23,7 @@ if(!class_exists('GoodByeCaptcha', false))
23
  {
24
  class GoodByeCaptcha
25
  {
26
- CONST PLUGIN_VERSION = '3.0.15';
27
  CONST PLUGIN_SLUG = 'wp-bruiser';
28
  CONST PLUGIN_NAME = 'WPBruiser';
29
  CONST PLUGIN_SITE_URL = 'http://www.wpbruiser.com';
@@ -69,6 +69,7 @@ if(!class_exists('GoodByeCaptcha', false))
69
 
70
  public static function startRunning()
71
  {
 
72
  GdbcUpdatesController::updateToCurrentVersion();
73
 
74
  $arrPluginInfo = array(
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.1
14
  * Author: Mihai Chelaru
15
  * Author URI: http://www.wpbruiser.com
16
  * Text Domain: wp-bruiser
23
  {
24
  class GoodByeCaptcha
25
  {
26
+ CONST PLUGIN_VERSION = '3.1.1';
27
  CONST PLUGIN_SLUG = 'wp-bruiser';
28
  CONST PLUGIN_NAME = 'WPBruiser';
29
  CONST PLUGIN_SITE_URL = 'http://www.wpbruiser.com';
69
 
70
  public static function startRunning()
71
  {
72
+
73
  GdbcUpdatesController::updateToCurrentVersion();
74
 
75
  $arrPluginInfo = array(
includes/utils/MchGdbcWpUtils.php CHANGED
@@ -145,6 +145,22 @@ final class MchGdbcWpUtils
145
 
146
  public static function getAjaxUrl()
147
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
  $ajaxUrl = admin_url('admin-ajax.php', self::isSslRequest() ? 'admin' : 'http');
149
 
150
  if(0 === strpos(self::getCurrentPageUrl(), 'https') && 0 !== strpos($ajaxUrl, 'https'))
145
 
146
  public static function getAjaxUrl()
147
  {
148
+
149
+ if( defined('SUNRISE_LOADED') && !function_exists('dm_redirect_admin')){ //&& MchGdbcWpUtils::isPluginNetworkActivated('/wordpress-mu-domain-mapping/domain_mapping.php')
150
+ foreach(wp_get_active_network_plugins() as $pluginName)
151
+ {
152
+ if(false === strpos($pluginName, '/domain_mapping.php'))
153
+ continue;
154
+
155
+ wp_register_plugin_realpath( $pluginName );
156
+
157
+ include_once( $pluginName );
158
+ break;
159
+ }
160
+
161
+ }
162
+
163
+
164
  $ajaxUrl = admin_url('admin-ajax.php', self::isSslRequest() ? 'admin' : 'http');
165
 
166
  if(0 === strpos(self::getCurrentPageUrl(), 'https') && 0 !== strpos($ajaxUrl, 'https'))
includes/vendor/MchHttp/MchGdbcIpCountryLocator.php CHANGED
@@ -26,13 +26,13 @@ class MchGdbcIpCountryLocator
26
 
27
  $dataFilePath = null;
28
 
29
- if(16777216 <= $ipNumber && $ipNumber <= 1410337738)
30
  $dataFilePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'country-ips' . DIRECTORY_SEPARATOR . 'ipv4' . DIRECTORY_SEPARATOR . 'country-ipv4-0.dat';
31
- elseif(1410337739 <= $ipNumber && $ipNumber <= 2647523327)
32
  $dataFilePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'country-ips' . DIRECTORY_SEPARATOR . 'ipv4' . DIRECTORY_SEPARATOR . 'country-ipv4-1.dat';
33
- elseif(2647523328 <= $ipNumber && $ipNumber <= 3486610431)
34
  $dataFilePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'country-ips' . DIRECTORY_SEPARATOR . 'ipv4' . DIRECTORY_SEPARATOR . 'country-ipv4-2.dat';
35
- elseif(3486610432 <= $ipNumber && $ipNumber <= 3758096383)
36
  $dataFilePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'country-ips' . DIRECTORY_SEPARATOR . 'ipv4' . DIRECTORY_SEPARATOR . 'country-ipv4-3.dat';
37
 
38
  if(null === $dataFilePath)
@@ -94,7 +94,7 @@ class MchGdbcIpCountryLocator
94
 
95
  $dataFilePath = null;
96
 
97
- if(MchGdbcIPUtils::ipAddressToBinary('::ffff:5.8.62.0', MchGdbcIPUtils::IP_VERSION_6) <= $ipBinary && $ipBinary <= MchGdbcIPUtils::ipAddressToBinary('2c0f:ffff:ffff:ffff:ffff:ffff:ffff:ffff', MchGdbcIPUtils::IP_VERSION_6))
98
  $dataFilePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'country-ips' . DIRECTORY_SEPARATOR . 'ipv6' . DIRECTORY_SEPARATOR . 'country-ipv6-0.dat';
99
 
100
  if(null === $dataFilePath)
26
 
27
  $dataFilePath = null;
28
 
29
+ if(16777216 <= $ipNumber && $ipNumber <= 1357878193)
30
  $dataFilePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'country-ips' . DIRECTORY_SEPARATOR . 'ipv4' . DIRECTORY_SEPARATOR . 'country-ipv4-0.dat';
31
+ elseif(1357878194 <= $ipNumber && $ipNumber <= 2585330456)
32
  $dataFilePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'country-ips' . DIRECTORY_SEPARATOR . 'ipv4' . DIRECTORY_SEPARATOR . 'country-ipv4-1.dat';
33
+ elseif(2585330457 <= $ipNumber && $ipNumber <= 3389308927)
34
  $dataFilePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'country-ips' . DIRECTORY_SEPARATOR . 'ipv4' . DIRECTORY_SEPARATOR . 'country-ipv4-2.dat';
35
+ elseif(3389308928 <= $ipNumber && $ipNumber <= 3758096383)
36
  $dataFilePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'country-ips' . DIRECTORY_SEPARATOR . 'ipv4' . DIRECTORY_SEPARATOR . 'country-ipv4-3.dat';
37
 
38
  if(null === $dataFilePath)
94
 
95
  $dataFilePath = null;
96
 
97
+ if(MchGdbcIPUtils::ipAddressToBinary('2001:200::', MchGdbcIPUtils::IP_VERSION_6) <= $ipBinary && $ipBinary <= MchGdbcIPUtils::ipAddressToBinary('2c0f:fff0:ffff:ffff:ffff:ffff:ffff:ffff', MchGdbcIPUtils::IP_VERSION_6))
98
  $dataFilePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'country-ips' . DIRECTORY_SEPARATOR . 'ipv6' . DIRECTORY_SEPARATOR . 'country-ipv6-0.dat';
99
 
100
  if(null === $dataFilePath)
includes/vendor/MchHttp/MchGdbcTrustedIPRanges.php CHANGED
@@ -11,7 +11,7 @@ final class MchGdbcTrustedIPRanges
11
  ?
12
  self::isIPInRanges($ipAddress, $ipVersion, array(1729491968=>1729492991,1729546240=>1729547263,1730085888=>1730086911,1745879040=>1746927615,1822605312=>1822621695,2197833728=>2197834751,2372222976=>2372239359,2728263680=>2728394751,2889875456=>2890399743,2918526976=>2918531071,3161612288=>3161616383,3193827328=>3193831423,3320508416=>3320509439,3324608512=>3324641279,3340468224=>3340470271,))
13
  :
14
- self::isIPInRanges($ipAddress, $ipVersion, array('2400:cb00::/32'=>1,'2405:8100::/32'=>1,'2405:b500::/32'=>1,'2606:4700::/32'=>1,'2803:f800::/32'=>1,));
15
 
16
  }
17
 
@@ -42,7 +42,7 @@ final class MchGdbcTrustedIPRanges
42
 
43
  return ( $ipVersion === MchGdbcIPUtils::IP_VERSION_4 )
44
  ?
45
- self::isIPInRanges($ipAddress, $ipVersion, array(877920256=>878051327,917897216=>917962751,918552576=>918618111,921042944=>921108479,921665536=>921690111,921731072=>921747455,3438715904=>3438717951,3438718464=>3438723071,3455827968=>3455836159,3455842560=>3455844095,3632865280=>3632873471,))
46
  :
47
  self::isIPInRanges($ipAddress, $ipVersion, array());
48
 
@@ -53,7 +53,7 @@ final class MchGdbcTrustedIPRanges
53
 
54
  return ( $ipVersion === MchGdbcIPUtils::IP_VERSION_4 )
55
  ?
56
- self::isIPInRanges($ipAddress, $ipVersion, array(387186688=>387448831,775127040=>775147519,775149568=>775159807,780730368=>780795903,839909376=>840171519,846200832=>846266367,872415232=>873332735,873463808=>875298815,875560960=>875954175,876216320=>876347391,876478464=>876740607,876806144=>877330431,877395968=>877658111,878051328=>878444543,878702592=>878704895,878705664=>878705919,878706432=>878706591,884998144=>885129215,885260288=>886571007,886833152=>886996991,910163968=>912261119,915406848=>917766143,917962752=>918552575,918618112=>920518655,920551424=>921042943,921174016=>921632767,921763840=>922746879,1137311744=>1137328127,1210851328=>1210859519,1264943104=>1264975871,1333592064=>1333624831,1618935808=>1618968575,1728317440=>1728319487,1796472832=>1796734975,2063122432=>2063138815,2927689728=>2927755263,2938732544=>2938765311,2954903552=>2954911743,2955018240=>2955083775,2974253056=>2974285823,3091726336=>3091857407,3098116096=>3098148863,3106961408=>3106962431,3438051328=>3438084095,3635863552=>3635867647,))
57
  :
58
  self::isIPInRanges($ipAddress, $ipVersion, array());
59
 
@@ -64,7 +64,7 @@ final class MchGdbcTrustedIPRanges
64
 
65
  return ( $ipVersion === MchGdbcIPUtils::IP_VERSION_4 )
66
  ?
67
- self::isIPInRanges($ipAddress, $ipVersion, array(1076022784=>1076023039,1116156032=>1116156159,1117464064=>1117464319,1169094784=>1169094911,1279981696=>1279981823,1279983104=>1279983231,1279983360=>1279983487,3221241856=>3221258239,3333780480=>3333781503,3485885696=>3485885823,3485888512=>3485889023,3507426560=>3507426815,3633828160=>3633828223,3633828352=>3633828479,))
68
  :
69
  self::isIPInRanges($ipAddress, $ipVersion, array('2620:115:c000::/44'=>1,));
70
 
11
  ?
12
  self::isIPInRanges($ipAddress, $ipVersion, array(1729491968=>1729492991,1729546240=>1729547263,1730085888=>1730086911,1745879040=>1746927615,1822605312=>1822621695,2197833728=>2197834751,2372222976=>2372239359,2728263680=>2728394751,2889875456=>2890399743,2918526976=>2918531071,3161612288=>3161616383,3193827328=>3193831423,3320508416=>3320509439,3324608512=>3324641279,3340468224=>3340470271,))
13
  :
14
+ self::isIPInRanges($ipAddress, $ipVersion, array('2400:cb00::/32'=>1,'2405:8100::/32'=>1,'2405:b500::/32'=>1,'2606:4700::/32'=>1,'2803:f800::/32'=>1,'2c0f:f248::/32'=>1,));
15
 
16
  }
17
 
42
 
43
  return ( $ipVersion === MchGdbcIPUtils::IP_VERSION_4 )
44
  ?
45
+ self::isIPInRanges($ipAddress, $ipVersion, array(220200960=>220332031,875429888=>875446271,877920256=>878051327,886996992=>887029759,917897216=>917962751,918552576=>918618111,921042944=>921108479,921665536=>921690111,921731072=>921747455,3438715904=>3438717951,3438718464=>3438723071,3455827968=>3455836159,3455842560=>3455844095,3632865280=>3632873471,))
46
  :
47
  self::isIPInRanges($ipAddress, $ipVersion, array());
48
 
53
 
54
  return ( $ipVersion === MchGdbcIPUtils::IP_VERSION_4 )
55
  ?
56
+ self::isIPInRanges($ipAddress, $ipVersion, array(221642752=>221773823,387186688=>387448831,583008256=>584056831,597295104=>597360639,597426176=>598212607,775127040=>775147519,775149568=>775159807,780730368=>780795903,839909376=>840171519,846200832=>846266367,872415232=>875429887,875560960=>876412927,876478464=>877330431,877395968=>877723647,878051328=>878444543,878702592=>878706175,878706432=>878706591,884998144=>885129215,885260288=>886571007,886833152=>886996991,910163968=>912261119,915406848=>917766143,917962752=>918552575,918618112=>920518655,920551424=>921042943,921174016=>921632767,921763840=>922746879,1137311744=>1137328127,1210851328=>1210859519,1264943104=>1264975871,1333592064=>1333624831,1618935808=>1618968575,1728317440=>1728319487,1796472832=>1796734975,2063122432=>2063138815,2927689728=>2927755263,2938732544=>2938765311,2954903552=>2954911743,2955018240=>2955083775,2974253056=>2974285823,3091726336=>3091857407,3098116096=>3098148863,3106961408=>3106962431,3438051328=>3438084095,3635863552=>3635867647,))
57
  :
58
  self::isIPInRanges($ipAddress, $ipVersion, array());
59
 
64
 
65
  return ( $ipVersion === MchGdbcIPUtils::IP_VERSION_4 )
66
  ?
67
+ self::isIPInRanges($ipAddress, $ipVersion, array(1076022784=>1076023039,1279981696=>1279981823,1279983360=>1279983487,3221241856=>3221258239,3333780480=>3333781503,))
68
  :
69
  self::isIPInRanges($ipAddress, $ipVersion, array('2620:115:c000::/44'=>1,));
70
 
includes/vendor/MchHttp/country-ips/ipv4/country-ipv4-0.dat CHANGED
Binary file
includes/vendor/MchHttp/country-ips/ipv4/country-ipv4-1.dat CHANGED
Binary file
includes/vendor/MchHttp/country-ips/ipv4/country-ipv4-2.dat CHANGED
Binary file
includes/vendor/MchHttp/country-ips/ipv4/country-ipv4-3.dat CHANGED
Binary file
includes/vendor/MchHttp/country-ips/ipv6/country-ipv6-0.dat CHANGED
Binary file
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: 3.5
6
  Tested up to: 4.6
7
- Stable tag: 3.0.15
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -218,10 +218,22 @@ Studies shown that visual CAPTCHAs take around 5-10 seconds to complete and audi
218
 
219
 
220
  == Upgrade Notice ==
221
- Compatibility with Avada theme
222
 
223
  == Changelog ==
224
 
 
 
 
 
 
 
 
 
 
 
 
 
225
  = 3.0.15 =
226
  **Improvements**
227
 
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: 3.5
6
  Tested up to: 4.6
7
+ Stable tag: 3.1.1
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
218
 
219
 
220
  == Upgrade Notice ==
221
+ Compatibility with MailChimp for WP version 4.0.4 and up. For those having WPBruiser protecting subscription forms built using MailChimp for WP, this update is a must.
222
 
223
  == Changelog ==
224
 
225
+ = 3.1.1 =
226
+ **Fixes**
227
+ - Compatibility with MailChimp for WP version 4.0.4 and up.
228
+
229
+ = 3.1 =
230
+ **Fixes**
231
+
232
+ - Compatibility with MailChimp for WP version 4.0.6 and up
233
+ - Compatibility with WordPress MU Domain Mapping plugin
234
+ - Fixed Password reset protection for WooCommerce
235
+ - Refreshed Country IPs
236
+
237
  = 3.0.15 =
238
  **Improvements**
239