Просмотр файла app/Controllers/HomeController.php

Размер файла: 3.13Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Controllers;
  6.  
  7. use App\Models\Ban;
  8. use Exception;
  9. use Gregwar\Captcha\PhraseBuilder;
  10. use Gregwar\Captcha\CaptchaBuilder;
  11. use Illuminate\Http\Request;
  12.  
  13. class HomeController extends BaseController
  14. {
  15. /**
  16. * Главная страница
  17. *
  18. * @return string
  19. */
  20. public function index(): string
  21. {
  22. return view('index');
  23. }
  24.  
  25. /**
  26. * Закрытие сайта
  27. *
  28. * @return string
  29. */
  30. public function closed(): string
  31. {
  32. if (setting('closedsite') !== 2) {
  33. redirect('/');
  34. }
  35.  
  36. header($_SERVER['SERVER_PROTOCOL'] . ' 503 Service Unavailable');
  37.  
  38. return view('pages/closed');
  39. }
  40.  
  41. /**
  42. * Поиск по сайту
  43. *
  44. * @return string
  45. */
  46. public function search(): string
  47. {
  48. return view('search/index');
  49. }
  50.  
  51. /**
  52. * Бан по IP
  53. *
  54. * @param Request $request
  55. *
  56. * @return string
  57. * @throws Exception
  58. */
  59. public function ipban(Request $request): string
  60. {
  61. $ban = Ban::query()
  62. ->where('ip', getIp())
  63. ->first();
  64.  
  65. if (! $ban) {
  66. ipBan(true);
  67. redirect('/');
  68. }
  69.  
  70. if (! $ban->user_id
  71. && $ban->created_at < strtotime('-1 minute', SITETIME)
  72. && $request->isMethod('post')
  73. && captchaVerify()
  74. ) {
  75. $ban->delete();
  76. ipBan(true);
  77.  
  78. setFlash('success', __('pages.ip_success_unbanned'));
  79. redirect('/');
  80. }
  81.  
  82. header($_SERVER['SERVER_PROTOCOL'] . ' 429 Too Many Requests');
  83.  
  84. return view('pages/ipban', compact('ban'));
  85. }
  86.  
  87. /**
  88. * Защитная картинка
  89. *
  90. * @return void
  91. */
  92. public function captcha(): void
  93. {
  94. header('Content-type: image/jpeg');
  95. $phrase = new PhraseBuilder();
  96. $phrase = $phrase->build(setting('captcha_maxlength'), setting('captcha_symbols'));
  97.  
  98. $builder = new CaptchaBuilder($phrase);
  99. $builder->setBackgroundColor(mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
  100. $builder->setMaxOffset(setting('captcha_offset'));
  101. $builder->setMaxAngle(setting('captcha_angle'));
  102. $builder->setDistortion(setting('captcha_distortion'));
  103. $builder->setInterpolation(setting('captcha_interpolation'));
  104. $builder->build()->output();
  105.  
  106. $_SESSION['protect'] = $builder->getPhrase();
  107. }
  108.  
  109. /**
  110. * Быстрое изменение языка
  111. *
  112. * @param string $lang
  113. * @param Request $request
  114. */
  115. public function language(string $lang, Request $request): void
  116. {
  117. $return = $request->input('return');
  118. $languages = array_map('basename', glob(RESOURCES . '/lang/*', GLOB_ONLYDIR));
  119.  
  120. if (preg_match('/^[a-z]+$/', $lang) && in_array($lang, $languages, true)) {
  121. if ($user = getUser()) {
  122. $user->update([
  123. 'language' => $lang,
  124. ]);
  125. } else {
  126. $_SESSION['language'] = $lang;
  127. }
  128. }
  129.  
  130. redirect($return ?? '/');
  131. }
  132. }