From df138cf8bb14de463e641572ad296cd988d67515 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 9 Oct 2012 11:44:12 +0000 Subject: [PATCH] =?UTF-8?q?-=20Revisi=C3=B3n=20del=20c=C3=B3digo=20en=20ge?= =?UTF-8?q?neral=20-=20Tarea=20#1099=20->=20Mejorar=20la=20encriptaci?= =?UTF-8?q?=C3=B3n=20de=20las=20contrase=C3=B1as=20-=20Tarea=20#1104=20->?= =?UTF-8?q?=20Guardar=20en=20el=20usuario=20la=20fecha=20de=20creaci=C3=B3?= =?UTF-8?q?n=20y=20del=20=C3=BAltimo=20login=20-=20Tarea=20#1125=20->=20Qu?= =?UTF-8?q?itar=20la=20m=C3=A1scara=20en=20el=20campo=20'tel=C3=A9fono'=20?= =?UTF-8?q?del=20usuario?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://192.168.0.254/svn/Proyectos.Incam_PROFIND_Web/trunk@57 3fe1ab16-cfe0-e34b-8c9f-7d8c168d430d --- www/protected/components/Controller.php | 59 +- .../components/IdentificacionUsuario.php | 31 +- www/protected/components/UsuarioWeb.php | 58 +- www/protected/config/main.php | 7 + www/protected/config/mode_development.php | 6 +- .../controllers/EmpresaController.php | 14 +- .../controllers/EquipoController.php | 72 +-- .../controllers/RegistroUsuarioController.php | 327 ----------- .../SeguridadUsuarioController.php | 82 --- www/protected/controllers/SiteController.php | 2 +- .../controllers/UsuarioController.php | 509 ++++++++++++++++-- www/protected/helpers/EMail.php | 141 +++++ www/protected/helpers/GHelper.php | 48 ++ .../helpers/recursive_remove_directory.php | 46 -- .../m120927_143321_tbl_productos.php | 12 +- www/protected/models/Empresa.php | 6 +- .../models/FormularioRegistroAgente.php | 8 - www/protected/models/Producto.php | 9 + www/protected/models/Usuario.php | 8 +- .../FormularioCambiarPassword.php | 6 +- .../FormularioEntradaCambiarPassword.php} | 2 +- .../FormularioEntradaRecuperarPassword.php} | 8 +- .../FormularioInvitarAgente.php | 0 .../{ => formularios}/FormularioLogin.php | 0 .../formularios/FormularioRegistroAgente.php | 8 + .../FormularioRegistroCoordinador.php} | 2 +- www/themes/profind/views/equipo/index.php | 14 +- www/themes/profind/views/usuario/_form.php | 2 +- .../cambiar_password.php | 0 .../confirmacion_cancelacion_usuario.php | 0 .../confirmacion_usuario.php | 0 .../error_confirmacion.php | 0 32 files changed, 852 insertions(+), 635 deletions(-) delete mode 100644 www/protected/controllers/RegistroUsuarioController.php create mode 100644 www/protected/helpers/EMail.php create mode 100644 www/protected/helpers/GHelper.php delete mode 100644 www/protected/helpers/recursive_remove_directory.php delete mode 100644 www/protected/models/FormularioRegistroAgente.php rename www/protected/models/{ => formularios}/FormularioCambiarPassword.php (77%) rename www/protected/models/{FormularioExtCambiarPassword.php => formularios/FormularioEntradaCambiarPassword.php} (93%) rename www/protected/models/{FormularioRecuperarPassword.php => formularios/FormularioEntradaRecuperarPassword.php} (84%) rename www/protected/models/{ => formularios}/FormularioInvitarAgente.php (100%) rename www/protected/models/{ => formularios}/FormularioLogin.php (100%) create mode 100644 www/protected/models/formularios/FormularioRegistroAgente.php rename www/protected/models/{FormularioRegistro.php => formularios/FormularioRegistroCoordinador.php} (92%) rename www/themes/profind/views/{seguridadUsuario => usuario}/cambiar_password.php (100%) rename www/themes/profind/views/{registroUsuario => usuario}/confirmacion_cancelacion_usuario.php (100%) rename www/themes/profind/views/{registroUsuario => usuario}/confirmacion_usuario.php (100%) rename www/themes/profind/views/{registroUsuario => usuario}/error_confirmacion.php (100%) diff --git a/www/protected/components/Controller.php b/www/protected/components/Controller.php index ee7d14d..c87b3e9 100644 --- a/www/protected/components/Controller.php +++ b/www/protected/components/Controller.php @@ -1,23 +1,44 @@ end(); + } + } + } \ No newline at end of file diff --git a/www/protected/components/IdentificacionUsuario.php b/www/protected/components/IdentificacionUsuario.php index 79f8241..7c0d822 100644 --- a/www/protected/components/IdentificacionUsuario.php +++ b/www/protected/components/IdentificacionUsuario.php @@ -1,8 +1,10 @@ findByAttributes(array('email' => $this->email)); @@ -50,8 +52,8 @@ class IdentificacionUsuario extends CBaseUserIdentity { $this->errorCode = self::ERROR_ESTADO_NOACTIVO; else if($usuario->estado == Usuario::ESTADO_BORRADO) $this->errorCode = self::ERROR_ESTADO_BORRADO; - else if($usuario->estado == Usuario::ESTADO_DENEGADO) - $this->errorCode = self::ERROR_ESTADO_DENEGADO; + else if($usuario->estado == Usuario::ESTADO_BLOQUEADO) + $this->errorCode = self::ERROR_ESTADO_BLOQUEADO; else { // Si el usuario tiene cifrada la contraseña con md5() // pasarla al nuevo método. @@ -67,23 +69,18 @@ class IdentificacionUsuario extends CBaseUserIdentity { } /** - * Returns the unique identifier for the identity. - * The default implementation simply returns {@link username}. - * This method is required by {@link IUserIdentity}. - * @return string the unique identifier for the identity. + * @brief Devuelve el identificador único para la identidad del usuario + * @return string. */ public function getId() { return $this->_id; } /** - * Returns the display name for the identity. - * The default implementation simply returns {@link username}. - * This method is required by {@link IUserIdentity}. - * @return string the display name for the identity. + * @brief Devuelve el email del usuario que está en sesión. + * @return string */ public function getName() { return $this->email; } - } \ No newline at end of file diff --git a/www/protected/components/UsuarioWeb.php b/www/protected/components/UsuarioWeb.php index 54905ff..36e2bbf 100644 --- a/www/protected/components/UsuarioWeb.php +++ b/www/protected/components/UsuarioWeb.php @@ -1,9 +1,19 @@ _model === null) && ($this->loadUser())) Usuario::model()->updateByPk($this->id, array( @@ -12,31 +22,62 @@ class UsuarioWeb extends CWebUser { return true; } + /** + * @brief ID de la empresa del usuario que está en sesión. + * @return integer + */ public function getId_empresa() { $usuario = $this->loadUser($this->id); return $usuario->id_empresa; } - + + /** + * @brief Comprueba si el usuario que está en sesión es coordinador o no. + * @return boolean + */ public function getEsCoordinador() { $usuario = $this->loadUser(); return ($usuario->tipo == Usuario::TIPO_USUARIO_COORDINADOR); } - + + /** + * @brief Comprueba si el usuario que está en sesión tiene/puede tener + * un equipo de agentes. + * @return boolean + */ public function getTieneEquipo() { $subscripcion = $this->loadSubscripcion(); - return ($subscripcion->producto->n_agentes > 0); + Yii::log(CVarDumper::dumpAsString($subscripcion), CLogger::LEVEL_ERROR); + + if ($subscripcion) + return ($subscripcion->producto->n_agentes > 0); + else + return false; } + /** + * @brief Devuelve la subscripción del usuario que está en sesión. + * @return Subscripcion + */ public function getSubscripcion() { return $this->loadSubscripcion(); } - + + /** + * @brief Devuelve el nombre del usuario que está en sesión. + * Si el usuario ha rellenado su nombre y apellidos, devuelve el nombre + * completo. Si no, devuelve la dirección e-mail del usuario. + * @return string + */ public function getName() { $usuario = $this->loadUser(); - return ($usuario->nombre) ? $usuario->nombreCompleto : parent::getName(); + return ($usuario && $usuario->nombre) ? $usuario->nombreCompleto : parent::getName(); } - // Load user model. + /** + * @brief Devuelve el usuario que ha hecho sesión. + * @return Usuario + */ protected function loadUser() { if ($this->_model === null) { $this->_model = Usuario::model()->findByPk($this->id); @@ -44,7 +85,10 @@ class UsuarioWeb extends CWebUser { return $this->_model; } - // Carga la subscripción activa + /** + * @brief Devuelve la subscripción activa del usuario que ha hecho sesión. + * @return Subscripcion + */ protected function loadSubscripcion() { return Subscripcion::model()->activa()->findByAttributes(array('id_usuario' => $this->id)); } diff --git a/www/protected/config/main.php b/www/protected/config/main.php index 5c23d90..183d274 100644 --- a/www/protected/config/main.php +++ b/www/protected/config/main.php @@ -20,7 +20,14 @@ $config = array( // autoloading model and component classes 'import' => array( + // Modelos 'application.models.*', + 'application.models.formularios.*', + + // Helpers + 'application.helpers.*', + + // Componentes y extensiones 'application.components.*', 'application.extensions.yii-mail.YiiMailMessage', 'application.extensions.PasswordHash.PasswordHash', diff --git a/www/protected/config/mode_development.php b/www/protected/config/mode_development.php index 435aef0..e64fe6b 100644 --- a/www/protected/config/mode_development.php +++ b/www/protected/config/mode_development.php @@ -85,12 +85,14 @@ $configSpecific = array( // Save log messages on file array( 'class' => 'CFileLogRoute', - 'levels' => 'error, warning', + 'levels' => 'error, warning, trace', + //'categories' => '*', ), // Show log messages on web pages array( 'class' => 'CWebLogRoute', - 'levels' => 'error, warning', + 'levels' => 'error, warning, trace', + //'categories' => 'application.*', 'showInFireBug' => true, ), ), diff --git a/www/protected/controllers/EmpresaController.php b/www/protected/controllers/EmpresaController.php index bdf621e..1cb2bc7 100644 --- a/www/protected/controllers/EmpresaController.php +++ b/www/protected/controllers/EmpresaController.php @@ -56,7 +56,7 @@ class EmpresaController extends Controller { $empresa = $this->loadModel($id); // Uncomment the following line if AJAX validation is needed - // $this->performAjaxValidation($model); + // $this->performAjaxValidation($model, 'empresa-form'); if (isset($_POST['Empresa'])) { $empresa->attributes = $_POST['Empresa']; @@ -128,16 +128,4 @@ class EmpresaController extends Controller { return $empresa; } - - /** - * Performs the AJAX validation. - * @param CModel the model to be validated - */ - protected function performAjaxValidation($model) { - if (isset($_POST['ajax']) && $_POST['ajax'] === 'empresa-form') { - echo CActiveForm::validate($model); - Yii::app()->end(); - } - } - } diff --git a/www/protected/controllers/EquipoController.php b/www/protected/controllers/EquipoController.php index 5016f34..06ee80e 100644 --- a/www/protected/controllers/EquipoController.php +++ b/www/protected/controllers/EquipoController.php @@ -19,9 +19,9 @@ class EquipoController extends Controller { public function accessRules() { return array( array('allow', - 'actions' => array('index', 'delete'), + 'actions' => array('index', 'deleteMember'), 'users' => array('@'), - 'expression' => 'Yii::app()->user->esCoordinador', + 'expression' => 'Yii::app()->user->esCoordinador', ), array('deny', // deny all users 'users' => array('*'), @@ -33,6 +33,7 @@ class EquipoController extends Controller { $invitacion = new FormularioInvitarAgente; if (isset($_POST['FormularioInvitarAgente'])) { + Yii::trace('Dar de alta un nuevo agente', 'application.controllers.EquipoController'); $invitacion->attributes = $_POST['FormularioInvitarAgente']; if ($invitacion->validate()) { @@ -46,7 +47,7 @@ class EquipoController extends Controller { $nuevo_usuario->clave_seguridad = $nuevo_usuario->encryptSecureKey(microtime() . $nuevo_usuario->password); if ($nuevo_usuario->save()) { - $this->enviarMailRegistroAgente($nuevo_usuario); + EMail::enviarBienvenidaAgente($nuevo_usuario->email, $nuevo_usuario->clave_seguridad); Yii::app()->user->setFlash('success', Yii::t('profind', 'Se ha enviado la invitación a la dirección') . ' ' . $invitacion->email); $invitacion = new FormularioInvitarAgente; } else { @@ -59,50 +60,38 @@ class EquipoController extends Controller { } $agentes = Usuario::model()->equipo()->findAll(); - + if (count($agentes) >= Yii::app()->user->subscripcion->producto->n_agentes) $invitacion = NULL; - + $this->render('index', array( 'agentes' => $agentes, 'invitacion' => $invitacion, )); } - - public function actionDelete($id) { - $agente = $this->loadModel($id); - if ($agente) $agente->delete(); - - // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser - if(!isset($_GET['ajax'])) - $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('index')); - } /** - * Envía un mail de registro a un usuario - * con una URL de confirmación. - * @param Usuario $usuario Usuario al que se le enviará el mail de registro + * @brief Elimina a un miembro (agente) del equipo. + * También envía un email al agente informándole. */ - private function enviarMailRegistroAgente($usuario) { - Yii::import('ext.yii-mail.YiiMailMessage'); - - $url_activacion = Yii::app()->params['frontpage'] . '?' . 'key=' . $usuario->clave_seguridad . '&email=' . urlencode($usuario->email) . '&x=1'; - - $mensaje = new YiiMailMessage; - $mensaje->from = Yii::app()->params['email_remitente']; - $mensaje->setTo($usuario->email); - $mensaje->subject = Yii::t('profind', 'Complete su registro de agente en PROFIND'); - $mensaje->view = 'registro_agente'; - $mensaje->setBody(array( - 'url' => $url_activacion, - 'email' => $usuario->email - ), 'text/html' - ); - - Yii::app()->mail->send($mensaje); + public function actionDeleteMember($id) { + $agente = $this->loadModel($id); + if ($agente) { + try { + Yii::trace('Eliminando el agente', 'application.controllers.EquipoController'); + $agente->delete(); + EMail::enviarConfirmacionCancelacion($agente->email); + Yii::app()->user->setFlash('success', Yii::t('profind', 'Se ha eliminado el agente')); + } catch (Exception $e) { + Yii::trace($e->getMessage(), 'application.controllers.UsuarioController'); + Yii::app()->user->setFlash('error', Yii::t('profind', 'Se ha producido un error al eliminar el agente')); + Yii::app()->user->setFlash('error', CHtml::errorSummary($agente)); + } + } + if (!isset($_GET['ajax'])) + $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('index')); } - - + /** * Returns the data model based on the primary key given in the GET variable. * If the data model is not found, an HTTP exception will be raised. @@ -115,15 +104,4 @@ class EquipoController extends Controller { return $model; } - /** - * Performs the AJAX validation. - * @param CModel the model to be validated - */ - protected function performAjaxValidation($model) { - if (isset($_POST['ajax']) && $_POST['ajax'] === 'usuario-form') { - echo CActiveForm::validate($model); - Yii::app()->end(); - } - } - } diff --git a/www/protected/controllers/RegistroUsuarioController.php b/www/protected/controllers/RegistroUsuarioController.php deleted file mode 100644 index d72dd8b..0000000 --- a/www/protected/controllers/RegistroUsuarioController.php +++ /dev/null @@ -1,327 +0,0 @@ - array('registrar', 'registrarAgente', 'activar', 'cancelar'), - 'users' => array('*') - ), - array('deny'), - ); - } - - /** - * Realiza el registro de un usuario a partir de los datos introducidos - * en el formulario de la página de entrada. - * También envía un email al usuario para que confirme su cuenta. - */ - public function actionRegistrar() { - $formulario = new FormularioRegistro; - $resultado = array(); - - // if it is ajax validation request - if (isset($_POST['ajax']) && $_POST['ajax'] === 'registro-form') { - - $formulario->email = $_POST['FormularioRegistro_email']; - $formulario->password = $_POST['FormularioRegistro_password']; - $formulario->password2 = $_POST['FormularioRegistro_password2']; - - if (!$formulario->validate()) { - foreach ($formulario->getErrors() as $campo => $error) { - $resultado[$campo] = $error; - } - echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado); - Yii::app()->end(); - } - - $nuevo_usuario = new Usuario('registrar'); - $nuevo_usuario->tipo = Usuario::TIPO_USUARIO_COORDINADOR; - $nuevo_usuario->email = $formulario->email; - $nuevo_usuario->password = $nuevo_usuario->encryptPassword($formulario->password); - $nuevo_usuario->estado = Usuario::ESTADO_NOACTIVO; - $nuevo_usuario->clave_seguridad = $nuevo_usuario->encryptSecureKey(microtime() . $nuevo_usuario->password); - - if (!$nuevo_usuario->save()) { - foreach ($nuevo_usuario->getErrors() as $campo => $error) { - $resultado[$campo] = $error; - } - echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado); - Yii::app()->end(); - } - - // Crear la empresa - $nueva_empresa = new Empresa('registrar'); - if (!$nueva_empresa->save()) { - foreach ($nueva_empresa->getErrors() as $campo => $error) { - $resultado[$campo] = $error; - } - echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado); - Yii::app()->end(); - } - $nuevo_usuario->id_empresa = $nueva_empresa->id; - if (!$nuevo_usuario->save()) { - foreach ($nuevo_usuario->getErrors() as $campo => $error) { - $resultado[$campo] = $error; - } - echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado); - Yii::app()->end(); - } - - // Crear la subscripción - $nueva_subscripcion = new Subscripcion('registrar'); - $nueva_subscripcion->estado = Subscripcion::ESTADO_ACTIVO; - $nueva_subscripcion->id_usuario = $nuevo_usuario->id; - $nueva_subscripcion->id_producto = 1; - if (!$nueva_subscripcion->save()) { - foreach ($nueva_subscripcion->getErrors() as $campo => $error) { - $resultado[$campo] = $error; - } - echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado); - Yii::app()->end(); - } - - if ($this->enviarMailRegistro($nuevo_usuario)) { - $resultado['status'] = '200'; - $resultado['titulo'] = Yii::t('profind', 'Gracias por registrarse en PRODIND'); - $resultado['texto'] = Yii::t('profind', 'Su cuenta ha sido creada. En unos momentos recibirá un email con un enlace para completar su registro.'); - } else { - $resultado['status'] = '200'; - $resultado['titulo'] = Yii::t('profind', 'Error en el registro'); - $resultado['texto'] = Yii::t('profind', 'No se ha podido enviar el correo de registro a la dirección indicada.'); - } - echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado); - Yii::app()->end(); - - } - - $this->redirect(Yii::app()->params['frontpage']); - } - - public function actionRegistrarAgente() { - $formulario = new FormularioRegistroAgente; - $resultado = array(); - - if (isset($_POST['ajax']) && $_POST['ajax'] === 'activar-agente-form-ext') { - $formulario->key = $_POST['FormularioActivarAgente_key']; - $formulario->email = $_POST['FormularioActivarAgente_email']; - $formulario->password = $_POST['FormularioActivarAgente_password']; - $formulario->passwordRepetida = $_POST['FormularioActivarAgente_password_repetida']; - - if ($formulario->validate()) { - $usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email)); - $usuario->estado = Usuario::ESTADO_ACTIVO; - $usuario->save(); - - if ($this->_cambiarPassword($usuario->id, $formulario->password)) { - $this->enviarMailConfirmacionActivacion($usuario); - $resultado['status'] = '200'; - $resultado['titulo'] = Yii::t('profind', 'Cuenta de agente activada'); - $resultado['texto'] = Yii::t('profind', 'Se ha activado su cuenta y se ha establecido su nueva password en PROFIND.'); - echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado); - Yii::app()->end(); - } else { - foreach ($formulario->getErrors() as $campo => $error) { - $resultado[$campo] = $error; - } - echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado); - Yii::app()->end(); - } - } else { - foreach ($formulario->getErrors() as $campo => $error) { - $resultado[$campo] = $error; - } - echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado); - Yii::app()->end(); - } - } - - $this->redirect(Yii::app()->params['frontpage']); - } - - private function _cambiarPassword($id, $nueva_password) { - $usuario = Usuario::model()->findByPk($id); - if (!isset($usuario)) - throw new CHttpException(404, Yii::t('profind', 'La página solicitada no existe.')); - - $usuario->password = $usuario->encryptPassword($nueva_password); - $usuario->clave_seguridad = $usuario->encryptSecureKey(microtime() . $usuario->password); - if ($usuario->save()) { - return true; - } else - return false; - } - - /** - * Activa la cuenta del usuario a partir de la URL de activación - * que se le ha enviado a través de un email. - */ - public function actionActivar() { - $email = $_GET['email']; - $clave_seguridad = $_GET['key']; - - if ($email && $clave_seguridad) { - $usuario = Usuario::model()->findByAttributes(array('email' => $email)); - - // Comprobamos si se ha encontrado un usuario con ese email - if (!isset($usuario)) { - $this->render('//site/error', array( - 'titulo' => Yii::t('profind', 'Error de activación'), - 'mensaje' => Yii::t('profind', 'No se puede activar la cuenta.
La URL de activación es incorrecta.'), - )); - } elseif ($usuario->estado == Usuario::ESTADO_ACTIVO) { - $this->render('//site/error', array( - 'titulo' => Yii::t('profind', 'Cuenta ya activada'), - 'mensaje' => Yii::t('profind', 'No se ha realizado ningún cambio.
La cuenta ya estaba activada.'), - )); - } elseif ($usuario->estado == Usuario::ESTADO_DENEGADO) { - $this->render('//site/error', array( - 'titulo' => Yii::t('profind', 'Cuenta bloqueada'), - 'mensaje' => Yii::t('profind', 'La cuenta ha sido bloqueada.
Contacte con el administrador del sitio para obtener más información.'), - )); - } elseif (isset($usuario->clave_seguridad) && ($usuario->clave_seguridad == $clave_seguridad)) { - // Hay que activar el usuario - $usuario->estado = Usuario::ESTADO_ACTIVO; - $usuario->clave_seguridad = $usuario->encryptSecureKey(microtime() . $usuario->password); - $usuario->save(); - - $this->enviarMailConfirmacionActivacion($usuario); - - $this->layout = '//layouts/mensaje'; - $this->render('confirmacion_usuario', array()); - } else { - $this->render('//site/error', array( - 'titulo' => Yii::t('profind', 'Error de activación'), - 'mensaje' => Yii::t('profind', 'No se puede activar la cuenta.
La URL de activación es incorrecta.'), - )); - } - } else { - $this->render('//site/error', array( - 'titulo' => Yii::t('profind', 'Error de activación'), - 'mensaje' => Yii::t('profind', 'No se puede activar la cuenta.
La URL de activación es incorrecta.'), - )); - } - } - - public function actionCancelar() { - $email = $_GET['email']; - $clave_seguridad = $_GET['key']; - - if ($email && $clave_seguridad) { - $usuario = Usuario::model()->findByAttributes(array('email' => $email)); - - // Comprobamos si se ha encontrado un usuario con ese email - if (!isset($usuario)) { - $this->render('//site/error', array( - 'titulo' => Yii::t('profind', 'Error de cancelación'), - 'mensaje' => Yii::t('profind', 'No se puede cancelar la cuenta.
La URL de cancelación es incorrecta.'), - )); - } elseif ($usuario->estado == Usuario::ESTADO_NOACTIVO) { - $this->render('//site/error', array( - 'titulo' => Yii::t('profind', 'Cuenta no confirmada'), - 'mensaje' => Yii::t('profind', 'No se ha realizado ningún cambio.
La cuenta no está confirmada.'), - )); - } elseif ($usuario->estado == Usuario::ESTADO_BORRADO) { - $this->render('//site/error', array( - 'titulo' => Yii::t('profind', 'Cuenta ya cancelada'), - 'mensaje' => Yii::t('profind', 'No se ha realizado ningún cambio.
La cuenta ya estaba cancelada.'), - )); - } elseif ($usuario->estado == Usuario::ESTADO_DENEGADO) { - $this->render('//site/error', array( - 'titulo' => Yii::t('profind', 'Cuenta bloqueada'), - 'mensaje' => Yii::t('profind', 'La cuenta ha sido bloqueada.
Contacte con el administrador del sitio para obtener más información.'), - )); - } elseif (isset($usuario->clave_seguridad) && ($usuario->clave_seguridad == $clave_seguridad)) { - // Hay que desactivar el usuario - $usuario->estado = Usuario::ESTADO_NOACTIVO; - $usuario->clave_seguridad = $usuario->encryptSecureKey(microtime() . $usuario->password); - $usuario->save(); - - $this->enviarMailConfirmacionCancelacion($usuario); - - $this->layout = '//layouts/mensaje'; - $this->render('confirmacion_cancelacion_usuario', array()); - } else { - $this->render('//site/error', array( - 'titulo' => Yii::t('profind', 'Error de cancelación'), - 'mensaje' => Yii::t('profind', 'No se puede cancelar la cuenta.
La URL de cancelación es incorrecta.'), - )); - } - } else { - $this->render('//site/error', array( - 'titulo' => Yii::t('profind', 'Error de cancelación'), - 'mensaje' => Yii::t('profind', 'No se puede cancelar la cuenta.
La URL de cancelación es incorrecta.'), - )); - } - } - - /** - * Envía un mail de registro a un usuario - * con una URL de confirmación. - * @param Usuario $usuario Usuario al que se le enviará el mail de registro - */ - private function enviarMailRegistro($usuario) { - Yii::import('ext.yii-mail.YiiMailMessage'); - - $url_activacion = $this->createAbsoluteUrl('registroUsuario/activar', array("key" => $usuario->clave_seguridad, "email" => $usuario->email)); - $mensaje = new YiiMailMessage; - - $mensaje->from = Yii::app()->params['email_remitente']; - $mensaje->setTo($usuario->email); - $mensaje->subject = Yii::t('profind', 'Complete su registro en PROFIND'); - $mensaje->view = 'registro_usuario'; - $mensaje->setBody(array( - 'url' => $url_activacion, - 'email' => $usuario->email - ), 'text/html' - ); - - return Yii::app()->mail->send($mensaje); - } - - /** - * Envía un mail de confirmación de su cuenta al usuario. - * @param Usuario $usuario Usuario al que se le enviará el mail de registro - */ - private function enviarMailConfirmacionActivacion($usuario) { - Yii::import('ext.yii-mail.YiiMailMessage'); - - $mensaje = new YiiMailMessage; - - $mensaje->from = Yii::app()->params['email_remitente']; - $mensaje->setTo($usuario->email); - $mensaje->subject = Yii::t('profind', 'Gracias por registrarse en PROFIND.'); - $mensaje->view = 'confirmacion_usuario'; - $mensaje->setBody(array( - 'email' => $usuario->email - ), 'text/html' - ); - - return Yii::app()->mail->send($mensaje); - } - - private function enviarMailConfirmacionCancelacion($usuario) { - Yii::import('ext.yii-mail.YiiMailMessage'); - - $mensaje = new YiiMailMessage; - - $mensaje->from = Yii::app()->params['email_remitente']; - $mensaje->setTo($usuario->email); - $mensaje->subject = Yii::t('profind', 'Confirmación de cancelación de su cuenta en PROFIND'); - $mensaje->view = 'confirmacion_cancelacion_usuario'; - $mensaje->setBody(array('email' => $usuario->email), 'text/html'); - - return Yii::app()->mail->send($mensaje); - } -} \ No newline at end of file diff --git a/www/protected/controllers/SeguridadUsuarioController.php b/www/protected/controllers/SeguridadUsuarioController.php index f37ce7c..c750b9b 100644 --- a/www/protected/controllers/SeguridadUsuarioController.php +++ b/www/protected/controllers/SeguridadUsuarioController.php @@ -4,42 +4,6 @@ class SeguridadUsuarioController extends Controller { public $defaultAction = 'recuperar'; - /** - * Realiza la recuperación de la contraseña de un usuario. - * Este método es llamado por AJAX desde la página de entrada. - * - */ - public function actionRecuperar() { - $formulario = new FormularioRecuperarPassword; - $resultado = array(); - - // if it is ajax validation request - if (isset($_POST['ajax']) && $_POST['ajax'] === 'recuperar-form') { - - $formulario->email = $_POST['FormularioRecuperar_email']; - - if (!$formulario->validate()) { - foreach ($formulario->getErrors() as $campo => $error) { - $resultado[$campo] = $error; - } - echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado); - Yii::app()->end(); - } - - $usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email)); - if ($usuario) { - $this->enviarMailRecuperacion($usuario); - - $resultado['status'] = '200'; - $resultado['titulo'] = Yii::t('profind', 'Recuperación de su cuenta en PROFIND'); - $resultado['texto'] = Yii::t('profind', 'En unos momentos recibirá un un correo con los pasos necesarios para recuperar su cuenta en PROFIND.'); - echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado); - Yii::app()->end(); - } - } - - $this->redirect(Yii::app()->params['frontpage']); - } /** * Cambiar la contraseña del usuario desde la página de entrada. @@ -135,51 +99,5 @@ class SeguridadUsuarioController extends Controller { return false; } - /** - * Envía un mail de recuperación de password a un usuario con una URL. - * @param Usuario $usuario Usuario al que se le enviará el mail de recuperación - */ - private function enviarMailRecuperacion($usuario) { - Yii::import('ext.yii-mail.YiiMailMessage'); - - $url_modificacion = Yii::app()->params['frontpage'] . '?' . 'key=' . $usuario->clave_seguridad . '&email=' . urlencode($usuario->email); - - $mensaje = new YiiMailMessage; - $mensaje->from = Yii::app()->params['email_remitente']; - $mensaje->setTo($usuario->email); - $mensaje->subject = Yii::t('profind', 'Recuperación de su cuenta en PROFIND'); - $mensaje->view = 'recuperacion_password_usuario'; - $mensaje->setBody(array( - 'url' => $url_modificacion, - 'email' => $usuario->email - ), 'text/html' - ); - - Yii::app()->mail->send($mensaje); - } - - /** - * Envía un mail confirmando el cambio de password a un usuario. - * También se envio una URL de recuperacion por si fuera un cambio no permitido. - * @param Usuario $usuario Usuario al que se le enviará el mail de notificación - */ - private function enviarMailNotificacionCambioPassword($usuario) { - Yii::import('ext.yii-mail.YiiMailMessage'); - - $url_modificacion = Yii::app()->params['frontpage'] . '?' . 'key=' . $usuario->clave_seguridad . '&email=' . urlencode($usuario->email); - - $mensaje = new YiiMailMessage; - $mensaje->from = Yii::app()->params['email_remitente']; - $mensaje->setTo($usuario->email); - $mensaje->subject = Yii::t('profind', 'Se ha modificado su password en PROFIND'); - $mensaje->view = 'notificacion_cambio_password_usuario'; - $mensaje->setBody(array( - 'url' => $url_modificacion, - 'email' => $usuario->email - ), 'text/html' - ); - - Yii::app()->mail->send($mensaje); - } } \ No newline at end of file diff --git a/www/protected/controllers/SiteController.php b/www/protected/controllers/SiteController.php index bafd760..5ecfa1f 100644 --- a/www/protected/controllers/SiteController.php +++ b/www/protected/controllers/SiteController.php @@ -44,7 +44,7 @@ class SiteController extends Controller { } /** - * Displays the login page + * Validate login data */ public function actionLogin() { $formulario = new FormularioLogin; diff --git a/www/protected/controllers/UsuarioController.php b/www/protected/controllers/UsuarioController.php index 7b77bd8..937a1d5 100644 --- a/www/protected/controllers/UsuarioController.php +++ b/www/protected/controllers/UsuarioController.php @@ -1,5 +1,12 @@ array('modificar', 'delete'), + array('allow', + 'actions' => array( + 'activar', 'cancelar', 'establecerPassword', + 'recuperar', 'registrar', 'registrarAgente', + ), + 'users' => array('*'), + ), + array('allow', + 'actions' => array( + 'cambiarPassword' ,'delete', 'modificar' + ), 'users' => array('@'), ), - array('deny', // deny all users + array('deny', 'users' => array('*'), ), ); } /** - * Actualiza un usuario. - * If update is successful, the browser will be redirected to the 'view' page. - * @param integer $id the ID of the model to be updated + * @brief Realiza el registro de un usuario. + * - Coordinador => a través de la página de entrada (formulario) + * - Agente => a través del formulario de añadir agente en el equipo (AJAX) + */ + public function actionRegistrar() { + // ¿Coordinador o agente? + if (isset($_POST['ajax']) && $_POST['ajax'] === 'registro-coordinador-form-entrada') { + $this->_registrarCoordinador(); + } elseif (isset($_POST['FormularioRegistrarAgente'])) { + $this->_registrarAgente(); + } else + $this->redirect(Yii::app()->params['frontpage']); + } + + /** + * @brief Realiza la activación de un usuario (coordinadores y agentes). + * - Coordinador => a través del enlace recibido por email + * - Agente => a través del formulario de la página de entrada (AJAX) + */ + public function actionActivar() { + // ¿Coordinador o agente? + if (isset($_POST['ajax']) && $_POST['ajax'] === 'activar-agente-form-entrada') { + $this->_activarAgente(); + } elseif (isset($_GET['email']) && isset($_GET['key'])) { + $this->_activarCoordinador(); + } else + $this->redirect(Yii::app()->params['frontpage']); + } + + /** + * @brief Realiza la recuperación de la contraseña de un usuario. + * Este método es llamado por AJAX desde la página de entrada. + */ + public function actionRecuperar() { + Yii::trace('Recuperar la cuenta del usuario', 'application.controllers.UsuarioController'); + $formulario = new FormularioEntradaRecuperarPassword; + + if (isset($_POST['ajax']) && $_POST['ajax'] === 'recuperar-form-entrada') { + $formulario->email = $_POST['FormularioRecuperar_email']; + + if (!$formulario->validate()) + $this->performAjaxValidationMessage($formulario); + + $usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email)); + if ($usuario) { + if (EMail::enviarRecuperacion($usuario->email, $usuario->clave_seguridad)) { + Yii::trace('Correo para recuperar la cuenta enviado', 'application.controllers.UsuarioController'); + $this->performAjaxStatusMessage('success', + Yii::t('profind', 'Recuperación de su cuenta en PROFIND'), + Yii::t('profind', 'En unos momentos recibirá un un correo con los pasos necesarios para recuperar su cuenta en PROFIND.') + ); + } else { + Yii::trace('Error al enviar el correo para recuperar la cuenta', 'application.controllers.UsuarioController'); + $this->performAjaxStatusMessage('success', + Yii::t('profind', 'Recuperación de su cuenta en PROFIND'), + Yii::t('profind', 'No se ha podido enviar el correo para recuperar su cuenta a la dirección indicada.') + ); + } + } else { + Yii::trace('No se encontrado un usuario con el email indicado', 'application.controllers.UsuarioController'); + $this->performAjaxStatusMessage('failure', + Yii::t('profind', 'Recuperación de su cuenta en PROFIND'), + Yii::t('profind', 'No se encontrado un usuario con el email indicado.') + ); + } + } + $this->redirect(Yii::app()->params['frontpage']); + } + + /** + * @brief Cambia la contraseña de un usuario (coordinador / agente). + * Esta acción se llama desde la ficha de un usuario. + * Envia un email de notificación al usuario. + * @param integer ID del usuario + */ + public function actionCambiarPassword($id) { + Yii::trace('Cambiar la password del usuario', 'application.controllers.UsuarioController'); + + if ($id != Yii::app()->user->id) + throw new CHttpException(404, Yii::t('profind', 'La página solicitada no existe.')); + + $formulario = new FormularioCambiarPassword; + $this->performAjaxValidation($formulario, 'cambiar-password-form'); + + if (isset($_POST['FormularioCambiarPassword'])) { + $formulario->attributes = $_POST['FormularioCambiarPassword']; + + if ($formulario->validate()) { + $usuario = $this->loadModel($id); + if ($this->_cambiarPassword($usuario, $formulario->password)) { + Yii::trace('Se ha modificado la password', 'application.controllers.UsuarioController'); + + EMail::enviarNotificacionCambioPassword($usuario->email, $usuario->clave_seguridad); + + Yii::app()->user->setFlash('success', Yii::t('profind', 'Se ha modificado la contraseña')); + $this->redirect(array('usuario/modificar', 'id' => $id)); + } + } + Yii::app()->user->setFlash('error', Yii::t('profind', 'No se ha podido modificar la contraseña')); + Yii::app()->user->setFlash('error', CHtml::errorSummary($formulario)); + } + $this->render('cambiar_password', array('formulario' => $formulario)); + } + + /** + * @brief Establece la contraseña del usuario desde la página de entrada. + * Este método es llamado por AJAX desde la página de entrada cuando se + * olvida la contraseña. + * Envia un email de notificación al usuario informando del cambio. + */ + public function actionEstablecerPassword() { + Yii::trace('Estableciendo password para el usuario', 'application.controllers.UsuarioController'); + + $formulario = new FormularioEntradaCambiarPassword; + + if (isset($_POST['ajax']) && $_POST['ajax'] === 'cambiar-password-form-entrada') { + $formulario->key = $_POST['FormularioCambiarPassword_key']; + $formulario->email = $_POST['FormularioCambiarPassword_email']; + $formulario->password = $_POST['FormularioCambiarPassword_password']; + $formulario->passwordRepetida = $_POST['FormularioCambiarPassword_password_repetida']; + + if (!$formulario->validate()) + $this->performAjaxValidationMessage($formulario); + + $usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email)); + + if ($this->_cambiarPassword($usuario, $formulario->password)) { + Yii::trace('Se ha modificado la password', 'application.controllers.UsuarioController'); + if (EMail::enviarNotificacionCambioPassword($usuario->email, $usuario->clave_seguridad)) { + $this->performAjaxStatusMessage('success', + Yii::t('profind', 'Password modificada'), + Yii::t('profind', 'Se ha modificado su password en PROFIND.') + ); + } else { + Yii::trace('Error al enviar el correo para informar del cambio', 'application.controllers.UsuarioController'); + $this->performAjaxStatusMessage('success', + Yii::t('profind', 'Password modificada'), + Yii::t('profind', 'Se ha modificado su password en PROFIND pero no se ha podido enviar el correo informando del cambio.') + ); + } + } else { + Yii::trace('Error al cambiar la password del usuario', 'application.controllers.UsuarioController'); + $this->performAjaxStatusMessage('success', + Yii::t('profind', 'Recuperar password'), + Yii::t('profind', 'No se ha podido restablecer la password de su cuenta. Inténtelo más tarde o contacto con PROFIND.') + ); + } + } + $this->redirect(Yii::app()->params['frontpage']); + } + + + /** + * @brief Realiza el registro de un usuario a partir de los datos introducidos + * en el formulario de la página de entrada. + * También envía un email al usuario para que confirme su cuenta. + */ + protected function _registrarCoordinador() { + Yii::trace('Registrando coordinador', 'application.controllers.UsuarioController'); + + $formulario = new FormularioRegistroCoordinador; + $resultado = array(); + + $formulario->email = $_POST['FormularioRegistro_email']; + $formulario->password = $_POST['FormularioRegistro_password']; + $formulario->password2 = $_POST['FormularioRegistro_password2']; + + if (!$formulario->validate()) + $this->performAjaxValidationMessage($formulario); + + // Crear el usuario + $nuevo_usuario = new Usuario('registrar'); + $nuevo_usuario->tipo = Usuario::TIPO_USUARIO_COORDINADOR; + $nuevo_usuario->email = $formulario->email; + $nuevo_usuario->password = $nuevo_usuario->encryptPassword($formulario->password); + $nuevo_usuario->estado = Usuario::ESTADO_NOACTIVO; + $nuevo_usuario->clave_seguridad = $nuevo_usuario->encryptSecureKey(microtime() . $nuevo_usuario->password); + + // Crear la subscripción + $nueva_subscripcion = new Subscripcion('registrar'); + $nueva_subscripcion->estado = Subscripcion::ESTADO_ACTIVO; + $nueva_subscripcion->id_producto = $this->_darIdProductoBasico(); + + // Crear la empresa + $nueva_empresa = new Empresa('registrar'); + + // Guardar los datos + $transaccion = Yii::app()->db->beginTransaction(); + try { + Yii::trace('Guardando la nueva empresa', 'application.controllers.UsuarioController'); + if (!$nueva_empresa->save()) + throw new CException('Error al guardar la empresa'); + + Yii::trace('Guardando el nuevo usuario', 'application.controllers.UsuarioController'); + $nuevo_usuario->id_empresa = $nueva_empresa->id; + if (!$nuevo_usuario->save()) + throw new CException('Error al guardar el usuario'); + + Yii::trace('Guardando la nueva subscripción', 'application.controllers.UsuarioController'); + $nueva_subscripcion->id_usuario = $nuevo_usuario->id; + if (!$nueva_subscripcion->save()) + throw new CException('Error al guardar la subscripción'); + + $transaccion->commit(); + Yii::trace('Nuevo coordinador dado de alta', 'application.controllers.UsuarioController'); + } catch (Exception $e) { + Yii::trace($e->getMessage(), 'application.controllers.UsuarioController'); + + $transaccion->rollBack(); + $errores = array_merge($nuevo_usuario->getErrors(), $nueva_empresa->getErrors(), $nueva_subscripcion->getErrors()); + foreach ($errores as $campo => $mensaje) $resultado[$campo] = $mensaje; + Yii::trace(CVarDumper::dumpAsString($resultado), 'application.controllers.UsuarioController'); + + echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado); + Yii::app()->end(); + } + + if (EMail::enviarBienvenidaCoordinador($nuevo_usuario->email, $nuevo_usuario->clave_seguridad)) { + Yii::trace('Correo para activar el coordinador enviado', 'application.controllers.UsuarioController'); + $this->performAjaxStatusMessage('success', + Yii::t('profind', 'Gracias por registrarse en PRODIND'), + Yii::t('profind', 'Su cuenta ha sido creada. En unos momentos recibirá un email con un enlace para completar su registro.') + ); + } else { + Yii::trace('Error al enviar el correo para activar el coordinador', 'application.controllers.UsuarioController'); + $this->performAjaxStatusMessage('success', + Yii::t('profind', 'Gracias por registrarse en PRODIND'), + Yii::t('profind', 'Su cuenta ha sido creada pero no se ha podido enviar el correo de registro a la dirección indicada.') + ); + } + } + + /** + * @brief Activa la cuenta del coordinador a partir de la URL de activación + * que se le ha enviado a través del email generado en el proceso de + * registrar un coordinador. + */ + protected function _activarCoordinador() { + Yii::trace('Activando coordinador', 'application.controllers.UsuarioController'); + + $email = $_GET['email']; + $clave_seguridad = $_GET['key']; + + if ($email && $clave_seguridad) { + $usuario = Usuario::model()->findByAttributes(array('email' => $email)); + + // Comprobamos si se ha encontrado un usuario con ese email + if (!isset($usuario)) { + Yii::trace('No existe el email', 'application.controllers.UsuarioController'); + $this->render('//site/error', array( + 'titulo' => Yii::t('profind', 'Error de activación'), + 'mensaje' => Yii::t('profind', 'No se puede activar la cuenta.
La URL de activación es incorrecta.'), + )); + } elseif ($usuario->estado == Usuario::ESTADO_ACTIVO) { + Yii::trace('El usuario ya está activo', 'application.controllers.UsuarioController'); + $this->render('//site/error', array( + 'titulo' => Yii::t('profind', 'Cuenta ya activada'), + 'mensaje' => Yii::t('profind', 'No se ha realizado ningún cambio.
La cuenta ya estaba activada.'), + )); + } elseif ($usuario->estado == Usuario::ESTADO_BLOQUEADO) { + Yii::trace('El usuario está bloqueado', 'application.controllers.UsuarioController'); + $this->render('//site/error', array( + 'titulo' => Yii::t('profind', 'Cuenta bloqueada'), + 'mensaje' => Yii::t('profind', 'La cuenta ha sido bloqueada.
Contacte con el administrador del sitio para obtener más información.'), + )); + } elseif (isset($usuario->clave_seguridad) && ($usuario->clave_seguridad == $clave_seguridad)) { + Yii::trace('Guardando el usuario', 'application.controllers.UsuarioController'); + // Hay que activar el usuario + $usuario->estado = Usuario::ESTADO_ACTIVO; + $usuario->clave_seguridad = $usuario->encryptSecureKey(microtime() . $usuario->password); + $usuario->save(); + + EMail::enviarConfirmacionActivacion($usuario->email); + + $this->layout = '//layouts/mensaje'; + $this->render('confirmacion_usuario', array()); + + Yii::trace('Coordinador activado', 'application.controllers.UsuarioController'); + } else { + Yii::trace('Clave de seguridad no válida', 'application.controllers.UsuarioController'); + $this->render('//site/error', array( + 'titulo' => Yii::t('profind', 'Error de activación'), + 'mensaje' => Yii::t('profind', 'No se puede activar la cuenta.
El enlace de activación es incorrecto.'), + )); + } + } else { + Yii::trace('URL de activación no válida', 'application.controllers.UsuarioController'); + $this->render('//site/error', array( + 'titulo' => Yii::t('profind', 'Error de activación'), + 'mensaje' => Yii::t('profind', 'No se puede activar la cuenta.
El enlace de activación es incorrecto.'), + )); + } + } + + public function actionRegistrarAgente() { + $formulario = new FormularioRegistroAgente; + $resultado = array(); + + if (isset($_POST['ajax']) && $_POST['ajax'] === 'activar-agente-form-entrada') { + $formulario->key = $_POST['FormularioActivarAgente_key']; + $formulario->email = $_POST['FormularioActivarAgente_email']; + $formulario->password = $_POST['FormularioActivarAgente_password']; + $formulario->passwordRepetida = $_POST['FormularioActivarAgente_password_repetida']; + + if (!$formulario->validate()) + $this->performAjaxValidationMessage($formulario); + + $usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email)); + $usuario->estado = Usuario::ESTADO_ACTIVO; + $usuario->save(); + + if ($this->_cambiarPassword($usuario, $formulario->password)) { + EMail::enviarConfirmacionActivacion($usuario->email); + $this->performAjaxStatusMessage('success', + Yii::t('profind', 'Cuenta de agente activada'), + Yii::t('profind', 'Se ha activado su cuenta y se ha establecido su nueva password en PROFIND.') + ); + } else { + foreach ($formulario->getErrors() as $campo => $error) { + $resultado[$campo] = $error; + } + echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado); + Yii::app()->end(); + } + } + + $this->redirect(Yii::app()->params['frontpage']); + } + + protected function _cambiarPassword($usuario, $nueva_password) { + $usuario->password = $usuario->encryptPassword($nueva_password); + $usuario->clave_seguridad = $usuario->encryptSecureKey(microtime() . $usuario->password); + return $usuario->save(); + } + + public function actionCancelar() { + $email = $_GET['email']; + $clave_seguridad = $_GET['key']; + + if ($email && $clave_seguridad) { + $usuario = Usuario::model()->findByAttributes(array('email' => $email)); + + // Comprobamos si se ha encontrado un usuario con ese email + if (!isset($usuario)) { + $this->render('//site/error', array( + 'titulo' => Yii::t('profind', 'Error de cancelación'), + 'mensaje' => Yii::t('profind', 'No se puede cancelar la cuenta.
La URL de cancelación es incorrecta.'), + )); + } elseif ($usuario->estado == Usuario::ESTADO_NOACTIVO) { + $this->render('//site/error', array( + 'titulo' => Yii::t('profind', 'Cuenta no confirmada'), + 'mensaje' => Yii::t('profind', 'No se ha realizado ningún cambio.
La cuenta no está confirmada.'), + )); + } elseif ($usuario->estado == Usuario::ESTADO_BORRADO) { + $this->render('//site/error', array( + 'titulo' => Yii::t('profind', 'Cuenta ya cancelada'), + 'mensaje' => Yii::t('profind', 'No se ha realizado ningún cambio.
La cuenta ya estaba cancelada.'), + )); + } elseif ($usuario->estado == Usuario::ESTADO_BLOQUEADO) { + $this->render('//site/error', array( + 'titulo' => Yii::t('profind', 'Cuenta bloqueada'), + 'mensaje' => Yii::t('profind', 'La cuenta ha sido bloqueada.
Contacte con el administrador del sitio para obtener más información.'), + )); + } elseif (isset($usuario->clave_seguridad) && ($usuario->clave_seguridad == $clave_seguridad)) { + // Hay que desactivar el usuario + $usuario->estado = Usuario::ESTADO_NOACTIVO; + $usuario->clave_seguridad = $usuario->encryptSecureKey(microtime() . $usuario->password); + $usuario->save(); + + EMail::enviarConfirmacionCancelacion($usuario->email); + + $this->layout = '//layouts/mensaje'; + $this->render('confirmacion_cancelacion_usuario', array()); + } else { + $this->render('//site/error', array( + 'titulo' => Yii::t('profind', 'Error de cancelación'), + 'mensaje' => Yii::t('profind', 'No se puede cancelar la cuenta.
La URL de cancelación es incorrecta.'), + )); + } + } else { + $this->render('//site/error', array( + 'titulo' => Yii::t('profind', 'Error de cancelación'), + 'mensaje' => Yii::t('profind', 'No se puede cancelar la cuenta.
La URL de cancelación es incorrecta.'), + )); + } + } + + /** + * @brief Busca el ID del producto básico que se utilizará para la subscripción + * de los coordinadores nuevos. + * @return integer + */ + protected function _darIdProductoBasico() { + $producto = Producto::model()->productoInicial()->find(); + if ($producto === null) { + Yii::log('No se ha encontrado un producto básico', CLogger::LEVEL_ERROR, 'application.controller.UsuarioController'); + throw new CHttpException(500, Yii::t('profind', 'Error interno.')); + } + return $producto->id; + } + + /** + * @brief Muestra el formulario de modificación de un usuario y realiza los + * cambios. + * @param integer $id el ID del usuario a modificar + * @param string $provider nombre de la red social a utilizar para rellenar los datos del usuario */ public function actionModificar($id, $provider = '') { if ($id != Yii::app()->user->id) @@ -60,10 +479,6 @@ class UsuarioController extends Controller { $usuario->attributes = $_POST['Usuario']; $ficheroFotografia = CUploadedFile::getInstance($usuario, 'ficheroFotografia'); - Yii::log(CVarDumper::dumpAsString($_POST['Usuario']), CLogger::LEVEL_ERROR); - Yii::log(CVarDumper::dumpAsString($usuario->attributes), CLogger::LEVEL_ERROR); - Yii::log(CVarDumper::dumpAsString($ficheroFotografia), CLogger::LEVEL_ERROR); - $quitarFotografia = Yii::app()->request->getParam('quitar_fotografia', '0'); if ($usuario->save()) { @@ -83,6 +498,10 @@ class UsuarioController extends Controller { )); } + /** + * @brief Elimina un usuario. + * @param integer $id el ID del usuario a eliminar + */ public function actionDelete($id) { if ($id != Yii::app()->user->id) throw new CHttpException(404, Yii::t('profind', 'La página solicitada no existe.')); @@ -102,6 +521,12 @@ class UsuarioController extends Controller { $this->redirect($this->createUrl('modificar', array('id' => $id))); } + /** + * @brief Devuelve los datos de un usuario utilizando la red social que + * indique el parámetro $provider. + * @param integer $id el ID del usuario a modificar + * @param string $provider nombre de la red social a utilizar para rellenar los datos del usuario + */ public function loadModelwithSocialData($id, $provider) { $usuario = $this->loadModel($id); @@ -133,9 +558,9 @@ class UsuarioController extends Controller { } /** - * Returns the data model based on the primary key given in the GET variable. - * If the data model is not found, an HTTP exception will be raised. - * @param integer the ID of the model to be loaded + * @brief Devuelve los datos del usuario. + * Si el usuario no existe, se lanza una excepción HTTP 404 + * @param integer $id el ID del usuario a recuperar */ public function loadModel($id) { $model = Usuario::model()->findByPk($id); @@ -146,35 +571,41 @@ class UsuarioController extends Controller { } /** - * Performs the AJAX validation. - * @param CModel the model to be validated + * @brief Genera un mensaje de estado en formato JSON que se utilizará + * para mostrar información al usuario en la página de entrada. + * @param string $status 'success' o 'failure' + * @param string $title título de la ventana modal con mensaje */ - protected function performAjaxValidation($model) { - if (isset($_POST['ajax']) && $_POST['ajax'] === 'usuario-form') { - echo CActiveForm::validate($model); - Yii::app()->end(); - } - } + protected function performAjaxStatusMessage($status, $title, $content) { + Yii::trace('Generando respuesta JSON con mensaje de estado', 'application.controllers.UsuarioController'); + $result = array(); + $result['status'] = $status; + $result['titulo'] = $title; + $result['texto'] = $content; + Yii::trace(CVarDumper::dumpAsString($result), 'application.controllers.UsuarioController'); + echo function_exists('json_encode') ? json_encode($result) : CJSON::encode($result); + Yii::app()->end(); + } + /** - * Envía un mail de registro a un usuario - * con una URL de confirmación. - * @param Usuario $usuario Usuario al que se le enviará el mail de registro + * @brief Genera un mensaje en formato JSON con los errores de validación de + * uno o más modelos. El mensaje se mostrará al usuario en la página de entrada. + * @param mixed $models una instancia de un modelo o un array de instancias. */ - private function enviarMailSolicitudBaja($usuario) { - Yii::import('ext.yii-mail.YiiMailMessage'); - - $url_cancelacion = $this->createAbsoluteUrl('registroUsuario/cancelar', array("key" => $usuario->clave_seguridad, "email" => $usuario->email)); - $mensaje = new YiiMailMessage; - - $mensaje->from = Yii::app()->params['email_remitente']; - $mensaje->setTo($usuario->email); - $mensaje->subject = Yii::t('profind', 'Solicitud de cancelación de su cuenta en PROFIND'); - $mensaje->view = 'solicitud_cancelacion_usuario'; - $mensaje->setBody(array('url' => $url_cancelacion), 'text/html'); - - return Yii::app()->mail->send($mensaje); + protected function performAjaxValidationMessage($models) { + Yii::trace('Generando respuesta JSON con errores de validación', 'application.controllers.UsuarioController'); + + $result = array(); + if(!is_array($models)) + $models=array($models); + + foreach($models as $model) + foreach($model->getErrors() as $attribute => $errors) + $result[$attribute] = $errors; + + Yii::trace(CVarDumper::dumpAsString($result), 'application.controllers.UsuarioController'); + echo function_exists('json_encode') ? json_encode($result) : CJSON::encode($result); + Yii::app()->end(); } - - } diff --git a/www/protected/helpers/EMail.php b/www/protected/helpers/EMail.php new file mode 100644 index 0000000..e4cb318 --- /dev/null +++ b/www/protected/helpers/EMail.php @@ -0,0 +1,141 @@ +from = Yii::app()->params['email_remitente']; + $mensaje->setTo($to); + $mensaje->subject = $subject; + $mensaje->view = $view; + $mensaje->setBody($body, 'text/html'); + return (Yii::app()->mail->send($mensaje) > 0); + } + + /** + * @brief Envía un correo de confirmación de cuenta. + * @param string $destino dirección de destino + * @return boolean + */ + public static function enviarConfirmacionActivacion($destino) { + Yii::trace('Enviando correo para confirmar activación', 'application.helpers.EMail'); + return self::_enviar($destino, + Yii::t('profind', 'Gracias por registrarse en PROFIND.'), + 'confirmacion_usuario', + array('email' => $destino)); + } + + /** + * @brief Envía un correo informando de la cancelación de cuenta + * @param string $destino dirección de destino + * @return boolean + */ + public static function enviarConfirmacionCancelacion($destino) { + Yii::trace('Enviando correo para confirmar cancelación', 'application.helpers.EMail'); + return self::_enviar($destino, + Yii::t('profind', 'Confirmación de cancelación de su cuenta en PROFIND'), + 'confirmacion_cancelacion_usuario', + array('email' => $destino)); + } + + /** + * @brief Envía un correo de recuperación de password con una URL de verificación. + * @param string $destino dirección de destino + * @param string $key clave de seguridad necesaria para construir la URL de recuperación + * @return boolean + */ + public static function enviarRecuperacion($destino, $key) { + Yii::trace('Enviando correo con URL para recuperar la contraseña', 'application.helpers.EMail'); + $url_recuperacion = Yii::app()->params['frontpage'] . '?' . 'key=' . $key . '&email=' . urlencode($destino); + return self::_enviar($destino, + Yii::t('profind', 'Recuperación de su cuenta en PROFIND'), + 'recuperacion_password_usuario', + array('email' => $destino, 'url' => $url_recuperacion)); + } + + /** + * @brief Envía un correo confirmando el cambio de password. + * También se envia una URL de recuperación por si fuera un cambio no permitido. + * @param string $destino dirección de destino + * @param string $key clave de seguridad necesaria para construir la URL de recuperación + * @return boolean + */ + public static function enviarNotificacionCambioPassword($destino, $key) { + Yii::trace('Enviando correo confirmando el cambio de contraseña', 'application.helpers.EMail'); + $url_recuperacion = Yii::app()->params['frontpage'] . '?' . 'key=' . $key . '&email=' . urlencode($destino); + return self::_enviar($destino, + Yii::t('profind', 'Se ha modificado su password en PROFIND'), + 'notificacion_cambio_password_usuario', + array('email' => $destino, 'url' => $url_recuperacion)); + } + + /** + * @brief Envía un correo de registro de agente con una URL para confirmar la cuenta. + * @param string $destino dirección de destino + * @param string $key clave de seguridad necesaria para construir la URL de confirmación + * @return boolean + */ + public static function enviarBienvenidaAgente($destino, $key) { + Yii::trace('Enviando correo de bienvenida a agente', 'application.helpers.EMail'); + $url_activacion = Yii::app()->params['frontpage'] . '?' . 'key=' . $key . '&email=' . urlencode($destino) . '&x=1'; + return self::_enviar($destino, + Yii::t('profind', 'Complete su registro de agente en PROFIND'), + 'registro_agente', + array('email' => $destino, 'url' => $url_activacion)); + } + + /** + * @brief Envía un correo de registro de coordinador con una URL para confirmar la cuenta. + * @param string $destino dirección de destino + * @param string $key clave de seguridad necesaria para construir la URL de confirmación + * @return boolean + */ + public static function enviarBienvenidaCoordinador($destino, $key) { + Yii::trace('Enviando correo de bienvenida a coordinador', 'application.helpers.EMail'); + $url_activacion = Yii::app()->createAbsoluteUrl('usuario/activar', array("key" => $key, "email" => $destino)); + return self::_enviar($destino, + Yii::t('profind', 'Complete su registro en PROFIND'), + 'registro_usuario', + array('email' => $destino, 'url' => $url_activacion)); + } + + /** + * @brief Envía un mail de registro a un usuario (coordinador/agente) con + * una URL de confirmación de baja. + * @param string $destino dirección de destino + * @param string $key clave de seguridad necesaria para construir la URL de confirmación + * @return boolean + */ + + public static function enviarSolicitudBaja($destino, $key) { + Yii::trace('Enviando correo con URL para realizar la baja de la cuenta', 'application.helpers.EMail'); + + $url_cancelacion = $this->createAbsoluteUrl('usuario/cancelar', array("key" => $key, "email" => $destino)); + return self::_enviar($destino, + Yii::t('profind', 'Solicitud de cancelación de su cuenta en PROFIND'), + 'solicitud_cancelacion_usuario', + array('email' => $destino, 'url' => $url_cancelacion)); + } +} +?> diff --git a/www/protected/helpers/GHelper.php b/www/protected/helpers/GHelper.php new file mode 100644 index 0000000..6617317 --- /dev/null +++ b/www/protected/helpers/GHelper.php @@ -0,0 +1,48 @@ + diff --git a/www/protected/helpers/recursive_remove_directory.php b/www/protected/helpers/recursive_remove_directory.php deleted file mode 100644 index daa4410..0000000 --- a/www/protected/helpers/recursive_remove_directory.php +++ /dev/null @@ -1,46 +0,0 @@ - \ No newline at end of file diff --git a/www/protected/migrations/m120927_143321_tbl_productos.php b/www/protected/migrations/m120927_143321_tbl_productos.php index 83919b2..7ea827e 100644 --- a/www/protected/migrations/m120927_143321_tbl_productos.php +++ b/www/protected/migrations/m120927_143321_tbl_productos.php @@ -13,17 +13,23 @@ class m120927_143321_tbl_productos extends CDbMigration $this->createTable('tbl_subscripciones', array( 'id' => 'pk', - 'id_usuario' => 'integer', - 'id_producto' => 'integer', + 'id_usuario' => 'integer NOT NULL', + 'id_producto' => 'integer NOT NULL', 'estado' => 'string', 'fecha_inicio' => 'datetime', 'fecha_fin' => 'datetime', )); + + $this->addForeignKey('fk_subscripciones_1', 'tbl_subscripciones', 'id_usuario', 'tbl_usuarios', 'id', 'CASCADE', 'CASCADE'); + $this->addForeignKey('fk_subscripciones_2', 'tbl_subscripciones', 'id_producto', 'tbl_productos', 'id', 'CASCADE', 'CASCADE'); } public function safeDown() { - $this->dropTable('tbl_productos'); + $this->dropForeignKey('fk_subscripciones_2', 'tbl_subscripciones'); + $this->dropForeignKey('fk_subscripciones_1', 'tbl_subscripciones'); + $this->dropTable('tbl_subscripciones'); + $this->dropTable('tbl_productos'); } } \ No newline at end of file diff --git a/www/protected/models/Empresa.php b/www/protected/models/Empresa.php index f55b741..05401f8 100644 --- a/www/protected/models/Empresa.php +++ b/www/protected/models/Empresa.php @@ -173,10 +173,8 @@ class Empresa extends CActiveRecord { private function deleteUploadDir() { $upload = $this->getUploadPath(); - if(is_dir($upload)) { - require_once( Yii::getPathOfAlias('application.helpers') . DIRECTORY_SEPARATOR . 'recursive_remove_directory.php'); - return recursive_remove_directory($upload); - } + if(is_dir($upload)) + return GHelper::recursiveRemoveDirectory($upload); else return false; } diff --git a/www/protected/models/FormularioRegistroAgente.php b/www/protected/models/FormularioRegistroAgente.php deleted file mode 100644 index 3d49155..0000000 --- a/www/protected/models/FormularioRegistroAgente.php +++ /dev/null @@ -1,8 +0,0 @@ - array( + 'condition' => 'id = 1', + 'limit' => 1, + ), + ); + } + /** * @return array relational rules. */ diff --git a/www/protected/models/Usuario.php b/www/protected/models/Usuario.php index 5ca9c3e..eb3b6da 100644 --- a/www/protected/models/Usuario.php +++ b/www/protected/models/Usuario.php @@ -31,7 +31,7 @@ class Usuario extends CActiveRecord { const ESTADO_NOACTIVO = 0; const ESTADO_ACTIVO = 1; const ESTADO_BORRADO = 2; - const ESTADO_DENEGADO = 3; + const ESTADO_BLOQUEADO = 3; const TIPO_USUARIO_COORDINADOR = 'C'; const TIPO_USUARIO_AGENTE = 'A'; @@ -228,10 +228,8 @@ class Usuario extends CActiveRecord { private function deleteUploadDir() { $upload = $this->getUploadPath(); - if(is_dir($upload)) { - require_once( Yii::getPathOfAlias('application.helpers') . DIRECTORY_SEPARATOR . 'recursive_remove_directory.php'); - return recursive_remove_directory($upload); - } + if(is_dir($upload)) + return GHelper::recursiveRemoveDirectory($upload); else return false; } diff --git a/www/protected/models/FormularioCambiarPassword.php b/www/protected/models/formularios/FormularioCambiarPassword.php similarity index 77% rename from www/protected/models/FormularioCambiarPassword.php rename to www/protected/models/formularios/FormularioCambiarPassword.php index f19c1b3..793776c 100644 --- a/www/protected/models/FormularioCambiarPassword.php +++ b/www/protected/models/formularios/FormularioCambiarPassword.php @@ -27,7 +27,11 @@ class FormularioCambiarPassword extends CFormModel { public function comprobarPasswordAnterior($attribute, $params) { if (!$this->hasErrors()) { $usuario = Usuario::model()->findByPk(Yii::app()->user->id); - if ($usuario->password != Usuario::model()->encryptPassword($this->passwordAnterior)) + $ph = new PasswordHash( + Yii::app()->params['phpass']['iteration_count_log2'], + Yii::app()->params['phpass']['portable_hashes'] + ); + if (!$ph->checkPassword($this->passwordAnterior, $usuario->password)) $this->addError($this->passwordAnterior, Yii::t('profind', 'La contraseña anterior no es correcta.')); } } diff --git a/www/protected/models/FormularioExtCambiarPassword.php b/www/protected/models/formularios/FormularioEntradaCambiarPassword.php similarity index 93% rename from www/protected/models/FormularioExtCambiarPassword.php rename to www/protected/models/formularios/FormularioEntradaCambiarPassword.php index e2e571f..afcc2e6 100644 --- a/www/protected/models/FormularioExtCambiarPassword.php +++ b/www/protected/models/formularios/FormularioEntradaCambiarPassword.php @@ -3,7 +3,7 @@ /** * */ -class FormularioExtCambiarPassword extends CFormModel { +class FormularioEntradaCambiarPassword extends CFormModel { public $key; public $email; diff --git a/www/protected/models/FormularioRecuperarPassword.php b/www/protected/models/formularios/FormularioEntradaRecuperarPassword.php similarity index 84% rename from www/protected/models/FormularioRecuperarPassword.php rename to www/protected/models/formularios/FormularioEntradaRecuperarPassword.php index 4feb2ce..e388175 100644 --- a/www/protected/models/FormularioRecuperarPassword.php +++ b/www/protected/models/formularios/FormularioEntradaRecuperarPassword.php @@ -3,13 +3,10 @@ /** * */ -class FormularioRecuperarPassword extends CFormModel { +class FormularioEntradaRecuperarPassword extends CFormModel { public $email; - /** - * - */ public function rules() { return array( array('email', 'required'), @@ -18,9 +15,6 @@ class FormularioRecuperarPassword extends CFormModel { ); } - /** - * - */ public function existeEmailUsuario($attribute, $params) { if (!$this->hasErrors()) { $usuario = Usuario::model()->findByAttributes(array('email' => $this->email)); diff --git a/www/protected/models/FormularioInvitarAgente.php b/www/protected/models/formularios/FormularioInvitarAgente.php similarity index 100% rename from www/protected/models/FormularioInvitarAgente.php rename to www/protected/models/formularios/FormularioInvitarAgente.php diff --git a/www/protected/models/FormularioLogin.php b/www/protected/models/formularios/FormularioLogin.php similarity index 100% rename from www/protected/models/FormularioLogin.php rename to www/protected/models/formularios/FormularioLogin.php diff --git a/www/protected/models/formularios/FormularioRegistroAgente.php b/www/protected/models/formularios/FormularioRegistroAgente.php new file mode 100644 index 0000000..a21898e --- /dev/null +++ b/www/protected/models/formularios/FormularioRegistroAgente.php @@ -0,0 +1,8 @@ + +clientScript->registerScript('tooltips', " + $('.user_list').tooltip({selector: 'a[rel=tooltip]'}); + ", CClientScript::POS_END); +?> +

