Files
fitme3070.pt/shared/platform-tools/hub_bootstrap.php
T
andreandClaude Opus 5.5 0e8b53f620 feat(audit): platform-tools atualizado (12f26fd) e registo de auditoria ligado
- 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>
2026-09-25 07:28:13 +01:00

73 lines
3.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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'];