Files
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

37 lines
1.5 KiB
PHP

<?php
// ─── Front controller dos endpoints partilhados ─────────────────────────────
//
// Um só stub por site para toda a API partilhada:
//
// <?php require __DIR__ . '/../../shared/platform-tools/api/router.php'; // public/api/platform.php
//
// e cada endpoint responde em api/platform.php?endpoint=<nome> (ou
// api/platform?endpoint=… com 'clean_urls'). A lista é fechada
// (platform_api_routes()), e cada endpoint continua a autenticar-se a si
// próprio: este ficheiro só carrega o arranque do site e despacha.
//
// Um site com implementação própria de um endpoint declara-a no
// platform_connect(): 'api_files' => ['backup_trigger' => <caminho absoluto>]
// (a silver tem guardas com outros nomes). O 'migrations_dir' do site chega ao
// agente, como chega às páginas.
declare(strict_types=1);
require_once __DIR__ . '/../hub_bootstrap.php'; // $repo_root, $pdo, o arranque do site
require_once __DIR__ . '/../functions_routes.php';
$endpoint = (string) ($_GET['endpoint'] ?? '');
$file = platform_api_routes()[$endpoint] ?? null;
if ($file === null) {
hub_json(['ok' => false, 'error' => 'endpoint desconhecido'], 404);
}
$cfg = function_exists('platform_config') ? platform_config() : [];
if (!empty($cfg['migrations_dir'])) {
$GLOBALS['MIGRATIONS_DIR'] = (string) $cfg['migrations_dir'];
}
$target = (string) ($cfg['api_files'][$endpoint] ?? (dirname(__DIR__) . '/' . $file));
unset($cfg, $file);
require $target;