Incam_PROFIND_Web/www/protected/controllers/SeguridadUsuarioController.php
2012-09-25 08:06:10 +00:00

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->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_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);
}
}