PluginProbe
Loginizer / 1.1.0
Loginizer v1.1.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.1.0, at init.php

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