.
*/
if(!function_exists('add_action')){
echo 'You are not allowed to access this page directly.';
exit;
}
define('lz_version', '1.0');
include_once('functions.php');
// Ok so we are now ready to go
register_activation_hook( __FILE__, 'loginizer_activation');
function loginizer_activation(){
global $wpdb;
$sql = array();
$sql[] = "
--
-- Table structure for table `".$wpdb->prefix."lz_failed_logs`
--
CREATE TABLE `".$wpdb->prefix."lz_failed_logs` (
`username` varchar(255) NOT NULL DEFAULT '',
`time` int(10) NOT NULL DEFAULT '0',
`count` int(10) NOT NULL DEFAULT '0',
`lockout` int(10) NOT NULL DEFAULT '0',
`ip` varchar(255) NOT NULL DEFAULT '',
UNIQUE KEY `ip` (`ip`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;";
$sql[] = "
--
-- Table structure for table `".$wpdb->prefix."lz_options`
--
CREATE TABLE IF NOT EXISTS `".$wpdb->prefix."lz_options` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`option_name` varchar(255) NOT NULL,
`option_value` varchar(255) NOT NULL,
`updated` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `option_name` (`option_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;";
$sql[] = "
--
-- Table structure for table `".$wpdb->prefix."lz_iprange`
--
CREATE TABLE IF NOT EXISTS `".$wpdb->prefix."lz_iprange` (
`rid` int(10) NOT NULL AUTO_INCREMENT,
`start` bigint(20) NOT NULL,
`end` bigint(20) NOT NULL,
`blacklist` tinyint(2) NOT NULL DEFAULT '0',
`whitelist` tinyint(2) NOT NULL DEFAULT '0',
`date` int(10) NOT NULL,
PRIMARY KEY (`rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;";
foreach($sql as $sk => $sv){
$wpdb->query($sv);
}
add_option('lz_version', lz_version);
}
add_action( 'plugins_loaded', 'loginizer_load_plugin' );
function loginizer_update_check(){
global $wpdb;
$sql = array();
$current_version = get_option('lz_version');
if($current_version < lz_version){
foreach($sql as $sk => $sv){
$wpdb->query($sv);
}
update_option('lz_version', lz_version);
}
}
function loginizer_load_plugin(){
global $lz_globals;
loginizer_update_check();
$lz_globals = array();
$lz_globals['lz_max_retries'] = lz_get_option('lz_max_retries', 3);
$lz_globals['lz_lockout_time'] = lz_get_option('lz_lockout_time', 900); // 15 minutes
$lz_globals['lz_max_lockouts'] = lz_get_option('lz_max_lockouts', 5);
$lz_globals['lz_lockouts_extend'] = lz_get_option('lz_lockouts_extend', 86400); // 24 hours
$lz_globals['lz_reset_retries'] = lz_get_option('lz_reset_retries', 86400); // 24 hours
$lz_globals['lz_last_reset'] = lz_get_option('lz_last_reset', 0); // 24 hours
$lz_globals['lz_notify_email'] = lz_get_option('lz_notify_email', 0);
// Clear retries
if((time() - $lz_globals['lz_last_reset']) >= $lz_globals['lz_reset_retries']){
lz_reset_retries();
}
$lz_globals['current_ip'] = lz_getip();
/* Filters and actions */
add_filter('wp_authenticate_user', 'lz_wp_authenticate_user', 99999, 2);// This is used for additional validation
add_action('wp_login_failed', 'lz_login_failed');// Update our records login failed
add_action('wp_authenticate', 'lz_wp_authenticate', 10, 2);// Use this to verify before WP tries to login
add_action('login_errors', 'lz_update_error_msg');// Update Error message
}
function lz_wp_authenticate_user($user, $username){
global $lz_error, $lz_cannot_login;
if(is_wp_error($user) || empty($lz_cannot_login)){
return $user;
}
$error = new WP_Error();
$error->add('ip_blocked', implode('', $lz_error));
return $error;
}
function lz_wp_authenticate($username, $password){
global $lz_error, $lz_cannot_login, $lz_user_pass;
if(!empty($username) && !empty($password)){
$lz_user_pass = 1;
}
// Are you whitelisted ?
if(lz_is_whitelisted()){
return $username;
}
// Are you blacklisted ?
if(lz_is_blacklisted()){
$lz_cannot_login = 1;
$error = new WP_Error();
$error->add('ip_blacklisted', implode('', $lz_error));
return $error;
}
if(lz_can_login()){
return $username;
}
$lz_cannot_login = 1;
$error = new WP_Error();
$error->add('ip_blocked', implode('', $lz_error));
return $error;
}
function lz_can_login(){
global $wpdb, $lz_globals, $lz_error;
// Get the logs
$result = lz_selectquery("SELECT * FROM `".$wpdb->prefix."lz_failed_logs` WHERE `ip` = '".$lz_globals['current_ip']."';");
if(!empty($result['count']) && $result['count'] >= $lz_globals['lz_max_retries']){
// Has he reached max lockouts ?
if($result['lockout'] >= $lz_globals['lz_max_lockouts']){
$lz_globals['lz_lockout_time'] = $lz_globals['lz_lockouts_extend'];
}
// Is he in the lockout time ?
if($result['time'] >= time() - $lz_globals['lz_lockout_time']){
$banlift = ceil((($result['time'] + $lz_globals['lz_lockout_time']) - time()) / 60);
//echo 'Current Time '.date('m/d/Y H:i:s', time()).'
';
//echo 'Last attempt '.date('m/d/Y H:i:s', $result['time']).'
';
//echo 'Unlock Time '.date('m/d/Y H:i:s', $result['time'] + $lz_globals['lz_lockout_time']).'
';
$_time = $banlift.' minute(s)';
if($banlift > 60){
$banlift = ceil($banlift / 60);
$_time = $banlift.' hour(s)';
}
$lz_error['ip_blocked'] = 'You have exceeded maximum login retries
Please try after '.$_time;
return false;
}
}
if(!empty($result['count']) && $result['count'] < $lz_globals['lz_max_retries']){
$lz_globals['lz_retries_left'] = $lz_globals['lz_max_retries'] - $result['count'];
}
return true;
}
function lz_is_blacklisted(){
global $wpdb, $lz_globals, $lz_error;
// Get the logs
$result = lz_selectquery("SELECT * FROM `".$wpdb->prefix."lz_iprange` WHERE (".ip2long($lz_globals['current_ip'])." BETWEEN `start` AND `end`) AND `blacklist` = '1';");
// You are blacklisted
if(!empty($result)){
$lz_error['ip_blacklisted'] = 'Your IP has been blacklisted';
return true;
}
return false;
}
function lz_is_whitelisted(){
global $wpdb, $lz_globals, $lz_error;
// Get the logs
$result = lz_selectquery("SELECT * FROM `".$wpdb->prefix."lz_iprange` WHERE (".ip2long($lz_globals['current_ip'])." BETWEEN `start` AND `end`) AND `whitelist` = '1';");
// You are whitelisted
if(!empty($result)){
return true;
}
return false;
}
function lz_login_failed($username){
global $wpdb, $lz_globals, $lz_cannot_login;
if(empty($lz_cannot_login)){
$result = lz_selectquery("SELECT * FROM `".$wpdb->prefix."lz_failed_logs` WHERE `ip` = '".$lz_globals['current_ip']."';");
if(!empty($result)){
$lockout = floor(($result['count'] / $lz_globals['lz_max_retries']));
$sresult = $wpdb->query("UPDATE `".$wpdb->prefix."lz_failed_logs` SET `username` = '".$username."', `time` = '".time()."', `count` = `count`+1, `lockout` = '".$lockout."' WHERE `ip` = '".$lz_globals['current_ip']."';");
// Do we need to email admin ?
$lz_globals['lz_notify_email'] = 4;
if(!empty($lz_globals['lz_notify_email']) && $lockout >= $lz_globals['lz_notify_email']){
$sitename = lz_is_multisite() ? get_site_option('site_name') : get_option('blogname');
$mail = array();
$mail['to'] = lz_is_multisite() ? get_site_option('admin_email') : get_option('admin_email');
$mail['subject'] = 'Failed Login Attempts from IP '.$lz_globals['current_ip'].' ('.$sitename.')';
$mail['message'] = 'Hi,
'.($result['count']+1).' failed login attempts and '.$lockout.' lockout(s) from IP '.$lz_globals['current_ip'].'
Last Login Attempt : '.date('d/m/Y H:i:s', time()).'
Last User Attempt : '.$username.'
IP has been blocked until : '.date('m/d/Y H:i:s', time() + $lz_globals['lz_lockout_time']).'
Regards,
Loginizer';
@wp_mail($mail['to'], $mail['subject'], $mail['message']);
}
}else{
$result = $wpdb->query("INSERT INTO `".$wpdb->prefix."lz_failed_logs` SET `username` = '".$username."', `time` = '".time()."', `count` = '1', `ip` = '".$lz_globals['current_ip']."', `lockout` = '0';");
}
}
}
function lz_update_error_msg($default_msg){
global $wpdb, $lz_globals, $lz_user_pass, $lz_cannot_login;
$msg = '';
if(!empty($lz_user_pass) && empty($lz_cannot_login)){
$msg = 'ERROR: Incorrect Username or Password';
if(!empty($lz_globals['lz_retries_left'])){
$msg .= '
'.$lz_globals['lz_retries_left'].' attempt(s) left';
}
}
if(!empty($msg)){
return $msg;
}else{
return $default_msg;
}
}
function lz_reset_retries(){
global $wpdb, $lz_globals;
$deltime = time() - $lz_globals['lz_reset_retries'];
$result = $wpdb->query("DELETE FROM `".$wpdb->prefix."lz_failed_logs` WHERE `time` <= '".$deltime."';");
lz_update_option('lz_last_reset', time());
}
// Add settings link on plugin page
function lz_settings_link($links) {
$settings_link = 'Settings';
array_unshift($links, $settings_link);
return $links;
}
$plugin = plugin_basename(__FILE__);
add_filter("plugin_action_links_$plugin", 'lz_settings_link' );
add_action('admin_menu', 'loginizer_admin_menu');
function loginizer_admin_menu() {
global $wp_version;
// Modern WP?
if (version_compare($wp_version, '3.0', '>=')) {
add_options_page('Loginizer', 'Loginizer', 'manage_options', 'loginizer', 'loginizer_option_page');
return;
}
// Older WPMU?
if (function_exists("get_current_site")) {
add_submenu_page('wpmu-admin.php', 'Loginizer', 'Loginizer', 9, 'loginizer', 'loginizer_option_page');
return;
}
// Older WP
add_options_page('Loginizer', 'Loginizer', 9, 'loginizer', 'loginizer_option_page');
}
function loginizer_option_page(){
global $wpdb, $wp_roles, $lz_globals;
if(!current_user_can('manage_options')){
wp_die('Sorry, but you do not have permissions to change settings.');
}
/* Make sure post was from this page */
if(count($_POST) > 0){
check_admin_referer('loginizer-options');
}
if(isset($_POST['save_lz'])){
$lz_max_retries = (int) lz_optpost('lz_max_retries');
$lz_lockout_time = (int) lz_optpost('lz_lockout_time');
$lz_max_lockouts = (int) lz_optpost('lz_max_lockouts');
$lz_lockouts_extend = (int) lz_optpost('lz_lockouts_extend');
$lz_reset_retries = (int) lz_optpost('lz_reset_retries');
$lz_notify_email = (int) lz_optpost('lz_notify_email');
$lz_lockout_time = $lz_lockout_time * 60;
$lz_lockouts_extend = $lz_lockouts_extend * 60 * 60;
$lz_reset_retries = $lz_reset_retries * 60 * 60;
if(empty($error)){
lz_update_option('lz_max_retries', $lz_max_retries);
lz_update_option('lz_lockout_time', $lz_lockout_time);
lz_update_option('lz_max_lockouts', $lz_max_lockouts);
lz_update_option('lz_lockouts_extend', $lz_lockouts_extend);
lz_update_option('lz_reset_retries', $lz_reset_retries);
lz_update_option('lz_notify_email', $lz_notify_email);
$saved = true;
}else{
lz_report_error($error);
}
if(!empty($notice)){
lz_report_notice($notice);
}
if(!empty($saved)){
echo '
' . __('The settings were saved successfully', 'loginizer') . '
' . __('IP range has been deleted successfully', 'loginizer') . '
' . __('Blacklist IP range added successfully', 'loginizer') . '
' . __('There were some errors while adding the blacklist IP range', 'loginizer') . '
' . __('Whitelist IP range added successfully', 'loginizer') . '
' . __('There were some errors while adding the whitelist IP range', 'loginizer') . '
| No Logs. You will see logs about failed login attempts here. | '; }else{ foreach($result as $ik => $iv){ $status_button = (!empty($iv['status']) ? 'disable' : 'enable'); echo '|||
| '.$iv['ip'].' | '.date('d/m/Y H:i:s', $iv['time']).' | '.$iv['count'].' | '.$iv['lockout'].' |
| No Blacklist IPs. You will see blacklisted IP ranges here. | '; }else{ foreach($blacklist_ips as $ik => $iv){ echo '|||
| '.long2ip($iv['start']).' | '.long2ip($iv['end']).' | '.date('d/m/Y', strtotime($iv['date'])).' | Delete |
| No Whitelist IPs. You will see whitelisted IP ranges here. | '; }else{ foreach($whitelist_ips as $ik => $iv){ echo '|||
| '.long2ip($iv['start']).' | '.long2ip($iv['end']).' | '.date('d/m/Y', strtotime($iv['date'])).' | Delete |