Пример #1
0
 /**
  * Administración de los nicks del usuario.
  */
 public function action_nick()
 {
     // Asignamos el título.
     $this->template->assign('title', 'Cuenta - Nick');
     // Cargamos la vista.
     $view = View::factory('cuenta/nick');
     // Cargamos el usuario actual.
     $model_usuario = Usuario::usuario();
     $view->assign('email', $model_usuario->email);
     // Valores por defecto.
     $view->assign('nick_actual', $model_usuario->nick);
     $view->assign('nick', '');
     $view->assign('error_nick', NULL);
     $view->assign('error_password', NULL);
     // Listado de nick's reservados.
     $nicks_reservados = $model_usuario->nicks();
     //TODO: Mantener nick's para evitar borrar y poder cambiar.
     //TODO: Mantener nicks por un tiempo limitado.
     // Calculo cuanto hace que cambio su nick.
     if (count($nicks_reservados) !== 0) {
         $fecha_cambio = Usuario::usuario()->ultimo_cambio_nick()->format('U');
     } else {
         // Obtengo fecha de refgistro.
         $fecha_cambio = Usuario::usuario()->registro->format('U');
     }
     // 5184000 === 2 meses.
     $view->assign('tiempo_cambio', $fecha_cambio + 5184000 - date('U'));
     if (Request::method() == 'POST') {
         if (!isset($_POST['nick']) || empty($_POST['nick']) || (!isset($_POST['password']) || empty($_POST['password']))) {
             // Verificamos los datos
             if (!isset($_POST['nick']) || empty($_POST['nick'])) {
                 $view->assign('error_nick', 'Debe ingresar un nuevo nick.');
             } else {
                 $view->assign('nick', $_POST['nick']);
             }
             if (!isset($_POST['password']) || empty($_POST['password'])) {
                 $view->assign('error_password', 'Debe ingresar su contraseña para validar el cambio.');
             }
         } else {
             $nick = $_POST['nick'];
             $password = $_POST['password'];
             $view->assign('nick', $nick);
             // Verifico longitud Nick.
             if (!preg_match('/^[a-zA-Z0-9]{4,20}$/D', $nick)) {
                 $view->assign('error_nick', 'El nick debe tener entre 4 y 20 caracteres alphanuméricos.');
             } else {
                 // Verifico la contraseña.
                 $enc = new Phpass(8, FALSE);
                 if (!$enc->check_password($password, $model_usuario->password)) {
                     $view->assign('error_password', 'La contraseña es incorrecta.');
                 } else {
                     // Verifico que no exista el nick.
                     if ($model_usuario->exists_nick($nick)) {
                         $view->assign('error_nick', 'El nick no está disponible.');
                     } else {
                         // Verifico la cantidad de nick's.
                         if (count($nicks_reservados) >= 3) {
                             $view->assign('error_nick', 'Has superado el máximo de nick\'s utilizados.');
                         } else {
                             // Verifico tiempo de cambio.
                             if ($fecha_cambio + 5184000 - date('U') <= 0) {
                                 // Actualizamos.
                                 $model_usuario->cambiar_nick($nick);
                                 // Recargo los nick's reservados.
                                 $nicks_reservados = $model_usuario->nicks();
                                 // Envio el suceso.
                                 $model_suceso = new Model_Suceso();
                                 //TODO: Implementar campos alphanumericos.
                                 $model_suceso->crear(Usuario::$usuario_id, 'usuario_cambio_nick', Usuario::$usuario_id);
                                 // Informamos resultado.
                                 $view->assign('success', 'El nick se ha actualizado correctamente.');
                                 $view->assign('nick', '');
                                 $view->assign('nick_actual', $nick);
                             } else {
                                 $view->assign('error_nick', 'Solo puedes cambiar tu nick cada 2 meses.');
                             }
                         }
                     }
                 }
             }
         }
     }
     // Cargo listado de nicks.
     $view->assign('nicks', $nicks_reservados);
     // Menu.
     $this->template->assign('master_bar', parent::base_menu('inicio'));
     $this->template->assign('top_bar', $this->submenu('nick'));
     // Asignamos la vista.
     $this->template->assign('contenido', $view->parse());
 }
Пример #2
0
 /**
  * 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;
     }
 }