feat(platform-tools): liga platform_connect() e o router de páginas de sistema

O bootstrap só reimplementava pedaços do platform-tools à mão (sessão
endurecida, IP do cliente) sem nunca chamar platform_connect() — sem
router, só 4 das ~9 páginas de sistema estavam ligadas (faltavam IP
bans, Geo, Origem das visitas, Hub), e o log de erro de arranque ainda
dizia "[fotografia bootstrap]", copiado sem adaptar.

Liga-se com 'auth' => 'own': a app mantém as suas próprias passwords e
sessão, porque a auth_attempts local (ip+scope) não tem a coluna
identifier que o throttle partilhado exige — trocar para 'shared'
partia o throttle. Ganha-se à mesma o bloqueio de IP da frota e o
router (platform.php / api/platform.php), com Comunicações e Fila de
mensagens declaradas como sysadmin_tools próprias (substituem o Estado
SMTP partilhado, que já cobrem). Os stubs de Backups/Actualizações/
Auditoria passam a reencaminhar para o router; o menu de Sistema passa
a incluir IP bans, Geo e Origem das visitas.

'conformance' => 'report' para nunca recusar pedidos — só reporta no
health endpoint — enquanto o resto da migração de autenticação fica
por decidir.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
andreandClaude Sonnet 5 committed 2026-09-25 12:16:43 +01:00
1 parent 5cf0f14ad2
commit f066eec7c7
7 files changed
+75 -26

No files matched your search

+37 -1
View File
@@ -15,7 +15,7 @@ env_load(__DIR__ . '/../.env');
function _bootstrap_fail(string $logMsg): void {
@mkdir(__DIR__ . '/../logs', 0775, true);
@error_log('[' . date('c') . '] ' . $logMsg . "\n", 3, __DIR__ . '/../logs/db_error.log');
error_log('[fotografia bootstrap] ' . $logMsg);
error_log('[fitme bootstrap] ' . $logMsg);
http_response_code(500);
header('Content-Type: text/html; charset=utf-8');
$tpl = __DIR__ . '/../templates/error_500.php';
@@ -79,3 +79,39 @@ if (session_status() === PHP_SESSION_NONE) {
session_name('FIT_SESS');
session_start();
}
// ─── Ligação ao platform-tools ───────────────────────────────────────────────
//
// A app mantém as suas próprias passwords e sessão (`config/auth.php`,
// `views/auth/login.php`) — não passa a usar o functions_auth.php partilhado
// (`'auth' => 'own'`), porque a `auth_attempts` desta app não tem a coluna
// `identifier` que o throttle partilhado exige (tem `ip`+`scope`, do seu
// próprio throttle em functions_throttle.php). Ainda assim liga-se ao
// bloqueio de IP da frota, ao router das páginas de sistema (Backups,
// Actualizações, Auditoria, IP bans, Geo, Origem das visitas, Hub) e ao
// resto do platform-tools, tudo por cima da autenticação própria.
require_once dirname(__DIR__) . '/shared/platform-tools/functions_connector.php';
platform_connect($pdo, [
'auth' => 'own',
'guard' => 'require_sysadmin',
'router' => true,
'conformance' => 'report', // nunca recusa — só reporta no health endpoint
// A Comunicações desta app já cobre SMTP (config + testes); o Estado SMTP
// partilhado seria um segundo editor da mesma configuração.
'replaced_tools' => ['smtp_status' => 'views/sysadmin/comms.php'],
'hide_tools' => ['smtp_status'],
'sysadmin_tools' => [[
'title' => 'Comunicações',
'description' => 'Configuração SMTP, fila de mensagens e testes de envio.',
'icon' => 'bi-broadcast',
'url' => 'views/sysadmin/comms.php',
'color' => 'info',
], [
'title' => 'Fila de mensagens',
'description' => 'O que saiu, o que falhou e porquê.',
'icon' => 'bi-envelope-paper',
'url' => 'views/sysadmin/messages.php',
'color' => 'secondary',
]],
]);