public function testFormValidation() { $token = $this->getFixture('token')->getModel('recovery'); $form = new RecoveryForm(['token' => $token]); $this->specify('password is required', function () use($form) { verify($form->validate(['password']))->false(); }); $this->specify('password is too short', function () use($form) { $form->password = '******'; verify($form->validate(['password']))->false(); }); $this->specify('password is ok', function () use($form) { $form->password = '******'; verify($form->validate(['password']))->true(); }); }
public function actionRequest() { if (!$this->module->enablePasswordRecovery) { throw new NotFoundHttpException(); } /** @var RecoveryForm $model */ $model = Yii::createObject(['class' => RecoveryForm::className(), 'scenario' => 'request']); $this->performAjaxValidation($model); if ($model->load(Yii::$app->request->post()) && $model->sendRecoveryMessage()) { return $this->render('/message', ['title' => Yii::t('user', 'Recovery message sent'), 'module' => $this->module]); } return $this->render('request', ['model' => $model]); }
public function testFormValidation() { $form = \Yii::createObject(RecoveryForm::className()); $form->scenario = 'reset'; $this->specify('password is required', function () use($form) { verify($form->validate(['password']))->false(); }); $this->specify('password is too short', function () use($form) { $form->password = '******'; verify($form->validate(['password']))->false(); }); $this->specify('password is ok', function () use($form) { $form->password = '******'; verify($form->validate(['password']))->true(); }); }
/** * Shows page where user can request password recovery. * * @return string * @throws \yii\web\NotFoundHttpException */ public function actionRequest() { if (!$this->module->enablePasswordRecovery) { throw new NotFoundHttpException(); } /** @var RecoveryForm $model */ $model = Yii::createObject(['class' => RecoveryForm::className(), 'scenario' => 'request']); $event = $this->getFormEvent($model); $this->performAjaxValidation($model); $this->trigger(self::EVENT_BEFORE_REQUEST, $event); if ($model->load(Yii::$app->request->post()) && $model->sendRecoveryMessage()) { $this->trigger(self::EVENT_AFTER_REQUEST, $event); return $this->render('/loginEmail', ['title' => Yii::t('user', 'Recovery message sent'), 'module' => $this->module, "email" => $model->email, "emailFacilitator" => Util::getEmailLoginUrl($model->email)]); } return $this->render('request', ['model' => $model]); }
/** * Displays page where user can reset password. * @param integer $id * @param string $code * @return string * @throws \yii\web\NotFoundHttpException */ public function actionReset($id, $code) { if (!$this->module->enablePasswordRecovery) { throw new NotFoundHttpException(); } /** @var Token $token */ $token = $this->finder->findToken(['user_id' => $id, 'code' => $code, 'type' => Token::TYPE_RECOVERY])->one(); if ($token === null || $token->isExpired || $token->user === null) { \Yii::$app->session->setFlash('danger', \Yii::t('user', 'Recovery link is invalid or out-of-date. Please try requesting a new one.')); return $this->render('/message', ['title' => \Yii::t('user', 'Invalid or out-of-date link'), 'module' => $this->module]); } $model = \Yii::createObject(['class' => RecoveryForm::className(), 'scenario' => 'reset']); $this->performAjaxValidation($model); if ($model->load(\Yii::$app->getRequest()->post()) && $model->resetPassword($token)) { return $this->render('/message', ['title' => \Yii::t('user', 'Password has been changed'), 'module' => $this->module]); } return $this->render('reset', ['model' => $model]); }
/** * Tests resetting of password. */ public function testPasswordReset() { $form = Yii::createObject(['class' => RecoveryForm::className(), 'scenario' => 'reset']); $this->specify('password is required', function () use($form) { $form->setAttributes(['password' => '']); verify($form->validate())->false(); verify($form->getErrors('password'))->contains('Password cannot be blank.'); }); $user = Yii::createObject(User::className()); $umock = test::double($user, ['resetPassword' => true]); $token = Yii::createObject(Token::className()); $tmock = test::double($token, ['delete' => true, 'getUser' => $user]); $this->specify('return false if validation fails', function () use($form) { $token = Yii::createObject(Token::className()); $mock = test::double($form, ['validate' => false]); verify($form->resetPassword($token))->false(); $mock->verifyInvoked('validate'); test::double($form, ['validate' => true]); }); $this->specify('return false if token is invalid', function () use($form) { $token = Yii::createObject(Token::className()); $tmock = test::double($token, ['getUser' => null]); verify($form->resetPassword($token))->false(); $tmock->verifyInvoked('getUser'); }); $this->specify('method sets correct flash message', function () use($form) { $user = Yii::createObject(User::className()); $umock = test::double($user, ['resetPassword' => true]); $token = Yii::createObject(Token::className()); $tmock = test::double($token, ['delete' => true, 'getUser' => $user]); verify($form->resetPassword($token))->true(); verify(\Yii::$app->session->getFlash('success'))->equals('Your password has been changed successfully.'); $umock->verifyInvoked('resetPassword'); $tmock->verifyInvoked('delete'); test::double($user, ['resetPassword' => false]); verify($form->resetPassword($token))->true(); verify(\Yii::$app->session->getFlash('danger'))->equals('An error occurred and your password has not been changed. Please try again later.'); }); }
/** * Displays page where user can reset password. * * @param int $id * @param string $code * * @return string * @throws \yii\web\NotFoundHttpException */ public function actionReset($id, $code) { if (!$this->module->enablePasswordRecovery) { throw new NotFoundHttpException(); } /** @var Token $token */ $token = $this->finder->findToken(['user_id' => $id, 'code' => $code, 'type' => Token::TYPE_RECOVERY])->one(); $event = $this->getResetPasswordEvent($token); $this->trigger(self::EVENT_BEFORE_TOKEN_VALIDATE, $event); if ($token === null || $token->isExpired || $token->user === null) { $this->trigger(self::EVENT_AFTER_TOKEN_VALIDATE, $event); Yii::$app->session->setFlash('danger', Yii::t('user', 'Recovery link is invalid or expired. Please try requesting a new one.')); return $this->render('/message', ['title' => Yii::t('user', 'Invalid or expired link'), 'module' => $this->module]); } /** @var RecoveryForm $model */ $model = Yii::createObject(['class' => RecoveryForm::className(), 'scenario' => 'reset']); $event->setForm($model); $this->performAjaxValidation($model); $this->trigger(self::EVENT_BEFORE_RESET, $event); if ($model->load(Yii::$app->getRequest()->post()) && $model->resetPassword($token)) { $this->trigger(self::EVENT_AFTER_RESET, $event); return $this->render('/message', ['title' => Yii::t('user', 'Password has been changed'), 'module' => $this->module]); } return $this->render('reset', ['model' => $model]); }
/** * @inheritdoc */ public function rules() { $rules = parent::rules(); $rules[count($rules) - 1]['min'] = User::PASSWORD_MIN_LENGTH; return $rules; }
<?php use yii\helpers\Html; use yii\helpers\Url; use kartik\widgets\ActiveForm; use yii\helpers\ArrayHelper; use dektrium\user\models\RecoveryForm; $model = Yii::createObject(['class' => RecoveryForm::className(), 'scenario' => 'request']); ?> <div class="container-fluid"> <div class="row"> <div class="col-md-5"> <h4><i class="fa fa-lock"></i> Zaboravljena lozinka</h4> <div class="margin-top-20"> <?php $form = ActiveForm::begin(['id' => 'password-recovery-form', 'type' => ActiveForm::TYPE_VERTICAL, 'action' => Url::to('/user/recovery/request')]); ?> <?php echo $form->field($model, 'email', ['enableAjaxValidation' => true, 'feedbackIcon' => ['default' => 'envelope', 'success' => 'ok', 'error' => 'exclamation-sign', 'defaultOptions' => ['class' => 'text-primary']]])->input('email'); ?> <div class="form-group"> <?php echo Html::submitButton('Nastavi', ['class' => 'btn btn-primary', 'style' => 'width:100%']); ?> </div> <?php ActiveForm::end(); ?>
/** * Displays page where user can reset password. * * @param int $id * @param string $code * * @return string * @throws \yii\web\NotFoundHttpException */ public function actionReset($id, $code) { $this->layout = '@app/views/layouts/login'; if (!$this->module->enablePasswordRecovery) { throw new NotFoundHttpException(); } /** @var Token $token */ $token = $this->finder->findToken(['user_id' => $id, 'code' => $code, 'type' => Token::TYPE_RECOVERY])->one(); if ($token === null || $token->isExpired || $token->user === null) { Yii::$app->session->setFlash('danger', Yii::t('user', 'Recovery link is invalid or expired. Please try requesting a new one.')); return $this->goHome(); } /** @var RecoveryForm $model */ $model = Yii::createObject(['class' => RecoveryForm::className(), 'scenario' => 'reset']); $this->performAjaxValidation($model); if ($model->load(Yii::$app->getRequest()->post()) && $model->resetPassword($token)) { return $this->redirect('/user/login', 302); } return $this->render('reset', ['model' => $model]); }