6.2 KiB
6.2 KiB
План разработки IP WhiteList — актуальный (30.05.2026)
Основан на ТЗ (
WhiteIPlist.txt) и реальном состоянии кода.
Все предыдущие планы (plan.md, plan-v2.md, plan-working.md, plan-gemini.md, plan-gpt54.md) устарели.
Что уже работает (не трогать)
| Компонент | Файл | Состояние |
|---|---|---|
| Валидатор IPv4/CIDR | src/validators.js |
✅ Полный — все 14 диапазонов Приложения А |
| CRUD функции | src/queries.js |
✅ createEntry, updateEntry, deleteEntry, listEntries, getExportCIDRs, getAudit |
| Soft delete | src/queries.js + sql/schema.sql |
✅ deleted_at, deleted_by |
| Схема БД | sql/schema.sql |
✅ Все таблицы и индексы |
| Аудит-лог запись | src/queries.js |
✅ Пишется при CREATE/UPDATE/DELETE |
| UI главная страница | views/index.ejs |
✅ Стиль Nubes |
| Экспорт txt | server.js GET /export |
✅ Работает (без суммаризации) |
| Лимит + custom_limit | src/queries.js |
✅ |
Что есть в queries.js, но не подключено к роутам
updateEntry— написана, роутаPOST /update/:idнет, UI-кнопки нетgetAudit— написана, роута и страницы нетlistEntries(companyId, includeDeleted=true)— параметр есть, но нигде не вызывается сtrue
Что отсутствует полностью
A. Роуты (server.js)
POST /update/:id— редактирование записиGET /admin— страница администратораPOST /admin/limit/:companyId— изменение лимита компанииGET /admin/audit— журнал аудита (только для admin)
B. UI (views/)
- Кнопка и inline-форма редактирования в таблице
- Страница admin (
views/admin.ejs):- Список всех компаний
- Записи с фильтром по компании
- Переключатель "показать удалённые"
- Журнал аудита
- Изменение лимита компании
C. Авторизация
- Текущий код: наивный base64 decode JWT — не проверяет подпись, не Keycloak
- Нужно:
openid-client(OIDC), интеграция с Keycloak, проверкаclientIDиemailиз claims - Admin-роль:
clientId === 'WZ01112'— определяется из claim
D. Суммаризация CIDR в экспорте
- ТЗ требует агрегацию в минимальный набор CIDR
- Нужна библиотека:
npm install cidr-toolsилиip-range-check - Или самописный merge (sorted ranges → contiguous merge)
E. Клиентская валидация
- ТЗ: валидация на клиенте обязательна, серверная — авторитетная
- Сейчас: только серверная
- Нужно: JS в index.ejs — проверить формат CIDR, маску /22–/32, не RFC1918
F. Переключатель компаний
- ТЗ: пользователь может быть в нескольких компаниях (несколько
clientIdв токене) - Нужно: UI-dropdown, переключение активного
clientId, хранение выбора в сессии
Обнаруженные баги
overlaps() в validators.js — логическая ошибка
// Текущий код (неверно):
return a.start <= b.end && b.start <= a.start ||
b.start <= a.end && a.start <= b.start;
// Правильно:
return a.start <= b.end && b.start <= a.end;
Стандартное условие пересечения отрезков. Текущий код даёт false positive для некоторых смежных диапазонов.
Приоритет: высокий — влияет на корректность проверки пересечений.
Порядок реализации
Этап 1 — Критические фиксы (не ломают работу)
- Исправить
overlaps()вvalidators.js - Добавить
POST /update/:idвserver.js - Добавить кнопку редактирования + inline-форму в
views/index.ejs
Этап 2 — Полнота ТЗ
- Клиентская валидация (JS в index.ejs)
- Суммаризация CIDR в
GET /export(cidr-tools или ручной merge) - Определение admin-роли (
clientId === 'WZ01112') - Страница
/admin+ роутGET /admin - Роут
POST /admin/limit/:companyId - Журнал аудита для admin (
GET /admin/audit)
Этап 3 — Авторизация (блокирующая для продакшена)
npm install openid-client— OIDC Keycloak- Заменить auth middleware на реальную проверку токена
- Убрать
DEV_MODE(или оставить только для локальной разработки)
Этап 4 — Опционально
- Переключатель компаний (multi-company claim)
- Автотесты:
npm install --save-dev jest supertest - Пагинация (только если лимит вырастет > 50)
- Audit UI для клиента (не только admin)
Зависимости
openid-client — OIDC / Keycloak
cidr-tools — суммаризация CIDR в экспорте
Всё остальное — в рамках существующего стека (Express, EJS, pg).
Что НЕ нужно делать
- Переписывать validators.js (только исправить overlaps)
- Переписывать queries.js — всё уже написано
- Менять схему БД — она полная
- Пересобирать стек — Express + EJS достаточно для ТЗ