SiteController.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Page;
  4. use App\Profile;
  5. use App\Services\FollowerService;
  6. use App\Services\StatusService;
  7. use App\User;
  8. use App\Util\ActivityPub\Helpers;
  9. use App\Util\Localization\Localization;
  10. use Auth;
  11. use Cache;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Support\Str;
  14. use View;
  15. class SiteController extends Controller
  16. {
  17. public function home(Request $request)
  18. {
  19. if (Auth::check()) {
  20. return $this->homeTimeline($request);
  21. } else {
  22. return $this->homeGuest();
  23. }
  24. }
  25. public function homeGuest()
  26. {
  27. return view('site.index');
  28. }
  29. public function homeTimeline(Request $request)
  30. {
  31. if ($request->has('force_old_ui')) {
  32. return view('timeline.home', ['layout' => 'feed']);
  33. }
  34. return redirect('/i/web');
  35. }
  36. public function changeLocale(Request $request, $locale)
  37. {
  38. // todo: add other locales after pushing new l10n strings
  39. $locales = Localization::languages();
  40. if (in_array($locale, $locales)) {
  41. if ($request->user()) {
  42. $user = $request->user();
  43. $user->language = $locale;
  44. $user->save();
  45. }
  46. session()->put('locale', $locale);
  47. }
  48. return redirect(route('site.language'));
  49. }
  50. public function about()
  51. {
  52. return Cache::remember('site.about_v2', now()->addMinutes(15), function () {
  53. $user_count = number_format(User::count());
  54. $post_count = number_format(StatusService::totalLocalStatuses());
  55. $rules = config_cache('app.rules') ? json_decode(config_cache('app.rules'), true) : null;
  56. return view('site.about', compact('rules', 'user_count', 'post_count'))->render();
  57. });
  58. }
  59. public function language()
  60. {
  61. return view('site.language');
  62. }
  63. public function communityGuidelines(Request $request)
  64. {
  65. return Cache::remember('site:help:community-guidelines', now()->addDays(120), function () {
  66. $slug = '/site/kb/community-guidelines';
  67. $page = Page::whereSlug($slug)->whereActive(true)->first();
  68. return View::make('site.help.community-guidelines')->with(compact('page'))->render();
  69. });
  70. }
  71. public function privacy(Request $request)
  72. {
  73. $page = Cache::remember('site:privacy', now()->addDays(120), function () {
  74. $slug = '/site/privacy';
  75. return Page::whereSlug($slug)->whereActive(true)->first();
  76. });
  77. return View::make('site.privacy')->with(compact('page'))->render();
  78. }
  79. public function terms(Request $request)
  80. {
  81. $page = Cache::remember('site:terms', now()->addDays(120), function () {
  82. $slug = '/site/terms';
  83. return Page::whereSlug($slug)->whereActive(true)->first();
  84. });
  85. return View::make('site.terms')->with(compact('page'))->render();
  86. }
  87. public function redirectUrl(Request $request)
  88. {
  89. abort_if(! $request->user(), 404);
  90. $this->validate($request, [
  91. 'url' => 'required|url',
  92. ]);
  93. $url = request()->input('url');
  94. abort_if(Helpers::validateUrl($url) == false, 404);
  95. return view('site.redirect', compact('url'));
  96. }
  97. public function followIntent(Request $request)
  98. {
  99. $this->validate($request, [
  100. 'user' => 'string|min:1|max:15|exists:users,username',
  101. ]);
  102. $profile = Profile::whereUsername($request->input('user'))->firstOrFail();
  103. $user = $request->user();
  104. abort_if($user && $profile->id == $user->profile_id, 404);
  105. $following = $user != null ? FollowerService::follows($user->profile_id, $profile->id) : false;
  106. return view('site.intents.follow', compact('profile', 'user', 'following'));
  107. }
  108. public function legacyProfileRedirect(Request $request, $username)
  109. {
  110. $username = Str::contains($username, '@') ? '@'.$username : $username;
  111. if (str_contains($username, '@')) {
  112. $profile = Profile::whereUsername($username)
  113. ->firstOrFail();
  114. if ($profile->domain == null) {
  115. $url = "/$profile->username";
  116. } else {
  117. $url = "/i/web/profile/_/{$profile->id}";
  118. }
  119. } else {
  120. $profile = Profile::whereUsername($username)
  121. ->whereNull('domain')
  122. ->firstOrFail();
  123. $url = "/$profile->username";
  124. }
  125. return redirect($url);
  126. }
  127. public function legacyWebfingerRedirect(Request $request, $username, $domain)
  128. {
  129. $un = '@'.$username.'@'.$domain;
  130. $profile = Profile::whereUsername($un)
  131. ->firstOrFail();
  132. if ($profile->domain == null) {
  133. $url = "/$profile->username";
  134. } else {
  135. $url = $request->user() ? "/i/web/profile/_/{$profile->id}" : $profile->url();
  136. }
  137. return redirect($url);
  138. }
  139. public function legalNotice(Request $request)
  140. {
  141. $page = Cache::remember('site:legal-notice', now()->addDays(120), function () {
  142. $slug = '/site/legal-notice';
  143. return Page::whereSlug($slug)->whereActive(true)->first();
  144. });
  145. abort_if(! $page, 404);
  146. return View::make('site.legal-notice')->with(compact('page'))->render();
  147. }
  148. public function curatedOnboarding(Request $request)
  149. {
  150. if ($request->user()) {
  151. return redirect('/i/web');
  152. }
  153. $regOpen = (bool) config_cache('pixelfed.open_registration');
  154. $curOnboarding = (bool) config_cache('instance.curated_registration.enabled');
  155. $curOnlyClosed = (bool) config('instance.curated_registration.state.only_enabled_on_closed_reg');
  156. if ($regOpen) {
  157. if ($curOnlyClosed) {
  158. return redirect('/register');
  159. }
  160. } else {
  161. if (! $curOnboarding) {
  162. return redirect('/');
  163. }
  164. }
  165. return view('auth.curated-register.index', ['step' => 1]);
  166. }
  167. }