mirror of
				https://github.com/elyby/accounts.git
				synced 2025-05-31 14:11:46 +05:30 
			
		
		
		
	
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | ||
| namespace api\models\authentication;
 | ||
| 
 | ||
| use api\models\AccountIdentity;
 | ||
| use api\models\base\KeyConfirmationForm;
 | ||
| use common\helpers\Error as E;
 | ||
| use common\models\EmailActivation;
 | ||
| use common\validators\PasswordValidator;
 | ||
| use Yii;
 | ||
| use yii\base\ErrorException;
 | ||
| 
 | ||
| class RecoverPasswordForm extends KeyConfirmationForm {
 | ||
| 
 | ||
|     public $newPassword;
 | ||
| 
 | ||
|     public $newRePassword;
 | ||
| 
 | ||
|     public function rules() {
 | ||
|         return array_merge(parent::rules(), [
 | ||
|             ['newPassword', 'required', 'message' => E::NEW_PASSWORD_REQUIRED],
 | ||
|             ['newRePassword', 'required', 'message' => E::NEW_RE_PASSWORD_REQUIRED],
 | ||
|             ['newPassword', PasswordValidator::class],
 | ||
|             ['newRePassword', 'validatePasswordAndRePasswordMatch'],
 | ||
|         ]);
 | ||
|     }
 | ||
| 
 | ||
|     public function validatePasswordAndRePasswordMatch($attribute) {
 | ||
|         if (!$this->hasErrors()) {
 | ||
|             if ($this->newPassword !== $this->newRePassword) {
 | ||
|                 $this->addError($attribute, E::NEW_RE_PASSWORD_DOES_NOT_MATCH);
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     public function recoverPassword() {
 | ||
|         if (!$this->validate()) {
 | ||
|             return false;
 | ||
|         }
 | ||
| 
 | ||
|         $confirmModel = $this->getActivationCodeModel();
 | ||
|         if ($confirmModel->type !== EmailActivation::TYPE_FORGOT_PASSWORD_KEY) {
 | ||
|             $confirmModel->delete();
 | ||
|             // TODO: вот где-то здесь нужно ещё попутно сгенерировать соответствующую ошибку
 | ||
|             return false;
 | ||
|         }
 | ||
| 
 | ||
|         $transaction = Yii::$app->db->beginTransaction();
 | ||
|         try {
 | ||
|             $account = $confirmModel->account;
 | ||
|             $account->password = $this->newPassword;
 | ||
|             if (!$confirmModel->delete()) {
 | ||
|                 throw new ErrorException('Unable remove activation key.');
 | ||
|             }
 | ||
| 
 | ||
|             if (!$account->save(false)) {
 | ||
|                 throw new ErrorException('Unable activate user account.');
 | ||
|             }
 | ||
| 
 | ||
|             $transaction->commit();
 | ||
|         } catch (ErrorException $e) {
 | ||
|             $transaction->rollBack();
 | ||
|             if (YII_DEBUG) {
 | ||
|                 throw $e;
 | ||
|             } else {
 | ||
|                 return false;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         // TODO: ещё было бы неплохо уведомить пользователя о том, что его пароль изменился
 | ||
| 
 | ||
|         /** @var \api\components\User\Component $component */
 | ||
|         $component = Yii::$app->user;
 | ||
| 
 | ||
|         return $component->login(new AccountIdentity($account->attributes), false);
 | ||
|     }
 | ||
| 
 | ||
| }
 |