admins.php
6.11 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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<?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);
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.';
}
} catch (Throwable $e) {
$erro = 'Erro ao consultar o AD: ' . $e->getMessage();
}
}
} 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 desativar o último administrador ativo do sistema.';
} else {
AdminRepository::setActive($id, false);
AuditLog::record($quemFez, 'desativou_admin', $admin['login']);
$ok = 'Administrador 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.';
}
} 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.';
}
}
}
$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>
<?php if ($a['ativo']): ?>
<form method="post" action="admins.php" style="display:flex;gap:6px;align-items:center;margin:0">
<input type="hidden" name="acao" value="atualizar_papel">
<input type="hidden" name="id" value="<?= (int) $a['id'] ?>">
<select name="papel" style="margin:0">
<option value="operador" <?= $a['papel'] === 'operador' ? 'selected' : '' ?>>Operador</option>
<option value="admin" <?= $a['papel'] === 'admin' ? 'selected' : '' ?>>Administrador</option>
</select>
<button type="submit" class="secondary">Salvar</button>
</form>
<?php else: ?>
<?= View::escape($a['papel']) ?>
<?php endif; ?>
</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="desativar">
<button type="submit" class="danger">Desativar</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();