PasswordRecoveryController.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. namespace App\Controllers\Auth;
  3. use App\Controllers\Controller;
  4. use App\Web\Mail;
  5. use Psr\Http\Message\ResponseInterface as Response;
  6. use Psr\Http\Message\ServerRequestInterface as Request;
  7. class PasswordRecoveryController extends Controller
  8. {
  9. /**
  10. * @param Request $request
  11. * @param Response $response
  12. * @return Response
  13. * @throws \Twig\Error\LoaderError
  14. * @throws \Twig\Error\RuntimeError
  15. * @throws \Twig\Error\SyntaxError
  16. */
  17. public function recover(Request $request, Response $response): Response
  18. {
  19. return view()->render($response, 'auth/recover_mail.twig');
  20. }
  21. /**
  22. * @param Request $request
  23. * @param Response $response
  24. * @return Response
  25. * @throws \Exception
  26. */
  27. public function recoverMail(Request $request, Response $response): Response
  28. {
  29. if ($this->session->get('logged', false)) {
  30. return redirect($response, route('home'));
  31. }
  32. $user = $this->database->query('SELECT `id`, `username` FROM `users` WHERE `email` = ? LIMIT 1', param($request, 'email'))->fetch();
  33. if (!isset($user->id)) {
  34. $this->session->alert(lang('recover_email_sent'), 'success');
  35. return redirect($response, route('recover'));
  36. }
  37. $resetToken = bin2hex(random_bytes(16));
  38. $this->database->query('UPDATE `users` SET `reset_token`=? WHERE `id` = ?', [
  39. $resetToken,
  40. $user->id,
  41. ]);
  42. Mail::make()
  43. ->from('no-reply@'.str_ireplace('www.', '', parse_url($this->config['base_url'], PHP_URL_HOST)), $this->config['app_name'])
  44. ->to(param($request, 'email'))
  45. ->subject(lang('mail.recover_password', [$this->config['app_name']]))
  46. ->message(lang('mail.recover_text', [
  47. $user->username,
  48. route('recover.password', ['resetToken' => $resetToken]),
  49. ]))
  50. ->send();
  51. $this->session->alert(lang('recover_email_sent'), 'success');
  52. return redirect($response, route('recover'));
  53. }
  54. /**
  55. * @param Request $request
  56. * @param Response $response
  57. * @param string $resetToken
  58. * @return Response
  59. * @throws \Twig\Error\LoaderError
  60. * @throws \Twig\Error\RuntimeError
  61. * @throws \Twig\Error\SyntaxError
  62. */
  63. public function recoverPasswordForm(Request $request, Response $response, string $resetToken): Response
  64. {
  65. return view()->render($response, 'auth/recover_password.twig', [
  66. 'reset_token' => $resetToken
  67. ]);
  68. }
  69. /**
  70. * @param Request $request
  71. * @param Response $response
  72. * @param string $resetToken
  73. * @return Response
  74. */
  75. public function recoverPassword(Request $request, Response $response, string $resetToken): Response
  76. {
  77. }
  78. }