From 4e566b9c5a2a3a6e51f56d4a4fb9a7db6b4d017f Mon Sep 17 00:00:00 2001 From: Willen Borges Coelho Date: Thu, 22 Oct 2026 04:23:44 +0000 Subject: [PATCH] Adiciona auditoria, STARTTLS no LDAP e melhorias na gestão de admins --- public_html/admins.php | 46 ++++++++++++++++++++++++++++++++++++++-------- public_html/auditoria.php | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public_html/dashboard.php | 2 +- public_html/index.php | 4 ++-- src/AdminRepository.php | 6 ++++++ src/Auth.php | 1 + src/Ldap.php | 12 ++++++++++++ src/View.php | 5 +++-- 8 files changed, 149 insertions(+), 13 deletions(-) create mode 100644 public_html/auditoria.php diff --git a/public_html/admins.php b/public_html/admins.php index 8a775f9..cd0df29 100644 --- a/public_html/admins.php +++ b/public_html/admins.php @@ -23,11 +23,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $ldapObj = new Ldap(); $ldapObj->bindService(); $entry = $ldapObj->findUserByLogin($login); - $nome = $entry['displayname'][0] ?? null; if ($entry === null) { $erro = 'Login não encontrado no AD. Confira e tente novamente.'; } else { + $nome = $entry['displayname'][0] ?? null; AdminRepository::add($login, $nome, $papel, $quemFez); AuditLog::record($quemFez, 'adicionou_admin', $login, "papel={$papel}"); $ok = 'Administrador adicionado com sucesso.'; @@ -36,18 +36,18 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $erro = 'Erro ao consultar o AD: ' . $e->getMessage(); } } - } elseif ($acao === 'remover') { + } elseif ($acao === 'desativar') { $id = (int) ($_POST['id'] ?? 0); $admin = AdminRepository::find($id); if (!$admin) { $erro = 'Administrador não encontrado.'; } elseif ($admin['papel'] === 'admin' && AdminRepository::countActiveAdmins($id) === 0) { - $erro = 'Não é possível remover o último administrador ativo do sistema.'; + $erro = 'Não é possível desativar o último administrador ativo do sistema.'; } else { AdminRepository::setActive($id, false); - AuditLog::record($quemFez, 'removeu_admin', $admin['login']); - $ok = 'Administrador removido (desativado) com sucesso.'; + AuditLog::record($quemFez, 'desativou_admin', $admin['login']); + $ok = 'Administrador desativado com sucesso.'; } } elseif ($acao === 'reativar') { $id = (int) ($_POST['id'] ?? 0); @@ -57,6 +57,22 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { AuditLog::record($quemFez, 'reativou_admin', $admin['login']); $ok = 'Administrador reativado.'; } + } elseif ($acao === 'atualizar_papel') { + $id = (int) ($_POST['id'] ?? 0); + $papel = ($_POST['papel'] ?? 'operador') === 'admin' ? 'admin' : 'operador'; + $admin = AdminRepository::find($id); + + if (!$admin) { + $erro = 'Administrador não encontrado.'; + } elseif ($admin['papel'] === 'admin' && $papel === 'operador' && AdminRepository::countActiveAdmins($id) === 0) { + $erro = 'Não é possível rebaixar o último administrador ativo do sistema.'; + } elseif ($admin['papel'] === $papel) { + $ok = 'Nenhuma alteração: o papel já era esse.'; + } else { + AdminRepository::setPapel($id, $papel); + AuditLog::record($quemFez, 'alterou_papel_admin', $admin['login'], "de={$admin['papel']} para={$papel}"); + $ok = 'Papel atualizado com sucesso.'; + } } } @@ -94,7 +110,21 @@ View::header('Administradores'); - + + +
+ + + + +
+ + + + Ativo @@ -106,8 +136,8 @@ View::header('Administradores');
- - + + diff --git a/public_html/auditoria.php b/public_html/auditoria.php new file mode 100644 index 0000000..90d6456 --- /dev/null +++ b/public_html/auditoria.php @@ -0,0 +1,86 @@ +query('SELECT COUNT(*) FROM audit_log')->fetchColumn(); + +$stmt = Database::pdo()->prepare( + 'SELECT * FROM audit_log ORDER BY criado_em DESC, id DESC LIMIT :limit OFFSET :offset' +); +$stmt->bindValue('limit', $perPage, PDO::PARAM_INT); +$stmt->bindValue('offset', $offset, PDO::PARAM_INT); +$stmt->execute(); +$logs = $stmt->fetchAll(); + +$totalPages = max(1, (int) ceil($total / $perPage)); + +$acaoLabels = [ + 'login' => 'Login', + 'login_negado' => 'Login negado (sem permissão)', + 'login_falhou' => 'Login falhou (usuário/senha)', + 'logout' => 'Logoff', + 'habilitou_aluno' => 'Habilitou aluno', + 'desabilitou_aluno' => 'Desabilitou aluno', + 'alterou_senha_aluno' => 'Alterou senha de aluno', + 'adicionou_admin' => 'Adicionou administrador', + 'desativou_admin' => 'Desativou administrador', + 'reativou_admin' => 'Reativou administrador', + 'alterou_papel_admin' => 'Alterou papel de administrador', + 'atualizou_settings' => 'Atualizou configurações', +]; + +View::header('Auditoria'); +?> +
+

Auditoria

+

+ Histórico de logins (inclusive tentativas com senha incorreta), alterações em + alunos, administradores e configurações. Mostrando de registros. +

+ + + + + + + + + + + + + + + + + + + + + + + +
Data/horaUsuárioAçãoAlvoDetalheIP
Nenhum registro ainda.
+ + 1): ?> +

+ + + + + + + | + +

+ +
+ $cn, - 'nome' => $entry['sn'][0] ?? $cn, + 'nome' => $entry['displayname'][0] ?? $entry['cn'][0] ?? $cn, 'habilitado' => ($accountControl & 2) !== 2, 'descricao' => $entry['description'][0] ?? '', ]; diff --git a/public_html/index.php b/public_html/index.php index 5a1e8bb..af6c9b3 100644 --- a/public_html/index.php +++ b/public_html/index.php @@ -33,13 +33,13 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { - Gestão de Alunos - LabInfo + Gestão de Alunos Lab. Informática