<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 
/**
 * Libreria para Autenticación de Usuarios
 *
 * PHP version 5
 *
 * @category  CodeIgniter
 * @package   Flexigrid CI
 * @author    Emilia Garcia (milig@netsun.com.ar)
 * @version   0.1
*/
class Sec_Validation
{
	private $error = array();

	function __construct()
	{
		$this->ci =& get_instance();
		$this->ci->load->library('encrypt');		
		$this->ci->load->model('model_users');
		$this->ci->load->config('sec_validation', TRUE);		
	
	}
	
		/**
	 * Login user on the site. Return TRUE if login is successful
	 * (usuario existe, está activo, no está bloqueado y password correcta), otherwise FALSE.
	 *
	 * @param	string	(username)
	 * @param	string
	 * @param	bool
	 * @return	bool
	 */
	function login($username, $password)
	{
		if ((strlen($username) > 0) AND (strlen($password) > 0)) {
			
			if (!is_null($usuario = $this->ci->model_users->get_user_by_username_email($username))) {	// usuario existe
		
					// Validar Pass
					$passdec = $this->ci->encrypt->decode($usuario->password);
					if ($passdec != $password){					 								// fail - wrong password
							$this->increase_login_attempt($username);
							if ($this->is_max_login_attempts_user_exceeded($username) & $username != 'admin') {
								// Debe bloquear el usuario si no es admin 
								$this->ci->model_users->lock_user($usuario->id);
							}
							$this->error = array('password' => 'sec_incorrect_login');
							return false;			
					}
				
					// Validar Activo
					if (!$usuario->activo) {													// fail - Usuario Inactivo
							$this->error = array('user_non_active' => 'sec_incorrect_not_active');
							return false;
					}
					
					// Validar Bloqueado
					if ($usuario->bloqueado) {													// fail - Usuario Bloqueado
							// Incrementar Login Attemps para este usuario
							$this->error = array('user_blocked' => 'sec_incorrect_blocked');
							return false;
					}					
					
					
					// Pasó todas las validaciones    
					//==> Blanquea los Login attemps
					$this->clear_login_attempts($username);
					//==> Carga Sessions					
					$this->ci->session->set_userdata(array(
							'usuario_logueado' => 1,
							'usuario_id'	=> $usuario->id,
							'usuario_username'	=> $usuario->username,
							'usuario_nombre' => $usuario->nombre,
							'usuario_nombre_apellido' => trim($usuario->nombre." ".$usuario->apellido),
							'usuario_cambio_password' => $usuario->cambio_password,
							'usuario_fecha_vencimiento_password' => $usuario->fecha_vencimiento_password,
							'usuario_id_tipo' => $usuario->id_usuario_tipo,
							'usuario_tipos_id' => $usuario->usuario_tipos_id,
							'usuario_idioma' => $usuario->idioma,
							'usuario_lenguaje' => $usuario->lenguaje
							//'usuario_id_perfil' => $usuario->id_perfil
							));
					// Carga Sessions para viejo Sitio
					ini_set("session.cookie_lifetime","7200");
					ini_set("session.gc_maxlifetime","7200");
					session_start();
					$_SESSION['usuario_login'] = true;
					$_SESSION['usuario_username'] = $this->ci->session->userdata('usuario_username');
					$_SESSION['usuario_nombre'] = $this->ci->session->userdata('usuario_nombre');
					$_SESSION['usuario_tipos_id'] = $this->ci->session->userdata('usuario_tipos_id');

					
					// Debe actualizar datos de inicio de sesion
					$this->ci->model_users->update_login_info($usuario->id);

					return true;
					
			} else {
				$this->increase_login_attempt($username);
				$this->error = array('password' => 'sec_incorrect_login');
				return false;
			}
		}
	
	
	}


	function login_check_password($username, $password)
	{
		if ((strlen($username) > 0) AND (strlen($password) > 0)) {
			
			if (!is_null($usuario = $this->ci->model_users->get_user_by_username($username))) {	// usuario existe
		
					// Validar Pass
					$passdec = $this->ci->encrypt->decode($usuario->password);
					if ($passdec == $password){return TRUE;}
			}
		}
		
		return FALSE;
	}
	
	// Check page access
	
	function login_check_access ($id, $page, $action= null)
	{
		return $this->ci->model_users->can_access($id,$page,$action);
		
	}
	
	
	function change_password($id, $username, $password)
	{
		if ((strlen($password) > 0)) {
			if ($this->ci->model_users->set_password($id, $password,0)) {
				
				if (!is_null($usuario = $this->ci->model_users->get_user_by_username($username))){
							$this->ci->session->set_userdata(array(
							'usuario_cambio_password' => $usuario->cambio_password,
							'usuario_fecha_vencimiento_password' => $usuario->fecha_vencimiento_password));
							}	
							
				return TRUE;	
			}
		}
		
		return FALSE;
	}

	/**
	 * Logout usuario del Sitio
	 *
	 * @return	void
	 */
	function logout()
	{
		// See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line
		//$this->ci->session->set_userdata(array('user_id' => '', 'username' => '', 'status' => ''));
		$this->ci->session->sess_destroy();
	}

	private function increase_login_attempt($login)
	{
		if (!$this->is_max_login_attempts_exceeded($login)) {
			$this->ci->load->model('login_attempts');
			$this->ci->login_attempts->increase_attempt($this->ci->input->ip_address(), $login);
		}
	}

	function is_max_login_attempts_exceeded($login)
	{
		$this->ci->load->model('login_attempts');
		$attempts_num = $this->ci->login_attempts->get_attempts_num($this->ci->input->ip_address(), $login);
		$max_attempts = $this->ci->config->item('login_max_attempts', 'sec_validation');
		if ($attempts_num >= $max_attempts) {return true ;}
		return FALSE;
	}
	
	function is_max_login_attempts_user_exceeded($login)
	{
		$this->ci->load->model('login_attempts');
		return $this->ci->login_attempts->get_attempts_num($this->ci->input->ip_address(), $login)
				>= $this->ci->config->item('login_max_attempts_by_user', 'sec_validation');
		return FALSE;
	}

	private function clear_login_attempts($login)
	{
			$this->ci->load->model('login_attempts');
			$this->ci->login_attempts->clear_attempts(
					$this->ci->input->ip_address(),
					$login,
					$this->ci->config->item('login_attempt_expire', 'sec_validation'));
	}
	




	/**
	 * Devolver mensajes de error
	 * 	 *
	 * @return	string
	 */
	function get_error_message()
	{
		return $this->error;
	}




}