PluginProbe
Loginizer / 1.3.0
Loginizer v1.3.0
2.1.0 2.0.9 2.0.8 1.9.8 1.9.9 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 trunk 1.0 1.0.1 1.0.2 1.1.0 1.1.1 1.2.0 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 All 74 releases
loginizer / init.php

init.php in Loginizer 1.3.0, at init.php

1,560 lines 48.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 if(!function_exists('add_action')){
4 echo 'You are not allowed to access this page directly.';
5 exit;
6 }
7
8 define('LOGINIZER_VERSION', '1.3.0');
9 define('LOGINIZER_DIR', WP_PLUGIN_DIR.'/'.basename(dirname(LOGINIZER_FILE)));
10 define('LOGINIZER_URL', plugins_url('', LOGINIZER_FILE));
11 define('LOGINIZER_PRO_URL', 'https://loginizer.com/features#compare');
12
13 include_once(LOGINIZER_DIR.'/functions.php');
14
15 // Ok so we are now ready to go
16 register_activation_hook(LOGINIZER_FILE, 'loginizer_activation');
17
18 // Is called when the ADMIN enables the plugin
19 function loginizer_activation(){
20
21 global $wpdb;
22
23 $sql = array();
24
25 $sql[] = "DROP TABLE IF EXISTS `".$wpdb->prefix."loginizer_logs`";
26
27 $sql[] = "CREATE TABLE `".$wpdb->prefix."loginizer_logs` (
28 `username` varchar(255) NOT NULL DEFAULT '',
29 `time` int(10) NOT NULL DEFAULT '0',
30 `count` int(10) NOT NULL DEFAULT '0',
31 `lockout` int(10) NOT NULL DEFAULT '0',
32 `ip` varchar(255) NOT NULL DEFAULT '',
33 UNIQUE KEY `ip` (`ip`)
34 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;";
35
36 foreach($sql as $sk => $sv){
37 $wpdb->query($sv);
38 }
39
40 add_option('loginizer_version', LOGINIZER_VERSION);
41 add_option('loginizer_options', array());
42 add_option('loginizer_last_reset', 0);
43 add_option('loginizer_whitelist', array());
44 add_option('loginizer_blacklist', array());
45
46 }
47
48 // Checks if we are to update ?
49 function loginizer_update_check(){
50
51 global $wpdb;
52
53 $sql = array();
54 $current_version = get_option('loginizer_version');
55
56 // It must be the 1.0 pre stuff
57 if(empty($current_version)){
58 $current_version = get_option('lz_version');
59 }
60
61 $version = (int) str_replace('.', '', $current_version);
62
63 // No update required
64 if($current_version == LOGINIZER_VERSION){
65 return true;
66 }
67
68 // Is it first run ?
69 if(empty($current_version)){
70
71 // Reinstall
72 loginizer_activation();
73
74 // Trick the following if conditions to not run
75 $version = (int) str_replace('.', '', LOGINIZER_VERSION);
76
77 }
78
79 // Is it less than 1.0.1 ?
80 if($version < 101){
81
82 // TODO : GET the existing settings
83
84 // Get the existing settings
85 $lz_failed_logs = lz_selectquery("SELECT * FROM `".$wpdb->prefix."lz_failed_logs`;", 1);
86 $lz_options = lz_selectquery("SELECT * FROM `".$wpdb->prefix."lz_options`;", 1);
87 $lz_iprange = lz_selectquery("SELECT * FROM `".$wpdb->prefix."lz_iprange`;", 1);
88
89 // Delete the three tables
90 $sql = array();
91 $sql[] = "DROP TABLE IF EXISTS ".$wpdb->prefix."lz_failed_logs;";
92 $sql[] = "DROP TABLE IF EXISTS ".$wpdb->prefix."lz_options;";
93 $sql[] = "DROP TABLE IF EXISTS ".$wpdb->prefix."lz_iprange;";
94
95 foreach($sql as $sk => $sv){
96 $wpdb->query($sv);
97 }
98
99 // Delete option
100 delete_option('lz_version');
101
102 // Reinstall
103 loginizer_activation();
104
105 // TODO : Save the existing settings
106
107 // Update the existing failed logs to new table
108 if(is_array($lz_failed_logs)){
109 foreach($lz_failed_logs as $fk => $fv){
110 $wpdb->query("INSERT INTO ".$wpdb->prefix."loginizer_logs SET `username` = '".$fv['username']."', `time` = '".$fv['time']."', `count` = '".$fv['count']."', `lockout` = '".$fv['lockout']."', `ip` = '".$fv['ip']."';");
111 }
112 }
113
114 // Update the existing options to new structure
115 if(is_array($lz_options)){
116 foreach($lz_options as $ok => $ov){
117
118 if($ov['option_name'] == 'lz_last_reset'){
119 update_option('loginizer_last_reset', $ov['option_value']);
120 continue;
121 }
122
123 $old_option[str_replace('lz_', '', $ov['option_name'])] = $ov['option_value'];
124 }
125 // Save the options
126 update_option('loginizer_options', $old_option);
127 }
128
129 // Update the existing iprange to new structure
130 if(is_array($lz_iprange)){
131
132 $old_blacklist = array();
133 $old_whitelist = array();
134 $bid = 1;
135 $wid = 1;
136 foreach($lz_iprange as $ik => $iv){
137
138 if(!empty($iv['blacklist'])){
139 $old_blacklist[$bid] = array();
140 $old_blacklist[$bid]['start'] = long2ip($iv['start']);
141 $old_blacklist[$bid]['end'] = long2ip($iv['end']);
142 $old_blacklist[$bid]['time'] = strtotime($iv['date']);
143 $bid = $bid + 1;
144 }
145
146 if(!empty($iv['whitelist'])){
147 $old_whitelist[$wid] = array();
148 $old_whitelist[$wid]['start'] = long2ip($iv['start']);
149 $old_whitelist[$wid]['end'] = long2ip($iv['end']);
150 $old_whitelist[$wid]['time'] = strtotime($iv['date']);
151 $wid = $wid + 1;
152 }
153 }
154
155 if(!empty($old_blacklist)) update_option('loginizer_blacklist', $old_blacklist);
156 if(!empty($old_whitelist)) update_option('loginizer_whitelist', $old_whitelist);
157 }
158
159 }
160
161 // Save the new Version
162 update_option('loginizer_version', LOGINIZER_VERSION);
163
164 }
165
166 // Add the action to load the plugin
167 add_action('plugins_loaded', 'loginizer_load_plugin');
168
169 // The function that will be called when the plugin is loaded
170 function loginizer_load_plugin(){
171
172 global $loginizer;
173
174 // Check if the installed version is outdated
175 loginizer_update_check();
176
177 $options = get_option('loginizer_options');
178
179 $loginizer = array();
180 $loginizer['max_retries'] = empty($options['max_retries']) ? 3 : $options['max_retries'];
181 $loginizer['lockout_time'] = empty($options['lockout_time']) ? 900 : $options['lockout_time']; // 15 minutes
182 $loginizer['max_lockouts'] = empty($options['max_lockouts']) ? 5 : $options['max_lockouts'];
183 $loginizer['lockouts_extend'] = empty($options['lockouts_extend']) ? 86400 : $options['lockouts_extend']; // 24 hours
184 $loginizer['reset_retries'] = empty($options['reset_retries']) ? 86400 : $options['reset_retries']; // 24 hours
185 $loginizer['notify_email'] = empty($options['notify_email']) ? 0 : $options['notify_email'];
186
187 // Load the blacklist and whitelist
188 $loginizer['blacklist'] = get_option('loginizer_blacklist');
189 $loginizer['whitelist'] = get_option('loginizer_whitelist');
190
191 // When was the database cleared last time
192 $loginizer['last_reset'] = get_option('loginizer_last_reset');
193
194 //print_r($loginizer);
195
196 // Clear retries
197 if((time() - $loginizer['last_reset']) >= $loginizer['reset_retries']){
198 loginizer_reset_retries();
199 }
200
201 $ins_time = get_option('loginizer_ins_time');
202 if(empty($ins_time)){
203 $ins_time = time();
204 update_option('loginizer_ins_time', $ins_time);
205 }
206 $loginizer['ins_time'] = $ins_time;
207
208 // Set the current IP
209 $loginizer['current_ip'] = lz_getip();
210
211 /* Filters and actions */
212
213 // Use this to verify before WP tries to login
214 // Is always called and is the first function to be called
215 //add_action('wp_authenticate', 'loginizer_wp_authenticate', 10, 2);// Not called by XML-RPC
216 add_filter('authenticate', 'loginizer_wp_authenticate', 10001, 3);// This one is called by xmlrpc as well as GUI
217
218 // Is called when a login attempt fails
219 // Hence Update our records that the login failed
220 add_action('wp_login_failed', 'loginizer_login_failed');
221
222 // Is called before displaying the error message so that we dont show that the username is wrong or the password
223 // Update Error message
224 add_action('wp_login_errors', 'loginizer_error_handler', 10001, 2);
225
226 // Is the premium features there ?
227 if(file_exists(LOGINIZER_DIR.'/premium.php')){
228
229 // Include the file
230 include_once(LOGINIZER_DIR.'/premium.php');
231
232 loginizer_security_init();
233
234 }
235
236 }
237
238 // Should return NULL if everything is fine
239 function loginizer_wp_authenticate($user, $username, $password){
240
241 global $loginizer, $lz_error, $lz_cannot_login, $lz_user_pass;
242
243 if(!empty($username) && !empty($password)){
244 $lz_user_pass = 1;
245 }
246
247 // Are you whitelisted ?
248 if(loginizer_is_whitelisted()){
249 $loginizer['ip_is_whitelisted'] = 1;
250 return $user;
251 }
252
253 // Are you blacklisted ?
254 if(loginizer_is_blacklisted()){
255 $lz_cannot_login = 1;
256 return new WP_Error('ip_blacklisted', implode('', $lz_error), 'loginizer');
257 }
258
259 if(loginizer_can_login()){
260 return $user;
261 }
262
263 $lz_cannot_login = 1;
264
265 return new WP_Error('ip_blocked', implode('', $lz_error), 'loginizer');
266
267 }
268
269 function loginizer_can_login(){
270
271 global $wpdb, $loginizer, $lz_error;
272
273 // Get the logs
274 $result = lz_selectquery("SELECT * FROM `".$wpdb->prefix."loginizer_logs` WHERE `ip` = '".$loginizer['current_ip']."';");
275
276 if(!empty($result['count']) && ($result['count'] % $loginizer['max_retries']) == 0){
277
278 // Has he reached max lockouts ?
279 if($result['lockout'] >= $loginizer['max_lockouts']){
280 $loginizer['lockout_time'] = $loginizer['lockouts_extend'];
281 }
282
283 // Is he in the lockout time ?
284 if($result['time'] >= (time() - $loginizer['lockout_time'])){
285 $banlift = ceil((($result['time'] + $loginizer['lockout_time']) - time()) / 60);
286
287 //echo 'Current Time '.date('m/d/Y H:i:s', time()).'<br />';
288 //echo 'Last attempt '.date('m/d/Y H:i:s', $result['time']).'<br />';
289 //echo 'Unlock Time '.date('m/d/Y H:i:s', $result['time'] + $loginizer['lockout_time']).'<br />';
290
291 $_time = $banlift.' minute(s)';
292
293 if($banlift > 60){
294 $banlift = ceil($banlift / 60);
295 $_time = $banlift.' hour(s)';
296 }
297
298 $lz_error['ip_blocked'] = 'You have exceeded maximum login retries<br /> Please try after '.$_time;
299
300 return false;
301 }
302 }
303
304 return true;
305 }
306
307 function loginizer_is_blacklisted(){
308
309 global $wpdb, $loginizer, $lz_error;
310
311 $blacklist = $loginizer['blacklist'];
312
313 foreach($blacklist as $k => $v){
314
315 // Is the IP in the blacklist ?
316 if(ip2long($v['start']) <= ip2long($loginizer['current_ip']) && ip2long($loginizer['current_ip']) <= ip2long($v['end'])){
317 $result = 1;
318 break;
319 }
320
321 // Is it in a wider range ?
322 if(ip2long($v['start']) >= 0 && ip2long($v['end']) < 0){
323
324 // Since the end of the RANGE (i.e. current IP range) is beyond the +ve value of ip2long,
325 // if the current IP is <= than the start of the range, it is within the range
326 // OR
327 // if the current IP is <= than the end of the range, it is within the range
328 if(ip2long($v['start']) <= ip2long($loginizer['current_ip'])
329 || ip2long($loginizer['current_ip']) <= ip2long($v['end'])){
330 $result = 1;
331 break;
332 }
333
334 }
335
336 }
337
338 // You are blacklisted
339 if(!empty($result)){
340 $lz_error['ip_blacklisted'] = 'Your IP has been blacklisted';
341 return true;
342 }
343
344 return false;
345
346 }
347
348 function loginizer_is_whitelisted(){
349
350 global $wpdb, $loginizer, $lz_error;
351
352 $whitelist = $loginizer['whitelist'];
353
354 foreach($whitelist as $k => $v){
355
356 // Is the IP in the blacklist ?
357 if(ip2long($v['start']) <= ip2long($loginizer['current_ip']) && ip2long($loginizer['current_ip']) <= ip2long($v['end'])){
358 $result = 1;
359 break;
360 }
361
362 // Is it in a wider range ?
363 if(ip2long($v['start']) >= 0 && ip2long($v['end']) < 0){
364
365 // Since the end of the RANGE (i.e. current IP range) is beyond the +ve value of ip2long,
366 // if the current IP is <= than the start of the range, it is within the range
367 // OR
368 // if the current IP is <= than the end of the range, it is within the range
369 if(ip2long($v['start']) <= ip2long($loginizer['current_ip'])
370 || ip2long($loginizer['current_ip']) <= ip2long($v['end'])){
371 $result = 1;
372 break;
373 }
374
375 }
376
377 }
378
379 // You are whitelisted
380 if(!empty($result)){
381 return true;
382 }
383
384 return false;
385
386 }
387
388
389 // When the login fails, then this is called
390 // We need to update the database
391 function loginizer_login_failed($username){
392
393 global $wpdb, $loginizer, $lz_cannot_login;
394
395 if(empty($lz_cannot_login) && empty($loginizer['ip_is_whitelisted']) && empty($loginizer['no_loginizer_logs'])){
396
397 $result = lz_selectquery("SELECT * FROM `".$wpdb->prefix."loginizer_logs` WHERE `ip` = '".$loginizer['current_ip']."';");
398
399 if(!empty($result)){
400 $lockout = floor((($result['count']+1) / $loginizer['max_retries']));
401 $sresult = $wpdb->query("UPDATE `".$wpdb->prefix."loginizer_logs` SET `username` = '".$username."', `time` = '".time()."', `count` = `count`+1, `lockout` = '".$lockout."' WHERE `ip` = '".$loginizer['current_ip']."';");
402
403 // Do we need to email admin ?
404 if(!empty($loginizer['notify_email']) && $lockout >= $loginizer['notify_email']){
405
406 $sitename = lz_is_multisite() ? get_site_option('site_name') : get_option('blogname');
407 $mail = array();
408 $mail['to'] = lz_is_multisite() ? get_site_option('admin_email') : get_option('admin_email');
409 $mail['subject'] = 'Failed Login Attempts from IP '.$loginizer['current_ip'].' ('.$sitename.')';
410 $mail['message'] = 'Hi,
411
412 '.($result['count']+1).' failed login attempts and '.$lockout.' lockout(s) from IP '.$loginizer['current_ip'].'
413
414 Last Login Attempt : '.date('d/m/Y H:i:s', time()).'
415 Last User Attempt : '.$username.'
416 IP has been blocked until : '.date('d/m/Y H:i:s', time() + $loginizer['lockout_time']).'
417
418 Regards,
419 Loginizer';
420
421 @wp_mail($mail['to'], $mail['subject'], $mail['message']);
422 }
423 }else{
424 $insert = $wpdb->query("INSERT INTO `".$wpdb->prefix."loginizer_logs` SET `username` = '".$username."', `time` = '".time()."', `count` = '1', `ip` = '".$loginizer['current_ip']."', `lockout` = '0';");
425 }
426
427 // We need to add one as this is a failed attempt as well
428 $result['count'] = $result['count'] + 1;
429 $loginizer['retries_left'] = ($loginizer['max_retries'] - ($result['count'] % $loginizer['max_retries']));
430 $loginizer['retries_left'] = $loginizer['retries_left'] == $loginizer['max_retries'] ? 0 : $loginizer['retries_left'];
431
432 }
433 }
434
435 // Handles the error of the password not being there
436 function loginizer_error_handler($errors, $redirect_to){
437
438 global $wpdb, $loginizer, $lz_user_pass, $lz_cannot_login;
439
440 //echo 'loginizer_error_handler :';print_r($errors->errors);echo '<br>';
441
442 // Remove the empty password error
443 if(is_wp_error($errors)){
444
445 $codes = $errors->get_error_codes();
446
447 foreach($codes as $k => $v){
448 if($v == 'invalid_username' || $v == 'incorrect_password'){
449 $show_error = 1;
450 }
451 }
452
453 $errors->remove('invalid_username');
454 $errors->remove('incorrect_password');
455
456 }
457
458 // Add the error
459 if(!empty($lz_user_pass) && !empty($show_error) && empty($lz_cannot_login)){
460 $errors->add('invalid_userpass', '<b>ERROR:</b> Incorrect Username or Password');
461 }
462
463 // Add the number of retires left as well
464 if(count($errors->get_error_codes()) > 0 && isset($loginizer['retries_left'])){
465 $errors->add('retries_left', loginizer_retries_left());
466 }
467
468 return $errors;
469
470 }
471
472 // Returns a string with the number of retries left
473 function loginizer_retries_left(){
474
475 global $wpdb, $loginizer, $lz_user_pass, $lz_cannot_login;
476
477 // If we are to show the number of retries left
478 if(isset($loginizer['retries_left'])){
479 return '<b>'.$loginizer['retries_left'].'</b> attempt(s) left';
480 }
481
482 }
483
484 function loginizer_reset_retries(){
485
486 global $wpdb, $loginizer;
487
488 $deltime = time() - $loginizer['reset_retries'];
489 $result = $wpdb->query("DELETE FROM `".$wpdb->prefix."loginizer_logs` WHERE `time` <= '".$deltime."';");
490
491 update_option('loginizer_last_reset', time());
492
493 }
494
495 add_filter("plugin_action_links_$plugin_loginizer", 'loginizer_plugin_action_links');
496
497 // Add settings link on plugin page
498 function loginizer_plugin_action_links($links) {
499
500 if(!defined('LOGINIZER_PREMIUM')){
501 $links[] = '<a href="'.LOGINIZER_PRO_URL.'" style="color:#3db634;" target="_blank">'._x('Upgrade', 'Plugin action link label.', 'loginizer').'</a>';
502 }
503
504 $settings_link = '<a href="admin.php?page=loginizer">Settings</a>';
505 array_unshift($links, $settings_link);
506
507 return $links;
508 }
509
510 add_action('admin_menu', 'loginizer_admin_menu');
511
512 // Shows the admin menu of Loginizer
513 function loginizer_admin_menu() {
514
515 global $wp_version, $loginizer;
516
517 // Add the menu page
518 add_menu_page(__('Loginizer Dashboard'), __('Loginizer Security'), 'activate_plugins', 'loginizer', 'loginizer_page_dashboard');
519
520 // Dashboard
521 add_submenu_page('loginizer', __('Loginizer Dashboard'), __('Dashboard'), 'activate_plugins', 'loginizer', 'loginizer_page_dashboard');
522
523 // Brute Force
524 add_submenu_page('loginizer', __('Loginizer Brute Force Settings'), __('Brute Force'), 'activate_plugins', 'loginizer_brute_force', 'loginizer_page_brute_force');
525
526 if(defined('LOGINIZER_PREMIUM')){
527
528 // PasswordLess
529 add_submenu_page('loginizer', __('Loginizer PasswordLess Settings'), __('PasswordLess'), 'activate_plugins', 'loginizer_passwordless', 'loginizer_page_passwordless');
530
531 // Two Factor Auth
532 add_submenu_page('loginizer', __('Loginizer Two Factor Authentication'), __('Two Factor Auth'), 'activate_plugins', 'loginizer_2fa', 'loginizer_page_2fa');
533
534 // reCaptcha
535 add_submenu_page('loginizer', __('Loginizer reCAPTCHA Settings'), __('reCAPTCHA'), 'activate_plugins', 'loginizer_recaptcha', 'loginizer_page_recaptcha');
536
537 // Security Settings
538 add_submenu_page('loginizer', __('Loginizer Security Settings'), __('Security Settings'), 'activate_plugins', 'loginizer_security', 'loginizer_page_security');
539
540 // Security Settings
541 add_submenu_page('loginizer', __('Loginizer File Checksums'), __('File Checksums'), 'activate_plugins', 'loginizer_checksums', 'loginizer_page_checksums');
542
543 }elseif(!defined('LOGINIZER_PREMIUM') && !empty($loginizer['ins_time']) && $loginizer['ins_time'] < (time() - (30*24*3600))){
544
545 // Go Pro link
546 add_submenu_page('loginizer', __('Loginizer Go Pro'), __('Go Pro'), 'activate_plugins', LOGINIZER_PRO_URL);
547
548 }
549
550 }
551
552 // The Loginizer Admin Options Page
553 function loginizer_page_header($title = 'Loginizer'){
554 /*wp_enqueue_script('common');
555 wp_enqueue_script('wp-lists');
556 wp_enqueue_script('postbox');
557 wp_nonce_field('closedpostboxes', 'closedpostboxesnonce', false);
558
559 echo '
560 <script>
561 jQuery(document).ready( function() {
562 //add_postbox_toggles("loginizer");
563 });
564 </script>';*/
565
566 ?>
567 <style>
568 .lz-right-ul{
569 padding-left: 10px !important;
570 }
571
572 .lz-right-ul li{
573 list-style: circle !important;
574 }
575 </style>
576 <?php
577
578 echo '<div style="margin: 10px 20px 0 2px;">
579 <div class="metabox-holder columns-2">
580 <div class="postbox-container">
581 <div id="top-sortables" class="meta-box-sortables ui-sortable">
582
583 <table cellpadding="2" cellspacing="1" width="100%" class="fixed" border="0">
584 <tr>
585 <td valign="top"><h3>'.$title.'</h3></td>
586 <td align="right"><a target="_blank" class="button button-primary" href="https://wordpress.org/support/view/plugin-reviews/loginizer">Review Loginizer</a></td>
587 </tr>
588 </table>
589 <hr />
590
591 <!--Main Table-->
592 <table cellpadding="8" cellspacing="1" width="100%" class="fixed">
593 <tr>
594 <td valign="top">';
595
596 }
597
598 // The Loginizer Theme footer
599 function loginizer_page_footer(){
600
601 echo '</td>
602 <td width="200" valign="top" id="loginizer-right-bar">';
603
604 if(!defined('LOGINIZER_PREMIUM')){
605
606 echo '
607 <div class="postbox" style="min-width:0px !important;">
608 <h2 class="hndle ui-sortable-handle">
609 <span>Premium Version</span>
610 </h2>
611 <div class="inside">
612 <i>Upgrade to the premium version and get the following features </i>:<br>
613 <ul class="lz-right-ul">
614 <li>PasswordLess Login</li>
615 <li>Two Factor Auth - Email</li>
616 <li>Two Factor Auth - App</li>
617 <li>Login Challenge Question</li>
618 <li>reCAPTCHA</li>
619 <li>Rename Login Page</li>
620 <li>Disable XML-RPC</li>
621 <li>And many more ...</li>
622 </ul>
623 <center><a class="button button-primary" href="https://loginizer.com/members/cart.php">Upgrade</a></center>
624 </div>
625 </div>';
626
627 }else{
628
629 echo '
630 <div class="postbox" style="min-width:0px !important;">
631 <h2 class="hndle ui-sortable-handle">
632 <span>Recommedations</span>
633 </h2>
634 <div class="inside">
635 <i>We recommed that you enable atleast one of the following security features</i>:<br>
636 <ul class="lz-right-ul">
637 <li>Rename Login Page</li>
638 <li>Login Challenge Question</li>
639 <li>reCAPTCHA</li>
640 <li>Two Factor Auth - Email</li>
641 <li>Two Factor Auth - App</li>
642 </ul>
643 </div>
644 </div>';
645 }
646
647 echo '</td>
648 </tr>
649 </table>
650 <br />
651 <div style="width:45%;background:#FFF;padding:15px; margin:auto">
652 <b>Let your friends know that you have secured your website :</b>
653 <form method="get" action="http://twitter.com/intent/tweet" id="tweet" onsubmit="return dotweet(this);">
654 <textarea name="text" cols="45" row="3" style="resize:none;">I just secured my @WordPress site against #bruteforce using @loginizer</textarea>
655 &nbsp; &nbsp; <input type="submit" value="Tweet!" class="button button-primary" onsubmit="return false;" id="twitter-btn" style="margin-top:20px;"/>
656 </form>
657
658 </div>
659 <br />
660
661 <script>
662 function dotweet(ele){
663 window.open(jQuery("#"+ele.id).attr("action")+"?"+jQuery("#"+ele.id).serialize(), "_blank", "scrollbars=no, menubar=no, height=400, width=500, resizable=yes, toolbar=no, status=no");
664 return false;
665 }
666 </script>
667
668 <hr />
669 <a href="http://loginizer.com" target="_blank">Loginizer</a> v'.LOGINIZER_VERSION.'. You can report any bugs <a href="http://wordpress.org/support/plugin/loginizer" target="_blank">here</a>.
670
671 </div>
672 </div>
673 </div>
674 </div>';
675
676 }
677
678 // The Loginizer Admin Options Page
679 function loginizer_page_dashboard(){
680
681 global $loginizer, $lz_error, $lz_env;
682
683 // Is there a license key ?
684 if(isset($_POST['save_lz'])){
685
686 $license = lz_optpost('lz_license');
687
688 // Check if its a valid license
689 if(empty($license)){
690 $lz_error['lic_invalid'] = __('The license key was not submitted', 'loginizer');
691 return loginizer_page_dashboard_T();
692 }
693
694 $resp = wp_remote_get(LOGINIZER_API.'license.php?license='.$license);
695
696 if(is_array($resp)){
697 $json = json_decode($resp['body'], true);
698 //print_r($json);
699 }
700
701 // Save the License
702 if(empty($json)){
703
704 $lz_error['lic_invalid'] = __('The license key is invalid', 'loginizer');
705 return loginizer_page_dashboard_T();
706
707 }else{
708
709 update_option('loginizer_license', $json);
710
711 // Mark as saved
712 $GLOBALS['lz_saved'] = true;
713 }
714
715 }
716
717 loginizer_page_dashboard_T();
718
719 }
720
721 // The Loginizer Admin Options Page - THEME
722 function loginizer_page_dashboard_T(){
723
724 global $loginizer, $lz_error, $lz_env;
725
726 loginizer_page_header('Loginizer Dashboard');
727 ?>
728 <style>
729 .welcome-panel{
730 margin: 0px;
731 padding: 10px;
732 }
733
734 input[type="text"], textarea, select {
735 width: 70%;
736 }
737
738 .form-table label{
739 font-weight:bold;
740 }
741
742 .exp{
743 font-size:12px;
744 }
745 </style>
746
747 <?php
748 echo '<script src="http://api.loginizer.com/'.(defined('LOGINIZER_PREMIUM') ? 'news_security.js' : 'news.js').'"></script><br>';
749
750 // Saved ?
751 if(!empty($GLOBALS['lz_saved'])){
752 echo '<div id="message" class="updated"><p>'. __('The settings were saved successfully', 'loginizer'). '</p></div><br />';
753 }
754
755 // Any errors ?
756 if(!empty($lz_error)){
757 lz_report_error($lz_error);echo '<br />';
758 }
759
760 ?>
761
762 <div class="postbox">
763
764 <button class="handlediv button-link" aria-expanded="true" type="button">
765 <span class="screen-reader-text">Toggle panel: Getting Started</span>
766 <span class="toggle-indicator" aria-hidden="true"></span>
767 </button>
768
769 <h2 class="hndle ui-sortable-handle">
770 <span><?php echo __('Getting Started', 'loginizer'); ?></span>
771 </h2>
772
773 <div class="inside">
774
775 <form action="" method="post" enctype="multipart/form-data">
776 <?php wp_nonce_field('loginizer-options'); ?>
777 <table class="form-table">
778 <tr>
779 <td scope="row" valign="top" colspan="2" style="line-height:150%">
780 <i>Welcome to Loginizer Security. By default the <b>Brute Force Protection</b> is immediately enabled. You should start by going over the default settings and tweaking them as per your needs.</i>
781 <?php
782 if(defined('LOGINIZER_PREMIUM')){
783 echo '<br><i>In the Premium version of Loginizer you have many more features. We recommend you enable features like <b>reCAPTCHA, Two Factor Auth or Email based PasswordLess</b> login. These features will improve your websites security.</i>';
784 }
785 ?>
786 </td>
787 </tr>
788 </table>
789 </form>
790
791 </div>
792 </div>
793
794 <div class="postbox">
795
796 <button class="handlediv button-link" aria-expanded="true" type="button">
797 <span class="screen-reader-text">Toggle panel: System Information</span>
798 <span class="toggle-indicator" aria-hidden="true"></span>
799 </button>
800
801 <h2 class="hndle ui-sortable-handle">
802 <span><?php echo __('System Information', 'loginizer'); ?></span>
803 </h2>
804
805 <div class="inside">
806
807 <form action="" method="post" enctype="multipart/form-data">
808 <?php wp_nonce_field('loginizer-options'); ?>
809 <table class="wp-list-table fixed striped users" cellspacing="1" border="0" width="95%" cellpadding="10" align="center">
810 <?php
811 echo '
812 <tr>
813 <th align="left" width="25%">'.__('Loginizer Version', 'loginizer').'</th>
814 <td>'.LOGINIZER_VERSION.(defined('LOGINIZER_PREMIUM') ? ' (Security PRO Version)' : '').'</td>
815 </tr>';
816
817 if(defined('LOGINIZER_PREMIUM')){
818 echo '
819 <tr>
820 <th align="left" valign="top">'.__('Loginizer License', 'loginizer').'</th>
821 <td align="left">
822 '.(empty($loginizer['license']) ? '<span style="color:red">Unlicensed</span> &nbsp; &nbsp;' : '').'
823 <input type="text" name="lz_license" value="'.(empty($loginizer['license']) ? '' : $loginizer['license']['license']).'" size="30" placeholder="e.g. WXCSE-SFJJX-XXXXX-AAAAA-BBBBB" style="width:300px;" /> &nbsp;
824 <input name="save_lz" class="button button-primary" value="Update License" type="submit" />';
825
826 if(!empty($loginizer['license'])){
827
828 $expires = $loginizer['license']['expires'];
829 $expires = substr($expires, 0, 4).'/'.substr($expires, 4, 2).'/'.substr($expires, 6);
830
831 echo '<div style="margin-top:10px;">License Active : '.(empty($loginizer['license']['active']) ? '<span style="color:red">No</span>' : 'Yes').' &nbsp; &nbsp; &nbsp;
832 License Expires : '.($loginizer['license']['expires'] <= date('Ymd') ? '<span style="color:red">'.$expires.'</span>' : $expires).'
833 </div>';
834 }
835
836
837 echo
838 '</td>
839 </tr>';
840 }
841
842 echo '<tr>
843 <th align="left">'.__('URL', 'loginizer').'</th>
844 <td>'.get_site_url().'</td>
845 </tr>
846 <tr>
847 <th align="left">'.__('Path', 'loginizer').'</th>
848 <td>'.ABSPATH.'</td>
849 </tr>
850 <tr>
851 <th align="left">'.__('Server\'s IP Address', 'loginizer').'</th>
852 <td>'.$_SERVER['SERVER_ADDR'].'</td>
853 </tr>
854 <tr>
855 <th align="left">'.__('Your IP Address', 'loginizer').'</th>
856 <td>'.$_SERVER['REMOTE_ADDR'].'</td>
857 </tr>
858 <tr>
859 <th align="left">'.__('wp-config.php is writable', 'loginizer').'</th>
860 <td>'.(is_writable(ABSPATH.'/wp-config.php') ? '<span style="color:red">Yes</span>' : '<span style="color:green">No</span>').'</td>
861 </tr>';
862
863 if(file_exists(ABSPATH.'/.htaccess')){
864 echo '
865 <tr>
866 <th align="left">'.__('.htaccess is writable', 'loginizer').'</th>
867 <td>'.(is_writable(ABSPATH.'/.htaccess') ? '<span style="color:red">Yes</span>' : '<span style="color:green">No</span>').'</td>
868 </tr>';
869
870 }
871
872 ?>
873 </table>
874 </form>
875
876 </div>
877 </div>
878
879 <div id="" class="postbox">
880
881 <button class="handlediv button-link" aria-expanded="true" type="button">
882 <span class="screen-reader-text">Toggle panel: File Permissions</span>
883 <span class="toggle-indicator" aria-hidden="true"></span>
884 </button>
885
886 <h2 class="hndle ui-sortable-handle">
887 <span><?php echo __('File Permissions', 'loginizer'); ?></span>
888 </h2>
889
890 <div class="inside">
891
892 <form action="" method="post" enctype="multipart/form-data">
893 <?php wp_nonce_field('loginizer-options'); ?>
894 <table class="wp-list-table fixed striped users" border="0" width="95%" cellpadding="10" align="center">
895 <?php
896
897 echo '
898 <tr>
899 <th style="background:#EFEFEF;">'.__('Relative Path', 'loginizer').'</th>
900 <th style="width:10%; background:#EFEFEF;">'.__('Suggested', 'loginizer').'</th>
901 <th style="width:10%; background:#EFEFEF;">'.__('Actual', 'loginizer').'</th>
902 </tr>';
903
904 $wp_content = basename(dirname(dirname(dirname(__FILE__))));
905
906 $files_to_check = array('/' => '0755',
907 '/wp-admin' => '0755',
908 '/wp-includes' => '0755',
909 '/wp-config.php' => '0444',
910 '/'.$wp_content => '0755',
911 '/'.$wp_content.'/themes' => '0755',
912 '/'.$wp_content.'/plugins' => '0755',
913 '.htaccess' => '0444');
914
915 $root = ABSPATH;
916
917 foreach($files_to_check as $k => $v){
918
919 $path = $root.'/'.$k;
920 $stat = @stat($path);
921 $suggested = $v;
922 $actual = substr(sprintf('%o', $stat['mode']), -4);
923
924 echo '
925 <tr>
926 <td>'.$k.'</td>
927 <td>'.$suggested.'</td>
928 <td><span '.($suggested != $actual ? 'style="color: red;"' : '').'>'.$actual.'</span></td>
929 </tr>';
930
931 }
932
933 ?>
934 </table>
935 </form>
936
937 </div>
938 </div>
939
940 <?php
941
942 loginizer_page_footer();
943
944 }
945
946 // The Loginizer Admin Options Page
947 function loginizer_page_brute_force(){
948
949 global $wpdb, $wp_roles, $loginizer;
950
951 if(!current_user_can('manage_options')){
952 wp_die('Sorry, but you do not have permissions to change settings.');
953 }
954
955 /* Make sure post was from this page */
956 if(count($_POST) > 0){
957 check_admin_referer('loginizer-options');
958 }
959
960 // BEGIN THEME
961 loginizer_page_header('Loginizer - Brute Force Settings');
962
963 // Load the blacklist and whitelist
964 $loginizer['blacklist'] = get_option('loginizer_blacklist');
965 $loginizer['whitelist'] = get_option('loginizer_whitelist');
966
967 if(isset($_POST['save_lz'])){
968
969 $max_retries = (int) lz_optpost('max_retries');
970 $lockout_time = (int) lz_optpost('lockout_time');
971 $max_lockouts = (int) lz_optpost('max_lockouts');
972 $lockouts_extend = (int) lz_optpost('lockouts_extend');
973 $reset_retries = (int) lz_optpost('reset_retries');
974 $notify_email = (int) lz_optpost('notify_email');
975
976 $lockout_time = $lockout_time * 60;
977 $lockouts_extend = $lockouts_extend * 60 * 60;
978 $reset_retries = $reset_retries * 60 * 60;
979
980 if(empty($error)){
981
982 $option['max_retries'] = $max_retries;
983 $option['lockout_time'] = $lockout_time;
984 $option['max_lockouts'] = $max_lockouts;
985 $option['lockouts_extend'] = $lockouts_extend;
986 $option['reset_retries'] = $reset_retries;
987 $option['notify_email'] = $notify_email;
988
989 // Save the options
990 update_option('loginizer_options', $option);
991
992 $saved = true;
993
994 }else{
995 lz_report_error($error);
996 }
997
998 if(!empty($notice)){
999 lz_report_notice($notice);
1000 }
1001
1002 if(!empty($saved)){
1003 echo '<div id="message" class="updated"><p>'
1004 . __('The settings were saved successfully', 'loginizer')
1005 . '</p></div><br />';
1006 }
1007
1008 }
1009
1010 // Delete a Blackist IP range
1011 if(isset($_GET['bdelid'])){
1012
1013 $delid = (int) lz_optreq('bdelid');
1014
1015 // Unset and save
1016 $blacklist = $loginizer['blacklist'];
1017 unset($blacklist[$delid]);
1018 update_option('loginizer_blacklist', $blacklist);
1019
1020 echo '<div id="message" class="updated fade"><p>'
1021 . __('The Blacklist IP range has been deleted successfully', 'loginizer')
1022 . '</p></div><br />';
1023
1024 }
1025
1026 // Delete a Whitelist IP range
1027 if(isset($_GET['delid'])){
1028
1029 $delid = (int) lz_optreq('delid');
1030
1031 // Unset and save
1032 $whitelist = $loginizer['whitelist'];
1033 unset($whitelist[$delid]);
1034 update_option('loginizer_whitelist', $whitelist);
1035
1036 echo '<div id="message" class="updated fade"><p>'
1037 . __('The Whitelist IP range has been deleted successfully', 'loginizer')
1038 . '</p></div><br />';
1039
1040 }
1041
1042 if(isset($_POST['blacklist_iprange'])){
1043
1044 $start_ip = lz_optpost('start_ip');
1045 $end_ip = lz_optpost('end_ip');
1046
1047 if(empty($start_ip)){
1048 $error[] = 'Please enter the Start IP';
1049 }
1050
1051 // If no end IP we consider only 1 IP
1052 if(empty($end_ip)){
1053 $end_ip = $start_ip;
1054 }
1055
1056 if(!lz_valid_ip($start_ip)){
1057 $error[] = 'Please provide a valid start IP';
1058 }
1059
1060 if(!lz_valid_ip($end_ip)){
1061 $error[] = 'Please provide a valid end IP';
1062 }
1063
1064 // Regular ranges will work
1065 if(ip2long($start_ip) > ip2long($end_ip)){
1066
1067 // BUT, if 0.0.0.1 - 255.255.255.255 is given, it will not work
1068 if(ip2long($start_ip) >= 0 && ip2long($end_ip) < 0){
1069 // This is right
1070 }else{
1071 $error[] = 'The End IP cannot be smaller than the Start IP';
1072 }
1073
1074 }
1075
1076 if(empty($error)){
1077
1078 $blacklist = $loginizer['blacklist'];
1079
1080 foreach($blacklist as $k => $v){
1081
1082 // This is to check if there is any other range exists with the same Start or End IP
1083 if(( ip2long($start_ip) <= ip2long($v['start']) && ip2long($v['start']) <= ip2long($end_ip) )
1084 || ( ip2long($start_ip) <= ip2long($v['end']) && ip2long($v['end']) <= ip2long($end_ip) )
1085 ){
1086 $error[] = 'The Start IP or End IP submitted conflicts with an existing IP range !';
1087 break;
1088 }
1089
1090 // This is to check if there is any other range exists with the same Start IP
1091 if(ip2long($v['start']) <= ip2long($start_ip) && ip2long($start_ip) <= ip2long($v['end'])){
1092 $error[] = 'The Start IP is present in an existing range !';
1093 break;
1094 }
1095
1096 // This is to check if there is any other range exists with the same End IP
1097 if(ip2long($v['start']) <= ip2long($end_ip) && ip2long($end_ip) <= ip2long($v['end'])){
1098 $error[] = 'The End IP is present in an existing range!';
1099 break;
1100 }
1101
1102 }
1103
1104 $newid = ( empty($blacklist) ? 0 : max(array_keys($blacklist)) ) + 1;
1105
1106 if(empty($error)){
1107
1108 $blacklist[$newid] = array();
1109 $blacklist[$newid]['start'] = $start_ip;
1110 $blacklist[$newid]['end'] = $end_ip;
1111 $blacklist[$newid]['time'] = time();
1112
1113 update_option('loginizer_blacklist', $blacklist);
1114
1115 echo '<div id="message" class="updated fade"><p>'
1116 . __('Blacklist IP range added successfully', 'loginizer')
1117 . '</p></div><br />';
1118
1119 }
1120
1121 }
1122
1123 if(!empty($error)){
1124 lz_report_error($error);echo '<br />';
1125 }
1126
1127 }
1128
1129 if(isset($_POST['whitelist_iprange'])){
1130
1131 $start_ip = lz_optpost('start_ip_w');
1132 $end_ip = lz_optpost('end_ip_w');
1133
1134 if(empty($start_ip)){
1135 $error[] = 'Please enter the Start IP';
1136 }
1137
1138 // If no end IP we consider only 1 IP
1139 if(empty($end_ip)){
1140 $end_ip = $start_ip;
1141 }
1142
1143 if(!lz_valid_ip($start_ip)){
1144 $error[] = 'Please provide a valid start IP';
1145 }
1146
1147 if(!lz_valid_ip($end_ip)){
1148 $error[] = 'Please provide a valid end IP';
1149 }
1150
1151 if(ip2long($start_ip) > ip2long($end_ip)){
1152
1153 // BUT, if 0.0.0.1 - 255.255.255.255 is given, it will not work
1154 if(ip2long($start_ip) >= 0 && ip2long($end_ip) < 0){
1155 // This is right
1156 }else{
1157 $error[] = 'The End IP cannot be smaller than the Start IP';
1158 }
1159
1160 }
1161
1162 if(empty($error)){
1163
1164 $whitelist = $loginizer['whitelist'];
1165
1166 foreach($whitelist as $k => $v){
1167
1168 // This is to check if there is any other range exists with the same Start or End IP
1169 if(( ip2long($start_ip) <= ip2long($v['start']) && ip2long($v['start']) <= ip2long($end_ip) )
1170 || ( ip2long($start_ip) <= ip2long($v['end']) && ip2long($v['end']) <= ip2long($end_ip) )
1171 ){
1172 $error[] = 'The Start IP or End IP submitted conflicts with an existing IP range !';
1173 break;
1174 }
1175
1176 // This is to check if there is any other range exists with the same Start IP
1177 if(ip2long($v['start']) <= ip2long($start_ip) && ip2long($start_ip) <= ip2long($v['end'])){
1178 $error[] = 'The Start IP is present in an existing range !';
1179 break;
1180 }
1181
1182 // This is to check if there is any other range exists with the same End IP
1183 if(ip2long($v['start']) <= ip2long($end_ip) && ip2long($end_ip) <= ip2long($v['end'])){
1184 $error[] = 'The End IP is present in an existing range!';
1185 break;
1186 }
1187
1188 }
1189
1190 $newid = ( empty($whitelist) ? 0 : max(array_keys($whitelist)) ) + 1;
1191
1192 if(empty($error)){
1193
1194 $whitelist[$newid] = array();
1195 $whitelist[$newid]['start'] = $start_ip;
1196 $whitelist[$newid]['end'] = $end_ip;
1197 $whitelist[$newid]['time'] = time();
1198
1199 update_option('loginizer_whitelist', $whitelist);
1200
1201 echo '<div id="message" class="updated fade"><p>'
1202 . __('Whitelist IP range added successfully', 'loginizer')
1203 . '</p></div><br />';
1204
1205 }
1206
1207 }
1208
1209 if(!empty($error)){
1210 lz_report_error($error);echo '<br />';
1211 }
1212 }
1213
1214 // Count the Results
1215 $tmp = lz_selectquery("SELECT COUNT(*) AS num FROM `".$wpdb->prefix."loginizer_logs`");
1216 //print_r($tmp);
1217
1218 // Which Page is it
1219 $lz_env['res_len'] = 10;
1220 $lz_env['cur_page'] = lz_get_page('lzpage', $lz_env['res_len']);
1221 $lz_env['num_res'] = $tmp['num'];
1222 $lz_env['max_page'] = ceil($lz_env['num_res'] / $lz_env['res_len']);
1223
1224 // Get the logs
1225 $result = lz_selectquery("SELECT * FROM `".$wpdb->prefix."loginizer_logs`
1226 ORDER BY `time` DESC
1227 LIMIT ".$lz_env['cur_page'].", ".$lz_env['res_len']."", 1);
1228 //print_r($result);
1229
1230 $lz_env['cur_page'] = ($lz_env['cur_page'] / $lz_env['res_len']) + 1;
1231 $lz_env['cur_page'] = $lz_env['cur_page'] < 1 ? 1 : $lz_env['cur_page'];
1232 $lz_env['next_page'] = ($lz_env['cur_page'] + 1) > $lz_env['max_page'] ? $lz_env['max_page'] : ($lz_env['cur_page'] + 1);
1233 $lz_env['prev_page'] = ($lz_env['cur_page'] - 1) < 1 ? 1 : ($lz_env['cur_page'] - 1);
1234
1235 // Reload the settings
1236 $loginizer['blacklist'] = get_option('loginizer_blacklist');
1237 $loginizer['whitelist'] = get_option('loginizer_whitelist');
1238
1239 ?>
1240
1241 <div id="" class="postbox">
1242
1243 <button class="handlediv button-link" aria-expanded="true" type="button">
1244 <span class="screen-reader-text">Toggle panel: Failed Login Attempts Logs</span>
1245 <span class="toggle-indicator" aria-hidden="true"></span>
1246 </button>
1247
1248 <h2 class="hndle ui-sortable-handle">
1249 <?php echo __('<span>Failed Login Attempts Logs</span> &nbsp; (Past '.($loginizer['reset_retries']/60/60).' hours)','loginizer'); ?>
1250 </h2>
1251
1252 <script>
1253 function yesdsd(){
1254 window.location = '<?php echo menu_page_url('loginizer_brute_force', false);?>&lzpage='+jQuery("#current-page-selector").val();
1255 return false;
1256 }
1257 </script>
1258
1259 <form method="get" onsubmit="return yesdsd();">
1260 <div class="tablenav">
1261 <p class="tablenav-pages" style="margin: 5px 10px" align="right">
1262 <span class="displaying-num"><?php echo $lz_env['num_res'];?> items</span>
1263 <span class="pagination-links">
1264 <a class="first-page" href="<?php echo menu_page_url('loginizer_brute_force', false).'&lzpage=1';?>"><span class="screen-reader-text">First page</span><span aria-hidden="true">«</span></a>
1265 <a class="prev-page" href="<?php echo menu_page_url('loginizer_brute_force', false).'&lzpage='.$lz_env['prev_page'];?>"><span class="screen-reader-text">Previous page</span><span aria-hidden="true">‹</span></a>
1266 <span class="paging-input">
1267 <label for="current-page-selector" class="screen-reader-text">Current Page</label>
1268 <input class="current-page" id="current-page-selector" name="lzpage" value="<?php echo $lz_env['cur_page'];?>" size="3" aria-describedby="table-paging" type="text"><span class="tablenav-paging-text"> of <span class="total-pages"><?php echo $lz_env['max_page'];?></span></span>
1269 </span>
1270 <a class="next-page" href="<?php echo menu_page_url('loginizer_brute_force', false).'&lzpage='.$lz_env['next_page'];?>"><span class="screen-reader-text">Next page</span><span aria-hidden="true">›</span></a>
1271 <a class="last-page" href="<?php echo menu_page_url('loginizer_brute_force', false).'&lzpage='.$lz_env['max_page'];?>"><span class="screen-reader-text">Last page</span><span aria-hidden="true">»</span></a>
1272 </span>
1273 </p>
1274 </div>
1275 </form>
1276
1277 <div class="inside">
1278 <table class="wp-list-table widefat fixed users" border="0">
1279 <tr>
1280 <th scope="row" valign="top" style="background:#EFEFEF;"><?php echo __('IP','loginizer'); ?></th>
1281 <th scope="row" valign="top" style="background:#EFEFEF;"><?php echo __('Last Failed Attempt (DD/MM/YYYY)','loginizer'); ?></th>
1282 <th scope="row" valign="top" style="background:#EFEFEF;"><?php echo __('Failed Attempts Count','loginizer'); ?></th>
1283 <th scope="row" valign="top" style="background:#EFEFEF;" width="150"><?php echo __('Lockouts Count','loginizer'); ?></th>
1284 </tr>
1285 <?php
1286 if(empty($result)){
1287 echo '
1288 <tr>
1289 <td colspan="4">
1290 No Logs. You will see logs about failed login attempts here.
1291 </td>
1292 </tr>';
1293 }else{
1294 foreach($result as $ik => $iv){
1295 $status_button = (!empty($iv['status']) ? 'disable' : 'enable');
1296 echo '
1297 <tr>
1298 <td>
1299 '.$iv['ip'].'
1300 </td>
1301 <td>
1302 '.date('d/m/Y H:i:s', $iv['time']).'
1303 </td>
1304 <td>
1305 '.$iv['count'].'
1306 </td>
1307 <td>
1308 '.$iv['lockout'].'
1309 </td>
1310 </tr>';
1311 }
1312 }
1313 ?>
1314 </table>
1315 </div>
1316 </div>
1317 <br />
1318
1319 <div id="" class="postbox">
1320
1321 <button class="handlediv button-link" aria-expanded="true" type="button">
1322 <span class="screen-reader-text">Toggle panel: Brute Force Settings</span>
1323 <span class="toggle-indicator" aria-hidden="true"></span>
1324 </button>
1325
1326 <h2 class="hndle ui-sortable-handle">
1327 <span><?php echo __('Brute Force Settings', 'loginizer'); ?></span>
1328 </h2>
1329
1330 <div class="inside">
1331
1332 <form action="" method="post" enctype="multipart/form-data">
1333 <?php wp_nonce_field('loginizer-options'); ?>
1334 <table class="form-table">
1335 <tr>
1336 <th scope="row" valign="top"><label for="max_retries"><?php echo __('Max Retries','loginizer'); ?></label></th>
1337 <td>
1338 <input type="text" size="3" value="<?php echo lz_optpost('max_retries', $loginizer['max_retries']); ?>" name="max_retries" id="max_retries" /> <?php echo __('Maximum failed attempts allowed before lockout','loginizer'); ?> <br />
1339 </td>
1340 </tr>
1341 <tr>
1342 <th scope="row" valign="top"><label for="lockout_time"><?php echo __('Lockout Time','loginizer'); ?></label></th>
1343 <td>
1344 <input type="text" size="3" value="<?php echo (!empty($lockout_time) ? $lockout_time : $loginizer['lockout_time']) / 60; ?>" name="lockout_time" id="lockout_time" /> <?php echo __('minutes','loginizer'); ?> <br />
1345 </td>
1346 </tr>
1347 <tr>
1348 <th scope="row" valign="top"><label for="max_lockouts"><?php echo __('Max Lockouts','loginizer'); ?></label></th>
1349 <td>
1350 <input type="text" size="3" value="<?php echo lz_optpost('max_lockouts', $loginizer['max_lockouts']); ?>" name="max_lockouts" id="max_lockouts" /> <?php echo __('','loginizer'); ?> <br />
1351 </td>
1352 </tr>
1353 <tr>
1354 <th scope="row" valign="top"><label for="lockouts_extend"><?php echo __('Extend Lockout','loginizer'); ?></label></th>
1355 <td>
1356 <input type="text" size="3" value="<?php echo (!empty($lockouts_extend) ? $lockouts_extend : $loginizer['lockouts_extend']) / 60 / 60; ?>" name="lockouts_extend" id="lockouts_extend" /> <?php echo __('hours. Extend Lockout time after Max Lockouts','loginizer'); ?> <br />
1357 </td>
1358 </tr>
1359 <tr>
1360 <th scope="row" valign="top"><label for="reset_retries"><?php echo __('Reset Retries','loginizer'); ?></label></th>
1361 <td>
1362 <input type="text" size="3" value="<?php echo (!empty($reset_retries) ? $reset_retries : $loginizer['reset_retries']) / 60 / 60; ?>" name="reset_retries" id="reset_retries" /> <?php echo __('hours','loginizer'); ?> <br />
1363 </td>
1364 </tr>
1365 <tr>
1366 <th scope="row" valign="top"><label for="notify_email"><?php echo __('Email Notification','loginizer'); ?></label></th>
1367 <td>
1368 <?php echo __('after ','loginizer'); ?>
1369 <input type="text" size="3" value="<?php echo (!empty($notify_email) ? $notify_email : $loginizer['notify_email']); ?>" name="notify_email" id="notify_email" /> <?php echo __('lockouts <br />0 to disable email notifications','loginizer'); ?>
1370 </td>
1371 </tr>
1372 </table><br />
1373 <input name="save_lz" class="button button-primary action" value="<?php echo __('Save Settings','loginizer'); ?>" type="submit" />
1374 </form>
1375
1376 </div>
1377 </div>
1378 <br />
1379
1380 <div id="" class="postbox">
1381
1382 <button class="handlediv button-link" aria-expanded="true" type="button">
1383 <span class="screen-reader-text">Toggle panel: Blacklist IP</span>
1384 <span class="toggle-indicator" aria-hidden="true"></span>
1385 </button>
1386
1387 <h2 class="hndle ui-sortable-handle">
1388 <span><?php echo __('Blacklist IP','loginizer'); ?></span>
1389 </h2>
1390
1391 <div class="inside">
1392
1393 <?php echo __('Enter the IP you want to blacklist from login','loginizer'); ?>
1394
1395 <form action="" method="post">
1396 <?php wp_nonce_field('loginizer-options'); ?>
1397 <table class="form-table">
1398 <tr>
1399 <th scope="row" valign="top"><label for="start_ip"><?php echo __('Start IP','loginizer'); ?></label></th>
1400 <td>
1401 <input type="text" size="25" value="<?php echo(lz_optpost('start_ip')); ?>" name="start_ip" id="start_ip"/> <?php echo __('Start IP of the range','loginizer'); ?> <br />
1402 </td>
1403 </tr>
1404 <tr>
1405 <th scope="row" valign="top"><label for="end_ip"><?php echo __('End IP (Optional)','loginizer'); ?></label></th>
1406 <td>
1407 <input type="text" size="25" value="<?php echo(lz_optpost('end_ip')); ?>" name="end_ip" id="end_ip"/> <?php echo __('End IP of the range. <br />If you want to blacklist single IP leave this field blank.','loginizer'); ?> <br />
1408 </td>
1409 </tr>
1410 </table><br />
1411 <input name="blacklist_iprange" class="button button-primary action" value="<?php echo __('Add Blacklist IP Range','loginizer'); ?>" type="submit" />
1412 </form>
1413 </div>
1414
1415 <table class="wp-list-table fixed striped users" border="0" width="95%" cellpadding="10" align="center">
1416 <tr>
1417 <th scope="row" valign="top" style="background:#EFEFEF;"><?php echo __('Start IP','loginizer'); ?></th>
1418 <th scope="row" valign="top" style="background:#EFEFEF;"><?php echo __('End IP','loginizer'); ?></th>
1419 <th scope="row" valign="top" style="background:#EFEFEF;"><?php echo __('Date (DD/MM/YYYY)','loginizer'); ?></th>
1420 <th scope="row" valign="top" style="background:#EFEFEF;" width="100"><?php echo __('Options','loginizer'); ?></th>
1421 </tr>
1422 <?php
1423 if(empty($loginizer['blacklist'])){
1424 echo '
1425 <tr>
1426 <td colspan="4">
1427 No Blacklist IPs. You will see blacklisted IP ranges here.
1428 </td>
1429 </tr>';
1430 }else{
1431 foreach($loginizer['blacklist'] as $ik => $iv){
1432 echo '
1433 <tr>
1434 <td>
1435 '.$iv['start'].'
1436 </td>
1437 <td>
1438 '.$iv['end'].'
1439 </td>
1440 <td>
1441 '.date('d/m/Y', $iv['time']).'
1442 </td>
1443 <td>
1444 <a class="submitdelete" href="admin.php?page=loginizer_brute_force&bdelid='.$ik.'" onclick="return confirm(\'Are you sure you want to delete this IP range ?\')">Delete</a>
1445 </td>
1446 </tr>';
1447 }
1448 }
1449 ?>
1450 </table>
1451 <br />
1452
1453 </div>
1454
1455 <br />
1456
1457 <div id="" class="postbox">
1458
1459 <button class="handlediv button-link" aria-expanded="true" type="button">
1460 <span class="screen-reader-text">Toggle panel: Whitelist IP</span>
1461 <span class="toggle-indicator" aria-hidden="true"></span>
1462 </button>
1463
1464 <h2 class="hndle ui-sortable-handle">
1465 <span><?php echo __('Whitelist IP', 'loginizer'); ?></span>
1466 </h2>
1467
1468 <div class="inside">
1469
1470 <?php echo __('Enter the IP you want to whitelist for login','loginizer'); ?>
1471 <form action="" method="post">
1472 <?php wp_nonce_field('loginizer-options'); ?>
1473 <table class="form-table">
1474 <tr>
1475 <th scope="row" valign="top"><label for="start_ip_w"><?php echo __('Start IP','loginizer'); ?></label></th>
1476 <td>
1477 <input type="text" size="25" value="<?php echo(lz_optpost('start_ip_w')); ?>" name="start_ip_w" id="start_ip_w"/> <?php echo __('Start IP of the range','loginizer'); ?> <br />
1478 </td>
1479 </tr>
1480 <tr>
1481 <th scope="row" valign="top"><label for="end_ip_w"><?php echo __('End IP (Optional)','loginizer'); ?></label></th>
1482 <td>
1483 <input type="text" size="25" value="<?php echo(lz_optpost('end_ip_w')); ?>" name="end_ip_w" id="end_ip_w"/> <?php echo __('End IP of the range. <br />If you want to whitelist single IP leave this field blank.','loginizer'); ?> <br />
1484 </td>
1485 </tr>
1486 </table><br />
1487 <input name="whitelist_iprange" class="button button-primary action" value="<?php echo __('Add Whitelist IP Range','loginizer'); ?>" type="submit" />
1488 </form>
1489 </div>
1490
1491 <table class="wp-list-table fixed striped users" border="0" width="95%" cellpadding="10" align="center">
1492 <tr>
1493 <th scope="row" valign="top" style="background:#EFEFEF;"><?php echo __('Start IP','loginizer'); ?></th>
1494 <th scope="row" valign="top" style="background:#EFEFEF;"><?php echo __('End IP','loginizer'); ?></th>
1495 <th scope="row" valign="top" style="background:#EFEFEF;"><?php echo __('Date (DD/MM/YYYY)','loginizer'); ?></th>
1496 <th scope="row" valign="top" style="background:#EFEFEF;" width="100"><?php echo __('Options','loginizer'); ?></th>
1497 </tr>
1498 <?php
1499 if(empty($loginizer['whitelist'])){
1500 echo '
1501 <tr>
1502 <td colspan="4">
1503 No Whitelist IPs. You will see whitelisted IP ranges here.
1504 </td>
1505 </tr>';
1506 }else{
1507 foreach($loginizer['whitelist'] as $ik => $iv){
1508 echo '
1509 <tr>
1510 <td>
1511 '.$iv['start'].'
1512 </td>
1513 <td>
1514 '.$iv['end'].'
1515 </td>
1516 <td>
1517 '.date('d/m/Y', $iv['time']).'
1518 </td>
1519 <td>
1520 <a class="submitdelete" href="admin.php?page=loginizer_brute_force&delid='.$ik.'" onclick="return confirm(\'Are you sure you want to delete this IP range ?\')">Delete</a>
1521 </td>
1522 </tr>';
1523 }
1524 }
1525 ?>
1526 </table>
1527 <br />
1528
1529 </div>
1530
1531 <?php
1532
1533 loginizer_page_footer();
1534
1535 }
1536
1537
1538 // Sorry to see you going
1539 register_uninstall_hook(LOGINIZER_FILE, 'loginizer_deactivation');
1540
1541 function loginizer_deactivation(){
1542
1543 global $wpdb;
1544
1545 $sql = array();
1546 $sql[] = "DROP TABLE ".$wpdb->prefix."loginizer_logs;";
1547
1548 foreach($sql as $sk => $sv){
1549 $wpdb->query($sv);
1550 }
1551
1552 delete_option('loginizer_version');
1553 delete_option('loginizer_options');
1554 delete_option('loginizer_last_reset');
1555 delete_option('loginizer_whitelist');
1556 delete_option('loginizer_blacklist');
1557
1558 }
1559
1560