예제 #1
0
 /**
  * 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')));
 }