feat(dev): adopt shared platform-tools dev toolbar and one-click dev login

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
andreandClaude Sonnet 5.5 committed 2026-10-09 22:10:58 +01:00
1 parent 8edc37e43a
commit 5f64ae57db
7 files changed
+76 -76

No files matched your search

+30
View File
@@ -0,0 +1,30 @@
<?php
declare(strict_types=1);
/**
* DEV ONLY -- login de um clique da barra de dev (includes/dev_toolbar.php).
* Fica na raiz porque este site não tem public/ (o .htaccess encaminha
* /dev_login para aqui). O guarda, o 404 antes de tocar na BD/sessão, o POST e o
* papel permitido são do platform-tools (platform_dev_login_handle). Aqui só: o
* CSRF do site e a abertura da sessão como o login real (auth_login), sem
* palavra-passe. As contas são as de scripts/dev_accounts.php.
*/
$_dev_shared = __DIR__ . '/shared/platform-tools/functions_dev.php';
if (!is_file($_dev_shared)) { http_response_code(404); exit; } // submódulo sem o ficheiro (produção)
require_once $_dev_shared;
platform_dev_login_handle([
'roles' => ['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));
},
]);