- 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>
30 lines
1.0 KiB
PHP
30 lines
1.0 KiB
PHP
<?php
|
|
// Envia ao hub os eventos de segurança em espera e aplica os banimentos da frota.
|
|
//
|
|
// */5 * * * * php /var/www/html/shared/platform-tools/bin/hub-security-sync.php
|
|
//
|
|
// Sem isto a sincronização acontece na mesma, no fim dos pedidos normais — mas
|
|
// um site sem visitas nunca chegaria a receber os banimentos dos outros, e uma
|
|
// caixa de saída cheia depois de o hub ter estado em baixo esvazia-se aqui de uma
|
|
// vez em vez de um lote por visita.
|
|
|
|
declare(strict_types=1);
|
|
|
|
if (PHP_SAPI !== 'cli') {
|
|
http_response_code(404);
|
|
exit;
|
|
}
|
|
|
|
// O mesmo arranque dos endpoints do hub: resolve os dois stacks da frota.
|
|
require dirname(__DIR__) . '/hub_bootstrap.php';
|
|
require_once dirname(__DIR__) . '/functions_security_events.php';
|
|
|
|
if (!$pdo instanceof PDO) {
|
|
echo json_encode(['ok' => true, 'skipped' => 'plataforma sem base de dados']), "\n";
|
|
exit(0);
|
|
}
|
|
|
|
$res = hub_security_sync($pdo, 50);
|
|
echo json_encode($res, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), "\n";
|
|
exit(!empty($res['ok']) ? 0 : 1);
|