/** * 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()); }
/** * 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; } }