RegisterController.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. use Slim\Exception\HttpNotFoundException;
  8. class RegisterController extends Controller
  9. {
  10. /**
  11. * @param Request $request
  12. * @param Response $response
  13. * @return Response
  14. * @throws HttpNotFoundException
  15. * @throws \Twig\Error\LoaderError
  16. * @throws \Twig\Error\RuntimeError
  17. * @throws \Twig\Error\SyntaxError
  18. */
  19. public function registerForm(Request $request, Response $response): Response
  20. {
  21. if ($this->session->get('logged', false)) {
  22. return redirect($response, route('home'));
  23. }
  24. $registerEnabled = $this->database->query('SELECT `value` FROM `settings` WHERE `key` = \'register_enabled\'')->fetch()->value ?? 'off';
  25. if ($registerEnabled === 'off') {
  26. throw new HttpNotFoundException($request);
  27. }
  28. return view()->render($response, 'auth/register.twig');
  29. }
  30. /**
  31. * @param Request $request
  32. * @param Response $response
  33. * @return Response
  34. * @throws HttpNotFoundException
  35. * @throws \Exception
  36. */
  37. public function register(Request $request, Response $response): Response
  38. {
  39. if ($this->session->get('logged', false)) {
  40. return redirect($response, route('home'));
  41. }
  42. $registerEnabled = $this->database->query('SELECT `value` FROM `settings` WHERE `key` = \'register_enabled\'')->fetch()->value ?? 'off';
  43. if ($registerEnabled === 'off') {
  44. throw new HttpNotFoundException($request);
  45. }
  46. if (param($request, 'email') === null && !filter_var(param($request, 'email'), FILTER_VALIDATE_EMAIL)) {
  47. $this->session->alert(lang('email_required'), 'danger');
  48. return redirect($response, route('register.show'));
  49. }
  50. if ($this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `email` = ?', param($request, 'email'))->fetch()->count > 0) {
  51. $this->session->alert(lang('email_taken'), 'danger');
  52. return redirect($response, route('register.show'));
  53. }
  54. if (param($request, 'username') === null) {
  55. $this->session->alert(lang('username_required'), 'danger');
  56. return redirect($response, route('register.show'));
  57. }
  58. if (param($request, 'password') === null) {
  59. $this->session->alert(lang('password_required'), 'danger');
  60. return redirect($response, route('register.show'));
  61. }
  62. if ($this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `username` = ?', param($request, 'username'))->fetch()->count > 0) {
  63. $this->session->alert(lang('username_taken'), 'danger');
  64. return redirect($response, route('register.show'));
  65. }
  66. do {
  67. $userCode = humanRandomString(5);
  68. } while ($this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `user_code` = ?', $userCode)->fetch()->count > 0);
  69. $token = $this->generateUserUploadToken();
  70. $activateToken = bin2hex(random_bytes(16));
  71. $this->database->query('INSERT INTO `users`(`email`, `username`, `password`, `is_admin`, `active`, `user_code`, `token`, `activate_token`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', [
  72. param($request, 'email'),
  73. param($request, 'username'),
  74. password_hash(param($request, 'password'), PASSWORD_DEFAULT),
  75. 0,
  76. 0,
  77. $userCode,
  78. $token,
  79. $activateToken,
  80. ]);
  81. Mail::make()
  82. ->from('no-reply@'.str_ireplace('www.', '', parse_url($this->config['base_url'], PHP_URL_HOST)), $this->config['app_name'])
  83. ->to(param($request, 'email'))
  84. ->subject(lang('mail.activate_account', [$this->config['app_name']]))
  85. ->message(lang('mail.activate_text', [
  86. param($request, 'username'),
  87. $this->config['app_name'],
  88. $this->config['base_url'],
  89. route('activate', ['activateToken' => $activateToken]),
  90. ]))
  91. ->send();
  92. $this->session->alert(lang('register_success', [param($request, 'username')]), 'success');
  93. $this->logger->info('New user registered.', [array_diff_key($request->getParsedBody(), array_flip(['password']))]);
  94. return redirect($response, route('login.show'));
  95. }
  96. /**
  97. * @param Request $request
  98. * @param Response $response
  99. * @param string $activateToken
  100. * @return Response
  101. */
  102. public function activateUser(Request $request, Response $response, string $activateToken): Response
  103. {
  104. if ($this->session->get('logged', false)) {
  105. return redirect($response, route('home'));
  106. }
  107. $userId = $this->database->query('SELECT `id` FROM `users` WHERE `activate_token` = ? LIMIT 1', $activateToken)->fetch()->id ?? null;
  108. if ($userId === null) {
  109. $this->session->alert(lang('account_not_found'), 'warning');
  110. return redirect($response, route('login.show'));
  111. }
  112. $this->database->query('UPDATE `users` SET `activate_token`=?, `active`=? WHERE `id` = ?', [
  113. null,
  114. 1,
  115. $userId,
  116. ]);
  117. $this->session->alert(lang('account_activated'), 'success');
  118. return redirect($response, route('login.show'));
  119. }
  120. }