@@ -24,9 +29,9 @@
  • - + estaActivo) ? Yii::t('profind', 'activo') : Yii::t('profind', 'no activo'); ?> - +
    titulo; ?>
    email, $agente->email); ?>
    - 'icon-trash')), '#', array( 'data-id' => $agente->id, 'class' => 'close pull-right delete', + 'rel' => 'tooltip', + 'data-original-title' => Yii::t('profind', 'Eliminar el agente'), )); ?>
     
    @@ -97,7 +103,7 @@ createUrl('delete', array('id' => 0)), + $this->createUrl('deleteMember', array('id' => 0)), array('class' => 'btn btn-danger') );?>
    diff --git a/www/themes/profind/views/usuario/_form.php b/www/themes/profind/views/usuario/_form.php index 422606d..9549c30 100644 --- a/www/themes/profind/views/usuario/_form.php +++ b/www/themes/profind/views/usuario/_form.php @@ -85,7 +85,7 @@ Yii::app()->clientScript->registerScript(
    - createUrl('seguridadUsuario/cambiarPassword', array('id' => Yii::app()->user->id))); ?> + createUrl('cambiarPassword', array('id' => Yii::app()->user->id))); ?>
    diff --git a/www/themes/profind/views/seguridadUsuario/cambiar_password.php b/www/themes/profind/views/usuario/cambiar_password.php similarity index 100% rename from www/themes/profind/views/seguridadUsuario/cambiar_password.php rename to www/themes/profind/views/usuario/cambiar_password.php diff --git a/www/themes/profind/views/registroUsuario/confirmacion_cancelacion_usuario.php b/www/themes/profind/views/usuario/confirmacion_cancelacion_usuario.php similarity index 100% rename from www/themes/profind/views/registroUsuario/confirmacion_cancelacion_usuario.php rename to www/themes/profind/views/usuario/confirmacion_cancelacion_usuario.php diff --git a/www/themes/profind/views/registroUsuario/confirmacion_usuario.php b/www/themes/profind/views/usuario/confirmacion_usuario.php similarity index 100% rename from www/themes/profind/views/registroUsuario/confirmacion_usuario.php rename to www/themes/profind/views/usuario/confirmacion_usuario.php diff --git a/www/themes/profind/views/registroUsuario/error_confirmacion.php b/www/themes/profind/views/usuario/error_confirmacion.php similarity index 100% rename from www/themes/profind/views/registroUsuario/error_confirmacion.php rename to www/themes/profind/views/usuario/error_confirmacion.php