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. * Este método es llamado por AJAX desde la página de entrada. * Envia un email de notificación al usuario. * @param integer ID del usuario */ public function actionCambiarPasswordExt() { $formulario = new FormularioExtCambiarPassword; $resultado = array(); if (isset($_POST['ajax']) && $_POST['ajax'] === 'cambiar-password-form-ext') { $formulario->key = $_POST['FormularioCambiarPassword_key']; $formulario->email = $_POST['FormularioCambiarPassword_email']; $formulario->password = $_POST['FormularioCambiarPassword_password']; $formulario->passwordRepetida = $_POST['FormularioCambiarPassword_password_repetida']; if ($formulario->validate()) { $usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email)); if ($this->_cambiarPassword($usuario->id, $formulario->password)) { $resultado['status'] = '200'; $resultado['titulo'] = Yii::t('profind', 'Password modificada'); $resultado['texto'] = Yii::t('profind', 'Se ha modificado su 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']); } /** * Cambiar la contraseña del usuario desde el formulario de la aplicación. * Envia un email de notificación al usuario. * @param integer ID del usuario */ public function actionCambiarPassword($id) { if ($id != Yii::app()->user->id) throw new CHttpException(404, Yii::t('profind', 'La página solicitada no existe.')); $formulario = new FormularioCambiarPassword; if (isset($_POST['ajax']) && $_POST['ajax'] === 'cambiar-password-form') { echo CActiveForm::validate($formulario); Yii::app()->end(); } if (isset($_POST['FormularioCambiarPassword'])) { $formulario->attributes = $_POST['FormularioCambiarPassword']; if ($formulario->validate() && $this->_cambiarPassword($id, $formulario->password)) { Yii::app()->user->setFlash('success', Yii::t('profind', 'Se ha modificado la contraseña')); $this->redirect(array('usuario/modificar', 'id' => $id)); } else { 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)); } /** * Realiza el proceso interno de cambiar la contraseña a un usuario. * Envia un email de notificación al usuario. * Este método es privado y de uso interno al controlador. * @param integer ID del usuario * @param string nueva contraseña del usuario * @return boolean si se ha podido hacer o no el cambio */ 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()) { $this->enviarMailNotificacionCambioPassword($usuario); return true; } else 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); } }