Brute Force Login Protection - Version 1.4.1

Version Description

  • Option to email administrator when an IP has been blocked
  • Button to whitelist your current IP
  • Bugfixes and improvements
Download this release

Release Info

Developer Jan-Paul Kleemans
Plugin Icon 128x128 Brute Force Login Protection
Version 1.4.1
Comparing to
See all releases

Code changes from version 1.4 to 1.4.1

brute-force-login-protection.php CHANGED
@@ -10,7 +10,7 @@ require_once 'includes/htaccess.php';
10
  * Text Domain: brute-force-login-protection
11
  * Author: Fresh-Media
12
  * Author URI: http://fresh-media.nl/
13
- * Version: 1.4
14
  * License: GPL2
15
  *
16
  * Copyright 2014 Fresh-Media
@@ -222,6 +222,9 @@ class BruteForceLoginProtection {
222
  update_option('bflp_login_attempts', $attempts);
223
 
224
  if ($denyIP) {
 
 
 
225
  $this->__setHtaccessPath();
226
  $this->__htaccess->denyIP($IP);
227
  header('HTTP/1.0 403 Forbidden');
@@ -349,6 +352,7 @@ class BruteForceLoginProtection {
349
  'reset_time' => 60, //Minutes before resetting login attempts count
350
  'login_failed_delay' => 1, //Delay in seconds when a user login has failed
351
  'inform_user' => true, //Inform user about remaining login attempts on login page
 
352
  '403_message' => '', //Message to show to a blocked user
353
  'htaccess_dir' => get_home_path() //.htaccess file location
354
  );
@@ -364,6 +368,7 @@ class BruteForceLoginProtection {
364
  register_setting('brute-force-login-protection', 'bflp_reset_time', array($this, 'validateResetTime'));
365
  register_setting('brute-force-login-protection', 'bflp_login_failed_delay', array($this, 'validateLoginFailedDelay'));
366
  register_setting('brute-force-login-protection', 'bflp_inform_user');
 
367
  register_setting('brute-force-login-protection', 'bflp_403_message', array($this, 'validate403Message'));
368
  register_setting('brute-force-login-protection', 'bflp_htaccess_dir');
369
  }
@@ -378,6 +383,7 @@ class BruteForceLoginProtection {
378
  delete_option('bflp_reset_time');
379
  delete_option('bflp_login_failed_delay');
380
  delete_option('bflp_inform_user');
 
381
  delete_option('bflp_403_message');
382
  delete_option('bflp_htaccess_dir');
383
  }
@@ -392,6 +398,7 @@ class BruteForceLoginProtection {
392
  $this->__options['reset_time'] = get_option('bflp_reset_time', $this->__options['reset_time']);
393
  $this->__options['login_failed_delay'] = get_option('bflp_login_failed_delay', $this->__options['login_failed_delay']);
394
  $this->__options['inform_user'] = get_option('bflp_inform_user', $this->__options['inform_user']);
 
395
  $this->__options['403_message'] = get_option('bflp_403_message', $this->__options['403_message']);
396
  }
397
 
@@ -480,6 +487,19 @@ class BruteForceLoginProtection {
480
  return $_SERVER['REMOTE_ADDR'];
481
  }
482
 
 
 
 
 
 
 
 
 
 
 
 
 
 
483
  /**
484
  * Echoes message with class 'updated'.
485
  *
10
  * Text Domain: brute-force-login-protection
11
  * Author: Fresh-Media
12
  * Author URI: http://fresh-media.nl/
13
+ * Version: 1.4.1
14
  * License: GPL2
15
  *
16
  * Copyright 2014 Fresh-Media
222
  update_option('bflp_login_attempts', $attempts);
223
 
224
  if ($denyIP) {
225
+ if ($this->__options['send_email']) {
226
+ $this->__sendEmail($IP);
227
+ }
228
  $this->__setHtaccessPath();
229
  $this->__htaccess->denyIP($IP);
230
  header('HTTP/1.0 403 Forbidden');
352
  'reset_time' => 60, //Minutes before resetting login attempts count
353
  'login_failed_delay' => 1, //Delay in seconds when a user login has failed
354
  'inform_user' => true, //Inform user about remaining login attempts on login page
355
+ 'send_email' => false, //Send email to administrator when an IP has been blocked
356
  '403_message' => '', //Message to show to a blocked user
357
  'htaccess_dir' => get_home_path() //.htaccess file location
358
  );
368
  register_setting('brute-force-login-protection', 'bflp_reset_time', array($this, 'validateResetTime'));
369
  register_setting('brute-force-login-protection', 'bflp_login_failed_delay', array($this, 'validateLoginFailedDelay'));
370
  register_setting('brute-force-login-protection', 'bflp_inform_user');
371
+ register_setting('brute-force-login-protection', 'bflp_send_email');
372
  register_setting('brute-force-login-protection', 'bflp_403_message', array($this, 'validate403Message'));
373
  register_setting('brute-force-login-protection', 'bflp_htaccess_dir');
374
  }
383
  delete_option('bflp_reset_time');
384
  delete_option('bflp_login_failed_delay');
385
  delete_option('bflp_inform_user');
386
+ delete_option('bflp_send_email');
387
  delete_option('bflp_403_message');
388
  delete_option('bflp_htaccess_dir');
389
  }
398
  $this->__options['reset_time'] = get_option('bflp_reset_time', $this->__options['reset_time']);
399
  $this->__options['login_failed_delay'] = get_option('bflp_login_failed_delay', $this->__options['login_failed_delay']);
400
  $this->__options['inform_user'] = get_option('bflp_inform_user', $this->__options['inform_user']);
401
+ $this->__options['send_email'] = get_option('bflp_send_email', $this->__options['send_email']);
402
  $this->__options['403_message'] = get_option('bflp_403_message', $this->__options['403_message']);
403
  }
404
 
487
  return $_SERVER['REMOTE_ADDR'];
488
  }
489
 
490
+ /**
491
+ * Sends email to admin with info about blocked IP
492
+ *
493
+ * @return mixed
494
+ */
495
+ private function __sendEmail($IP) {
496
+ $to = get_option('admin_email');
497
+ $subject = sprintf(__('IP %s has been blocked', 'brute-force-login-protection'), $IP);
498
+ $message = sprintf(__('Brute Force Login Protection has blocked IP %s from access to %s on %s', 'brute-force-login-protection'), $IP, get_site_url(), date('Y-m-d H:i:s'));
499
+
500
+ return wp_mail($to, $subject, $message);
501
+ }
502
+
503
  /**
504
  * Echoes message with class 'updated'.
505
  *
includes/htaccess.php CHANGED
@@ -7,7 +7,7 @@ class Htaccess {
7
  private $__path;
8
  private $__header = array(
9
  '<Files "*">',
10
- 'Order deny,allow'
11
  );
12
  private $__footer = array(
13
  '</Files>'
@@ -53,7 +53,13 @@ class Htaccess {
53
  * @return array
54
  */
55
  public function getDeniedIPs() {
56
- return $this->__getLines('deny from ');
 
 
 
 
 
 
57
  }
58
 
59
  /**
@@ -119,7 +125,7 @@ class Htaccess {
119
  * @return boolean
120
  */
121
  public function commentLines() {
122
- $currentLines = $this->__getLines();
123
 
124
  $insertion = array();
125
  foreach ($currentLines as $line) {
@@ -135,13 +141,11 @@ class Htaccess {
135
  * @return boolean
136
  */
137
  public function uncommentLines() {
138
- $currentLines = $this->__getLines(false, false);
139
 
140
  $lines = array();
141
  foreach ($currentLines as $line) {
142
- if (substr($line, 0, 1) === '#') {
143
- $lines[] = substr($line, 1);
144
- }
145
  }
146
 
147
  $insertion = array_merge($this->__header, $lines, $this->__footer);
@@ -156,33 +160,37 @@ class Htaccess {
156
  /**
157
  * Returs array of (prefixed) lines from .htaccess.
158
  *
159
- * @param string $prefix
160
  * @return array
161
  */
162
- private function __getLines($prefix = false, $onlyBody = true, $exceptPrefix = false) {
163
  $allLines = extract_from_markers($this->__path, 'Brute Force Login Protection');
164
 
165
  if ($onlyBody) {
166
  $allLines = array_diff($allLines, $this->__header, $this->__footer);
167
  }
168
 
169
- if (!$prefix) {
170
  return $allLines;
171
  }
172
 
173
- $prefixLength = strlen($prefix);
 
 
174
 
175
  $prefixedLines = array();
176
  foreach ($allLines as $line) {
177
- if ($exceptPrefix) {
178
- if (substr($line, 0, $prefixLength) !== $prefix) {
179
  $prefixedLines[] = $line;
180
  }
181
- } elseif (substr($line, 0, $prefixLength) === $prefix) {
182
- $prefixedLines[] = substr($line, $prefixLength);
183
  }
184
  }
185
 
 
 
 
 
186
  return $prefixedLines;
187
  }
188
 
@@ -193,7 +201,7 @@ class Htaccess {
193
  * @return boolean
194
  */
195
  private function __addLine($line) {
196
- $insertion = array_merge($this->__header, $this->__getLines(), array($line), $this->__footer);
197
 
198
  return insert_with_markers($this->__path, 'Brute Force Login Protection', array_unique($insertion));
199
  }
@@ -206,7 +214,7 @@ class Htaccess {
206
  * @return boolean
207
  */
208
  private function __removeLine($line, $prefix = false) {
209
- $insertion = $this->__getLines(false, false);
210
 
211
  if ($prefix !== false) {
212
  $lineKey = false;
7
  private $__path;
8
  private $__header = array(
9
  '<Files "*">',
10
+ 'order deny,allow'
11
  );
12
  private $__footer = array(
13
  '</Files>'
53
  * @return array
54
  */
55
  public function getDeniedIPs() {
56
+ $lines = $this->__getLines('deny from ');
57
+
58
+ foreach ($lines as $key => $line) {
59
+ $lines[$key] = substr($line, 10);
60
+ }
61
+
62
+ return $lines;
63
  }
64
 
65
  /**
125
  * @return boolean
126
  */
127
  public function commentLines() {
128
+ $currentLines = $this->__getLines(array('deny from ', 'ErrorDocument 403 '));
129
 
130
  $insertion = array();
131
  foreach ($currentLines as $line) {
141
  * @return boolean
142
  */
143
  public function uncommentLines() {
144
+ $currentLines = $this->__getLines(array('#deny from ', '#ErrorDocument 403 '));
145
 
146
  $lines = array();
147
  foreach ($currentLines as $line) {
148
+ $lines[] = substr($line, 1);
 
 
149
  }
150
 
151
  $insertion = array_merge($this->__header, $lines, $this->__footer);
160
  /**
161
  * Returs array of (prefixed) lines from .htaccess.
162
  *
163
+ * @param string $prefixes
164
  * @return array
165
  */
166
+ private function __getLines($prefixes = false, $onlyBody = false, $exceptPrefix = false) {
167
  $allLines = extract_from_markers($this->__path, 'Brute Force Login Protection');
168
 
169
  if ($onlyBody) {
170
  $allLines = array_diff($allLines, $this->__header, $this->__footer);
171
  }
172
 
173
+ if (!$prefixes) {
174
  return $allLines;
175
  }
176
 
177
+ if (!is_array($prefixes)) {
178
+ $prefixes = array($prefixes);
179
+ }
180
 
181
  $prefixedLines = array();
182
  foreach ($allLines as $line) {
183
+ foreach ($prefixes as $prefix) {
184
+ if (strpos($line, $prefix) === 0) {
185
  $prefixedLines[] = $line;
186
  }
 
 
187
  }
188
  }
189
 
190
+ if ($exceptPrefix) {
191
+ $prefixedLines = array_diff($allLines, $prefixedLines);
192
+ }
193
+
194
  return $prefixedLines;
195
  }
196
 
201
  * @return boolean
202
  */
203
  private function __addLine($line) {
204
+ $insertion = array_merge($this->__header, $this->__getLines(false, true), array($line), $this->__footer);
205
 
206
  return insert_with_markers($this->__path, 'Brute Force Login Protection', array_unique($insertion));
207
  }
214
  * @return boolean
215
  */
216
  private function __removeLine($line, $prefix = false) {
217
+ $insertion = $this->__getLines();
218
 
219
  if ($prefix !== false) {
220
  $lineKey = false;
includes/settings-page.php CHANGED
@@ -25,6 +25,10 @@
25
  document.forms["reset_form"].submit();
26
  }
27
  }
 
 
 
 
28
  </script>
29
 
30
  <div class="wrap brute-force-login-protection">
@@ -79,6 +83,9 @@
79
  <p><strong><?php _e('Inform user about remaining login attempts on login page', 'brute-force-login-protection'); ?></strong></p>
80
  <p><input type="checkbox" name="bflp_inform_user" value="true" <?php echo ($this->__options['inform_user']) ? 'checked' : ''; ?> /></p>
81
 
 
 
 
82
  <p><strong><?php _e('Message to show to blocked users (leave empty for default message)', 'brute-force-login-protection'); ?></strong></p>
83
  <p><input type="text" size="70" name="bflp_403_message" value="<?php echo $this->__options['403_message']; ?>" /></p>
84
 
@@ -146,8 +153,11 @@
146
  </thead>
147
  <tbody>
148
  <?php
 
 
149
  $i = 1;
150
- foreach ($this->__getWhitelist() as $whitelistedIP):
 
151
  ?>
152
  <tr <?php echo ($i % 2 == 0) ? 'class="even"' : ''; ?>>
153
  <td><?php echo $i; ?></td>
@@ -171,6 +181,9 @@
171
  </td>
172
  <td>
173
  <input type="submit" name="whitelist" value="<?php _e('Add to whitelist', 'brute-force-login-protection'); ?>" class="button button-primary" />
 
 
 
174
  </td>
175
  </form>
176
  </tr>
@@ -180,4 +193,9 @@
180
  <form id="reset_form" method="post" action="">
181
  <input type="hidden" name="reset" value="true" />
182
  </form>
 
 
 
 
 
183
  </div>
25
  document.forms["reset_form"].submit();
26
  }
27
  }
28
+
29
+ function WhitelistCurrentIP() {
30
+ document.forms["whitelist_current_ip_form"].submit();
31
+ }
32
  </script>
33
 
34
  <div class="wrap brute-force-login-protection">
83
  <p><strong><?php _e('Inform user about remaining login attempts on login page', 'brute-force-login-protection'); ?></strong></p>
84
  <p><input type="checkbox" name="bflp_inform_user" value="true" <?php echo ($this->__options['inform_user']) ? 'checked' : ''; ?> /></p>
85
 
86
+ <p><strong><?php _e('Send email to administrator when an IP has been blocked', 'brute-force-login-protection'); ?></strong></p>
87
+ <p><input type="checkbox" name="bflp_send_email" value="true" <?php echo ($this->__options['send_email']) ? 'checked' : ''; ?> /></p>
88
+
89
  <p><strong><?php _e('Message to show to blocked users (leave empty for default message)', 'brute-force-login-protection'); ?></strong></p>
90
  <p><input type="text" size="70" name="bflp_403_message" value="<?php echo $this->__options['403_message']; ?>" /></p>
91
 
153
  </thead>
154
  <tbody>
155
  <?php
156
+ $currentIP = $this->__getClientIP();
157
+
158
  $i = 1;
159
+ $whitelist = $this->__getWhitelist();
160
+ foreach ($whitelist as $whitelistedIP):
161
  ?>
162
  <tr <?php echo ($i % 2 == 0) ? 'class="even"' : ''; ?>>
163
  <td><?php echo $i; ?></td>
181
  </td>
182
  <td>
183
  <input type="submit" name="whitelist" value="<?php _e('Add to whitelist', 'brute-force-login-protection'); ?>" class="button button-primary" />
184
+ <?php if (!in_array($currentIP, $whitelist)): ?>
185
+ &nbsp;<a href="javascript:WhitelistCurrentIP()" class="button"><?php printf(__('Whitelist my current IP (%s)', 'brute-force-login-protection'), $currentIP); ?></a>
186
+ <?php endif; ?>
187
  </td>
188
  </form>
189
  </tr>
193
  <form id="reset_form" method="post" action="">
194
  <input type="hidden" name="reset" value="true" />
195
  </form>
196
+
197
+ <form id="whitelist_current_ip_form" method="post" action="">
198
+ <input type="hidden" name="whitelist" value="true" />
199
+ <input type="hidden" name="IP" value="<?php echo $currentIP; ?>" />
200
+ </form>
201
  </div>
languages/brute-force-login-protection-nl_NL.mo CHANGED
Binary file
languages/brute-force-login-protection-nl_NL.po CHANGED
@@ -4,8 +4,8 @@ msgid ""
4
  msgstr ""
5
  "Project-Id-Version: Brute Force Login Protection 1.4\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/brute-force-login-protection\n"
7
- "POT-Creation-Date: 2014-08-31 15:37:15+00:00\n"
8
- "PO-Revision-Date: 2014-08-31 17:40+0100\n"
9
  "Last-Translator: Jan-Paul Kleemans <jpkleemans@gmail.com>\n"
10
  "Language-Team: Jan-Paul Kleemans <jpkleemans@gmail.com>\n"
11
  "Language: nl\n"
@@ -15,7 +15,7 @@ msgstr ""
15
  "X-Generator: Poedit 1.6.9\n"
16
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
17
 
18
- #: brute-force-login-protection.php:99 includes/settings-page.php:31
19
  msgid "Brute Force Login Protection Settings"
20
  msgstr "Brute Force Login Protection Instellingen"
21
 
@@ -72,85 +72,94 @@ msgstr ""
72
  msgid "The Options have been successfully reset"
73
  msgstr "De opties zijn succesvol gereset"
74
 
75
- #: brute-force-login-protection.php:235
76
  msgid "%d attempt remaining."
77
  msgid_plural "%d attempts remaining."
78
  msgstr[0] "%d resterende loginpoging."
79
  msgstr[1] "%d resterende loginpogingen."
80
 
81
- #: brute-force-login-protection.php:271
82
  msgid "Allowed login attempts must be a number (between 1 and 100)"
83
  msgstr "Toegestane inlogpogingen moet een getal zijn (tussen 1 en 100)"
84
 
85
- #: brute-force-login-protection.php:287
86
  msgid "Minutes before resetting must be a number (higher than 1)"
87
  msgstr ""
88
  "Minuten voordat loginpogingen teller wordt gereset moet een getal zijn "
89
  "(groter dan 1)"
90
 
91
- #: brute-force-login-protection.php:303
92
  msgid "Failed login delay must be a number (between 1 and 10)"
93
  msgstr "Mislukte login vertraging moet een getal zijn (tussen 1 en 10)"
94
 
95
- #: brute-force-login-protection.php:321
96
  msgid "An error occurred while saving the blocked users message"
97
  msgstr ""
98
  "Er is een fout opgetreden bij het opslaan van het geblokkeerde gebruikers "
99
  "bericht"
100
 
 
 
 
 
 
 
 
 
 
101
  #: includes/settings-page.php:24
102
  msgid "Are you sure you want to reset all options?"
103
  msgstr "Weet u zeker dat u alle opties wilt resetten?"
104
 
105
- #: includes/settings-page.php:37
106
  msgid "Status"
107
  msgstr "Status"
108
 
109
- #: includes/settings-page.php:39
110
  msgid "You are not protected!"
111
  msgstr "U bent niet beschermd"
112
 
113
- #: includes/settings-page.php:41
114
  msgid "You are protected!"
115
  msgstr "U bent beschermd"
116
 
117
- #: includes/settings-page.php:46
118
  msgid ".htaccess file found"
119
  msgstr ".htaccess bestand gevonden"
120
 
121
- #: includes/settings-page.php:48
122
  msgid ".htaccess file not found"
123
  msgstr ".htaccess bestand niet gevonden"
124
 
125
- #: includes/settings-page.php:52
126
  msgid ".htaccess file readable"
127
  msgstr ".htaccess bestand leesbaar"
128
 
129
- #: includes/settings-page.php:54
130
  msgid ".htaccess file not readable"
131
  msgstr ".htaccess niet leesbaar"
132
 
133
- #: includes/settings-page.php:58
134
  msgid ".htaccess file writeable"
135
  msgstr ".htaccess bestand beschrijfbaar"
136
 
137
- #: includes/settings-page.php:60
138
  msgid ".htaccess file not writeable"
139
  msgstr ".htaccess bestand niet beschrijfbaar"
140
 
141
- #: includes/settings-page.php:66
142
  msgid "Options"
143
  msgstr "Opties"
144
 
145
- #: includes/settings-page.php:70
146
  msgid "Allowed login attempts before blocking IP"
147
  msgstr "Toegestane inlogpogingen voordat IP wordt geblokkeerd"
148
 
149
- #: includes/settings-page.php:73
150
  msgid "Minutes before resetting login attempts count"
151
  msgstr "Minuten voordat loginpogingen teller wordt gereset"
152
 
153
- #: includes/settings-page.php:76
154
  msgid ""
155
  "Delay in seconds when a login attempt has failed (to slow down brute force "
156
  "attack)"
@@ -158,67 +167,75 @@ msgstr ""
158
  "Vertraging in seconden wanneer een loginpoging is mislukt (om brute force "
159
  "aanvallen te vertragen)"
160
 
161
- #: includes/settings-page.php:79
162
  msgid "Inform user about remaining login attempts on login page"
163
  msgstr "Informeer de gebruiker over resterende loginpogingen op de loginpagina"
164
 
165
- #: includes/settings-page.php:82
 
 
 
 
166
  msgid "Message to show to blocked users (leave empty for default message)"
167
  msgstr ""
168
  "Bericht voor geblokkeerde gebruikers (laat leeg voor standaard bericht)"
169
 
170
- #: includes/settings-page.php:85
171
  msgid ".htaccess file location"
172
  msgstr ".htaccess bestandslocatie"
173
 
174
- #: includes/settings-page.php:89
175
  msgid "Save"
176
  msgstr "Opslaan"
177
 
178
- #: includes/settings-page.php:90
179
  msgid "Reset"
180
  msgstr "Reset"
181
 
182
- #: includes/settings-page.php:96
183
  msgid "Blocked IPs"
184
  msgstr "Geblokkeerde IPs"
185
 
186
- #: includes/settings-page.php:101 includes/settings-page.php:143
187
  msgid "Address"
188
  msgstr "Adres"
189
 
190
- #: includes/settings-page.php:102 includes/settings-page.php:144
191
  msgid "Actions"
192
  msgstr "Acties"
193
 
194
- #: includes/settings-page.php:116
195
  msgid "Unblock"
196
  msgstr "Deblokkeren"
197
 
198
- #: includes/settings-page.php:128
199
  msgid "IP to block"
200
  msgstr "Te blokkeren IP"
201
 
202
- #: includes/settings-page.php:131
203
  msgid "Manually block IP"
204
  msgstr "Handmatig IP blokkeren"
205
 
206
- #: includes/settings-page.php:138
207
  msgid "Whitelisted IPs"
208
  msgstr "Whitelist (Toegestane IPs)"
209
 
210
- #: includes/settings-page.php:158
211
  msgid "Remove from whitelist"
212
  msgstr "Verwijder van whitelist"
213
 
214
- #: includes/settings-page.php:170
215
  msgid "IP to whitelist"
216
  msgstr "Toe te voegen IP"
217
 
218
- #: includes/settings-page.php:173
219
  msgid "Add to whitelist"
220
  msgstr "Voeg toe aan whitelist"
221
 
 
 
 
 
222
  #. Plugin Name of the plugin/theme
223
  msgid "Brute Force Login Protection"
224
  msgstr "Brute Force Login Protection"
4
  msgstr ""
5
  "Project-Id-Version: Brute Force Login Protection 1.4\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/brute-force-login-protection\n"
7
+ "POT-Creation-Date: 2014-09-27 13:43:06+00:00\n"
8
+ "PO-Revision-Date: 2014-09-27 15:44+0100\n"
9
  "Last-Translator: Jan-Paul Kleemans <jpkleemans@gmail.com>\n"
10
  "Language-Team: Jan-Paul Kleemans <jpkleemans@gmail.com>\n"
11
  "Language: nl\n"
15
  "X-Generator: Poedit 1.6.9\n"
16
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
17
 
18
+ #: brute-force-login-protection.php:99 includes/settings-page.php:35
19
  msgid "Brute Force Login Protection Settings"
20
  msgstr "Brute Force Login Protection Instellingen"
21
 
72
  msgid "The Options have been successfully reset"
73
  msgstr "De opties zijn succesvol gereset"
74
 
75
+ #: brute-force-login-protection.php:238
76
  msgid "%d attempt remaining."
77
  msgid_plural "%d attempts remaining."
78
  msgstr[0] "%d resterende loginpoging."
79
  msgstr[1] "%d resterende loginpogingen."
80
 
81
+ #: brute-force-login-protection.php:274
82
  msgid "Allowed login attempts must be a number (between 1 and 100)"
83
  msgstr "Toegestane inlogpogingen moet een getal zijn (tussen 1 en 100)"
84
 
85
+ #: brute-force-login-protection.php:290
86
  msgid "Minutes before resetting must be a number (higher than 1)"
87
  msgstr ""
88
  "Minuten voordat loginpogingen teller wordt gereset moet een getal zijn "
89
  "(groter dan 1)"
90
 
91
+ #: brute-force-login-protection.php:306
92
  msgid "Failed login delay must be a number (between 1 and 10)"
93
  msgstr "Mislukte login vertraging moet een getal zijn (tussen 1 en 10)"
94
 
95
+ #: brute-force-login-protection.php:324
96
  msgid "An error occurred while saving the blocked users message"
97
  msgstr ""
98
  "Er is een fout opgetreden bij het opslaan van het geblokkeerde gebruikers "
99
  "bericht"
100
 
101
+ #: brute-force-login-protection.php:497
102
+ msgid "IP %s has been blocked"
103
+ msgstr "IP %s geblokkeerd"
104
+
105
+ #: brute-force-login-protection.php:498
106
+ msgid "Brute Force Login Protection has blocked IP %s from access to %s on %s"
107
+ msgstr ""
108
+ "Brute Force Login Protection heeft IP %s geblokkeerd van toegang tot %s op %s"
109
+
110
  #: includes/settings-page.php:24
111
  msgid "Are you sure you want to reset all options?"
112
  msgstr "Weet u zeker dat u alle opties wilt resetten?"
113
 
114
+ #: includes/settings-page.php:41
115
  msgid "Status"
116
  msgstr "Status"
117
 
118
+ #: includes/settings-page.php:43
119
  msgid "You are not protected!"
120
  msgstr "U bent niet beschermd"
121
 
122
+ #: includes/settings-page.php:45
123
  msgid "You are protected!"
124
  msgstr "U bent beschermd"
125
 
126
+ #: includes/settings-page.php:50
127
  msgid ".htaccess file found"
128
  msgstr ".htaccess bestand gevonden"
129
 
130
+ #: includes/settings-page.php:52
131
  msgid ".htaccess file not found"
132
  msgstr ".htaccess bestand niet gevonden"
133
 
134
+ #: includes/settings-page.php:56
135
  msgid ".htaccess file readable"
136
  msgstr ".htaccess bestand leesbaar"
137
 
138
+ #: includes/settings-page.php:58
139
  msgid ".htaccess file not readable"
140
  msgstr ".htaccess niet leesbaar"
141
 
142
+ #: includes/settings-page.php:62
143
  msgid ".htaccess file writeable"
144
  msgstr ".htaccess bestand beschrijfbaar"
145
 
146
+ #: includes/settings-page.php:64
147
  msgid ".htaccess file not writeable"
148
  msgstr ".htaccess bestand niet beschrijfbaar"
149
 
150
+ #: includes/settings-page.php:70
151
  msgid "Options"
152
  msgstr "Opties"
153
 
154
+ #: includes/settings-page.php:74
155
  msgid "Allowed login attempts before blocking IP"
156
  msgstr "Toegestane inlogpogingen voordat IP wordt geblokkeerd"
157
 
158
+ #: includes/settings-page.php:77
159
  msgid "Minutes before resetting login attempts count"
160
  msgstr "Minuten voordat loginpogingen teller wordt gereset"
161
 
162
+ #: includes/settings-page.php:80
163
  msgid ""
164
  "Delay in seconds when a login attempt has failed (to slow down brute force "
165
  "attack)"
167
  "Vertraging in seconden wanneer een loginpoging is mislukt (om brute force "
168
  "aanvallen te vertragen)"
169
 
170
+ #: includes/settings-page.php:83
171
  msgid "Inform user about remaining login attempts on login page"
172
  msgstr "Informeer de gebruiker over resterende loginpogingen op de loginpagina"
173
 
174
+ #: includes/settings-page.php:86
175
+ msgid "Send email to administrator when an IP has been blocked"
176
+ msgstr "Stuur e-mail naar beheerder wanneer een IP is geblokkeerd"
177
+
178
+ #: includes/settings-page.php:89
179
  msgid "Message to show to blocked users (leave empty for default message)"
180
  msgstr ""
181
  "Bericht voor geblokkeerde gebruikers (laat leeg voor standaard bericht)"
182
 
183
+ #: includes/settings-page.php:92
184
  msgid ".htaccess file location"
185
  msgstr ".htaccess bestandslocatie"
186
 
187
+ #: includes/settings-page.php:96
188
  msgid "Save"
189
  msgstr "Opslaan"
190
 
191
+ #: includes/settings-page.php:97
192
  msgid "Reset"
193
  msgstr "Reset"
194
 
195
+ #: includes/settings-page.php:103
196
  msgid "Blocked IPs"
197
  msgstr "Geblokkeerde IPs"
198
 
199
+ #: includes/settings-page.php:108 includes/settings-page.php:150
200
  msgid "Address"
201
  msgstr "Adres"
202
 
203
+ #: includes/settings-page.php:109 includes/settings-page.php:151
204
  msgid "Actions"
205
  msgstr "Acties"
206
 
207
+ #: includes/settings-page.php:123
208
  msgid "Unblock"
209
  msgstr "Deblokkeren"
210
 
211
+ #: includes/settings-page.php:135
212
  msgid "IP to block"
213
  msgstr "Te blokkeren IP"
214
 
215
+ #: includes/settings-page.php:138
216
  msgid "Manually block IP"
217
  msgstr "Handmatig IP blokkeren"
218
 
219
+ #: includes/settings-page.php:145
220
  msgid "Whitelisted IPs"
221
  msgstr "Whitelist (Toegestane IPs)"
222
 
223
+ #: includes/settings-page.php:168
224
  msgid "Remove from whitelist"
225
  msgstr "Verwijder van whitelist"
226
 
227
+ #: includes/settings-page.php:180
228
  msgid "IP to whitelist"
229
  msgstr "Toe te voegen IP"
230
 
231
+ #: includes/settings-page.php:183
232
  msgid "Add to whitelist"
233
  msgstr "Voeg toe aan whitelist"
234
 
235
+ #: includes/settings-page.php:185
236
+ msgid "Whitelist my current IP (%s)"
237
+ msgstr "Whitelist mijn huidige IP (%s)"
238
+
239
  #. Plugin Name of the plugin/theme
240
  msgid "Brute Force Login Protection"
241
  msgstr "Brute Force Login Protection"
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: Jan-Paul Kleemans
3
  Tags: brute force, bruteforce, login, wp-login, protection, shield, security, htaccess, block, ip
4
  Requires at least: 2.7.0
5
  Tested up to: 4.0
6
- Stable tag: 1.4
7
  License: GPL2
8
 
9
  Protects your website against brute force login attacks using .htaccess
@@ -21,6 +21,7 @@ Features
21
  * Manually whitelist trusted IP addresses
22
  * Delay execution after a failed login attempt (to slow down brute force attack)
23
  * Option to inform user about remaining attempts on login page
 
24
  * Custom message to show to blocked users
25
 
26
  Your feedback is highly appreciated!
@@ -43,6 +44,11 @@ Brute Force Login Protection will only work if your .htaccess file is writeable
43
  1. Plugin settings page
44
 
45
  == Changelog ==
 
 
 
 
 
46
  = 1.4 =
47
  * Ability to whitelist trusted IPs
48
  * Ability to create custom message to show to blocked users
3
  Tags: brute force, bruteforce, login, wp-login, protection, shield, security, htaccess, block, ip
4
  Requires at least: 2.7.0
5
  Tested up to: 4.0
6
+ Stable tag: 1.4.1
7
  License: GPL2
8
 
9
  Protects your website against brute force login attacks using .htaccess
21
  * Manually whitelist trusted IP addresses
22
  * Delay execution after a failed login attempt (to slow down brute force attack)
23
  * Option to inform user about remaining attempts on login page
24
+ * Option to email administrator when an IP has been blocked
25
  * Custom message to show to blocked users
26
 
27
  Your feedback is highly appreciated!
44
  1. Plugin settings page
45
 
46
  == Changelog ==
47
+ = 1.4.1 =
48
+ * Option to email administrator when an IP has been blocked
49
+ * Button to whitelist your current IP
50
+ * Bugfixes and improvements
51
+
52
  = 1.4 =
53
  * Ability to whitelist trusted IPs
54
  * Ability to create custom message to show to blocked users