+
+ /**
+ * Validate the user login request.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return void
+ *
+ * @throws \Illuminate\Validation\ValidationException
+ */
+ protected function validateLogin(Request $request)
+ {
+ $rules = ['password' => 'required|string'];
+ $authMethod = config('auth.method');
+
+ if ($authMethod === 'standard') {
+ $rules['email'] = 'required|email';
+ }
+
+ if ($authMethod === 'ldap') {
+ $rules['username'] = 'required|string';
+ $rules['email'] = 'email';
+ }
+
+ $request->validate($rules);
+ }
+
+ /**
+ * Send a response when a login attempt exception occurs.
+ */
+ protected function sendLoginAttemptExceptionResponse(LoginAttemptException $exception, Request $request)
+ {
+ if ($exception instanceof LoginAttemptEmailNeededException) {
+ $request->flash();
+ session()->flash('request-email', true);
+ }
+
+ if ($message = $exception->getMessage()) {
+ $this->showWarningNotification($message);
+ }
+
+ return redirect('/login');
+ }
+
+ /**
+ * Log failed accesses, matching the default fail2ban nginx/apache auth rules.
+ */
+ protected function logFailedAccess(Request $request)
+ {
+ if (isset($_SERVER['SERVER_SOFTWARE']) && preg_match('/nginx/i', $_SERVER['SERVER_SOFTWARE'])) {
+ error_log('user "' . $request->get($this->username()) . '" was not found in "BookStack"', 4);
+ } else {
+ error_log('user "' . $request->get($this->username()) . '" authentication failure for "BookStack"', 4);
+ }
+ }
+