Files
Investidor-V2/tools/portal-qa-account-selection.php
T
nala 6ddafc95ba
tests / ci (push) Canceled after 0s
oportunidades 4
2026-10-10 07:03:59 +02:00

37 lines
1.6 KiB
PHP

<?php
// Registered only by the router after its actual isolated-database guard.
use App\Models\User;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class PortalQaAccountSelection
{
public const MESSAGE = 'Este ambiente QA aceita apenas contas sintéticas de ensaio. Para os cenários A/B, use a conta QA 18 e o respetivo MFA. As contas restauradas são preservadas e não devem ser usadas neste ensaio.';
public function handle(Request $request, Closure $next): Response
{
if (! config('portal.qa_synthetic_accounts_only', false) || ! app()->environment('testing')) {
return $next($request);
}
$email = null;
if ($request->isMethod('POST') && $request->is('login')) {
$email = $request->input('email');
} elseif ($request->is('two-factor-challenge') && $request->session()->has('login.id')) {
$email = User::find($request->session()->get('login.id'))?->email;
}
if (is_string($email) && ! str_ends_with(strtolower($email), '@example.invalid')) {
$request->session()->forget(['login.id', 'login.remember']);
$request->attributes->set('qa_restored_account_rejected', true);
if ($request->expectsJson()) {
return response()->json(['message' => self::MESSAGE, 'errors' => ['email' => [self::MESSAGE]]], 422)
->header('Cache-Control', 'no-store');
}
return redirect()->route('login')->withErrors(['email' => self::MESSAGE])->header('Cache-Control', 'no-store');
}
return $next($request);
}
}