diff --git a/www/protected/config/main.php b/www/protected/config/main.php index 965db80..5e881b4 100644 --- a/www/protected/config/main.php +++ b/www/protected/config/main.php @@ -137,7 +137,7 @@ $config = array( // application-level parameters that can be accessed // using Yii::app()->params['paramName'] 'params'=>array( - 'frontpage' => 'http://localhost', + 'frontpage' => 'http://localhost/index.php', 'email_remitente' => 'mantenimiento@rodax-software.com', ), ); \ No newline at end of file diff --git a/www/protected/controllers/EmpresaController.php b/www/protected/controllers/EmpresaController.php index 4e7a06e..9c3cc86 100644 --- a/www/protected/controllers/EmpresaController.php +++ b/www/protected/controllers/EmpresaController.php @@ -35,7 +35,7 @@ class EmpresaController extends Controller { */ public function actionModificar($id) { if ($id != Yii::app()->user->id_empresa) - throw new CHttpException(404, 'The requested page does not exist.'); + throw new CHttpException(404, Yii::t('profind', 'La página solicitada no existe.')); $model = $this->loadModel($id); @@ -70,7 +70,7 @@ class EmpresaController extends Controller { public function loadModel($id) { $model = Empresa::model()->findByPk($id); if ($model === null) - throw new CHttpException(404, 'The requested page does not exist.'); + throw new CHttpException(404, Yii::t('profind', 'La página solicitada no existe.')); return $model; } diff --git a/www/protected/controllers/EquipoController.php b/www/protected/controllers/EquipoController.php index cc61402..428bbe6 100644 --- a/www/protected/controllers/EquipoController.php +++ b/www/protected/controllers/EquipoController.php @@ -159,7 +159,7 @@ class EquipoController extends Controller { public function loadModel($id) { $model = Usuario::model()->findByPk($id); if ($model === null) - throw new CHttpException(404, 'The requested page does not exist.'); + throw new CHttpException(404, Yii::t('profind', 'La página solicitada no existe.')); return $model; } diff --git a/www/protected/controllers/RegistroUsuarioController.php b/www/protected/controllers/RegistroUsuarioController.php index aac70ab..d68fa4f 100644 --- a/www/protected/controllers/RegistroUsuarioController.php +++ b/www/protected/controllers/RegistroUsuarioController.php @@ -18,9 +18,6 @@ class RegistroUsuarioController extends Controller { 'actions' => array('registrar', 'activar'), 'users' => array('*') ), - array('allow', - 'users' => array('@') - ), array('deny'), ); } diff --git a/www/protected/controllers/SeguridadUsuarioController.php b/www/protected/controllers/SeguridadUsuarioController.php new file mode 100644 index 0000000..60db142 --- /dev/null +++ b/www/protected/controllers/SeguridadUsuarioController.php @@ -0,0 +1,185 @@ +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->encrypt($nueva_password); + $usuario->clave_seguridad = $usuario->encrypt(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_recuperacion = $this->createAbsoluteUrl('recuperarUsuario/recuperar', 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', 'Se ha modificado su password en PROFIND'); + $mensaje->view = 'notificacion_cambio_password_usuario'; + $mensaje->setBody(array( + 'url' => $url_recuperacion, + 'email' => $usuario->email + ), 'text/html' + ); + + Yii::app()->mail->send($mensaje); + } + +} \ No newline at end of file diff --git a/www/protected/controllers/UsuarioController.php b/www/protected/controllers/UsuarioController.php index 1d3cde6..42f8dc1 100644 --- a/www/protected/controllers/UsuarioController.php +++ b/www/protected/controllers/UsuarioController.php @@ -2,6 +2,8 @@ class UsuarioController extends Controller { + public $defaultAction = 'modificar'; + /** * @return array action filters */ @@ -19,7 +21,7 @@ class UsuarioController extends Controller { public function accessRules() { return array( array('allow', // allow admin user to perform 'admin' and 'delete' actions - 'actions' => array('modificar', 'index'), + 'actions' => array('modificar', 'cambiarPassword'), 'users' => array('@'), ), array('deny', // deny all users @@ -35,8 +37,8 @@ class UsuarioController extends Controller { */ public function actionModificar($id) { if ($id != Yii::app()->user->id) - throw new CHttpException(404, 'The requested page does not exist.'); - + throw new CHttpException(404, Yii::t('profind', 'La página solicitada no existe.')); + $model = $this->loadModel($id); // Uncomment the following line if AJAX validation is needed @@ -55,13 +57,6 @@ class UsuarioController extends Controller { )); } - /** - * Lists all models. - */ - public function actionIndex() { - $this->actionModificar(Yii::app()->user->id); - } - /** * 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. @@ -70,7 +65,7 @@ class UsuarioController extends Controller { public function loadModel($id) { $model = Usuario::model()->findByPk($id); if ($model === null) - throw new CHttpException(404, 'The requested page does not exist.'); + throw new CHttpException(404, Yii::t('profind', 'La página solicitada no existe.')); return $model; } @@ -84,5 +79,4 @@ class UsuarioController extends Controller { Yii::app()->end(); } } - } diff --git a/www/protected/models/FormularioCambiarPassword.php b/www/protected/models/FormularioCambiarPassword.php new file mode 100644 index 0000000..23334ad --- /dev/null +++ b/www/protected/models/FormularioCambiarPassword.php @@ -0,0 +1,34 @@ + 128, 'min' => 6, 'message' => Yii::t('profind', 'La contraseña debe al menos 6 caracteres.')), + array('passwordRepetida', 'compare', 'compareAttribute' => 'password', 'message' => Yii::t('profind', 'La confirmación de contraseña no coincide.')), + array('passwordAnterior', 'comprobarPasswordAnterior'), + ); + } + + /** + * Comprobar que la anterior contraseña es correcta + */ + public function comprobarPasswordAnterior($attribute, $params) { + if (!$this->hasErrors()) { + $usuario = Usuario::model()->findByPk(Yii::app()->user->id); + if ($usuario->password != Usuario::model()->encrypt($this->passwordAnterior)) + $this->addError($this->passwordAnterior, Yii::t('profind', 'La contraseña anterior no es correcta.')); + } + } +} \ No newline at end of file diff --git a/www/protected/models/FormularioExtCambiarPassword.php b/www/protected/models/FormularioExtCambiarPassword.php new file mode 100644 index 0000000..e2e571f --- /dev/null +++ b/www/protected/models/FormularioExtCambiarPassword.php @@ -0,0 +1,53 @@ + 128, 'min' => 6, 'message' => Yii::t('profind', 'La contraseña debe al menos 6 caracteres.')), + array('passwordRepetida', 'compare', 'compareAttribute' => 'password', 'message' => Yii::t('profind', 'La confirmación de contraseña no coincide.')), + array('key', 'comprobarKey'), + ); + } + + /** + * Comprobar que existe un usuario con el email recibido. + */ + public function existeEmail($attribute, $params) { + if (!$this->hasErrors()) { + $usuario = Usuario::model()->findByAttributes(array( + 'email' => $this->email + )); + if (!isset($usuario)) + $this->addError($this->key, Yii::t('profind', 'Los datos para cambiar la contraseña no son válidos.')); + } + } + + /** + * Comprobar que la key recibida corresponde al email recibido. + */ + public function comprobarKey($attribute, $params) { + if (!$this->hasErrors()) { + $usuario = Usuario::model()->findByAttributes(array( + 'clave_seguridad' => $this->key, + 'email' => $this->email + )); + if (!isset($usuario)) + $this->addError($this->key, Yii::t('profind', 'Los datos para cambiar la contraseña no son válidos.')); + } + } +} \ No newline at end of file diff --git a/www/protected/models/FormularioRecuperarPassword.php b/www/protected/models/FormularioRecuperarPassword.php new file mode 100644 index 0000000..4feb2ce --- /dev/null +++ b/www/protected/models/FormularioRecuperarPassword.php @@ -0,0 +1,32 @@ +hasErrors()) { + $usuario = Usuario::model()->findByAttributes(array('email' => $this->email)); + + if ($usuario === null) + $this->addError($attribute, Yii::t('profind', 'Email incorrecto')); + } + } +} \ No newline at end of file diff --git a/www/protected/views/mails/notificacion_cambio_password_usuario.php b/www/protected/views/mails/notificacion_cambio_password_usuario.php new file mode 100644 index 0000000..9aaec4d --- /dev/null +++ b/www/protected/views/mails/notificacion_cambio_password_usuario.php @@ -0,0 +1,18 @@ + + + Se ha modificado su password en PROFIND + + +

Se ha modificado su password en PROFIND

+ +

Ha recibido este correo como confirmación de su reciente cambio de contraseña en http://www.profindtic.com.

+

Si su contraseña de http://www.profindtic.com fue cambiada sin su conocimento, pulse en el siguiente enlace para cambiarla de nuevo:
+ +

+

+ Este correo se ha enviado desde http://www.profindtic.com.
+ No responda a este correo ya que ha sido generado automáticamente para su información. +

+

El equipo de PROFIND

+ + diff --git a/www/protected/views/mails/recuperacion_password_usuario.php b/www/protected/views/mails/recuperacion_password_usuario.php new file mode 100644 index 0000000..b66d90a --- /dev/null +++ b/www/protected/views/mails/recuperacion_password_usuario.php @@ -0,0 +1,17 @@ + + + Recuperación de su cuenta en PROFIND + + +

Recuperación de su cuenta en PROFIND

+

Ha recibido este correo en respuesta a su solicitud de recuperación de su cuenta en PROFIND.

+

Para completar el proceso pulse en el siguiente enlace
+ +

+

+ Este correo se ha enviado desde http://www.profindtic.com.
+ No responda a este correo ya que ha sido generado automáticamente para su información. +

+

El equipo de PROFIND

+ + diff --git a/www/themes/profind/views/layouts/main.php b/www/themes/profind/views/layouts/main.php index 53e35f9..a3dac57 100644 --- a/www/themes/profind/views/layouts/main.php +++ b/www/themes/profind/views/layouts/main.php @@ -33,6 +33,8 @@ diff --git a/www/themes/profind/views/seguridadUsuario/cambiar_password.php b/www/themes/profind/views/seguridadUsuario/cambiar_password.php new file mode 100644 index 0000000..74f85ce --- /dev/null +++ b/www/themes/profind/views/seguridadUsuario/cambiar_password.php @@ -0,0 +1,59 @@ +pageTitle=Yii::t('profind', 'Cambiar la password'); ?> + +
+
+

+
+
+ hasErrors()) { ?> +
+ × + ' . Yii::t('profind', 'Se han encontrado errores') . '', '', array('firstError' => true)); + ?> +
+ + + beginWidget('CActiveForm', array( + 'id' => 'cambiar-password-form', + 'enableAjaxValidation' => true, + 'htmlOptions' => array( + 'class' => 'form-horizontal' + ) + )); + ?> + +
+
+ labelEx($formulario, 'passwordAnterior', array('class' => 'control-label')); ?> +
+ passwordField($formulario, 'passwordAnterior', array('class' => 'input-xlarge')); ?> +
+
+ +
+
+ labelEx($formulario, 'password', array('class' => 'control-label')); ?> +
+ passwordField($formulario, 'password', array('class' => 'input-xlarge')); ?> +
+
+ labelEx($formulario, 'passwordRepetida', array('class' => 'control-label')); ?> +
+ passwordField($formulario, 'passwordRepetida', array('class' => 'input-xlarge')); ?> +
+
+ +
+ + +
+
+ endWidget(); ?> +
+
+
+
+
+
diff --git a/www/themes/profind/views/usuario/_form.php b/www/themes/profind/views/usuario/_form.php index b7bd4b3..b9c78fb 100644 --- a/www/themes/profind/views/usuario/_form.php +++ b/www/themes/profind/views/usuario/_form.php @@ -3,13 +3,12 @@

- hasErrors()) { ?> + hasErrors()) { ?>
× - ' . Yii::t('profind', 'Se han encontrado errores') . '', - '', - array('firstError' => true)); ?> + ' . Yii::t('profind', 'Se han encontrado errores') . '', '', array('firstError' => true)); + ?>
@@ -22,7 +21,7 @@ ) )); ?> - +
@@ -46,6 +45,16 @@
+ +
+ labelEx($model, 'password', array('class' => 'control-label')); ?> +
+ +
+
+
labelEx($model, 'telefono', array('class' => 'control-label')); ?>