diff --git a/public/favicon.png b/public/favicon.png deleted file mode 100644 index f171012..0000000 Binary files a/public/favicon.png and /dev/null differ diff --git a/views/admin.ejs b/views/admin.ejs deleted file mode 100644 index 3d1bd0a..0000000 --- a/views/admin.ejs +++ /dev/null @@ -1,207 +0,0 @@ - - - - - Управление лимитами — IP WhiteList - - - - - -
- - - - - - - - - - | - Управление лимитами - - ← Список адресов - Журнал аудита - Выйти (<%= user.email %>) - -
- -
- - <% if (message) { %>
<%= message %>
<% } %> - <% if (error) { %>
<%= error %>
<% } %> - -
-
- Компании и лимиты - - Глобальный дефолт: <%= defaultLimit %> записей. - Пустое поле = сброс на дефолт. - -
- - <% if (companies.length === 0) { %> -
Нет компаний в системе
- <% } else { %> -
- - - - - - - - - - - - <% companies.forEach(c => { %> - <% - // Вычисляем эффективный лимит (кастомный или дефолтный) - const effectiveLimit = c.custom_limit != null ? c.custom_limit : defaultLimit; - const pct = effectiveLimit > 0 ? Math.min(c.active_count / effectiveLimit, 1) : 1; - const barClass = pct >= 1 ? 'full' : pct >= 0.8 ? 'warn' : ''; - %> - - - - - - - - - - - <% }) %> - -
КомпанияClientIDИспользованоЛимитДействие
<%= c.name %><%= c.client_id %> -
-
-
-
- - <%= c.active_count %> / <%= effectiveLimit %> - <% if (c.custom_limit != null) { %> - - <% } %> - -
-
- <% if (c.custom_limit != null) { %> - <%= c.custom_limit %> - (индивидуальный) - <% } else { %> - дефолт (<%= defaultLimit %>) - <% } %> - -
- <%# CSRF-токен: одно значение на всю страницу (генерируется сервером) %> - - - - <% if (c.custom_limit != null) { %> - - - <% } %> -
-
-
- <% } %> -
- -
- - - - - diff --git a/views/audit.ejs b/views/audit.ejs deleted file mode 100644 index 34d6dae..0000000 --- a/views/audit.ejs +++ /dev/null @@ -1,174 +0,0 @@ - - - - - Журнал аудита — IP WhiteList - - - - - - -
- - - - - - - - - - | - Журнал аудита - - ← Список адресов - Управление лимитами - Выйти (<%= user.email %>) - -
- -
- - <% if (error) { %>
<%= error %>
<% } %> - - -
-
- Фильтр -
-
-
- - - <% if (selectedCompanyId) { %> - Сбросить - <% } %> - - Показано: <%= rows.length %> записей (макс 500) - -
-
-
- - -
-
Записи журнала
- <% if (rows.length === 0) { %> -
Нет записей в журнале аудита
- <% } else { %> -
- - - - - - - - - - - - <% rows.forEach(r => { %> - - - - - - - - - - - - <% }) %> - -
КогдаКтоКомпанияДействиеЗначение
- <%= new Date(r.created_at).toLocaleString('ru', { - day: '2-digit', month: '2-digit', year: 'numeric', - hour: '2-digit', minute: '2-digit' - }) %> - <%= r.user_email %> - <%= r.company_name %>
- <%= r.client_id %> -
- <%= r.action %> - - <% if (r.old_value && r.new_value) { %> - <%= r.old_value %> - - <%= r.new_value %> - <% } else if (r.new_value) { %> - <%= r.new_value %> - <% } else if (r.old_value) { %> - <%= r.old_value %> - <% } else { %> - - <% } %> -
-
- <% } %> -
- -
- - - diff --git a/views/dev-login.ejs b/views/dev-login.ejs deleted file mode 100644 index be93c56..0000000 --- a/views/dev-login.ejs +++ /dev/null @@ -1,140 +0,0 @@ - - - - - Dev-вход — IP WhiteList - - - - - -
-

Тестовый вход

-

Dev-backdoor — в обход Keycloak

- -
- ⚠ ТЕСТОВЫЙ РЕЖИМ - Этот вход создаёт произвольного пользователя без проверки пароля. - Используйте только для тестирования. -
- - <% if (error) { %>
<%= error %>
<% } %> - -
- - - <%# ── Пресеты ── %> -

Быстрый выбор

-
- - -
- -
— или задайте вручную —
- - <%# ── Кастомные поля ── %> -

Произвольный пользователь

- -
- - - WZ-номер компании в Nubes (обязателен если пресет не выбран) -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- - -
- -
-

- ← Обычный вход -

-
- - - - - - diff --git a/views/index.ejs b/views/index.ejs deleted file mode 100644 index 382bce9..0000000 --- a/views/index.ejs +++ /dev/null @@ -1,409 +0,0 @@ - - - - - Белые списки IP — Nubes - - - - - -
- - - - - - - - - - | - Белые списки IP - - - <% if (isAdmin) { %> - Аудит - Лимиты - <% } %> - Выйти (<%= user.email %>) - -
- -
- - <% if (message) { %>
<%= message %>
<% } %> - <% if (error) { %>
<%= error %>
<% } %> - - <% - // Для admin: selectedCompany — выбранная компания (объект из getAllCompanies). - // Для обычного пользователя: selectedCompany — их компания (из getOrCreateCompany). - // company_id — числовой PK для передачи в скрытые поля форм. - const companyPk = selectedCompany ? selectedCompany.id : null; - %> - - - <% if (isAdmin && companies) { %> -
-
-
- Компания: - - - → Аудит этой компании - → Лимиты - - Режим: Администратор - -
-
-
- <% } %> - - -
-
-
-
-
<%= used %> / <%= limit %>
-
записей
-
-
- -
<%= selectedCompany ? selectedCompany.client_id : user.clientId %>
-
компания
-
-
-
<%= user.email %>
-
пользователь
-
-
-
-
- - -
-
Добавить адрес
-
-
- <% - // Передаём числовой PK компании в скрытом поле. - // Для admin: server.js возьмёт его из req.body.company_id. - // Для обычного пользователя: server.js игнорирует это поле - // и использует clientId из токена — защита от подмены. - %> - - <%# CSRF-токен: защита от межсайтовой подделки запроса (double-submit cookie) %> - -
-
- - = limit ? 'disabled' : '' %>> -
-
- - -
- -
-
-
-
- - -
-
Доверенные адреса
- <% if (entries.length === 0) { %> -
Нет добавленных адресов
- <% } else { %> -
- - - - - - - - - - - - - <% entries.forEach(e => { %> - - - - - - - - - - <% }) %> - -
Адрес / ПодсетьКомментарийДобавилДатаИзменёнДействия
<%= e.value_cidr %><%= e.comment || '—' %><%= e.created_by %><%= new Date(e.created_at).toLocaleDateString('ru', {day:'numeric',month:'short',year:'numeric',hour:'2-digit',minute:'2-digit'}) %> - <%= e.updated_at - ? new Date(e.updated_at).toLocaleDateString('ru', {day:'numeric',month:'short',hour:'2-digit',minute:'2-digit'}) - : '—' %> - - <% - // data-* атрибуты для JS-заполнения modal без inline-onclick с параметрами. - // Так как комментарий может содержать кавычки — EJS экранирует их в HTML. - // Но в data-атрибуте JSON::stringify безопаснее. - %> - - - -
- - <%# CSRF-токен: одно значение на всю страницу, сгенерировано сервером %> - - -
-
-
- <% } %> -
- -
- - - - - - - - - - diff --git a/views/login.ejs b/views/login.ejs deleted file mode 100644 index d64a334..0000000 --- a/views/login.ejs +++ /dev/null @@ -1,85 +0,0 @@ - - - - - Вход — IP WhiteList - - - - - -
-

Вход в IP WhiteList

-

Мок-аутентификация — имитация Keycloak

- - <% if (error) { %>
<%= error %>
<% } %> - -
- <%# CSRF-токен: защита от CSRF-атаки на форму входа %> - -
- - -
- -
- -
- В реальном продакшене здесь будет редирект на Keycloak.
- После входа пользователь сохраняется в session middleware. - <% if (devLoginUrl) { %> -
Тестовый вход (dev-backdoor) → - <% } %> -
-
- - - -