admins.php
4.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?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 o domínio <?= View::escape(Config::get('ldap.domain_suffix', '')) ?>)</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();