/** * Authenticates the password. * This is the 'authenticate' validator as declared in rules(). */ public function authenticate($attribute, $params) { if (!$this->hasErrors()) { // we only want to authenticate when no input errors $identity = new user\components\UserIdentity($this->username, $this->password); $identity->authenticate(); switch ($identity->errorCode) { case user\components\UserIdentity::ERROR_NONE: $duration = Yii::app()->user->allowAutoLogin && $this->rememberMe ? Yii::app()->controller->module->rememberMeTime : 0; Yii::app()->user->login($identity, $duration); break; case user\components\UserIdentity::ERROR_EMAIL_INVALID: $this->addError("username", UserModule::t("Email is incorrect.")); break; case user\components\UserIdentity::ERROR_USERNAME_INVALID: $this->addError("username", UserModule::t("Username is incorrect.")); break; case user\components\UserIdentity::ERROR_STATUS_NOT_ACTIVE: $this->addError("status", UserModule::t("Your account is not activated")); break; case user\components\UserIdentity::ERROR_STATUS_BAN: $this->addError("status", UserModule::t("Your account is blocked")); break; case user\components\UserIdentity::ERROR_PASSWORD_INVALID: $this->addError("password", UserModule::t("Password is incorrect.")); break; } } }
/** * Affichage et traitement du formulaire d'inscription */ public function actionRegistration() { $form = new RegistrationForm(); $profile = UserModuleFactory::profile(); $profile->regMode = true; // ajax validator if (isset($_POST['ajax']) && $_POST['ajax'] === 'registration-form') { echo UActiveForm::validate(array($form, $profile)); Yii::app()->end(); } /** @var UserModule $userModule */ $userModule = Yii::app()->controller->module; if (Yii::app()->user->id) { // Utilisateur déjà identifié : on le redirige sur sa page de profil $this->redirect($userModule->profileUrl); } if (isset($_POST['RegistrationForm'])) { // Création d'un nouvel utilisateur $form->attributes = $_POST['RegistrationForm']; if (!$form->validate()) { Yii::app()->user->setFlash('error', UserModule::t("Unable to validate user data")); } else { $profile->attributes = $_POST[get_class($profile)]; if (!$profile->validate()) { Yii::app()->user->setFlash('error', UserModule::t("Unable to validate profile data")); } else { $sourcePassword = $form->password; $form->activkey = UserModule::encrypting(microtime() . $form->password); $form->password = UserModule::encrypting($form->password); $form->verifyPassword = UserModule::encrypting($form->verifyPassword); $form->superuser = 0; $form->status = $userModule->activeAfterRegister ? User::STATUS_ACTIVE : User::STATUS_INACTIVE; $transaction = Yii::app()->db->beginTransaction(); if ($ok = $form->save(false)) { $profile->user_id = $form->id; if ($ok = $profile->save()) { // On envoie le mail de confirmation if (!$this->notifyRegistration($form)) { Yii::app()->user->setFlash('error', UserModule::t("The confirmation mail has not been sent. Please contact the administrator")); } // Connexion automatique du nouvel inscrit, selon la configuration $autoConnect = ($userModule->loginNotActiv || $userModule->activeAfterRegister && $userModule->sendActivationMail == false) && $userModule->autoLogin; if ($autoConnect) { // Connexion automatique $identity = new user\components\UserIdentity($form->username, $sourcePassword); $identity->authenticate(); Yii::app()->user->login($identity, 0); $this->redirect($userModule->returnUrl); } else { if (!$userModule->activeAfterRegister && !$userModule->sendActivationMail) { // Pas d'activation automatique ni de mail : il faut passer par l'admin pour activer le compte Yii::app()->user->setFlash('success', Yii::t("UserModule.msg", "Thank you for your registration. Please contact the administrator to activate your account")); } elseif ($userModule->activeAfterRegister && $userModule->sendActivationMail == false) { // Activation au compte, pas de mail de confirmation : on peut se connecter tout de suite Yii::app()->user->setFlash('success', Yii::t("UserModule.msg", "Thank you for your registration. You can now {{login}}.", array('{{login}}' => CHtml::link(UserModule::t('login'), $userModule->loginUrl)))); } elseif ($userModule->loginNotActiv) { // Yii::app()->user->setFlash('success', Yii::t("UserModule.msg", "Thank you for your registration. Please check your email or login.")); } else { // par défaut : pas d'activation automatique, il faut répondre au mail de confirmation Yii::app()->user->setFlash('success', Yii::t("UserModule.msg", "Thank you for your registration. Please check your email.")); } } } else { // if ($ok = $profile->save()) $msg = array("Erreur sur \$profile->save()", $profile); Yii::log(h::_($msg, __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); Yii::app()->user->setFlash('error', Yii::t('msg', 'There are errors. Please check the form')); } } else { // if ($ok = $form->save(false)) $msg = array("Erreur sur \$form->save()", $form); Yii::log(h::_($msg, __FILE__, __LINE__, __METHOD__), CLogger::LEVEL_ERROR); Yii::app()->user->setFlash('error', UserModule::t("Registration failed. Please contact the administrator")); } if ($ok) { // Inscription validée, on redirige en page d'accueil $transaction->commit(); $this->redirect('/'); } else { $transaction->rollback(); $form->password = $sourcePassword; $form->verifyPassword = $sourcePassword; $this->refresh(); } } } } // Inscription en erreur, on ré-affiche le formulaire $this->render('/user/registration', array('model' => $form, 'profile' => $profile, 'page' => $this->getPage('inscription'))); }