. */ declare(strict_types=1); namespace FireflyIII\Http\Middleware; use Closure; use FireflyIII\Exceptions\FireflyException; use Illuminate\Auth\AuthenticationException; use Illuminate\Contracts\Auth\Factory as Auth; use Illuminate\Database\QueryException; use Illuminate\Http\Request; /** * Class Authenticate */ class Authenticate { /** * The authentication factory instance. * * @var Auth */ protected $auth; /** * Create a new middleware instance. * * @param Auth $auth * * @return void */ public function __construct(Auth $auth) { $this->auth = $auth; } /** * Handle an incoming request. * * @param Request $request * @param Closure $next * @param string[] ...$guards * * @throws AuthenticationException * @throws FireflyException * @return mixed * */ public function handle($request, Closure $next, ...$guards) { $this->authenticate($request, $guards); return $next($request); } /** * Determine if the user is logged in to any of the given guards. * * @param $request * @param array $guards * * @throws AuthenticationException * @throws FireflyException * @return mixed */ protected function authenticate($request, array $guards) { if (empty($guards)) { try { // go for default guard: /** @noinspection PhpUndefinedMethodInspection */ if ($this->auth->check()) { // do an extra check on user object. /** @noinspection PhpUndefinedMethodInspection */ $user = $this->auth->authenticate(); if (1 === (int) $user->blocked) { $message = (string) trans('firefly.block_account_logout'); if ('email_changed' === $user->blocked_code) { $message = (string) trans('firefly.email_changed_logout'); } app('session')->flash('logoutMessage', $message); /** @noinspection PhpUndefinedMethodInspection */ $this->auth->logout(); throw new AuthenticationException('Blocked account.', $guards); } } } catch (QueryException $e) { // @codeCoverageIgnoreStart throw new FireflyException( sprintf( 'It seems the database has not yet been initialized. Did you run the correct upgrade or installation commands? Error: %s', $e->getMessage() ) ); // @codeCoverageIgnoreEnd } /** @noinspection PhpUndefinedMethodInspection */ return $this->auth->authenticate(); } // @codeCoverageIgnoreStart foreach ($guards as $guard) { if ($this->auth->guard($guard)->check()) { /** @noinspection PhpVoidFunctionResultUsedInspection */ return $this->auth->shouldUse($guard); } } throw new AuthenticationException('Unauthenticated.', $guards); // @codeCoverageIgnoreEnd } }