]> BookStack Code Mirror - bookstack/commitdiff
Merge branch 'feature/public-login-redirect' of git://github.com/Xiphoseer/BookStack...
authorDan Brown <redacted>
Sat, 14 Mar 2020 17:46:30 +0000 (17:46 +0000)
committerDan Brown <redacted>
Sat, 14 Mar 2020 17:46:30 +0000 (17:46 +0000)
1  2 
app/Http/Controllers/Auth/LoginController.php
resources/views/common/header.blade.php

index ea584a3b6f0427f92c271fa8924bff4a5796edb9,639da6699647e8f2a133f7cfc09b7bb25bd4a36a..4c396d3cd3f756af684f0e9c5af579bc3ed9d766
@@@ -2,11 -2,12 +2,11 @@@
  
  namespace BookStack\Http\Controllers\Auth;
  
 -use BookStack\Auth\Access\LdapService;
  use BookStack\Auth\Access\SocialAuthService;
 -use BookStack\Auth\UserRepo;
 -use BookStack\Exceptions\AuthException;
 +use BookStack\Exceptions\LoginAttemptEmailNeededException;
 +use BookStack\Exceptions\LoginAttemptException;
 +use BookStack\Exceptions\UserRegistrationException;
  use BookStack\Http\Controllers\Controller;
 -use Illuminate\Contracts\Auth\Authenticatable;
  use Illuminate\Foundation\Auth\AuthenticatesUsers;
  use Illuminate\Http\Request;
  
