RegisterController.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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 Psr\Http\Message\ResponseInterface as Response;
  7. use Psr\Http\Message\ServerRequestInterface as Request;
  8. use Slim\Exception\HttpNotFoundException;
  9. class RegisterController extends Controller
  10. {
  11. /**
  12. * @param Request $request
  13. * @param Response $response
  14. * @return Response
  15. * @throws HttpNotFoundException
  16. * @throws \Twig\Error\LoaderError
  17. * @throws \Twig\Error\RuntimeError
  18. * @throws \Twig\Error\SyntaxError
  19. */
  20. public function registerForm(Request $request, Response $response): Response
  21. {
  22. if ($this->session->get('logged', false)) {
  23. return redirect($response, route('home'));
  24. }
  25. if ($this->getSetting('register_enabled', 'off') === '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. if ($this->getSetting('register_enabled', 'off') === 'off') {
  43. throw new HttpNotFoundException($request);
  44. }
  45. $validator = $this->getUserCreateValidator($request);
  46. if ($validator->fails()) {
  47. return redirect($response, route('register.show'));
  48. }
  49. $activateToken = bin2hex(random_bytes(16));
  50. make(UserQuery::class)->create(
  51. param($request, 'email'),
  52. param($request, 'username'),
  53. param($request, 'password'),
  54. 0,
  55. 0,
  56. (int) $this->getSetting('default_user_quota', -1),
  57. $activateToken
  58. );
  59. Mail::make()
  60. ->from(platform_mail(), $this->config['app_name'])
  61. ->to(param($request, 'email'))
  62. ->subject(lang('mail.activate_account', [$this->config['app_name']]))
  63. ->message(lang('mail.activate_text', [
  64. param($request, 'username'),
  65. $this->config['app_name'],
  66. $this->config['base_url'],
  67. route('activate', ['activateToken' => $activateToken]),
  68. ]))
  69. ->send();
  70. $this->session->alert(lang('register_success', [param($request, 'username')]), 'success');
  71. $this->logger->info('New user registered.', [array_diff_key($request->getParsedBody(), array_flip(['password']))]);
  72. return redirect($response, route('login.show'));
  73. }
  74. /**
  75. * @param Response $response
  76. * @param string $activateToken
  77. * @return Response
  78. */
  79. public function activateUser(Response $response, string $activateToken): Response
  80. {
  81. if ($this->session->get('logged', false)) {
  82. return redirect($response, route('home'));
  83. }
  84. $userId = $this->database->query('SELECT `id` FROM `users` WHERE `activate_token` = ? LIMIT 1', $activateToken)->fetch()->id ?? null;
  85. if ($userId === null) {
  86. $this->session->alert(lang('account_not_found'), 'warning');
  87. return redirect($response, route('login.show'));
  88. }
  89. $this->database->query('UPDATE `users` SET `activate_token`=?, `active`=? WHERE `id` = ?', [
  90. null,
  91. 1,
  92. $userId,
  93. ]);
  94. $this->session->alert(lang('account_activated'), 'success');
  95. return redirect($response, route('login.show'));
  96. }
  97. }