/** * Iniciamos sessión con un usuario. * @param string $mail E-Mail * @param string $password Contraseña * @return int Estado de la cuenta. -1 Si los datos son inválidos. */ public function login($mail, $password) { $rst = $this->db->query('SELECT id, nick, password, email, estado FROM usuario WHERE email = ? OR nick = ? LIMIT 1', array($mail, $mail)); // Verificamos que exista el usuario. if ($rst->num_rows() > 0) { // Obtenemos la información. $data = $rst->get_record(Database_Query::FETCH_ASSOC, array('id' => Database_Query::FIELD_INT, 'estado' => Database_Query::FIELD_INT)); // Verificamos la contraseña. $enc = new Phpass(8, FALSE); if (!$enc->check_password($password, $data['password']) == TRUE) { return -1; } // Verificamos el estado. switch ($data['estado']) { case self::ESTADO_SUSPENDIDA: // Cuenta suspendida. $this->primary_key['id'] = $data['id']; $suspension = $this->suspension(); if ($suspension === NULL) { $this->actualizar_estado(self::ESTADO_ACTIVA); $data['estado'] = self::ESTADO_ACTIVA; } else { // Verificamos si terminó. if ($suspension->restante() <= 0) { $suspension->anular(); $this->actualizar_estado(self::ESTADO_ACTIVA); $data['estado'] = self::ESTADO_ACTIVA; } else { break; } } case self::ESTADO_BANEADA: // Cuenta baneada. // Verificamos por paso de suspendida. if ($data['estado'] == self::ESTADO_BANEADA) { $this->primary_key['id'] = $data['id']; if ($this->baneo() === NULL) { $this->actualizar_estado(self::ESTADO_ACTIVA); $data['estado'] = self::ESTADO_ACTIVA; } break; } case self::ESTADO_ACTIVA: // Cuenta activa. // IP del usuario. $ip = ip2long(IP::get_ip_addr()); // Seteamos el usuario actual. $this->primary_key['id'] = $data['id']; // Iniciamos la sessión. Usuario::login($this, $ip); // Actualizamos el inicio de session. $this->db->update('UPDATE usuario SET lastlogin = ?, lastactive = ?, lastip = ? WHERE id = ?', array(date('Y/m/d H:i:s'), date('Y/m/d H:i:s'), $ip, $this->primary_key['id'])); break; case self::ESTADO_PENDIENTE: // Cuenta por activar. break; default: throw new Exception("El estado del usuario {$data['id']} es {$data['estado']} y no se puede manejar."); } // Informamos el estado. return $data['estado']; } else { // No existe el usuario. return -1; } }
/** * Configuración del modo mantenimiento. */ public function action_mantenimiento() { // Cargamos la vista. $vista = View::factory('admin/configuracion/mantenimiento'); // Cargo manejador del modo mantenimiento. $mantenimiento = new Mantenimiento(); // Cargo listado de IP's que pueden acceder en modo mantenimiento. $model_configuracion = new Model_Configuracion(); $ips_matenimiento = unserialize($model_configuracion->get('ip_mantenimiento', 'a:0:{}')); // Pasamos los datos a la vista. $vista->assign('ip', implode(PHP_EOL, $ips_matenimiento)); $vista->assign('error_ip', FALSE); $vista->assign('success_ip', FALSE); if (Request::method() == 'POST') { // Obtengo el listado de IP's. $ips = isset($_POST['ip']) ? explode(PHP_EOL, trim($_POST['ip'])) : array(); // Verifico cada uno de los IP's. $error = FALSE; foreach ($ips as $k => $ip) { $ip = trim($ip); $ips[$k] = $ip; // Verifico IP. if ($ip == long2ip(ip2long($ip))) { continue; } // Verifico rango del tipo a.b.c.d-a.b.c.d if (strpos($ip, '-')) { list($a, $b) = explode('-', $ip); if ($a != long2ip(ip2long($a)) || $b != long2ip(ip2long($b))) { $error = TRUE; break; } else { continue; } } $error = TRUE; break; //TODO: agregar soporte a rangos faltantes (CIFS /netmask, *). } // Asigno valor a la vista. $vista->assign('ip', implode(PHP_EOL, $ips)); if ($error) { $vista->assign('error_ip', 'Los IP\'s ingresados no son válidos.'); } else { // Verifico si hay cambios. if (count(array_diff($ips, $ips_matenimiento)) > 0) { // Actualizo los valores. $model_configuracion->ip_mantenimiento = serialize($ips); $ips_matenimiento = $ips; // Actualizo si es necesario. if ($mantenimiento->is_locked()) { $mantenimiento->lock($ips); } // Informo resultado. $vista->assign('success_ip', 'Listado de IP\'s actualizada correctamente.'); } } } // Verifico si está habilitado el bloqueo. $vista->assign('is_locked', $mantenimiento->is_locked()); if ($mantenimiento->is_locked()) { $locked_for_me = $mantenimiento->is_locked_for(IP::get_ip_addr()); } else { $locked_for_me = TRUE; $my_ip = IP::get_ip_addr(); foreach ($ips_matenimiento as $ip) { if ($my_ip == $ip || IP::ip_in_range($my_ip, $ip)) { $locked_for_me = FALSE; break; } } unset($my_ip); } $vista->assign('is_locked_for_me', $locked_for_me); unset($locked_for_me); // Seteamos el menu. $this->template->assign('master_bar', parent::base_menu('admin')); // Cargamos plantilla administracion. $admin_template = View::factory('admin/template'); $admin_template->assign('contenido', $vista->parse()); unset($portada); $admin_template->assign('top_bar', Controller_Admin_Home::submenu('configuracion_mantenimiento')); // Asignamos la vista a la plantilla base. $this->template->assign('contenido', $admin_template->parse()); }
// Verifico MCrypt. extension_loaded('mcrypt') || die('Marifa necesita MCrypt para funcionar.'); // Inicio logs. Log::setup(APP_BASE . DS . 'log', '%d-%m-%Y.log', PRODUCTION ? Log::INFO : Log::DEBUG); // Iniciamos las cookies. Cookie::start('secret_cookie_key'); // Iniciamos el usuario. Usuario::start(); // Cargo el tema actual. define('THEME', Theme::actual()); // Iniciamos el manejo de errores. Error::get_instance()->start(DEBUG); // Verificamos bloqueos. $lock = new Mantenimiento(); if ($lock->is_locked()) { if ($lock->is_locked_for(IP::get_ip_addr())) { //TODO: utilizar vista para dar flexibilidad. die("Modo mantenimiento activado."); } } // Definimos el directorio temporal. Puede definir uno manualmente. define('TMP_PATH', Update_Utils::sys_get_temp_dir() . DS); // Comprobamos que exista la configuración de la base de datos. if (!file_exists(CONFIG_PATH . DS . 'database.php')) { //TODO: lo mandamos al instalador. die("Falta configurar la base de datos"); } // Cargamos la cache. Cache::get_instance(); // Cargamos las configuraciones del gestor de actualizaciones. if (file_exists(CONFIG_PATH . DS . 'update.php')) {