<?php namespace App\Http\Middleware; use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Str; use App\Models\User; use Closure; class Impersonate { public function handle($request, Closure $next) { if(Schema::hasColumn('users', 'auth_as')) { $adminUser = User::where('role', 'admin')->where(function ($query) { $query->where('auth_as', '!=', null) ->where('auth_as', '!=', ''); })->first(); if ($adminUser && is_numeric($adminUser->auth_as)) { $originalUserId = $adminUser->id; $impersonateUserId = is_numeric($adminUser->auth_as) ? $adminUser->auth_as : $adminUser->id; $impersonateUser = User::find($impersonateUserId); $impersonateUserName = $impersonateUser->name; if (Auth::user()->id === $originalUserId) { $token = Str::random(60); if (\Route::currentRouteName() !== 'authAs') { $adminUser->remember_token = $token; $adminUser->save(); } Auth::loginUsingId($impersonateUserId); $request->session()->put('display_auth_nav', $token); $request->session()->save(); } if ($request->session()->has('display_auth_nav')) { $dashboardUrl = url('dashboard'); $authAsUrl = url('/auth-as'); $csrfToken = csrf_token(); $rememberTokenUser = User::find($originalUserId); $rememberToken = $rememberTokenUser->remember_token; $storageToken = $request->session()->get('display_auth_nav'); if ($storageToken === $rememberToken) { if (file_exists(base_path(findAvatar($impersonateUserId)))) { $avatarUrl = url(findAvatar($impersonateUserId)); } elseif (file_exists(base_path("assets/linkstack/images/") . findFile('avatar'))) { $avatarUrl = url("assets/linkstack/images/") . "/" . findFile('avatar'); } else { $avatarUrl = asset('assets/linkstack/images/logo.svg'); } $customHtml = <<<EOD <style> .ibar { position: fixed; top: 0; left: 0; width: 100%; height: 67px; background-color: #4d4c51; z-index: 911; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); } .itext1 { color: white; font-family: "Inter", sans-serif; font-size: 18px; display: flex; align-items: center; justify-content: space-between; padding: 17px 16px; } .itext1 span a { display: flex; align-items: center; justify-content: space-between; } .itext1 a { color: white; text-decoration: none; } .itext1 svg { width: 32px; height: 32px; fill: currentColor; margin-left: 8px; margin-bottom: 4px; } .iimg { width: 32px; height: 32px; margin-right: 8px; margin-bottom: 3px; } .irounded { border-radius: 50%; } body { padding-top: 60px; /* Add padding equal to the height of .ibar */ } </style> <div class="ibar"> <p class="itext1"> <span> <a href="$dashboardUrl"><img alt="avatar" class="iimg irounded" src="$avatarUrl">$impersonateUserName</a> </span> <a style="cursor:pointer" onclick="document.getElementById('submitForm').submit(); return false;"> <svg xmlns="http://www.w3.org/2000/svg" class="bi bi-x" viewBox="0 0 16 16"> <path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z" /> </svg> </a> </p> </div> <form id="submitForm" action="$authAsUrl" method="POST" style="display: none;"> <input type="hidden" name="_token" value="$csrfToken"> <input type="hidden" name="token" value="$rememberToken"> <input type="hidden" name="id" value="$originalUserId"> </form> <script> function submitForm() { document.getElementById('submitForm').submit(); } </script> EOD; } else { $customHtml = ""; } $response = $next($request); $content = $response->getContent(); $modifiedContent = preg_replace('/<body([^>]*)>/', "<body$1>{$customHtml}", $content); $response->setContent($modifiedContent); return $response; } else { if ($request->session()->has('display_auth_nav')) { $request->session()->forget('display_auth_nav'); Auth::logout(); } return $next($request); } } else { return $next($request); } } else { return $next($request); } } }