. */ /** @noinspection PhpDynamicAsStaticMethodCallInspection */ declare(strict_types=1); namespace FireflyIII\Http\Middleware; use Auth; use Closure; use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\User; use Illuminate\Http\Request; use Log; /** * Class Sandstorm. */ class Sandstorm { /** * Detects if is using Sandstorm, and responds by logging the user * in and/or creating an account. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @param string|null $guard * * @return mixed */ public function handle(Request $request, Closure $next, $guard = null) { // is in Sandstorm environment? $sandstorm = 1 === (int)getenv('SANDSTORM'); app('view')->share('SANDSTORM', $sandstorm); if (!$sandstorm) { return $next($request); } // we're in sandstorm! is user a guest? if (Auth::guard($guard)->guest()) { /** @var UserRepositoryInterface $repository */ $repository = app(UserRepositoryInterface::class); $userId = (string)$request->header('X-Sandstorm-User-Id'); // catch anonymous: $userId = $userId === '' ? 'anonymous' : $userId; $email = $userId . '@firefly'; $user = $repository->findByEmail($email) ?? $this->createUser($email); Log::debug(sprintf('Sandstorm user email is "%s"', $email)); Auth::guard($guard)->login($user); $repository->attachRole($user, 'owner'); app('view')->share('SANDSTORM_ANON', false); } return $next($request); } /** * @param string $email * * @return User */ private function createUser(string $email): User { $repository = app(UserRepositoryInterface::class); return $repository->store( [ 'blocked' => false, 'blocked_code' => null, 'email' => $email, ] ); } }