admins.php 4.38 KB
<?php

declare(strict_types=1);

require __DIR__ . '/../src/bootstrap.php';
Auth::requireAdmin();

$erro = null;
$ok = null;
$quemFez = Auth::currentLogin() ?? 'desconhecido';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $acao = $_POST['acao'] ?? '';

    if ($acao === 'adicionar') {
        $login = trim((string) ($_POST['login'] ?? ''));
        $papel = ($_POST['papel'] ?? 'operador') === 'admin' ? 'admin' : 'operador';

        if ($login === '') {
            $erro = 'Informe o login.';
        } else {
            try {
                $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 {
                    AdminRepository::add($login, $nome, $papel, $quemFez);
                    AuditLog::record($quemFez, 'adicionou_admin', $login, "papel={$papel}");
                    $ok = 'Administrador adicionado com sucesso.';
                }
            } catch (Throwable $e) {
                $erro = 'Erro ao consultar o AD: ' . $e->getMessage();
            }
        }
    } elseif ($acao === 'remover') {
        $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.';
        } else {
            AdminRepository::setActive($id, false);
            AuditLog::record($quemFez, 'removeu_admin', $admin['login']);
            $ok = 'Administrador removido (desativado) com sucesso.';
        }
    } elseif ($acao === 'reativar') {
        $id = (int) ($_POST['id'] ?? 0);
        $admin = AdminRepository::find($id);
        if ($admin) {
            AdminRepository::setActive($id, true);
            AuditLog::record($quemFez, 'reativou_admin', $admin['login']);
            $ok = 'Administrador reativado.';
        }
    }
}

$admins = AdminRepository::all();

View::header('Administradores');
?>
<div class="card">
    <h1>Administradores do sistema</h1>

    <?php if ($erro): ?><div class="alert error"><?= View::escape($erro) ?></div><?php endif; ?>
    <?php if ($ok): ?><div class="alert success"><?= View::escape($ok) ?></div><?php endif; ?>

    <form method="post" action="admins.php">
        <input type="hidden" name="acao" value="adicionar">
        <label for="login">Login do AD (sem @cefetes.br)</label>
        <input type="text" id="login" name="login" required>
        <label for="papel">Papel</label>
        <select id="papel" name="papel">
            <option value="operador">Operador (só habilita/desabilita e reseta senha)</option>
            <option value="admin">Administrador (também gerencia quem tem acesso)</option>
        </select>
        <button type="submit">Adicionar</button>
    </form>

    <table>
        <tr>
            <th>Login</th>
            <th>Nome</th>
            <th>Papel</th>
            <th>Status</th>
            <th>Ações</th>
        </tr>
        <?php foreach ($admins as $a): ?>
        <tr>
            <td><?= View::escape($a['login']) ?></td>
            <td><?= View::escape($a['nome']) ?></td>
            <td><?= View::escape($a['papel']) ?></td>
            <td>
                <?php if ($a['ativo']): ?>
                    <span class="badge ok">Ativo</span>
                <?php else: ?>
                    <span class="badge off">Inativo</span>
                <?php endif; ?>
            </td>
            <td>
                <form method="post" action="admins.php" style="display:inline">
                    <input type="hidden" name="id" value="<?= (int) $a['id'] ?>">
                    <?php if ($a['ativo']): ?>
                        <input type="hidden" name="acao" value="remover">
                        <button type="submit" class="danger">Remover</button>
                    <?php else: ?>
                        <input type="hidden" name="acao" value="reativar">
                        <button type="submit">Reativar</button>
                    <?php endif; ?>
                </form>
            </td>
        </tr>
        <?php endforeach; ?>
    </table>
</div>
<?php
View::footer();