RegisterController.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. namespace App\Controllers\Auth;
  3. use App\Controllers\Controller;
  4. use App\Database\Queries\UserQuery;
  5. use App\Web\Mail;
  6. use App\Web\ValidationHelper;
  7. use Psr\Http\Message\ResponseInterface as Response;
  8. use Psr\Http\Message\ServerRequestInterface as Request;
  9. use Slim\Exception\HttpNotFoundException;
  10. class RegisterController extends AuthController
  11. {
  12. /**
  13. * @param Request $request
  14. * @param Response $response
  15. * @return Response
  16. * @throws HttpNotFoundException
  17. * @throws \Twig\Error\LoaderError
  18. * @throws \Twig\Error\RuntimeError
  19. * @throws \Twig\Error\SyntaxError
  20. */
  21. public function registerForm(Request $request, Response $response): Response
  22. {
  23. if ($this->session->get('logged', false)) {
  24. return redirect($response, route('home'));
  25. }
  26. if ($this->getSetting('register_enabled', 'off') === 'off') {
  27. throw new HttpNotFoundException($request);
  28. }
  29. return view()->render($response, 'auth/register.twig', [
  30. 'recaptcha_site_key' => $this->getSetting('recaptcha_enabled') === 'on' ? $this->getSetting('recaptcha_site_key') : null,
  31. ]);
  32. }
  33. /**
  34. * @param Request $request
  35. * @param Response $response
  36. * @return Response
  37. * @throws HttpNotFoundException
  38. * @throws \Exception
  39. */
  40. public function register(Request $request, Response $response): Response
  41. {
  42. if ($this->session->get('logged', false)) {
  43. return redirect($response, route('home'));
  44. }
  45. if ($this->getSetting('register_enabled', 'off') === 'off') {
  46. throw new HttpNotFoundException($request);
  47. }
  48. if ($this->checkRecaptcha(make(ValidationHelper::class), $request)->fails()) {
  49. return redirect($response, route('register.show'));
  50. }
  51. $validator = $this->getUserCreateValidator($request)->alertIf(empty(param($request, 'password')), 'password_required');
  52. if ($validator->fails()) {
  53. return redirect($response, route('register.show'));
  54. }
  55. $activateToken = bin2hex(random_bytes(16));
  56. make(UserQuery::class)->create(
  57. param($request, 'email'),
  58. param($request, 'username'),
  59. param($request, 'password'),
  60. 0,
  61. 0,
  62. (int) $this->getSetting('default_user_quota', -1),
  63. $activateToken
  64. );
  65. Mail::make()
  66. ->from(platform_mail(), $this->config['app_name'])
  67. ->to(param($request, 'email'))
  68. ->subject(lang('mail.activate_account', [$this->config['app_name']]))
  69. ->message(lang('mail.activate_text', [
  70. param($request, 'username'),
  71. $this->config['app_name'],
  72. $this->config['base_url'],
  73. $this->config['base_url'],
  74. route('activate', ['activateToken' => $activateToken]),
  75. route('activate', ['activateToken' => $activateToken]),
  76. ]))
  77. ->send();
  78. $this->session->alert(lang('register_success', [param($request, 'username')]), 'success');
  79. $this->logger->info('New user registered.', [array_diff_key($request->getParsedBody(), array_flip(['password']))]);
  80. return redirect($response, route('login.show'));
  81. }
  82. /**
  83. * @param Response $response
  84. * @param string $activateToken
  85. * @return Response
  86. */
  87. public function activateUser(Response $response, string $activateToken): Response
  88. {
  89. if ($this->session->get('logged', false)) {
  90. return redirect($response, route('home'));
  91. }
  92. $userId = $this->database->query('SELECT `id` FROM `users` WHERE `activate_token` = ? LIMIT 1', $activateToken)->fetch()->id ?? null;
  93. if ($userId === null) {
  94. $this->session->alert(lang('account_not_found'), 'warning');
  95. return redirect($response, route('login.show'));
  96. }
  97. $this->database->query('UPDATE `users` SET `activate_token`=?, `active`=? WHERE `id` = ?', [
  98. null,
  99. 1,
  100. $userId,
  101. ]);
  102. $this->session->alert(lang('account_activated'), 'success');
  103. return redirect($response, route('login.show'));
  104. }
  105. }