@@@ -26,23 -27,32 +26,23 @@@ class LoginController extends Controlle
      use AuthenticatesUsers;
  
      /**
 -     * Where to redirect users after login.
 -     *
 -     * @var string
 +     * Redirection paths
       */
      protected $redirectTo = '/';
 -
      protected $redirectPath = '/';
      protected $redirectAfterLogout = '/login';
  
      protected $socialAuthService;
 -    protected $ldapService;
 -    protected $userRepo;
  
      /**
       * Create a new controller instance.
 -     *
 -     * @param \BookStack\Auth\\BookStack\Auth\Access\SocialAuthService $socialAuthService
 -     * @param LdapService $ldapService
 -     * @param \BookStack\Auth\UserRepo $userRepo
       */
 -    public function __construct(SocialAuthService $socialAuthService, LdapService $ldapService, UserRepo $userRepo)
 +    public function __construct(SocialAuthService $socialAuthService)
      {
 -        $this->middleware('guest', ['only' => ['getLogin', 'postLogin']]);
 +        $this->middleware('guest', ['only' => ['getLogin', 'login']]);
 +        $this->middleware('guard:standard,ldap', ['only' => ['login', 'logout']]);
 +
          $this->socialAuthService = $socialAuthService;
 -        $this->ldapService = $ldapService;
 -        $this->userRepo = $userRepo;
          $this->redirectPath = url('/');
          $this->redirectAfterLogout = url('/login');
          parent::__construct();
      }
  
      /**
 -     * Overrides the action when a user is authenticated.
 -     * If the user authenticated but does not exist in the user table we create them.
 -     * @param Request $request
 -     * @param Authenticatable $user
 -     * @return \Illuminate\Http\RedirectResponse
 -     * @throws AuthException
 -     * @throws \BookStack\Exceptions\LdapException
 +     * Get the needed authorization credentials from the request.
       */
 -    protected function authenticated(Request $request, Authenticatable $user)
 +    protected function credentials(Request $request)
      {
 -        // Explicitly log them out for now if they do no exist.
 -        if (!$user->exists) {
 -            auth()->logout($user);
 -        }
 -
 -        if (!$user->exists && $user->email === null && !$request->filled('email')) {
 -            $request->flash();
 -            session()->flash('request-email', true);
 -            return redirect('/login');
 -        }
 -
 -        if (!$user->exists && $user->email === null && $request->filled('email')) {
 -            $user->email = $request->get('email');
 -        }
 -
 -        if (!$user->exists) {
 -            // Check for users with same email already
 -            $alreadyUser = $user->newQuery()->where('email', '=', $user->email)->count() > 0;
 -            if ($alreadyUser) {
 -                throw new AuthException(trans('errors.error_user_exists_different_creds', ['email' => $user->email]));
 -            }
 -
 -            $user->save();
 -            $this->userRepo->attachDefaultRole($user);
 -            $this->userRepo->downloadAndAssignUserAvatar($user);
 -            auth()->login($user);
 -        }
 -
 -        // Sync LDAP groups if required
 -        if ($this->ldapService->shouldSyncGroups()) {
 -            $this->ldapService->syncGroups($user, $request->get($this->username()));
 -        }
 -
 -        return redirect()->intended('/');
 +        return $request->only('username', 'email', 'password');
      }
  
      /**
       * Show the application login form.
 -     * @param Request $request
 -     * @return \Illuminate\Http\Response
       */
      public function getLogin(Request $request)
      {
          $socialDrivers = $this->socialAuthService->getActiveDrivers();
          $authMethod = config('auth.method');
 -        $samlEnabled = config('saml2.enabled') === true;
  
          if ($request->has('email')) {
              session()->flashInput([
              ]);
          }
  
+         if ($request->has('intended')) {
+             redirect()->setIntendedUrl($request->get('intended'));
+         }
          return view('auth.login', [
            'socialDrivers' => $socialDrivers,
            'authMethod' => $authMethod,
 -          'samlEnabled' => $samlEnabled,
          ]);
      }
  
      /**
 -     * Redirect to the relevant social site.
 -     * @param $socialDriver
 -     * @return \Symfony\Component\HttpFoundation\RedirectResponse
 -     * @throws \BookStack\Exceptions\SocialDriverNotConfigured
 +     * Handle a login request to the application.
 +     *
 +     * @param  \Illuminate\Http\Request  $request
 +     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\Http\JsonResponse
 +     *
 +     * @throws \Illuminate\Validation\ValidationException
       */
 -    public function getSocialLogin($socialDriver)
 +    public function login(Request $request)
      {
 -        session()->put('social-callback', 'login');
 -        return $this->socialAuthService->startLogIn($socialDriver);
 +        $this->validateLogin($request);
 +
 +        // If the class is using the ThrottlesLogins trait, we can automatically throttle
 +        // the login attempts for this application. We'll key this by the username and
 +        // the IP address of the client making these requests into this application.
 +        if (method_exists($this, 'hasTooManyLoginAttempts') &&
 +            $this->hasTooManyLoginAttempts($request)) {
 +            $this->fireLockoutEvent($request);
 +
 +            return $this->sendLockoutResponse($request);
 +        }
 +
 +        try {
 +            if ($this->attemptLogin($request)) {
 +                return $this->sendLoginResponse($request);
 +            }
 +        } catch (LoginAttemptException $exception) {
 +            return $this->sendLoginAttemptExceptionResponse($exception, $request);
 +        }
 +
 +        // If the login attempt was unsuccessful we will increment the number of attempts
 +        // to login and redirect the user back to the login form. Of course, when this
 +        // user surpasses their maximum number of attempts they will get locked out.
 +        $this->incrementLoginAttempts($request);
 +
 +        return $this->sendFailedLoginResponse($request);
      }
  
      /**
 -     * Log the user out of the application.
 +     * Validate the user login request.
       *
       * @param  \Illuminate\Http\Request  $request
 -     * @return \Illuminate\Http\Response
 +     * @return void
 +     *
 +     * @throws \Illuminate\Validation\ValidationException
       */
 -    public function logout(Request $request)
 +    protected function validateLogin(Request $request)
      {
 -        if (config('saml2.enabled') && session()->get('last_login_type') === 'saml2') {
 -            return redirect('/saml2/logout');
 +        $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';
          }
  
 -        $this->guard()->logout();
 +        $request->validate($rules);
 +    }
  
 -        $request->session()->invalidate();
 +    /**
 +     * 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);
 +        }
  
 -        return $this->loggedOut($request) ?: redirect('/');
 +        if ($message = $exception->getMessage()) {
 +            $this->showWarningNotification($message);
 +        }
 +
 +        return redirect('/login');
      }
 +
  }
index 524e4a11af000be035e647b7073900fdfa5aef93,2d3871ba06f865bc13cef7160394dc12b4abf407..3004acf3c0a2f8f157caad1229b7b6c75cfb61cc
@@@ -25,7 -25,7 +25,7 @@@
          </div>
  
          <div class="text-right">
 -            <nav class="header-links" >
 +            <nav class="header-links">
                  <div class="links text-center">
                      @if (hasAppAccess())
                          <a class="hide-over-l" href="{{ url('/search') }}">@icon('search'){{ trans('common.search') }}</a>
                      @endif
  
                      @if(!signedInUser())
 -                        @if(setting('registration-enabled', false))
 -                            <a href="{{ url('/register') }}">@icon('new-user') {{ trans('auth.sign_up') }}</a>
 +                        @if(setting('registration-enabled') && config('auth.method') === 'standard')
 +                            <a href="{{ url('/register') }}">@icon('new-user'){{ trans('auth.sign_up') }}</a>
                          @endif
-                         <a href="{{ url('/login') }}">@icon('login'){{ trans('auth.log_in') }}</a>
 -                        <a href="{{ action('Auth\LoginController@getLogin', ['intended' => url()->current()]) }}">@icon('login') {{ trans('auth.log_in') }}</a>
++                        <a href="{{ action('Auth\LoginController@getLogin', ['intended' => url()->current()]) }}">@icon('login'){{ trans('auth.log_in') }}</a>
                      @endif
                  </div>
                  @if(signedInUser())
                                  <a href="{{ url("/settings/users/{$currentUser->id}") }}">@icon('edit'){{ trans('common.edit_profile') }}</a>
                              </li>
                              <li>
 -                                <a href="{{ url('/logout') }}">@icon('logout'){{ trans('auth.logout') }}</a>
 +                                @if(config('auth.method') === 'saml2')
 +                                    <a href="{{ url('/saml2/logout') }}">@icon('logout'){{ trans('auth.logout') }}</a>
 +                                @else
 +                                    <a href="{{ url('/logout') }}">@icon('logout'){{ trans('auth.logout') }}</a>
 +                                @endif
                              </li>
                          </ul>
                      </div>
@@@ -77,4 -73,4 +77,4 @@@
          </div>
  
      </div>
 -</header>
 +</header>