Files
fitme3070.pt/dev_login.php
T

31 lines
1.7 KiB
PHP

<?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));
},
]);