- shared/platform-tools: ea3616a → 12f26fd (27 commits). Traz o módulo de audit (f761d99, o pin da frota), «manter sessão iniciada», o registo de segurança da frota (o gancho que o login já tinha passa a funcionar) e a correção do IP do cliente encontrada nesta auditoria (último X-Forwarded-For / X-Real-IP), promovida ao partilhado. client_ip() da app delega nele. - config/functions_audit.php: audit() sobre platform_audit(); tabela audit_log criada no primeiro uso, segredos ocultados, nunca parte a ação. - Registado: login, falha de login, bloqueio por excesso de tentativas, logout, pedidos de recuperação, mudança/definição de palavra-passe, registo e criação de utilizadores, convites, perfil (antes/depois), todas as definições (db_update_setting, com valor anterior), cada passo da lixeira (apagar, restaurar, eliminar de vez) e ações nas mensagens. - Sistema → Auditoria (views/sysadmin/audit.php), só sysadmin. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
73 lines
3.7 KiB
PHP
73 lines
3.7 KiB
PHP
<?php
|
||
// ─── Arranque partilhado dos endpoints do hub ────────────────────────────────
|
||
//
|
||
// Os três endpoints (health, ops, pair) são iguais em todas as plataformas, mas
|
||
// o arranque de cada site vive no seu config/db.php, que abre a ligação, e o
|
||
// config/functions.php com os helpers. (A silver tinha um stack `src/` à parte
|
||
// até 2026-09; passou para o mesmo contrato e o ramo dela saiu daqui.)
|
||
//
|
||
// Em vez de dezoito stubs com o arranque copiado — três endpoints × seis sites,
|
||
// e o dobro dos sítios onde uma correcção se esquece —, detecta-se aqui. Um
|
||
// site com um arranque próprio define $pdo antes de incluir isto e este ficheiro
|
||
// não lhe toca.
|
||
//
|
||
// ─── Plataformas sem base de dados ───────────────────────────────────────────
|
||
//
|
||
// O apex (andmore.pt) é uma montra estática: sem base de dados, sem sessão, sem
|
||
// autenticação, e montada read-only no contentor. Continua a ser uma plataforma
|
||
// da frota que vale a pena monitorizar — se estiver em baixo, é a primeira
|
||
// página que um cliente vê.
|
||
//
|
||
// Não pode é ser tratada como as outras. Aqui distingue-se **não ter** base de
|
||
// dados de **não conseguir** abri-la:
|
||
//
|
||
// não há config/db.php → não há camada de dados nenhuma,
|
||
// é o desenho do site. Segue sem.
|
||
// existe mas o $pdo não apareceu → avaria. 503, como antes.
|
||
//
|
||
// A distinção sai da presença dos ficheiros e não de um flag por site, porque um
|
||
// flag é uma coisa a mais para alguém pôr errada: um site com base de dados a
|
||
// arder responderia «sou estático, está tudo bem».
|
||
//
|
||
// Sem base de dados as chaves têm de vir do `.env` — o hub_setting_secret() já
|
||
// lê o .env primeiro, portanto não é caso especial nenhum; é o caminho normal
|
||
// sem o fallback.
|
||
//
|
||
// Deixa em cima da mesa: $pdo (ou null), $hub_has_db_layer, $repo_root, e o
|
||
// functions_hub.php carregado.
|
||
|
||
$repo_root = dirname(__DIR__, 2);
|
||
|
||
/** Este site tem sequer uma camada de dados? Ver a nota acima. */
|
||
$hub_has_db_layer = is_file($repo_root . '/config/db.php');
|
||
|
||
if (!isset($pdo) || !$pdo instanceof PDO) {
|
||
if (is_file($repo_root . '/config/db.php')) {
|
||
require_once $repo_root . '/config/db.php';
|
||
// Nem todas as plataformas carregam o functions.php a partir do db.php
|
||
// (a dsa e o hub carregam; a fotografia e o design não). O require_once
|
||
// sozinho não chega como guarda: quando o db.php o incluiu por outro
|
||
// caminho relativo, o realpath difere e o segundo include rebenta com
|
||
// "Cannot redeclare base_url()".
|
||
if (!function_exists('base_url') && is_file($repo_root . '/config/functions.php')) {
|
||
require_once $repo_root . '/config/functions.php';
|
||
}
|
||
}
|
||
}
|
||
|
||
require_once __DIR__ . '/functions_hub.php';
|
||
|
||
if ((!isset($pdo) || !$pdo instanceof PDO) && $hub_has_db_layer) {
|
||
// Este site TEM camada de dados e mesmo assim não chegou aqui um $pdo: é
|
||
// avaria, não desenho. Responder 401 daria a entender ao hub que a chave
|
||
// está errada quando o que falta é o arranque.
|
||
hub_json(['ok' => false, 'error' => 'esta plataforma não expôs uma ligação à base de dados ao endpoint do hub'], 503);
|
||
}
|
||
|
||
// Os endpoints leem-no como global (hub_pdo()); o $GLOBALS explícito cobre o
|
||
// caso de este ficheiro ser incluído de dentro de uma função num stub futuro.
|
||
// Numa plataforma estática fica a null de propósito — o hub_pdo() devolve null
|
||
// e quem depende de base de dados salta o seu check em vez de rebentar.
|
||
$GLOBALS['pdo'] = (isset($pdo) && $pdo instanceof PDO) ? $pdo : null;
|
||
$pdo = $GLOBALS['pdo'];
|