<?php
namespace AppBundle\Controller;
use Biz\Common\BizSms;
use Biz\System\Service\SettingService;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class PasswordResetController extends BaseController
{
public function indexAction(Request $request)
{
$user = $this->getCurrentUser();
if ($user->isLogin()) {
if (!$user['setup'] || false != stripos($user['email'], '@edusoho.net')) {
return $this->redirect($this->generateUrl('homepage'));
}
}
return $this->render(
'password-reset/index.html.twig'
);
}
public function resetByEmailAction(Request $request)
{
$email = $request->request->get('email');
if (empty($email)) {
return $this->createJsonResponse(['error' => ['message' => 'password_reset.message.email_empty']]);
}
$currentUser = $this->getCurrentUser();
if ($currentUser->isLogin() && $currentUser['email'] !== $email) {
return $this->createJsonResponse(['error' => ['message' => 'password_reset.message.email_not_match']]);
}
$user = $this->getUserService()->getUserByEmail($email);
if (empty($user)) {
list($result, $message) = $this->getAuthService()->checkEmail($email);
if ('error_duplicate' == $result) {
return $this->createJsonResponse(['error' => ['message' => 'password_reset.message.error_duplicate']]);
}
return $this->createJsonResponse(['error' => ['message' => 'password_reset.message.email_login_error']]);
}
$token = $this->getUserService()->makeToken('password-reset', $user['id'], strtotime('+1 day'));
try {
$site = $this->setting('site', []);
$mailOptions = [
'to' => $user['email'],
'template' => 'email_reset_password',
'format' => 'html',
'params' => [
'nickname' => $user['nickname'],
'verifyurl' => $this->generateUrl('password_reset_update', ['token' => $token], UrlGeneratorInterface::ABSOLUTE_URL),
'sitename' => $site['name'],
'siteurl' => $site['url'],
],
];
$mailFactory = $this->getBiz()->offsetGet('mail_factory');
$mail = $mailFactory($mailOptions);
$mail->send();
} catch (\Exception $e) {
$this->getLogService()->error('user', 'password-reset', '重设密码邮件发送失败:'.$e->getMessage());
return $this->createJsonResponse(['error' => ['message' => 'password_reset.message.reset_error']]);
}
$this->getLogService()->info('user', 'password-reset', "{$user['email']}向发送了找回密码邮件。");
return $this->createJsonResponse([
'goto' => $this->generateUrl('password_reset_email_sent', ['email' => base64_encode($email)]),
]);
}
public function emailSentAction(Request $request)
{
$email = base64_decode($request->query->get('email', ''));
return $this->render('password-reset/sent.html.twig', [
'email' => $email,
'emailLoginUrl' => $this->getEmailLoginUrl($email),
]);
}
public function updateAction(Request $request)
{
$token = $this->getUserService()->getToken('password-reset', $request->query->get('token') ?: $request->request->get('token'));
if (empty($token)) {
return $this->render(
'password-reset/error.html.twig'
);
}
if ('POST' == $request->getMethod()) {
$password = $request->request->get('password');
$confirmPassword = $request->request->get('confirmPassword');
if (!empty($password) && $password === $confirmPassword) {
$this->getAuthService()->changePassword($token['userId'], null, $password);
$this->getUserService()->deleteToken('password-reset', $token['token']);
$this->getUserService()->changePasswordUpgraded($token['userId']);
return $this->render(
'password-reset/success.html.twig'
);
}
}
return $this->render(
'password-reset/update.html.twig'
);
}
public function changeRawPasswordAction(Request $request)
{
$fields = $request->query->all();
$user_token = $this->getTokenService()->verifyToken('email_password_reset', $fields['token']);
$flag = $this->getUserService()->changeRawPassword($user_token['data']['userId'], $user_token['data']['rawPassword']);
if (!$flag) {
return $this->render(
'password-reset/raw-error.html.twig'
);
} else {
return $this->render(
'password-reset/raw-success.html.twig'
);
}
}
public function resetBySmsAction(Request $request)
{
$mobile = $request->request->get('mobile');
$smsToken = $request->request->get('sms_token');
$smsCode = $request->request->get('sms_code');
if (empty($mobile) || empty($smsToken) || empty($smsCode)) {
return $this->createJsonResponse(['error' => ['message' => 'password_reset.reset_by_sms.message.reset_error']]);
}
$bizSms = $this->getBizSms();
$result = $bizSms->check(BizSms::SMS_FORGET_PASSWORD, $mobile, $smsToken, $smsCode);
if (BizSms::STATUS_INVALID === $result) {
return $this->createJsonResponse(['error' => ['message' => 'password_reset.reset_by_sms.message.sms_code_error']]);
}
if (BizSms::STATUS_EXPIRED === $result) {
return $this->createJsonResponse(['error' => ['message' => 'password_reset.reset_by_sms.message.sms_code_expired']]);
}
$currentUser = $this->getCurrentUser();
if ($currentUser->isLogin() && $currentUser['verifiedMobile'] !== $mobile) {
return $this->createJsonResponse(['error' => ['message' => 'password_reset.reset_by_sms.message.mobile_not_match']]);
}
$targetUser = $this->getUserService()->getUserByVerifiedMobile($mobile);
if (empty($targetUser)) {
return $this->createJsonResponse(['error' => ['message' => 'password_reset.reset_by_sms.message.user_empty']]);
}
$token = $this->getUserService()->makeToken('password-reset', $targetUser['id'], strtotime('+1 day'));
return $this->createJsonResponse([
'goto' => $this->generateUrl('password_reset_update', ['token' => $token]),
]);
}
public function getEmailLoginUrl($email)
{
$host = substr($email, strpos($email, '@') + 1);
if ('hotmail.com' == $host) {
return 'http://www.'.$host;
}
if ('gmail.com' == $host) {
return 'http://mail.google.com';
}
return 'http://mail.'.$host;
}
protected function getAuthService()
{
return $this->createService('User:AuthService');
}
protected function getTokenService()
{
return $this->createService('User:TokenService');
}
/**
* @return SettingService
*/
protected function getSettingService()
{
return $this->createService('System:SettingService');
}
/**
* @return BizSms
*/
protected function getBizSms()
{
return $this->getBiz()['biz_sms'];
}
}