LoginController.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <?php
  2. namespace App\Http\Controllers\Auth;
  3. use App\AccountLog;
  4. use App\Http\Controllers\Controller;
  5. use App\User;
  6. use Illuminate\Foundation\Auth\AuthenticatesUsers;
  7. use App\Services\BouncerService;
  8. use Illuminate\Http\Request;
  9. use Illuminate\Validation\ValidationException;
  10. class LoginController extends Controller
  11. {
  12. /*
  13. |--------------------------------------------------------------------------
  14. | Login Controller
  15. |--------------------------------------------------------------------------
  16. |
  17. | This controller handles authenticating users for the application and
  18. | redirecting them to your home screen. The controller uses a trait
  19. | to conveniently provide its functionality to your applications.
  20. |
  21. */
  22. use AuthenticatesUsers;
  23. /**
  24. * Where to redirect users after login.
  25. *
  26. * @var string
  27. */
  28. protected $redirectTo = '/i/web';
  29. protected $maxAttempts = 5;
  30. protected $decayMinutes = 60;
  31. /**
  32. * Create a new controller instance.
  33. *
  34. * @return void
  35. */
  36. public function __construct()
  37. {
  38. $this->middleware('guest')->except('logout');
  39. }
  40. public function showLoginForm()
  41. {
  42. if(config('pixelfed.bouncer.cloud_ips.ban_logins')) {
  43. abort_if(BouncerService::checkIp(request()->ip()), 404);
  44. }
  45. return view('auth.login');
  46. }
  47. /**
  48. * Validate the user login request.
  49. *
  50. * @param \Illuminate\Http\Request $request
  51. *
  52. * @return void
  53. */
  54. public function validateLogin($request)
  55. {
  56. if(config('pixelfed.bouncer.cloud_ips.ban_logins')) {
  57. abort_if(BouncerService::checkIp($request->ip()), 404);
  58. }
  59. $rules = [
  60. $this->username() => 'required|email',
  61. 'password' => 'required|string|min:6',
  62. ];
  63. if(
  64. config('captcha.enabled') ||
  65. config('captcha.active.login') ||
  66. (
  67. config('captcha.triggers.login.enabled') &&
  68. request()->session()->has('login_attempts') &&
  69. request()->session()->get('login_attempts') >= config('captcha.triggers.login.attempts')
  70. )
  71. ) {
  72. $rules['h-captcha-response'] = 'required|filled|captcha|min:5';
  73. }
  74. $this->validate($request, $rules);
  75. }
  76. /**
  77. * The user has been authenticated.
  78. *
  79. * @param \Illuminate\Http\Request $request
  80. * @param mixed $user
  81. *
  82. * @return mixed
  83. */
  84. protected function authenticated($request, $user)
  85. {
  86. if($user->status == 'deleted') {
  87. return;
  88. }
  89. $log = new AccountLog();
  90. $log->user_id = $user->id;
  91. $log->item_id = $user->id;
  92. $log->item_type = 'App\User';
  93. $log->action = 'auth.login';
  94. $log->message = 'Account Login';
  95. $log->link = null;
  96. $log->ip_address = $request->ip();
  97. $log->user_agent = $request->userAgent();
  98. $log->save();
  99. }
  100. /**
  101. * Get the failed login response instance.
  102. *
  103. * @param \Illuminate\Http\Request $request
  104. * @return \Symfony\Component\HttpFoundation\Response
  105. *
  106. * @throws \Illuminate\Validation\ValidationException
  107. */
  108. protected function sendFailedLoginResponse(Request $request)
  109. {
  110. if(config('captcha.triggers.login.enabled')) {
  111. if ($request->session()->has('login_attempts')) {
  112. $ct = $request->session()->get('login_attempts');
  113. $request->session()->put('login_attempts', $ct + 1);
  114. } else {
  115. $request->session()->put('login_attempts', 1);
  116. }
  117. }
  118. throw ValidationException::withMessages([
  119. $this->username() => [trans('auth.failed')],
  120. ]);
  121. }
  122. }