array( 'class' => 'CCaptchaAction', 'backColor' => 0xFFFFFF, ), ); } /** * @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 si 'enviarMailActivacion' es 'true'. */ public function actionRegistrar() { Yii::trace('Registrando un nuevo usuario', 'application.modules.usuario.RegistroController'); Perfil::$regMode = true; $usuario = new FormularioRegistroUsuario; $perfil = new Perfil; // ajax validator if (isset($_POST['ajax']) && $_POST['ajax'] === 'formulario-registro-usuario') { echo CActiveForm::validate(array($usuario, $perfil)); Yii::app()->end(); } if (Yii::app()->user->id) { $this->redirect(Yii::app()->controller->module->urlPerfil); } else { if (isset($_POST['FormularioRegistroUsuario'])) { $usuario->attributes = $_POST['FormularioRegistroUsuario']; $perfil->attributes = ((isset($_POST['Perfil']) ? $_POST['Perfil'] : array())); if ($usuario->validate() && $perfil->validate()) { $passwordOriginal = $usuario->password; // Rellenar los campos necesarios $usuario->clave_activacion = UsuarioModule::cifrar(microtime() . $usuario->password); $usuario->password = UsuarioModule::cifrar($usuario->password); $usuario->confirmacion_password = UsuarioModule::cifrar($usuario->confirmacion_password); $usuario->superusuario = 0; $usuario->estado = ((Yii::app()->controller->module->activeAfterRegister) ? Usuario::ESTADO_ACTIVO : Usuario::ESTADO_NOACTIVO); // Guardar el usuario y el perfil $transaccion = Yii::app()->db->beginTransaction(); try { Yii::trace('Guardando el nuevo usuario', 'application.modules.usuario.RegistroController'); if (!$usuario->save()) throw new CException('Error al guardar el usuario'); Yii::trace('Guardando el perfil del usuario', 'application.modules.usuario.RegistroController'); $perfil->usuario_id = $usuario->id; if (!$perfil->save()) throw new CException('Error al guardar el perfil'); $transaccion->commit(); Yii::trace('Nuevo usuario dado de alta', 'application.modules.usuario.RegistroController'); } catch (Exception $e) { Yii::trace($e->getMessage(), 'application.modules.usuario.RegistroController'); $transaccion->rollBack(); $errores = array_merge($usuario->getErrors(), $perfil->getErrors()); foreach ($errores as $campo => $mensaje) $resultado[$campo] = $mensaje; Yii::trace(CVarDumper::dumpAsString($resultado), 'application.modules.usuario.RegistroController'); //echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado); Yii::app()->end(); } if (Yii::app()->controller->module->enviarMailActivacion) { Yii::trace('Hay que enviar un correo de activación al usuario', 'application.modules.usuario.RegistroController'); if (EMail::enviarBienvenidaUsuario($usuario->email, $usuario->clave_activacion)) { Yii::trace('Correo para activar el usuario enviado', 'application.modules.usuario.RegistroController'); } else { Yii::trace('Error al enviar el correo para activar el usuario', 'application.modules.usuario.RegistroController'); } } if ((Yii::app()->controller->module->loginSinActivacion || (Yii::app()->controller->module->activarAutomaticamente && Yii::app()->controller->module->enviarMailActivacion == false)) && Yii::app()->controller->module->autoLogin) { Yii::trace('Entrar directamente sin esperar a la activación', 'application.modules.usuario.RegistroController'); $identity = new UserIdentity($usuario->username, $passwordOriginal); $identity->authenticate(); Yii::app()->user->login($identity, 0); $this->redirect(Yii::app()->homeUrl); } else { if (!Yii::app()->controller->module->activarAutomaticamente && !Yii::app()->controller->module->enviarMailActivacion) { Yii::app()->user->setFlash('registro', UsuarioModule::t("Thank you for your registration. Contact Admin to activate your account.")); } elseif (Yii::app()->controller->module->activarAutomaticamente && Yii::app()->controller->module->enviarMailActivacion == false) { Yii::app()->user->setFlash('registro', UsuarioModule::t("Thank you for your registration. Please {{login}}.", array('{{login}}' => CHtml::link(UsuarioModule::t('Login'), Yii::app()->controller->module->urlLogin)))); } elseif (Yii::app()->controller->module->loginSinActivacion) { Yii::app()->user->setFlash('registro', UsuarioModule::t("Thank you for your registration. Please check your email or login.")); } else { Yii::app()->user->setFlash('registro', UsuarioModule::t("Thank you for your registration. Please check your email.")); } $this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin)); } } } else $perfil->validate(); } $this->render('registro', array('model' => $usuario, 'perfil' => $perfil)); } /** * @brief Activa la cuenta del usuarios a partir de la URL de activación * que se le ha enviado a través del email generado en el proceso de * registro. */ public function actionActivar() { Yii::trace('Activando usuario', 'application.modules.usuario.RegistroController'); $email = Yii::app()->request->getQuery('email'); $clave_activacion = Yii::app()->request->getQuery('key'); if ($email && $clave_activacion) { $usuario = Usuario::model()->notsafe()->findByAttributes(array('email' => $email)); // Comprobamos si se ha encontrado un usuario con ese email if (!isset($usuario)) { Yii::trace('No existe el email', 'application.modules.usuario.RegistroController'); Yii::app()->user->setFlash('registro', UsuarioModule::t("No se puede activar la cuenta. La URL de activación es incorrecta.")); $this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin)); } elseif ($usuario->estado == Usuario::ESTADO_ACTIVO) { Yii::trace('El usuario ya está activo', 'application.modules.usuario.RegistroController'); Yii::app()->user->setFlash('registro', UsuarioModule::t("No se ha realizado ningún cambio. La cuenta ya estaba activada.")); $this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin)); } elseif ($usuario->estado == Usuario::ESTADO_BLOQUEADO) { Yii::trace('El usuario está bloqueado', 'application.modules.usuario.RegistroController'); Yii::app()->user->setFlash('registro', UsuarioModule::t("La cuenta ha sido bloqueada. Contacte con el administrador del sitio para obtener más información.")); $this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin)); } elseif (isset($usuario->clave_activacion) && ($usuario->clave_activacion === $clave_activacion)) { Yii::trace('Guardando el usuario', 'application.modules.usuario.RegistroController'); // Hay que activar el usuario $usuario->estado = Usuario::ESTADO_ACTIVO; $usuario->clave_activacion = UsuarioModule::cifrar(microtime() . $usuario->password); $usuario->save(); Yii::trace('Usuario activado', 'application.modules.usuario.RegistroController'); EMail::enviarConfirmacionActivacion($usuario->email); Yii::app()->user->setFlash('registro', UsuarioModule::t("Gracias por registrarse en FactuGES. Su cuenta ha sido confirmada.")); $this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin)); } else { Yii::trace('Clave de seguridad no válida', 'application.modules.usuario.RegistroController'); Yii::app()->user->setFlash('registro', UsuarioModule::t("No se puede activar la cuenta. El enlace de activación es incorrecto.")); $this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin)); } } else { Yii::trace('URL de activación no válida', 'application.modules.usuario.RegistroController'); Yii::app()->user->setFlash('registro', UsuarioModule::t("No se puede activar la cuenta. El enlace de activación es incorrecto.")); $this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin)); } } /** * @brief Realiza la recuperación de la contraseña de un usuario. */ public function actionRecuperar() { Yii::trace('Recuperar la cuenta del usuario', 'application.modules.usuario.RegistroController'); $formulario = new FormularioRecuperarUsuario; if (Yii::app()->user->id) { $this->redirect(Yii::app()->controller->module->returnUrl); } else { 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.modules.usuario.RegistroController'); $this->performAjaxStatusMessage('success', Yii::t('factuges', 'Recuperación de su cuenta en FactuGES'), Yii::t('factuges', 'En unos momentos recibirá un un correo con los pasos necesarios para recuperar su cuenta en FactuGES.') ); } else { Yii::trace('Error al enviar el correo para recuperar la cuenta', 'application.modules.usuario.RegistroController'); $this->performAjaxStatusMessage('success', Yii::t('factuges', 'Recuperación de su cuenta en FactuGES'), Yii::t('factuges', '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.modules.usuario.RegistroController'); $this->performAjaxStatusMessage('failure', Yii::t('factuges', 'Recuperación de su cuenta en FactuGES'), Yii::t('factuges', 'No se encontrado un usuario con el email indicado.') ); } } $this->redirect(Yii::app()->params['frontpage']); } $this->render('recovery', array('form' => $form)); } }