Tarea #1099 -> Mejorar la encriptación de las contraseñas git-svn-id: https://192.168.0.254/svn/Proyectos.Incam_PROFIND_Web/trunk@55 3fe1ab16-cfe0-e34b-8c9f-7d8c168d430d
185 lines
8.0 KiB
PHP
185 lines
8.0 KiB
PHP
<?php
|
|
|
|
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.
|
|
* 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);
|
|
}
|
|
|
|
} |