RegisterController.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. namespace App\Controllers\Auth;
  3. use App\Controllers\Controller;
  4. use Psr\Http\Message\ResponseInterface as Response;
  5. use Psr\Http\Message\ServerRequestInterface as Request;
  6. use Slim\Exception\HttpNotFoundException;
  7. class RegisterController extends Controller
  8. {
  9. /**
  10. * @param Request $request
  11. * @param Response $response
  12. * @return Response
  13. * @throws HttpNotFoundException
  14. * @throws \Twig\Error\LoaderError
  15. * @throws \Twig\Error\RuntimeError
  16. * @throws \Twig\Error\SyntaxError
  17. */
  18. public function registerForm(Request $request, Response $response): Response
  19. {
  20. if ($this->session->get('logged', false)) {
  21. return redirect($response, route('home'));
  22. }
  23. $registerEnabled = $this->database->query('SELECT `value` FROM `settings` WHERE `key` = \'register_enabled\'')->fetch()->value ?? 'off';
  24. if ($registerEnabled === 'off') {
  25. throw new HttpNotFoundException($request);
  26. }
  27. return view()->render($response, 'auth/register.twig');
  28. }
  29. /**
  30. * @param Request $request
  31. * @param Response $response
  32. * @return Response
  33. * @throws HttpNotFoundException
  34. * @throws \Exception
  35. */
  36. public function register(Request $request, Response $response): Response
  37. {
  38. if ($this->session->get('logged', false)) {
  39. return redirect($response, route('home'));
  40. }
  41. $registerEnabled = $this->database->query('SELECT `value` FROM `settings` WHERE `key` = \'register_enabled\'')->fetch()->value ?? 'off';
  42. if ($registerEnabled === 'off') {
  43. throw new HttpNotFoundException($request);
  44. }
  45. if (param($request, 'email') === null && !filter_var(param($request, 'email'), FILTER_VALIDATE_EMAIL)) {
  46. $this->session->alert(lang('email_required'), 'danger');
  47. return redirect($response, route('register.show'));
  48. }
  49. if ($this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `email` = ?', param($request, 'email'))->fetch()->count > 0) {
  50. $this->session->alert(lang('email_taken'), 'danger');
  51. return redirect($response, route('register.show'));
  52. }
  53. if (param($request, 'username') === null) {
  54. $this->session->alert(lang('username_required'), 'danger');
  55. return redirect($response, route('register.show'));
  56. }
  57. if (param($request, 'password') === null) {
  58. $this->session->alert(lang('password_required'), 'danger');
  59. return redirect($response, route('register.show'));
  60. }
  61. if ($this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `username` = ?', param($request, 'username'))->fetch()->count > 0) {
  62. $this->session->alert(lang('username_taken'), 'danger');
  63. return redirect($response, route('register.show'));
  64. }
  65. do {
  66. $userCode = humanRandomString(5);
  67. } while ($this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `user_code` = ?', $userCode)->fetch()->count > 0);
  68. $token = $this->generateUserUploadToken();
  69. $activateToken = bin2hex(random_bytes(16));
  70. $this->database->query('INSERT INTO `users`(`email`, `username`, `password`, `is_admin`, `active`, `user_code`, `token`, `activate_token`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', [
  71. param($request, 'email'),
  72. param($request, 'username'),
  73. password_hash(param($request, 'password'), PASSWORD_DEFAULT),
  74. 0,
  75. 0,
  76. $userCode,
  77. $token,
  78. $activateToken,
  79. ]);
  80. $this->session->alert(lang('register_success', [param($request, 'username')]), 'success');
  81. $this->logger->info('New user registered.', [array_diff_key($request->getParsedBody(), array_flip(['password']))]);
  82. return redirect($response, route('login.show'));
  83. }
  84. /**
  85. * @param Request $request
  86. * @param Response $response
  87. * @param string $activateToken
  88. * @return Response
  89. */
  90. public function activateUser(Request $request, Response $response, string $activateToken): Response
  91. {
  92. }
  93. }