RegisterController.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. 'recaptcha_site_key' => $this->getSetting('recaptcha_enabled') === 'on' ? $this->getSetting('recaptcha_site_key') : null,
  30. ]);
  31. }
  32. /**
  33. * @param Request $request
  34. * @param Response $response
  35. * @return Response
  36. * @throws HttpNotFoundException
  37. * @throws \Exception
  38. */
  39. public function register(Request $request, Response $response): Response
  40. {
  41. if ($this->session->get('logged', false)) {
  42. return redirect($response, route('home'));
  43. }
  44. if ($this->getSetting('register_enabled', 'off') === 'off') {
  45. throw new HttpNotFoundException($request);
  46. }
  47. if ($this->getSetting('recaptcha_enabled') === 'on') {
  48. $recaptcha = json_decode(file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$this->getSetting('recaptcha_secret_key').'&response='.param($request, 'recaptcha_token')));
  49. if ($recaptcha->success && $recaptcha->score < 0.5) {
  50. $this->session->alert(lang('recaptcha_failed'), 'danger');
  51. return redirect($response, route('register.show'));
  52. }
  53. }
  54. $validator = $this->getUserCreateValidator($request);
  55. if ($validator->fails()) {
  56. return redirect($response, route('register.show'));
  57. }
  58. $activateToken = bin2hex(random_bytes(16));
  59. make(UserQuery::class)->create(
  60. param($request, 'email'),
  61. param($request, 'username'),
  62. param($request, 'password'),
  63. 0,
  64. 0,
  65. (int) $this->getSetting('default_user_quota', -1),
  66. $activateToken
  67. );
  68. Mail::make()
  69. ->from(platform_mail(), $this->config['app_name'])
  70. ->to(param($request, 'email'))
  71. ->subject(lang('mail.activate_account', [$this->config['app_name']]))
  72. ->message(lang('mail.activate_text', [
  73. param($request, 'username'),
  74. $this->config['app_name'],
  75. $this->config['base_url'],
  76. route('activate', ['activateToken' => $activateToken]),
  77. ]))
  78. ->send();
  79. $this->session->alert(lang('register_success', [param($request, 'username')]), 'success');
  80. $this->logger->info('New user registered.', [array_diff_key($request->getParsedBody(), array_flip(['password']))]);
  81. return redirect($response, route('login.show'));
  82. }
  83. /**
  84. * @param Response $response
  85. * @param string $activateToken
  86. * @return Response
  87. */
  88. public function activateUser(Response $response, string $activateToken): Response
  89. {
  90. if ($this->session->get('logged', false)) {
  91. return redirect($response, route('home'));
  92. }
  93. $userId = $this->database->query('SELECT `id` FROM `users` WHERE `activate_token` = ? LIMIT 1', $activateToken)->fetch()->id ?? null;
  94. if ($userId === null) {
  95. $this->session->alert(lang('account_not_found'), 'warning');
  96. return redirect($response, route('login.show'));
  97. }
  98. $this->database->query('UPDATE `users` SET `activate_token`=?, `active`=? WHERE `id` = ?', [
  99. null,
  100. 1,
  101. $userId,
  102. ]);
  103. $this->session->alert(lang('account_activated'), 'success');
  104. return redirect($response, route('login.show'));
  105. }
  106. }