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>
This commit is contained in:
andreandClaude Opus 5.5 committed 2026-09-25 07:28:13 +01:00
1 parent 5e300fc341
commit 0e8b53f620
65 files changed
+5852 -455

No files matched your search

+6 -11
View File
@@ -2,9 +2,9 @@
// ─── Arranque partilhado dos endpoints do hub ────────────────────────────────
//
// Os três endpoints (health, ops, pair) são iguais em todas as plataformas, mas
// o arranque não é: a frota tem dois stacks. O `config/` (dance, design,
// fotografia, mstudio, quack, hub) abre a ligação em config/db.php e tem os
// helpers em config/functions.php; a silver usa `src/` com App\Database.
// 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
@@ -21,9 +21,9 @@
// Não pode é ser tratada como as outras. Aqui distingue-se **não ter** base de
// dados de **não conseguir** abri-la:
//
// nem config/db.php nem src/db.php existem → não há camada de dados nenhuma,
// não há config/db.php → não há camada de dados nenhuma,
// é o desenho do site. Segue sem.
// um deles existe mas o $pdo não apareceu → avaria. 503, como antes.
// 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
@@ -39,8 +39,7 @@
$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')
|| is_file($repo_root . '/src/db.php');
$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')) {
@@ -53,10 +52,6 @@ if (!isset($pdo) || !$pdo instanceof PDO) {
if (!function_exists('base_url') && is_file($repo_root . '/config/functions.php')) {
require_once $repo_root . '/config/functions.php';
}
} elseif (is_file($repo_root . '/src/db.php')) {
require_once $repo_root . '/src/config.php';
require_once $repo_root . '/src/db.php';
$pdo = \App\Database::getConnection();
}
}