58 lines
2.0 KiB
JavaScript
58 lines
2.0 KiB
JavaScript
const REASONS = {
|
|
'honeypot': 'Антиспам-поле заполнено',
|
|
'login-bruteforce': 'Подбор пароля (10 неудачных входов)',
|
|
'share-password-bruteforce': 'Подбор пароля ссылки',
|
|
'manual': 'Вручную',
|
|
};
|
|
|
|
function reasonLabel(r) {
|
|
return REASONS[r] || r || '—';
|
|
}
|
|
|
|
async function loadBans() {
|
|
const tbody = document.getElementById('bansBody');
|
|
const info = document.getElementById('bansInfo');
|
|
const res = await fetch(`${API}/api/bans`, { headers: hdr() });
|
|
if (!res.ok) {
|
|
tbody.innerHTML = `<tr><td colspan="5">Ошибка загрузки (${res.status})</td></tr>`;
|
|
info.textContent = '';
|
|
return;
|
|
}
|
|
const bans = await res.json();
|
|
info.textContent = `Активных блокировок: ${bans.length}`;
|
|
if (!bans.length) {
|
|
tbody.innerHTML = '<tr><td colspan="5" style="color:var(--muted)">Активных блокировок нет</td></tr>';
|
|
return;
|
|
}
|
|
tbody.innerHTML = bans.map(b => `
|
|
<tr>
|
|
<td><b>${esc(b.ip)}</b></td>
|
|
<td>${esc(reasonLabel(b.reason))}</td>
|
|
<td>${new Date(b.created_at).toLocaleString('ru')}</td>
|
|
<td>${new Date(b.banned_until).toLocaleString('ru')}</td>
|
|
<td><button class="danger-btn" data-unban="${esc(b.ip)}" type="button">Разблокировать</button></td>
|
|
</tr>`).join('');
|
|
renderIcons();
|
|
}
|
|
|
|
document.getElementById('bansBody').addEventListener('click', async e => {
|
|
const ip = e.target.closest('[data-unban]')?.dataset.unban;
|
|
if (!ip) return;
|
|
const btn = e.target.closest('[data-unban]');
|
|
btn.disabled = true;
|
|
const res = await fetch(`${API}/api/bans/${encodeURIComponent(ip)}`, { method: 'DELETE', headers: hdr() });
|
|
if (res.ok) showToast('IP разблокирован: ' + ip);
|
|
else showToast('Ошибка разблокировки');
|
|
btn.disabled = false;
|
|
loadBans();
|
|
});
|
|
|
|
document.getElementById('refreshBtn').addEventListener('click', loadBans);
|
|
|
|
(async () => {
|
|
if (await requireAdminPage()) {
|
|
buildSidebar(document.body.dataset.page);
|
|
loadBans();
|
|
}
|
|
})();
|