['client' => 'client@mail.pt', 'staff' => 'staff@mail.pt', 'admin' => 'admin@mail.pt', 'sysadmin' => 'sysadmin@mail.pt'], 'bootstrap' => function () { global $pdo; require __DIR__ . '/config/db.php'; require_once __DIR__ . '/config/functions.php'; }, 'csrf_ok' => fn(): bool => is_string($_POST['_csrf'] ?? null) && is_string($_SESSION['csrf_token'] ?? null) && $_SESSION['csrf_token'] !== '' && hash_equals($_SESSION['csrf_token'], $_POST['_csrf']), 'login' => function (string $role, string $email): ?string { global $pdo; $st = $pdo->prepare('SELECT * FROM users WHERE email = ? AND role = ? AND is_active = 1 LIMIT 1'); $st->execute([$email, $role]); $user = $st->fetch(PDO::FETCH_ASSOC); if (!$user) return null; // conta em falta: corra php scripts/dev_accounts.php auth_login($pdo, $user); fit_stamp_login_ua($pdo, (int) $user['id']); return base_url(post_login_destination($role)); }, ]);