Я довольно новичок в Yii Framework. Я столкнулся с проблемой с одним из существующих приложений Yii.
Там есть функция «забыл пароль». Это работает как, введите имя пользователя и ответ на секретный вопрос. Если оба параметра верны, система отправит одну ссылку на электронную почту пользователя для сброса пароля. Ниже приведена функция:
public function actionCheckAnswer()
{
if(IS_AJAX && isset($_POST['answer']) && isset($_POST['username']))
{
$username=$_POST['username'];
$answer=$_POST['answer'];
$user=User::model()->findByAttributes(array('username'=>$username));
if($user!=null)
{
$realAnswer = $user->secretAnswer;
if(strlen($realAnswer)>0)
{
$profile=Profile::model()->findByAttributes(array('userId'=>$user->id));
if($this->checkAnswerSpam($profile->id))
{
if(strtolower($realAnswer)==strtolower($answer))
{
Activity::log(22, null, $profile->id, -1);
$stamp=Activity::model()->getLogTime(null, $profile->id, -1, 22);
$hash=$profile->id.'_'.sha1($profile->id.$stamp);
$url=Yii::app()->createAbsoluteUrl('site/recover').'/'.$hash;
echo $url;
$this->sendPasswordRecoveryLink($profile->fullName, $profile->email, $url);
//echo '<br />'.CHtml::link($url, $url).'<br />';
echo 'Correct! A link to your password recovery form has been sent to your e-mail. The link expires in 1 hour.<br />If you don\'t receive a mail, please check your spam folder.';
} else {
Activity::log(24, null, $profile->id, -1);
echo 'Sorry, that answer is not correct.';
}
}
} else {
echo 'Sorry, you have not set a secret question answer.';
}
} else {
echo 'No user "'.$username.'" found.';
}
}
}
В настоящее время эта функция не отправляет электронное письмо. Я сделал несколько проблем со стрельбой и обнаружил, что Activity::log(22, null, $profile->id, -1);
дал мне ошибку. Если я прокомментирую эту строку, она отправит письмо со ссылкой для сброса пароля, но это всегда ссылка с истекшим сроком действия. Ниже приведена функция журнала:
public function log($action=0, $trainingId=null, $profileId=null, $piId=null)
{
if($profileId==null) $profileId=Yii::app()->user->profileId;
if($piId==null) $piId=(isset(Yii::app()->user->piId))?Yii::app()->user->piId:0;
$activity=new Activity;
$activity->trainingId=$trainingId;
$activity->profileId=$profileId;
$activity->piId=$piId;
$activity->action=$action;
$activity->save();
}
Ниже приведена функция проверки лимита истечения.
public function getLogTime($trainingId, $profileId, $piId, $action)
{
$all = Activity::model()->findAllByAttributes(array(
'trainingId'=>$trainingId,
'profileId'=>$profileId,
'piId'=>$piId,
'action'=>$action,
));
foreach($all as $single) $return = $single;
return $return->timestamp;
}
public function checkRecoveryHash($hash)
{
$explode=explode('_', $hash);
$stamp=$this->getLogTime(null, $explode[0], -1, 22);
if(strlen($stamp)>0)
{
$time=time();
$stamptime=strtotime($stamp);
$passed=$time-$stamptime;
if($passed < 720*720) //1 hour
return true;
else
return false;
}
}
Не уверен, какую часть и как изменить. Кто-нибудь может сказать мне, что не так?
Задача ещё не решена.
Других решений пока нет …