LoginController.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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. $messages = [];
  64. if(
  65. (bool) config_cache('captcha.enabled') &&
  66. (bool) config_cache('captcha.active.login') ||
  67. (
  68. (bool) config_cache('captcha.triggers.login.enabled') &&
  69. request()->session()->has('login_attempts') &&
  70. request()->session()->get('login_attempts') >= config('captcha.triggers.login.attempts')
  71. )
  72. ) {
  73. $rules['h-captcha-response'] = 'required|filled|captcha|min:5';
  74. $messages['h-captcha-response.required'] = 'The captcha must be filled';
  75. }
  76. $request->validate($rules, $messages);
  77. }
  78. /**
  79. * The user has been authenticated.
  80. *
  81. * @param \Illuminate\Http\Request $request
  82. * @param mixed $user
  83. *
  84. * @return mixed
  85. */
  86. protected function authenticated($request, $user)
  87. {
  88. if($user->status == 'deleted') {
  89. return;
  90. }
  91. $log = new AccountLog();
  92. $log->user_id = $user->id;
  93. $log->item_id = $user->id;
  94. $log->item_type = 'App\User';
  95. $log->action = 'auth.login';
  96. $log->message = 'Account Login';
  97. $log->link = null;
  98. $log->ip_address = $request->ip();
  99. $log->user_agent = $request->userAgent();
  100. $log->save();
  101. }
  102. /**
  103. * Get the failed login response instance.
  104. *
  105. * @param \Illuminate\Http\Request $request
  106. * @return \Symfony\Component\HttpFoundation\Response
  107. *
  108. * @throws \Illuminate\Validation\ValidationException
  109. */
  110. protected function sendFailedLoginResponse(Request $request)
  111. {
  112. if(config('captcha.triggers.login.enabled')) {
  113. if ($request->session()->has('login_attempts')) {
  114. $ct = $request->session()->get('login_attempts');
  115. $request->session()->put('login_attempts', $ct + 1);
  116. } else {
  117. $request->session()->put('login_attempts', 1);
  118. }
  119. }
  120. throw ValidationException::withMessages([
  121. $this->username() => [trans('auth.failed')],
  122. ]);
  123. }
  124. }