-- ─── auth_attempts: torna-a conforme com o throttle do platform-tools ──────── -- Auditoria 2026-09-24, ponto 1.3: a app passa a usar o auth partilhado -- (shared/platform-tools/functions_auth.php) em vez do seu próprio login/ -- sessão/roles. Ver config/db.php ('auth' => 'shared'). -- -- Esta tabela já existia (migration_20260913_local_auth.sql) com o formato do -- throttle PRÓPRIO da app (config/functions_throttle.php: `ip` + `scope`, -- cobre login/registo/recuperação). O throttle partilhado -- (auth_throttle_check/hit em functions_auth.php) espera `identifier` + `ip` -- e falharia (INSERT INTO auth_attempts (identifier, ip) ...) com um erro de -- SQL — silenciosamente engolido pelo try/catch do throttle partilhado, que -- por desenho falha aberto e deixaria de bloquear ninguém. -- -- Decisão: a app CONTINUA a usar só o seu próprio throttle (login+registo+ -- recuperação, dois níveis IP+conta) — não passa a chamar -- auth_throttle_check()/auth_throttle_hit() em lado nenhum, para não duplicar -- a defesa contra o mesmo formulário com duas contagens diferentes. Esta -- migração só torna a TABELA conforme com o que o platform_conformance() -- (config/db.php, 'conformance' => 'report') verifica, para o relatório de -- saúde ficar limpo e para deixar a porta aberta a usar o throttle partilhado -- no futuro sem precisar de outra migração. -- -- `identifier` e `success` são aditivos, com omissão — invisíveis para o -- INSERT/SELECT do throttle próprio, que continua a nomear só `ip`+`scope`. -- `scope` passa a ter omissão (era NOT NULL sem omissão) porque é a única -- coluna que o INSERT do throttle partilhado não preenche; sem omissão esse -- INSERT falhava em modo estrito. -- -- Safe to re-run (IF NOT EXISTS é extensão do MariaDB). ALTER TABLE `auth_attempts` ADD COLUMN IF NOT EXISTS `identifier` VARCHAR(190) NOT NULL DEFAULT '' AFTER `id`; ALTER TABLE `auth_attempts` ADD COLUMN IF NOT EXISTS `success` TINYINT(1) NOT NULL DEFAULT 0 AFTER `attempted_at`; ALTER TABLE `auth_attempts` MODIFY COLUMN `scope` VARCHAR(20) NOT NULL DEFAULT ''; ALTER TABLE `auth_attempts` ADD INDEX IF NOT EXISTS `idx_identifier_time` (`identifier`, `attempted_at`);