Files
fitme3070.pt/config/functions_audit.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

26 lines
1.3 KiB
PHP

<?php
// ─── Registo de auditoria ────────────────────────────────────────────────────
// O registo é o do platform-tools (shared/platform-tools/functions_audit.php):
// tabela audit_log criada no primeiro uso, autor e IP tirados da sessão e do
// proxy, segredos ocultados em `changes`, nunca parte a ação. Consulta em
// Sistema → Auditoria (views/sysadmin/audit.php).
//
// audit() é só um atalho que vai buscar o $pdo global, para as funções de
// modelo que não o recebem. Convenção das ações: <entidade>.<verbo>
// (team.update, trash.purge, auth.login_failed, export.membership_leads…).
require_once __DIR__ . '/../shared/platform-tools/functions_audit.php';
function audit(string $action, array $d = []): void {
platform_audit($GLOBALS['pdo'] ?? null, $action, $d);
}
// Email mascarado para registos de falhas: permite ver padrões (o mesmo
// endereço atacado muitas vezes) sem guardar o endereço de quem se enganou.
function audit_mask_email(string $email): string {
$email = strtolower(trim($email));
if (!str_contains($email, '@')) return $email === '' ? '' : mb_substr($email, 0, 1) . '…';
[$u, $d] = explode('@', $email, 2);
return mb_substr($u, 0, 1) . '…@' . $d;
}